Zeiger auf Strukturen zurückgeben



  • Hallo,

    Da ich in einer Eingabefunktion verhältnismäßig viele Werte einlese und diese in einer weiteren Funktion weiterverarbeiten möchte, versuche ich diese an die weiterverarbeitende Funktion zu übergeben.

    Dazu habe ich gedacht sei es sinnvoll, einen Pointer auf die Struktur zurückzugeben.

    Leider sagt mir mein Visual Studio immer, dass z.B. der Rückgabetyp nicht passt.

    Kann mir jemand sagen, wie ich dieses einfache Problem am besten löse ?

    LG GFX

    struct Datum* input(void) {
    
    	struct Datum {
    
    		int tag;
    		int monat;
    		int jahr;
    	};
    
    	struct Datum datum;
    
    	struct Datum *ptr; 
    
    	ptr = &datum;
    
    	return ptr;
    


  • Du versuchst einen Pointer auf eine lokale Variable zurückzugeben, die mit dem Verlassen der Funktion zerstört wird.
    In C macht man so etwas in etwa so:

    // Header
    typedef struct foo_impl * foo;
    
    foo create_foo();
    void destroy_foo(foo f);
    
    // Source
    struct foo_impl
    {
    	int a, b;	
    };
    
    foo create_foo()
    {
    	foo f = malloc(sizeof(foo_impl));
    	f->a = ...;
    	return f;
    }
    
    void destroy_foo(foo f)
    {
    	free(f);
    }
    

    Analog dazu weitere Funktionen.


  • Mod

    Oder einfacher:

    void get_datum(struct Datum *datum)
    {
      *datum = current_date;
    }
    

    So obliegt die Verantwortung für das Objekt auch beim Aufrufer. Aber da ein struct Datum vermutlich nicht viel mehr kann, als Daten zu speichern, ist der objektorientierte Ansatz hier wohl etwas übertrieben.



  • Oder wenn die struct nicht groß ist:

    struct Datum input(void) {
    
        struct Datum datum;
        ...
        return datum;
    }
    


  • Ich bekomme dabei leider die Fehlermeldung: "...returns incomplete type "Datum"."

    Probiert habe ich es mit folgendem Code:

    struct Datum input(void) {
    
    	struct Datum {
    
    		int tag;
    		int monat;
    		int jahr;
    	};
    
    	struct Datum datum;
    
    	return datum;
    

    Eigentlich möchte ich "einfach nur" mehrere in Funktion a eingegebene Werte in Funktion b weiterverarbeiten.

    Ob das per "Call by value" oder "Call by reference" geschieht, ist mir dabei gerade nicht ganz so wichtig.

    LG GFX



  • Pack die Definition von Datum außerhalb der Funktion.



  • Wenn der folgende Code im Header und nicht in der Funktion steht, dann funktioniert es.

    struct Datum {
    
    		int tag;
    		int monat;
    		int jahr;
    	};
    
    	struct Datum datum;
    

    Damit wäre die Struktur dann aber global definiert oder sehe ich das falsch ??

    LG GFX



  • Der Teil gehört in den Header.
    Zumindest an den Anfang der C-Datei.
    Außerhalb einer Funktion.
    Andere Funktionen sollen doch auch damit arbeiten können.
    Damit gibst du den Aufbau der struct Datum bekannt.

    struct Datum {
    
    		int tag;
    		int monat;
    		int jahr;
    	};
    

    Dieser Teil gehört in eine Funktion.
    Wenn du sie global haben möchtest, dann am Anfang der C-Datei ausserhalb einer Funktion.
    Auf keinen Fall in eine Headerdatei.
    Denn damit legst du die Variable datum an. Es wird Speicher verbraucht.

    struct Datum datum;
    

Anmelden zum Antworten