return struct



  • meinst du das ?

    void tu_was(VECTOR v ); // prototyp
    
    //aufruf
    
    int r = 1, g = 2, b =3;
    tu_was(VECTOR(r,g,b));
    

    Kurt



  • Nein das, funktioniert bei mir leider nicht. ich bräuchte schon eine Funktione die VECTOR zurückliefern kann.

    Ich hab es so probiert und das geht auch (mehr oder weniger)

    VECTOR *ToVec(int R,int G,int B)
    {
    VECTOR vec = {_VAR(B),_VAR(G),_VAR(R)}; // _VAR konvertiert int in var
    return &vec;
    }
    

    Jedoch kann ich diese Funktion nur ein mal Aufrufen, da sie danach immer das selbe zurückliefert (das Ergebniss vom ersten Aufruf)



  • Hallo

    du brachst keine weitere Funktion drumherum

    VECTOR test = VECTOR(1,2,3);
    

    bis bald
    akari



  • Ich habe den Veracht hier hat sich jemand im Forum vertan und will eigentlich C programmieren.



  • So geht's auch nicht. Wenn ToVec() beendet ist ist der zurückgegebene VECTOR * ungültig.
    könntest es so machen

    VECTOR *ToVec(int R,int G,int B)
    {
        return new VECTOR(R,G,B);
    }
    

    Frage mich nur wozu du eine Konvertierungs funktion brauchst wenn du einen constructor hast.
    warum nicht einfach

    VECTOR * pv = new VECTOR( R,G,B);
       ....
       delete pv;
    

    Kurt
    EDIT: Heute bin ich wirklich langsam. 10min zu spät



  • VECTOR test = ToVec(10,10,10);
    funktioniert, aber die Funktion die ich aufrufen möchte muss ich mit z.B.
    testfunktion(&test);
    aufrufen. Warum funzt dann
    testfunktion(&ToVec(10,10,10));
    nicht, wenn ich die Funktion so schreibe:

    VECTOR ToVec(int R,int G,int B){
    VECTOR vec = {_VAR(B),_VAR(G),_VAR(R)};
    return vec;
    }

    Danke



  • Hallo

    weil du die Speicheradresse auf eine lokale Variable (die die in der Funktion ToVec zurückgegeben wird) außerhalb der Lebenszeit dieser verwenden willst. Und damit erzeugst du undefiniertes Verhalten.
    Wenn du wirklich auf deine (mit Konstruktor unnötige) ToVec-Funktion bestehst, must du mit Pointern wie von ZuK beschrieben arbeitet. Darfst dann aber nicht vergessen, dann selber den mit new reservierten Speicher nach der Benutzung der Instanz wieder freizugeben.

    Edit : Bitte benutzt Code-Tags, um in deinem Posts hier im Forum deinen Quellcode zu formatieren. Zu finden beim Post-Schreiben gleich unter den Smilis.

    bis bald
    akari



  • Danke jetzt funktionierts. Ich hab das ganze erst vollkommen falsch verstanden, aber jetzt ist mir alles klar.
    PS: Wie kann ich den Speicher wieder freigeben?

    Danke



  • Hallo

    mit delete. Bitte schau dir mal die Grundlagen in einem Tutorial an, zum Beispiel hier.

    bis bald
    akari



  • Ok, jetzt weiß ich wie ich den Speicher wieder freigeben kann, jedoch ist mir nicht ganz klar, wann ich das machen soll. Ich habe jetzt das hier:

    VECTOR ToVec(int R, int G, int B)
    {
        R = (int)((float)R * CompRV(R));
        G = (int)((float)G * CompGV(G));
        B = (int)((float)B * CompBV(B));
        return new VECTOR(_VAR(B),_VAR(G),_VAR(R));
    }
    
    void Linie(int x1, int y1, int x2, int y2)
    {
        draw_line(_VAR(x1),_VAR(y1),_VAR(x2),_VAR(y2),ToVec(255,128,0));
    }
    

    Wann bzw. wo soll ich denn nun delete aufrufen, und was genau soll ich wieder freigeben, ich hab ja hier keine Variable die ich wie z.b. hier einfach so freigeben kann.

    int* i=new int;
    int j=7;
    i=&j;
    delete i;
    


  • Bernhardt schrieb:

    Wann bzw. wo soll ich denn nun delete aufrufen

    delete rufst du für den Zeiger auf, der den Return-Wert von ToVec() speichert. Wann? Dann wenn du den dynamisch erstellten Vektor nicht mehr brauchst.

    Beispiel:

    int* create(int x) 
    { 
        return new int(x); 
    }
    
    ...
    
    int main()
    {
         int* value = create(9);
    
         // arbeite mit value... Zeiger darf nicht "umgebogen" werden!
    
         delete value; // Speicher, der in create() alloziert wurde, wieder freigeben.
    }
    

    Gruß Caipi



  • Ok, danke



  • Rein interessehalber, was kann passieren wenn man den mit new reservierten Speicherbereich nicht wieder freigibt?
    Und wird dieser Bereich dann beim Beenden des Programmes automatisch wieder freigegeben (oder schon früher).

    MfG 😕



  • IWanTtOkNOw schrieb:

    Rein interessehalber, was kann passieren wenn man den mit new reservierten Speicherbereich nicht wieder freigibt?

    Moderne Betriebssysteme geben den Speicher nach Beendigung deines Programms wieder frei, wenn du es nicht tust. Allerdings sollte man sich nicht darauf verlassen.


Anmelden zum Antworten