Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c++ builder] Il compilatore rende un messaggio di errore

    Ciao a tutti, sto cercando di fare una simulazione del sistema solare con c++ builder (la versione dell'embarcadero). Per farlo uso un'image su cui verranno via via disegnati il sole ed i pianeti. Dato che ad ogni intervallo di un timer dovrò disegnare una nuova Terra e dovrò cancellare la precedente, per ora ho creato una funzione nel file .h del progetto che disegna la nuova terra. Se non la uso nel file .cpp del programma, il compilatore compila normalmente il tutto e mi crea un eseguibile con il Sole e basta. Quando invece ho provato a usare la funzione nell' OnCreate del Form ed ho compilato, il compilatore mi ha mostrato il messaggio "Access violation at address 503E64C0 in module 'vcl160.bpl'. Read of address 000001 B8". Dopo ciò mi apre l'eseguibile senza però disegnarmi la Terra. Qualcuno sa dirmi perché?
    l'header è questo:
    codice:
    //---------------------------------------------------------------------------
    #ifndef codiceH
    #define codiceH 
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    #include <Vcl.ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
    TImage *Image1;
    TTimer *Timer1;
    void __fastcall FormCreate(TObject *Sender);
    private: // User declarations public:
    // User declarations
    __fastcall TForm1(TComponent* Owner); };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    // funzione che disegna la Terra
    int disegna_terra(float x,float y)
    {
    int centrox,centroy;
    centrox=floor(x);  //trova il centro in pixel della terra
    centroy=floor(y); //trova il centro in pixel della terra
    Form1->Image1->Canvas->Pen->Color=RGB(5,239,146); //cambia il colore del contorno della terra
    Form1->Image1->Canvas->Brush->Style=bsSolid; //cambia il brush style su solid
    Form1->Image1->Canvas->Brush->Color=RGB(5,239,146); //cambia il colore della terra
    Form1->Image1->Canvas->Ellipse(centrox-5,centroy-5,centrox+5,centroy+5); //disegna la terra 
    }
    
    #endif
    (ho usato la funzione floor perché dovrò usare anche variabili non intere)

    e questo è il frammento del codice principale di cui parlavo prima:
    codice:
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    xmax=Image1->Width;  //inserisce la larghezza dell'Image in una variabile
    ymax=Image1->Height;  //inserisce l'altezza dell'Image in una variabile
    Image1->Canvas->Brush->Color=RGB(4,49,117);  //cambia il colore di sfondo
    Image1->Canvas->Rectangle(0,0,xmax,ymax);  //colora lo sfondo
    Image1->Canvas->Brush->Color=RGB(253,193,55);  //cambia il colore del Sole
    Image1->Canvas->Ellipse(xmax/4,ymax/2-10,(xmax/4)+20,(ymax/2)+10);  //crea il Sole
    disegna_terra(580,ymax/2);
    }

  2. #2
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    Ciao, spostando la funzione "disegna_terra" dal file include, al file *.cpp (com'è giusto che sia ) il codice sembra funzionare regolarmente

  3. #3
    Originariamente inviato da SamIam
    Ciao, spostando la funzione "disegna_terra" dal file include, al file *.cpp (com'è giusto che sia ) il codice sembra funzionare regolarmente
    Ma di preciso in che punto del file la devo inserire?
    Perché avevo già provato qualche tempo fa ma mi dava un errore che ora non mi ricordo.

  4. #4
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    Puoi spostare il corpo della funzione dove preferisci, facendo però debita attenzione che la sua dichiarazione avvenga prima che la funzione stessa venga richiamata.

    Per fare le cose a regola d'arte, dovresti mettere la dichiarazione nel file include, in questo modo :

    int disegna_terra( float x, float y);

    mentre il corpo della funzione, la definizione, la potrai mettere in un qualsiasi punto del file *.cpp

  5. #5
    Originariamente inviato da SamIam
    Puoi spostare il corpo della funzione dove preferisci, facendo però debita attenzione che la sua dichiarazione avvenga prima che la funzione stessa venga richiamata.

    Per fare le cose a regola d'arte, dovresti mettere la dichiarazione nel file include, in questo modo :

    int disegna_terra( float x, float y);

    mentre il corpo della funzione, la definizione, la potrai mettere in un qualsiasi punto del file *.cpp
    Grazie, spostando tutto nel codice sorgente funziona, però non ho capito quale sarebbe il vantaggio di mettere la dichiarazione ed il corpo in due file differenti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.