PDA

Visualizza la versione completa : [C++] Errore di Access Violation (C++Builder)


marandavide
28-04-2012, 15:10
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:

//---------------------------------------------------------------------------
#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:

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);
}

SamIam
28-04-2012, 21:46
Ciao, spostando la funzione "disegna_terra" dal file include, al file *.cpp (com'è giusto che sia :zizi: ) il codice sembra funzionare regolarmente :ciauz:

marandavide
29-04-2012, 11:03
Originariamente inviato da SamIam
Ciao, spostando la funzione "disegna_terra" dal file include, al file *.cpp (com'è giusto che sia :zizi: ) il codice sembra funzionare regolarmente :ciauz:
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.

SamIam
29-04-2012, 14:17
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

marandavide
29-04-2012, 16:42
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. :bhò:

Loading