[size] CXX0030: Error: expression cannot be evaluated



  • Hi Leute,
    in dem folgenden Codeabschnitt eines Schachprogramms soll der beste Nachfolgezug von 'node' zurückgegeben werden, dazu wird der Spielbaum 'tree' und der Knoten 'node' übergeben.

    Wenn ich am Ende der Funktion in den Speicher gucke, sieht der folgendermaßen aus:

    http://www11.pic-upload.de/04.06.14/zvy5yh2zk8.jpg

    Völlig sinnlose Werte. Mal davon abgesehen, dass hier nciht ersichtlich ist was die 2 aufgerufenen Funktionen veranstallten, müssten wenigstens in der "end"-Variable die zugewiesenen Werte stehen, da die Variable nach dem initialisieren überhaupt nciht mehr angefasst wird, aber auch das ist nciht der Fall 😕

    Das seltsame ist auch, dass im Debugmodus genau das drin steht was auch drin stehen soll, aber im Realasemodus eben dieser Müll. Woran könnte das liegen? Außerdem hab ich vor auftreten des Fehlers überhaupt nichts an dieser Funktion verändert, sie hat immer tadellos funktioniert. Wenn ich mir im Speicher angucken will, was in "tree" oder "node" steht, erhalte ich die Fehlermeldung [size] CXX0030: Error: expression cannot be evaluated.

    Zu meiner Verwirrung beitragen tut auch die Tatsache, dass obwohl ich mir den Speicherinhalt von "node" nciht angucken kann, die Funktion sehr wohl in der Lage ist, den Bereich der Nachfolgeknoten daraus zu bestimmen. (von 340 bis 359) und auch die zurückgegebene Liste der Nachfolgeknoten ist richtig, also scheint auch ein vernünftiger Zugriff auf tree möglich zu sein.🙄

    //gibt den besten Nachfolgezug für 'node' zurück
    Cmove find_best_postmove(vector<Cmove> &tree, Cmove &node){
    	Cmove best;			//bester Zug
    	vector<int> range;	//speichert den Bereich der Nachfolgezüge
    	vector<Cmove> list;	//speichert alle Nachfolgezüge
    
    	Cmove end = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //Nullknoten
    
    	range = range_of_postmoves(tree, node); //speichert den Bereich der Nachfolgezüge von 'node'
    
    	//gebe 'end' zurück, falls keine Nachfolgeknoten im Baum gefunden
    	assert(range[1]>=range[0]);
    	if(range[0] == 0 && range[1] == 0) //keine Nachfolgeknoten gefunden
    		return end;
    
    	//speichert gefunden Züge in 'list'
    	for(int i=range[0]; i<=range[1]; i++)
    		list.push_back(tree[i]);
    
    	//findet den besten Zug in der Liste heraus
    	best = best_move_in_list(list);
    
    	return best;
    }
    

    Würd mich sehr freuen, wenn mir jmd helfen könnte. LG


  • Mod

    Zeig uns:
    -range_of_postmoves
    -best_move_in_list (ich würde hier den Fehler vermuten, aber zeig uns auch die andere Funktion)

    Guck dir dringend auch mal das Konzept der const-correctness an und setze es um! Ja, das wird sehr viel Arbeit machen, einen nicht const-correcten Code zu korrigieren, da ein einziges const ansteckend wirkt. Aber das ist es wert! Denn dann müssten wir uns hier nicht jede kleine nebenfunktion ansehen, sondern könnten uns auf wenige mögliche Fehlerquellen beschränken. So aber kann der Fehler überall sein, da du list und node an uns unbekannte Funktionen übergibst, von denen ich mal annehme, dass sie ebenfalls nicht const-correct sind. Und in diesen Funktionen geht dann wahrscheinlich das gleiche Spiel weiter.
    Da du hier Hilfe möchtest, ist diese Hilfe zur Selbsthilfe ein sehr guter Anfang und du solltest dies nicht verwerfen, weil es dir zu viel Arbeit ist. Es kann sehr gut sein, dass du dabei den Fehler schon selber findest oder zumindest die Ursache soweit einkreisen kannst, dass wir den Fehler schnell finden können.

    Weiterhin bietet deine Implementierung bestimmt auch einen Debugmodus für die STL an. Da du die STL nutzt ( 👍 ) kannst du den auch nutzen! Das ist MSVC? Du kannst beispielsweise zusätzliche Prüfungen für Iteratoren aktivieren (funktioniert auch im Releasemodus!):
    http://msdn.microsoft.com/en-us/library/aa985982.aspx

    Höchstwahrscheinlich ist das aber irgendein anderer Fehler. Etwas, bei dem du dich da drauf verlässt, dass es mit 0 initialisiert wird, aber dem gar nicht so ist.



  • Danke erstmal, ich hab mich in const-correctness etwas eingelesen und werd das in Zukunft berücksichtigen.

    Zum Code: Die Funktion macht jetzt genau das was sie soll und liefert eine vernünftige BS ausgabe... Aber vielleicht nur zufällig.

    Ein Fehler war erstmal, dass tatsächlich die best_move_in_list() Funktion eine ref zurück gibt, anstatt per value. Wenn ich allerdings das Programm in Zeile 7 stoppe und in den Speicher gucke, stehen in "end" ganz andere Werte als die, mit denen ich "end" initialisiere. Wie kann sowas sein? Wenn ich einer Variable einen Wert zuweise muss sie den doch annehmen? 🙄

    Ich habe das Problem jetzt so gelöst, dass ich von der übergeordneten Funktion überprüfen lasse ob es weitere Nachfolgeknoten gibt. Aber ich würd trotzdem gern wissen, wieso die initialisierung in Zeile 7 nciht klappe, das ist mir vollkommen unklar. Außerdem soll mir der Code in Zukunft nciht auf die Füße fallen.

    LG



  • Ok hab grad rausgefunden, dass mi nur der Debugger was falsches anzeigt. Wenn ich mir den Speicher in Zeile 9 ausgeben lasse, seh ich das die initialisierung funktioniert;) Also alles gut. Vielen Dank

    LG



  • Wenn du das Programm in Zeile 7 stoppst, ist das die Zeile die als nächstes ausgeführt wird. Deine Initialisierung hat also noch nicht stattgefunden und der Debugger zeigt nichts falsches an.


Anmelden zum Antworten