Builder 6 - Exception Problem.
-
Hi, ich habe ein kleines Probelm, beim Builder 6 und weis nicht mehr weiter.
Und zwar möchte ich folgende Kalsse als Beispiel in meine Windows Anwendung einfügen.class TMyClass { private: int a,b,c; public: int add(int,int,int) ; }; int TMyClass::add(int d, int e, int f) { a=d; b=e; c=f; return a+b+c };Nur wenn ich jetzt das Programm starte und mit folgendem aufruf meine Methode auführen will bekomme ich eine exception
TMyCalss *Class; Edit1->Text=IntToStr(Class->add(1,2,3));Dies ist nur ein Beispiel.
Die Exception Luatet wie folgt.Project test.exe raised exception class EAccess Violation with Message 'Access vilation at Adress 00403A1D in module 'test.exe'. Write of Adress 550102EE'. Process Stopped. Use Step or run to continue.
http://hannesk.mine.nu/webcam/exception.JPG
Des weiteren habe ich gemerkt, wenn ich in die Klasse als Beispiel ein Feld mit den Dimensionen 120x160 :
int ergebnis[120][160]erzeuge, der Builder aber ein Feld der Dimension 31555x160 aninmmt.
http://hannesk.mine.nu/webcam/klassen_feld.JPGIch hoffe mir kann jemand dabei helfen.
-
Hallo
Du must noch eine gültige Instanz der Klasse anlegen. Und du brauchst einen Konstruktor für die Klasse, der die Membervariablen der Instanz beim erzeugen auf z.b. 0 setzt
class TMyClass { private: int a,b,c; public: int add(int,int,int) ; TMyClass(); // Konstruktor einfügen }; // Implementation des Konstruktors mit Initialisierungsliste der Membervariablen TMyClass::TMyClass() : a(0), b(0), c(0) { } ... TMyCalss *Class = new TMyClass(); // Instanz von TMyClass erzeugen Edit1->Text=IntToStr(Class->add(1,2,3)); // Instanz verwenden ... delete Class; // Instanz nach Gebrauch löschenbis bald
akari
-
Du benötigst ein konkretes Objekt vom Typ MyClass, um eine Methode aufzurufen, nicht einen (mehr oder weniger) zufällig gelegenen Speicherbereich, den du als MyClass interpretierst (und das machst du mit dem uninitialisierten Zeiger):
MyClass *Class=new MyClass;//JETZT hast du ein Objekt Edit1->Text=IntToStr(Class->add(1,2,3)); //... delete Class;//Freigabe des Speichers(btw, über den Sinn dieser Klasse rede ich lieber nicht - die Add-Methode wäre als Funktion geeigneter ;))
Edit: OK, ich war zu langsam

@akari: Default-Konstruktor ist nicht nötig, den stellt der Compiler notfalls selber bereit.
-
Ok, das hatte ich mir auch schon gedacht, nur dann kommt eine Meldung vom Linker, und zwar.
Unresolved external 'TMyClass::add(int,int,int)' referenced from MainTest.obj.
MainTest ist nun der Source für meine Oberfläche, in der ich die Klasse nutzen möchte. Ich habe auch schon mit
extern *TMyClass MyClassversucht, jedoch kam wieder der Fehler.
Der Zweck dahinter ist natürlich ein größeres Projekt, welches aber nun zu Umfangreich ist, um hier genauer auf gesschlüsselt zu werden.
-
-
Hallo
CStoll schrieb:
@akari: Default-Konstruktor ist nicht nötig, den stellt der Compiler notfalls selber bereit.
Ja... aber dann werden die Member-Variablen nicht initialisiert. Dann stehen in a,b und c irgendwelche Werte drinne, was bei der sinnfreien Methode auch nicht auffällt. Aber spätestens dann wenn die Methode z.B. so aussieht
int TMyClass::add(int d, int e, int f) { a+=d; b+=e; c+=f; return a+b+c };fällt es auf. Also besser immer in einem Konstruktor die Member ordentlich initialisieren.
bis bald
akari