Compiler
-
while(bearbeiteteWoerter+1==0==false && Error==0 )
Oh je, setz da mal Klammern! Wie meinst du es denn? So?
while(((bearbeiteteWoerter+1)==0)==false && Error==0 )
Dann kannst du auch gleich
!=
benutzen.Es ist irgendwie nicht sehr schön, dass bearbeiteteWoerter rückwärts läuft und unter 0 sinken kann. Der Bezeichner sagt irgendwie was anderes aus.
-
_matze schrieb:
Es ist irgendwie nicht sehr schön, dass bearbeiteteWoerter rückwärts läuft und unter 0 sinken kann. Der Bezeichner sagt irgendwie was anderes aus.
jop ich weis,hatte ganz vergessen das man zahlen von rechts nach links schreibt :D.
mir ist der fehler erst beim 1 testlauf aufgefallen, hab dann einfach die schleife rückwärts laufen lassen_matze schrieb:
Dann kannst du auch gleich != benutzen.
joar hatte anfangs gedacht das der fehler vielleicht das ungleich wäre, hab dann es mit einem false ausgetauscht
_matze schrieb:
Oh je, setz da mal Klammern! Wie meinst du es denn? So?
jop, hab jetzt wieder das ungleich eingebaut
while((bearbeiteteWoerter+1)!=0 && Error==0 )
aber die schleife tut dadurch immernoch nicht
-
Tufelix schrieb:
aber die schleife tut dadurch immernoch nicht
Dann nutze den Debugger! Die Schleife wird sicher verlassen, wenn die Bedingung nicht mehr erfüllt ist. Darauf kannst du dich verlassen. Aber nicht auf deinen Code. Den musst du überprüfen. Und das geht am einfachsten mit dem Debugger. Schau dir an, welche Werte deine Variablen wirklich zur Laufzeit haben und warum die Schleife nicht verlassen wird.
-
also der fehler tritt auf wenn bearbeitetewoerter der wert -1 hat und der debugger bei dem schleifenanfang ist wenn man dann einen schritt macht kommt die fehlermeldung
Schleifenanfang:
while(bearbeiteteWoerter!=-1 && Error==0 )
-
fehlermeldung:
Unbehandelte Ausnahme bei 0x7c812afb in Editor.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x0012f144..
-
Wenn
bearbeiteteWoerter==0
ist, machst du noch einen Schleifendurchlauf. In dem dekrementierst dubearbeiteteWoerter
dann eventuell (es ist also -1) und greifst aufWoerter[bearbeiteteWoerter]
, alsoWoerter[-1]
zu. Das kann ja nicht funktionieren. Du solltest deinen Ablauf überdenken.Ach ja, und sowas
bearbeiteteWoerter<0==false
ist natürlich sehr ungewöhnlich formuliert. Wieso nicht einfach so?
bearbeiteteWoerter>=0
-
nun ich hab mir ein neuer code überlegt aber der will auch wieder nicht tun
das gleiche problem wie beim anderem codestring vergleicheWort(vector<string> &Woerter ,vector<tSprache> &Sprache) { string Binärcode; unsigned int c=0; unsigned int Ende=0; int Error=0; int HEX=0; unsigned int gr=Woerter.size()-1; while(Ende==0 && Error==0 ) { if("HEX"==Woerter[gr].substr(0,3)){ Binärcode=Binärcode+HEXA(Woerter[gr].substr(3,Woerter[gr].size()-1)); if(gr!=0){ gr--;} else{ Ende=1;} } while(Sprache[c].Name!=Woerter[gr] && Ende==0 && c<Sprache.size() && Error==0){ c++; } if(c>=Sprache.size()){ Error=1; SetColor(13); cout << "Fehler Befehl konnte nicht gefunden werden:"<<endl; SetColor(15); cout<<"Befehl:"; SetColor(12); cout<<Woerter[gr]<<endl; SetColor(15); cout<<"Zeile:"; SetColor(12); cout<<Zeilenanz<<endl; SetColor(15); } if(Error==0){ if(Sprache[c].Name==Woerter[gr] && Ende==0 && c<Sprache.size() ){ if(gr!=0){ gr--;} else{ Ende=1;} Binärcode=Binärcode+Sprache[c].Binärcode; c=0; } } } return Binärcode; }
-
Hast du mal versucht, den Fehler mit dem Debugger zu finden?
-
nartürlich, wie gesagt es ist das gleiche wie mit dem anderen code.
bzw:Tufelix schrieb:
also der fehler tritt auf wenn bearbeitetewoerter der wert -1 hat und der debugger bei dem schleifenanfang ist wenn man dann einen schritt macht kommt die fehlermeldung
nur das es die variable Ende ist und das sie den wert 1 hat.
hier mal die fehlermeldungUnbehandelte Ausnahme bei 0x7c812afb in Editor.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x0012f144..
ich hab jetzt ein wenig rumprobiert und hab dann den code so umgebaut das wenn die variable gr den wert 1 hat, die schleife beendet wird also das das erste wort im vector weggelassen wird.Nun der Code hat komischerweise funktionier.kann es also sein das es vielleicht an dem vector woerter liegt?
-
Es liegt sicher nicht an der Variablen Ende (in welcher Zeile kracht es denn? Schau dir mal die Zeile darüber an). Einer der std::vector wird das Problem sein. Mit "Fehler finden per Debugger" meine ich eigentlich nicht unbedingt, es krachen lassen und dann schauen, sondern mal am Anfang (oder an kritischen Stellen) einen Haltepunkt setzen, Zeile für Zeile das Programm durchlaufen lassen und überprüfen, ob der Ablauf und alle Werte wirklich so sind, wie sie sein sollen.
-
oho, hab jetzt mal auch bei return Binärcode einen haltepunkt gesetzt und hab gemerkt das doch die schleife stoppt und das return einen richtigen binärcode zurückliefert. Hab dann die funktion BinärtoHexa überprüft und da ist dann der fehler aufgetreten.Danach ist mir erst aufgefallen das der eingelesen satz des testcode wenn man in mit der sprache übersetzt 13 binärzalen ergeben und daraus lässt sich keine hexazahl machen. Also danke _Matze das du mir so weitergeholfen hast
Nun ich glaube mein problem ist gelöst. Jetzt muss ich nurnoch eine funktion einbauen die leere zeilen überspringt und dann ist der übersetzer fertig.
-
Tufelix schrieb:
Also danke _Matze das du mir so weitergeholfen hast
Genaugenommen hast du dir ja selbst geholfen. Wenn man sich erst mal an den Debugger gewöhnt und dessen Möglichkeiten nutzt (du kennst vermutlich noch gar nicht solch nützliche Dinge wie Datenhaltepunkte), sind die meisten Fehler recht schnell gefunden. Anfänger versuchen es leider allzu oft mit der Methode "auf den Code starren und darauf warten, dass sich der Fehler von selbst zeigt".
-
Anfänger versuchen es leider allzu oft mit der Methode "auf den Code starren und darauf warten, dass sich der Fehler von selbst zeigt".
Nun ich hab das früher anders gemacht ,da hab ich an bestimmten stellen der schleife cout befehle mit einem text oder ne variable eingefügt und daduch konnte ich in dem consolenfenster sehen wo gerade der debugger in der schleife stand und wie die werte in der variablen sind.
-
Tufelix schrieb:
Anfänger versuchen es leider allzu oft mit der Methode "auf den Code starren und darauf warten, dass sich der Fehler von selbst zeigt".
Nun ich hab das früher anders gemacht ,da hab ich an bestimmten stellen der schleife cout befehle mit einem text oder ne variable eingefügt und daduch konnte ich in dem consolenfenster sehen wo gerade der debugger in der schleife stand und wie die werte in der variablen sind.
Ja, das geht auch. Aber viele Features des Debuggers sind so nicht nutzbar. Ich mache sowas nur, wenn ich keine Entwicklungsumgebung auf dem Zielrechner habe (und kein Remote-Debugging möglich ist).