Builder2009 spartanische Fehlermeldung
-
Hallo,
ich versuche ein kleines altes BCB6 Projekt auf den neuen Builder abzustimmen. (Nur am Rande->Der neue Builder treibt mich noch in den Wahnsinn.)
Der Compiler meldet sich mit einer allgemeinen Fehlermeldung in einem Fenster(weißes Kreuz auf rotem Kreis)anstatt konkret den Fehler anzuzeigen:Fehler im Modul BLABLA. Falsche Methodendeklaration in Klasse XYZ.
Das war's. Keinerlei weitere Info, wo konkret das Problem auftritt.
Er compiliert nur 1x nach dem Programmstart, dann nicht mehr. (Die Verwendung der vorcompilierten Header habe ich in den Projektoptionen ausgeschaltet.)
Woran liegt das?
-
thunderbol4 schrieb:
(Nur am Rande->Der neue Builder treibt mich noch in den Wahnsinn.
)
Warum das?
thunderbol4 schrieb:
Der Compiler meldet sich mit einer allgemeinen Fehlermeldung in einem Fenster(weißes Kreuz auf rotem Kreis)anstatt konkret den Fehler anzuzeigen:
In einer MessageBox? Da dürfte es sich eigentlich nicht um den Compiler handeln.
Könntest du evtl. mal ein Build von der Kommandozeile aus machen (dazu aus dem Startmenu den Eintrag "RAD Studio-Befehlszeile" wählen, in das Projektverzeichnis wechseln, "msbuild <projname>.cbproj" eingeben)?
thunderbol4 schrieb:
Fehler im Modul BLABLA. Falsche Methodendeklaration in Klasse XYZ.
Vielleicht könntest du BLABLA und XYZ mal posten?
-
Hallo @audacia, Danke für die umgehende Antwort.
thunderbol4 schrieb:
(Nur am Rande->Der neue Builder treibt mich noch in den Wahnsinn.
)
Das betroffene kleine Projekt habe ich von BCB6 nach dem neuen Builder2009 transferiert. Anfänglich klappte alles erstaunlich gut, ohne Probleme. Okay von "AnsiString", "wchar_t" und "Unicode" einmal abgesehen.
Das Projekt beinhaltet ein Modul, das die erzeugten Daten in eine Datei schreibt (fstream...). Beim Testen stürzt das Programm ab, wenn es in diesem Modul auf eine bestimmte Funktion zugreift.
Der Fehler: Angeblich nicht übereinstimmender Typ bei der Parameterübergabe.
Mit dem Debugger kann ich die Stelle zwar ausmachen, aber keine Erklärung finden, wieso der Fehler entsteht.
Also habe ich in einer bis auf die Grundfunktion abgespeckten Programm-Testversion das besagte Datei-Modul nochmals geprüft
Und siehe da jetzt funktionierte es wie gewünscht ohne Absturz, obwohl sonst nichts geändert wurde.
Auch beim schrittweisen direkten Vergleich der beiden Versionen mit dem Debugger kann ich die Ursache nicht finden (vielleicht fehlt mir hier das notwendige Wissen, oder die richtige Vorgehensweise)
Ich gehe deshalb davon aus, dass es am Programmaufbau selbst liegt und versuche deshalb das Ganze zu vereinfachen(Abbau einer virtuellen Klasse, die hier nicht unbedingt benötigt wird, vielleicht liegts daran?).
Jetzt kommen aber durch den Builder2009 neue Unzulänglichkeiten, die das Ganze erschweren.audacia schrieb:
In einer MessageBox?...eigentlich nicht um den Compiler handeln
In meinem Builder-Startmenü habe ich leider keinen Punkt "RAD Studio-Befehlszeile".
MSBuild.exe aus Microsoft.NET Framework habe erfolglos von der Kommandozeile aus probiert (findet kein Ziel, obwohl /t:rebuild)
Habe jetzt festgestellt, dass die Fehlermeldung beim Compilieren nicht erscheint, wenn ich vorher das Projekt neu gespeichert habe. Trotzdem sollte das nicht sein und ist schon etwas merkwürdig.audacia schrieb:
könntest du BLABLA und XYZ mal posten?
Wenn ich mir darüber etwas mehr im Klaren bin, melde ich mich nochmal, so bringt das nichts, es ist noch zu undifferenziert.
-
thunderbol4 schrieb:
Der Fehler: Angeblich nicht übereinstimmender Typ bei der Parameterübergabe.
Mit dem Debugger kann ich die Stelle zwar ausmachen, aber keine Erklärung finden, wieso der Fehler entsteht."Angeblich nicht übereinstimmender Typ bei Parameterübergabe" klingt nach Compilerfehler, aber der Rest deiner Beschreibung nicht. Welcher Fehler tritt denn genau auf? Eine AV?
audacia schrieb:
In meinem Builder-Startmenü habe ich leider keinen Punkt "RAD Studio-Befehlszeile".
Daran solls nicht scheitern. Die Verknüpfung enthält nur die Befehlszeile
%comspec% /K "<C++Builder-Pfad>\bin\rsvars.bat"
; das kannst du auch bei Start|Ausführen eingeben.
-
Hallo @audacia,
habe mir die Mühe gemacht den Weg nachzuzeichnen, den ich mit dem Debugger gehe bis keine weitere Verzweigung mehr möglich ist bis der Fehler auftritt.
Bei dem genannten Modul FileBasic.cpp handelt es sich um ein Modul aus dem Internet mit dem man in eine Excel-Datei ohne OLE lesen und schreiben kann, allerdings auf sehr einfacher Basis.
Vielleicht kannst Du erkennen, wo der Fehler liegt: Wie schon gesagt, in der abgespeckten Version tritt der Fehler nicht auf. Die Funktion unter 8. wird dort ganz normal abgeschlossen.//1. Startpunkt im Projekt //Ziel: erzeugte Daten in xls-Datei speichern, e: ein KlassenObjekt aus Modul FileBasic.cpp AnsiString fn = DlgSaveRes->FileName; //DlgSaveRes: ein TSaveDialog e.SaveAs(fn.c_str()); //weiter mit F7, da F8 Fehlermeldung erzeugt //2. Verzweigt nach dstring.h // C string operator char* __fastcall c_str() const { if (!Data) { return const_cast<char*>(""); } #if !defined(_STRINGCHECKS_OFF) const_cast<AnsiStringT*>(this)->EnsureAnsi(); #endif return Data; //Data: "C:\\Pfad\\DateiName.xls", wobei [0]='C' 67, [1]=':' 58, usw.. } //3. Verzweigt im Modul FileBasic.cpp //Speichere das aktuelle Excel-workbook in eine Datei. bool FileBasic::SaveAs(const char* filename) { if (file_.IsOpen()) file_.Close(); //okay, kein Problem if (!file_.Create(filename)) return false; //weiter mit F7, da F8 Fehlermeldung erzeugt ...... } //4.Verzweigt im Modul FileBasic.cpp /*** ANSI char compound file, directory and file functions ***/ bool CompoundFile::Create(const char* filename) { size_t filenameLength = strlen(filename); wchar_t* wname = new wchar_t[filenameLength+1]; mbstowcs(wname, filename, filenameLength); wname[filenameLength] = 0; //wname: "C:\\Pfad\\DateiName.xls", wobei [0]=L'C' 67U, [1]=L':' 58U, usw..bis [letzter]=L'\0' 0U bool ret = Create(wname); //weiter mit F7, da F8 Fehlermeldung erzeugt ...... } //5. Verzweigt im Modul FileBasic.cpp /*** Compound File Functions ***/ bool CompoundFile::Create(const wchar_t* filename) // PURPOSE: Create a new compound file and open it. // PURPOSE: If file is present, truncate it and then open it. // PROMISE: Return true if file is successfully created and opened, false if otherwise. { Close(); //okay, kein Problem file_.Create(filename); //weiter mit F7, da F8 Fehlermeldung erzeugt ...... //filename: "C:\\Pfad\\DateiName.xls", wobei [0]=L'C' 67U, [1]=L':' 58U, usw..bis [letzter]=L'\0' 0U } //6.Verzweigt im Modul FileBasic.cpp bool Block::Create(const wchar_t* filename) // PURPOSE: Create a new block file and open it. // PURPOSE: If file is present, truncate it and then open it. // PROMISE: Return true if file is successfully created and opened, false if otherwise. { size_t filenameLength = wcslen(filename); char* name = new char[filenameLength+1]; wcstombs(name, filename, filenameLength); name[filenameLength] = 0; //name: "C:\\Pfad\\DateiName.xls", wobei [0]='C' 67, [1]=':' 58, usw..bis [letzter]='\0' 0 file_.open(name, ios_base::out | ios_base::trunc); //okay, kein Problem file_.close(); //weiter mit F7, da F8 Fehlermeldung erzeugt ...... } //7. fstream void close() { // close the C stream if (_Filebuffer.close() == 0) //weiter mit F7, da F8 Fehlermeldung erzeugt _Myios::setstate(ios_base::failbit); } //8.fstream _Myt *close() { // close the C stream _Myt *_Ans = this; //okay, wird durchlaufen, kein Problem if (_Myfile == 0) //springt von hier nach if(!_Endwrite()) _Ans = 0; //wird übersprungen else { // put any homing sequence and close file if (!_Endwrite()) _Ans = 0; //wird übersprungen if (fclose(_Myfile) != 0) //hier entsteht der Fehler: siehe unten _Ans = 0; } _Init(0, _Closefl); return (_Ans); }
24.02.2009 23:15:03 CodeGuard(tm)-Prozess wurde gestartet: Projekt1.exe(2152)
Falscher Parameter im Prozess: Projekt1.exe(2152) - c:\programme\codegear\rad studio\6.0\include\dinkumware\fstream#180
Falsches Datei-Stream (0x329DF840) wurde an die Funktion weitergegeben.
0x329A5074 Aufruf von [via 0x004A16EA] fclose(0x329DF840)
0x00429443 - c:\programme\codegear\rad studio\6.0\include\dinkumware\fstream#180
0x00402FF1 - c:\programme\codegear\rad studio\6.0\include\dinkumware\fstream#972
0x00402E6D - FileBasic.cpp#26
0x0040621C - FileBasic.cpp#439
0x00407D6B - FileBasic.cpp#896
0x0042217B - FileBasic.cpp#4544
-
Kein schöner Code
Könntest du interessehalber mal versuchen, CodeGuard zu deaktivieren? Ich erinnere mich, daß es ein paar Probleme mit CodeGuard gibt - auch wenn das auf deinen Anwendungsfall nicht zuzutreffen scheint.Jedoch angenommen, daß CodeGuard recht hat (und es hat meistens recht): dann wird etwas an fclose() übergeben, das nicht von fopen() kommt. Du könntest versuchen, den exakten Ursprung des Wertes von fstream::_Myfile in fstream::open() zu verfolgen.
(Btw: die vorcompilierten Header würde ich wieder anschalten, evtl. auch mal den PCH-Wizard benutzen. Das reduziert die Compilierzeiten signifikant, und die PCH-Bugs aus C++Builder 2006 sind mittlerweile fast alle behoben.)
-
Hallo @audacia,
nach einiger Zeit melde ich mich wieder.
Es ist nicht auszuschließen, daß die Sache mit Deinem Hinweis auf CodeGuard in C++Builder 2009 still buggy? => fileptr=_wfopen(filename,L"rb") zu tun haben könnte.
Habe jedenfalls Deinen Vorschlag ausprobiert und unter Projekt->Optionen->C++Compiler->Debuggen->Codeguard aktivieren auf False gesetzt.Ergebnis: Das Programm läuft jetzt, so wie es bereits mit dem BCB6.0 funktioniert hatte, fehlerfrei. Allerdings bleibt ein ungutes Gefühl.
Hoffentlich ändert sich im nächsten Update des Builder2009 bei Codeguard hier noch etwas.
PS: und am Hilfesystem auch!Vielen Dank.
-
thunderbol4 schrieb:
Hoffentlich ändert sich im nächsten Update des Builder2009 bei Codeguard hier noch etwas.
Das wurde verschiedentlich angekündigt.
thunderbol4 schrieb:
PS: und am Hilfesystem auch!
Help Update 1 installiert?