Zugriffsverletzung bei Aufruf einer ausgelagerten Funktion
-
Ich habe anfangs eine Funktion definiert, der ich eine Referenz auf ein Objekt (in meine Fall eine GroupBox) übergebe und diese dann an einer bestimmten stelle meines Programms aufgerufen. Das hat funktioniert, solange die Funktion mit in der gleichen cpp war, wie das Objekt auf der Form. Da das aber unübersichlich ist, habe ich die Funktion in eine Extra-Datei gepackt, die ich auch include. Jetzt taucht aber immer beim Aufruf der Funktion eine Zugriffsverletzung auf.
Mal ein bisschen Code zur Veranschaulichung:
//in Unit1.cpp: #include "Unit1.h" #include "funktion.cpp" void __fastcall TForm1::mnuUebersichtClick(TObject *Sender) { ShowOneGroupBox(gbUebersicht); // gbUebersicht = meine GroupBox } //in funktion.cpp: #include "Unit1.h" void ShowOneGroupBox(TGroupBox *GroupBox2Show) { //Alle GroupBoxes unsichtbar machen Form1->gbUebersicht->Visible = false; //<- Hier kommt die Zugriffsverletzung Form1->gbLog->Visible = false; //Übergebene GroupBox sichtbar machen GroupBox2Show->Show(); }
Wenn ich das Problem oben mal außer acht lasse habe ich noch ein Problem in einer Funktion, dass wohl eine ähnliche Ursache hat.
//auch in funktion.cpp: void Add2Log(AnsiString LogMessage) { Form1->lbLog->Items->Add(LogMessage); // <- Hier auch Zugriffsverletzung }
Ich mache wohl irgend etwas grundsätzlich falsch bei Zugriffen zwischen "externen" Funktionen und meiner Form. Ich habe nur leider auch nach langem probieren und nachforschen nicht rausgefunden was.
Bin für jeden Hinweis dankbar.
Knowman
<edit>Habe jetzt die genaue Fehlerzeile angegeben</edit>
-
Hi,
warum greifst du, wenn du schon die GroupBox übergibst immernoch mit Form1->... daruf zu?MfG
Alexander Sulfrian
PS: BEim debuggen gibt's auch die Taste F7! Damit kannst du in die Funktion reintracen und die richtige Quelltextzeile herausfinden!
-
Die Funktion macht ALLE GrupBoxen unsichtbar und EINE bestimmte (die ich übergebe) sichtbar. Ich könnte natürlich auch noch Form1 als Referenz übergeben, darum geht es mir aber eigentlich nicht. Das Problem besteht ja auch in ganz anderen Situationen.
F7 bringt mich nicht weiter, weil er die Zugriffsverletzung an der Stelle bringt, wo die Funktion aufgerufen wird. Wenn ich etzt F7 verwende überspringt er einfach die Funktion und macht so weiter.
-
Include in "Unit1.cpp" "funktion.h" statt "funktion.cpp"
-
Das ist es definitiv nicht, weil funktionen.cpp eine einfache Quelltext-Datei ist und keine Form oder ähnliches.
-
Weiß wirklich keiner woran die Fehlermeldung liegen könnte?
Es muss doch möglich sein, im BCB Funktionen in extra Quelltextdateien genauso und uneingeschränkt aufzurufen, wie als wäre die Funktion in der einentlichen Hauptform?!
Also wäre für Tipps wirklich sehr dankbar.
MfG
Knowman
<edit>Habe in meinem Beitrag oben jetzt die Fehlerstelle nochmal genauer analysiert (das ich die vorher noch nicht gefunden hatte, muss man wohl unter Anfänger-Fehler verbuchen.
Es hat also damit zu tun, dass er nicht auf Form1 oder ein Unterobjekt zugreifen kann, aber warum nicht? Ich habe doch die Header von Form1 eingebunden.</edit>
-
Beachte bitte auch mal die Compilerwarnungen. Es könnte auch sein, das die Variable Form1 zweimal vorhanden ist.
Am besten wäre es, wenn du mal den gesamten Quelltext mal posten könntest.
-
oder mach die Funktionen zu Member von Form1 bzw. übergib ihnen einen Pointer von Form1.
Ich würde das mit dem includieren von cpp-Dateien aber lieber lassen. Ausgelagerte Funktionen werden im zugehörigen Header deklariert (Der wird dann eingebunden) und in der cpp-Datei definiert (so wird das normalerweise gemacht).
Du verwendest hier den globalen Pointer von Form1 ohne genau zu wissen ob er initialisiert ist.Ciao
-
Braunstein schrieb:
Ich würde das mit dem includieren von cpp-Dateien aber lieber lassen. Ausgelagerte Funktionen werden im zugehörigen Header deklariert (Der wird dann eingebunden) und in der cpp-Datei definiert (so wird das normalerweise gemacht).
Das war wohl das Problem, ich habe inzwischen meine gesamte Projektstruktur geändert und jetzt geht es. An einigen Stellen war auch die Reihenfolge der includes wichtig, damit alles funktioniert.
Über die Antworten im Thread http://www.c-plusplus.net/forum/viewtopic.php?t=68712 bin ich drauf gekommen.