intrinsic



  • Bei MSVC++ gibt es den Schalter Oi (Intrinsic-Funktionen generieren). Damit konnte ich gezielt einen Laufzeitfehler, der beim Schließen des Programms auftrat, ausschalten. Ich denke, dass es etwas mit der Funktion abs(...) zu schaffen hat. Bei der Debug-Version gibt es aber immer noch eine Fehlermeldung (assert), da man dort keine Optimierung einschalten kann. Kann das jemand erklären? 😕



  • Kannst Du mal ein Programm zeigen, das den Fehler demonstriert?



  • Ich bin nicht völlig sicher, dass der Fehler dort begraben ist, aber ich setze auf abs(...):

    void move_figur(position pos) 
    		{ 
    			DXUtil_Timer(TIMER_GETELAPSEDTIME);
    			int ziel_x = pos.x - NETTOBREITE / SCALEFACTOR / 2 ; 
    			int ziel_y = pos.y - NETTOHOEHE  / SCALEFACTOR / 2 ; 
    			int x,y,dx,dy,dxcalc,delta_x,delta_y;
    
    			do
    			{
    				timediff = DXUtil_Timer(TIMER_GETELAPSEDTIME);
    
    				dx = (ziel_x - pFigur->getPos().x);
    				dy = (ziel_y - pFigur->getPos().y);
    
    				/* macht noch im Standard RT-ERROR // intrinsic-Funktionen generieren (/Oi), dann geht es! */
    				dxcalc = dx;
    				if( ( dxcalc > -2 ) && ( dxcalc < 2 ) ) dxcalc = 1;
    
    				double m = double(dy)/double(dxcalc); //Steigung
    				delta_x = int( pFigur->getSpeed() * timediff / sqrt( (m * m) + 1 ) );
    
    				if(delta_x==0) delta_x = 1;
    				delta_y = abs( int( m * delta_x ) );
    
    				if (delta_x>abs(dx)) delta_x = abs(dx); // Verhindert Überschießen 
    				if (delta_y>abs(dy)) delta_y = abs(dy);
    
    				if(dx>=0)	x = pFigur->getPos().x + delta_x;
    				else 		x = pFigur->getPos().x - delta_x;
    				if(dy>=0)	y = pFigur->getPos().y + delta_y;
    				else		y = pFigur->getPos().y - delta_y;
    
    				show_figur( x, y );
    				SendMessage( g_mainwindow, WM_PAINT, 0, 0 ); // Nicht PostMessage!
    			}
    			while( (abs(ziel_x - x) > 5) || (abs(ziel_y - y) > 5) );
    		}
    


  • Wie kommst du darauf, dass es was mit intrinsic oder abs() zu tun hat?

    Dass der Fehler bei Setzen der Option "verschwindet" muß nicht heißen, dass das was mit dem Fehler zu tun hat. Vielleicht hast du irgendwo einen Pointer, der auf eine "falsche" Adresse zeigt. Je nach Compileroption liegt nun an der Stelle die eine oder andere Variable und erzeugt den einen oder den anderen Fehler, der entweder sichtbar ist oder nicht.



  • In der Debug-Version findet sich folgender Hinweis:

    Debug Assertion Failed!
    ...
    _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
    ...

    Wie finde ich die Stelle, an der der Fehler liegt?



  • da musst du im debug modus jede Zeile durchgehen (Haltepunkte setzen) und so die Zeile herausbekommen, wann der Fehler auftritt. Oder beim Assertionfeld auf Debug klicken und dann die Aufrufliste anschauen. Die sagt oft viel drüber aus, wio der Fehler ist



  • "Oder beim Assertionfeld auf Debug klicken und dann die Aufrufliste anschauen."
    Wie geht das genau?



  • Hast du vielleicht irgendwo ein delete wo du eine delete[] machen müsstest?



  • optymyzer schrieb:

    "Oder beim Assertionfeld auf Debug klicken und dann die Aufrufliste anschauen."
    Wie geht das genau?

    Wer lesen kann, ist klar im Vorteil. Press retry to debug the application. 🙄



  • Aufrufliste? 😕



  • Hallo,

    Aufrufliste (aka "call stack"):

    Menü Ansicht -> Debug-Fenster -> Aufrufliste 😉

    MfG


Anmelden zum Antworten