Seltsam - Rückgabewert wird von int zu uint



  • Hallo Forumsbesucher,

    eine seltsame Sache treibt mich in die Verzweiflung. Ich habe gerade eine Konsolenanwendung kurz vor der Abgabe und wollte nur noch die errorlevels "aufräumen", die zurückgegeben werden sollen, aber das Ganze funzt nicht.

    int blah(void)
    {
    	return -2;
    }
    
    int main(int argc, char *argv[])
    {
    	int status = 0;
    	status = blah();
    	if (status >= 0)
    	{
    		// domore
    	}
    	else
    		return status;
    
    	return 0;
    }
    

    Also Fehler sollten durch negative Zahlen, einfaches OK durch 0 und Zusatzinfos durch positive Zahlen zurückgegeben werden. Leider wird status beim Vergleich als unsigned int interpretiert (aus -2 wird $FFFF'FFFE immer >0) und nicht als Zweierkomplement, deswegen wird trotz provoziertem Fehler weitergemacht (domore).

    Darf ich nun ernsthaft den Compiler hinterfragen oder soll ich mir den "Trottel des Tages"- Orden umhängen 😕

    EDIT: Trottel der Stunde gehört mir schon, Typen vergessen



  • #include <stdio.h>
    
    int blah(void)
    {
        return -2;
    }
    
    int main(int argc, char *argv[])
    {
        int status = 0;
        status = blah();
        if (status >= 0)
        {
            printf("domore\n");
        }
        else
            printf("do NO more\n");
    
        return 0;
    }
    

    gibt bei mir erwartungsgemäß: do NO more



  • Belli schrieb:

    #include <stdio.h>
    
    int blah(void)
    {
        return -2;
    }
    
    int main(int argc, char *argv[])
    {
        int status = 0;
        status = blah();
        if (status >= 0)
        {
            printf("domore\n");
        }
        else
            printf("do NO more\n");
    
        return 0;
    }
    

    gibt bei mir erwartungsgemäß: do NO more

    Bei mir auch kommt auch erwartungsgemäß "do NO more".

    @pointercrash: Probier mal das:

    signed int blah(void) {
      return -2;
    }
    


  • Dasselbe richtige Ergebnis.



  • Ravendark schrieb:

    signed int blah(void) {
      return -2;
    }
    

    Hatte ich auch schon probiert, aber leider vergessen, das anzuführen ... nee, bei mir bleibt's bei "domore" - mit unguten Folgen 😞 .



  • c-mässig sieht's ok aus. welcher compiler isses denn?
    🙂



  • +fricky schrieb:

    c-mässig sieht's ok aus. welcher compiler isses denn?
    🙂

    Pelles C - ich durchsuche gerade das Forum dazu.



  • pointercrash() schrieb:

    +fricky schrieb:

    c-mässig sieht's ok aus. welcher compiler isses denn?

    Pelles C

    der macht sowas nicht. erstell mal ein neues projekt und kopier den code rein, den du hier gepostet hat. der fehler muss irgendwo anders sein.
    🙂



  • +fricky schrieb:

    erstell mal ein neues projekt und kopier den code rein, den du hier gepostet hat. der fehler muss irgendwo anders sein.

    Yep, der Spuk ist jetzt vorbei.
    Ich hab' erstmal den abgespeckten Code reingesetzt und als das geklappt hat, das Projekt neu gebaut, jetzt ist der Vergleich wieder vorzeichenbehaftet und funzt 😃 ... an "bösen" Extra- features mußte ich nur die MS- Extensions zuschalten wg. einer statischen Lib, die nicht von mir ist.

    Weiß der Geier, was da passiert ist ... immerhin dürfte ich das jetzt fertigkriegen *aufseufz*


Anmelden zum Antworten