warum warning C4172 ?



  • das stimmt ja nun nicht.

    denn wenn ich das so schreibe:

    float    FPS=0.0f;
        float    prevSecond=0.0f;
    
        char *GetFPS()
        {
            float nextSecond = 0.0f;
            char titleBar[50] = {0};
    
            FPS++;
    
            nextSecond = GetTickCount() * 0.001f;                
    
            if(nextSecond - prevSecond > 1.0f)
            {
                prevSecond = nextSecond;
                FPS = 0.0;
            }
            sprintf(titleBar, "Frames: %d FPS", int(FPS));
    
            return titleBar; // warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben
        }
    
    Print(20,50,(char*)GetFPS()); // position x=20, y=50, Text
    

    dann habe ich sehr wohl eine ausgabe



  • Durch beenden der Funktion verlässt du den Scope in dem alle in der Funktion lokalen Variablen definiert sind. Also werden diese zerstört. Das im Speicher möglicherweise immernoch das selbe steht, wie vorher hat damit nichts zu tun. Beim nächsten anlegen einer Variable wird der Teil aber höchst wahrscheinlich überschreiben.



  • yo, könntest recht haben bzw. hast es 😉

    aber andere frage .. ist das der richtige weg FPS zu messen?

    main
    {
      while(blabla)
      {
        Print(20,50,(char*)GetFPS()); // stimmt die GetFPS funktion?
      }
    }
    


  • das war doch unsinn was du sagtest. 😮
    nach dem return wird dir variable zerstört und nicht beim/vor return!
    ich weiss garnet wie ich dazu kam dir nur nen funken lang recht einzuräumen 😛

    deiner aussage nach wären ja solche funktionen falsch

    int Wert()
    {
    int i;
    return i;
    }

    diese funktionen sind aber wohl völlig ok, oder ich soll von stuhl fallen 🤡



  • helium hat schon recht...
    der stack wird abgeräumt nachdem die funktion beendet ist... wenn sie den in deinem beispiel i zurückgeliefert hat wird der stack abgeräumt und alle lokalen variablen der funktion sind damit futsch...

    wenn du ne zuweisung gemacht hast x=Wert(); dann hast du zwar den inhalt den i hatte in x gespeichert und damit den wert gerettet das ändert aber nichts daran das die variable trotzdem nicht mehr existiert...



  • ja klar werden die variablen die lokal in funktion angelegt wurden zerstört aber das return übergibt den wert sauber vorher über.

    ich peil nicht mal was der zusatz sollte, da das nirgends was mit meinem problem zu tun hatte.

    mein satz ausm ersten post
    "dazu kommt das ich keine ausgabe sehe." bezog sich das er irgendwie nicht in die if reinkam .. wie man sieht hat das mit der variable selber nichts zu tun.



  • naja problem bei der übergabe ist halt wenn du einen pointer zurücklieferst, der auf einen speicherbereich zeigt der dir dann nicht mehr gehört... weil dieser speicher ja nach verlassen der funktion freigegeben wird, wenn du ihn erst innhalb der funktion angelegt hast. das hat dir ja helium auch schon versucht zu erklären( dies würde nicht gelten wenn du malloc verwendet hättest...)
    in dem fall hast du dann zwar die adresse des speicherbereichs der noch gültig war als du dich innerhalb der funktion befandest, aber ausserhalb der funktion nützt dir die ja nichts mehr...

    der hintergedanke dabei ist der folgende könnte man den funktionen arrays übergeben bzw sie zurückliefern lassen müsste jedesmal der komplette speicher kopiert werden (wäre also langsam und nicht gerade ressourcenschonend) deshalb werden keine arrays übergeben sondern pointer.. wenn du nun die adresse von einem array hast das gar nicht mehr existiert bringt dir das nicht wirklich viel
    jetzt klarer?



  • char *IntTostr(int zahl)
    {
    char konv[10];
    sprintf(konv,"%d",zahl);
    return konv;
    }
    
    ausgabe(IntToStr(5));
    

    das geht also nicht? weil der zeiger auf konv zerstört ist bevor in ausgabe(); genutzt werden kann? wie muss ich das dann machen? ich mein in cbuilder gibts ja die funktion und ich übergebe ihr nur eine zahl.



  • da gibts eingentlich nur zwei möglichkeiten
    entweder allokierst du den speicher innerhalb deiner funktion dynamisch... also mit malloc....

    oder du übergibst deiner funktion einen pointer auf ein array was du ausserhalb dieser funktion angelegt hast, weil das existiert ja auch noch nach dem ende der funktion...

    naja dritte möglichkeit wäre vielleicht noch die ausgabe innerhalb der funktion zu machen aber das kommt ja vermutlich nicht in frage



  • Also ich würde titlebar als Parameter an die Funktion übergeben und fertig.

    Zum eigentlichen Problem:
    Der "Fehler" kann ja eigentlich nur an GetTickCount() liegen. Was liefert diese Funktion wann zurück?


Anmelden zum Antworten