Funktionsweise beim Erstellen eines Release bei Visual C++
-
Hallo,
ich arbeite an einem Programm mit Visual C++, welches eine Exceldatei mit einer Textdatei im .dat vergleicht.
Das Programm funktioniert im Debug-Modus einwandfrei, doch wenn ich eine Release-EXE erstelle, dann kommen immer Fehler.
Genau erklären kann ich das leider nicht, darum meine Frage, ob jmd. weiß, wo ich nachlesen kann, wie die Release-Erstellung funktioniert, damit ich weiß, warum er diesen Fehler machen könnte.
Ich kann das Problem ja mal grob umreißen.
Im Excel gibt es eine Zelle:
projFwElementeVorZielgleis(siFsFw):
projFwLage(zA):
projFwRichtung(zA):
projFwFmElementeVorZielgleis(zA):
projFwAufloesendeElemente(zA):
projTeilFwFlsElemente(zA),Die Werte in Klammern werden ausgelesen, damit die Parameter in der .dat einfacher verglichen werden können.
Im Code sieht das ungefähr so aus:
in elem. strElementKlasse werden die Werte in den Klammern gespeichert, das mit "zA" hab ich jetzt rausgelassen, weil der Fehler bei dem "siFsFw" auftritt.CString CScanStdRTDlg::GetTGFlexData(CVplKonfig &elem,tTGFlexElemente Fstr,tTGFlexElemente DWeg,tTGFlexElemente *FahrwegArray) { if(elem.strElementKlasse =="") { if(Fstr.m_Eigenschaften[0]!="") ret = gibTGFlexProj(Fstr,elem.strSICASParameter); else if (DWeg.m_Eigenschaften[0]!="") ret = gibTGFlexProj(DWeg,elem.strSICASParameter); else AfxMessageBox("offene Klasse 1", MB_OK); } else if(elem.strElementKlasse == "siFsFw") // Element aus Fahrweg { for(int ArrayZaehl = 0;ArrayZaehl<10;ArrayZaehl++) { if(FahrwegArray[ArrayZaehl].nAnzahlFahrwege) { if(ret.GetLength() > 0) ret += ";"; // mit semikolon für die weiterverarbeitung trennen ret += gibTGFlexProj(FahrwegArray[ArrayZaehl],elem.strSICASParameter); } else // thk : wenn keine Fahrweg vorhanden kann abgebrochen werden { break; } } } else { CString msg; msg.Format("offene Klasse 2 : %s",elem.strElementKlasse); // AfxMessageBox(msg, MB_OK); } ret.Replace("'",""); ret.Replace(")(",";"); return ret; }Wie gesagt, normal im Code-Fenster bei der Ausführung mit F5 geht alles ohne Probleme.
Mit der Exe kommt dann ein PopUp mit folgendem Fehler:offene Klasse 2 : siFsFw
projFwLagezA
projFwRichtungzA
projFwFmElementeVorZielgleiszA
projFwAufloesendeElementezA
projTeilFwFlsElementezADa alle Parameter darin vorkommen, müssten die ja irgendwo zusammengefügt werden, was aber im Code nicht gemacht wird...
Darum denke ich, dass beim Erstellen des Release irgendwo was falsch läuft, aber ich finde nicht raus wo, da die Codeumgebung ohne Probleme geht.Vielleicht hatte jmd. schonmal so ein Problem oder weiß, wo ich nachlesen kann.
MfG,
Thorsten
-
Tupamann schrieb:
Mit der Exe kommt dann ein PopUp mit folgendem Fehler:
offene Klasse 2 : siFsFw
...Wenn diese Zeile aus deiner Funktion stammt, stimmt irgendwas mit deinen Bedingungen nicht (mit der Elementklasse "siFsFw" solltest du eigentlich im zweiten Arbeitszweig landen). Was für einen Typ hat denn CVplConfig::strElementKlasse (hoffentlich nicht char*)?
-
Hallo,
nein, strElementKlasse ist ein CString.
Wie kann ich denn überprüfen, wie die Variablen beladen werden, wenn ich die Release Exe starte...im Code kann man ja die StopPoints setzen, gibt es die Möglichkeit auch mit der Exe, dass ich sehen kann, was in die Variable reingeschrieben wird und der dann da den Fehler hat?
-
In meiner Signatur findest du einen Link zu meinen Artikeln im Magazin.
Da ist einer zum Debuggen dabei und da drin ist ein ganzes Kapitel (14) zum Debuggen einer Releaseversion und ein Link zu einer guten Beschreibung der Stolperfallen.
-
Danke für die Hilfe.
Es ist wirklich gut, dass einem hier so schnell und kompetent geholfen wird.Das Problem ist gelöst und lag nicht am Quellcode.
Es lag daran, dass die Exe durch eine Ini-Datei beladen wird und das Problem war, dass der Pfad der Ini komplett in die Ausführung mit reingeschrieben werden muss, da aber beide im selben Ordner liegen, dachte ich, es reicht der Dateiname mit .\ davor...
Naja, wieder einen halben Arbeitstag an einem kleinen Fehler gesessen^^. Rückwärtssuchen ist leider nicht immer leicht, besonders wenn viel davor passiert ist.Ich habe den kompletten Pfad integriert und jetzt geht es.
Vielen Dank nochmal,
Thorsten