Probleme mit struct tm (tm_mday, tm_mon, tm_year)



  • Ich hab grad scheinbar leichte Probleme bei der Verwendung von struct tm. Ich hoffe mal, dass ich die entscheidenden Parts raus kopiert habe.

    Problem ist, dass ich in einer Funktion eine andere Funktion aufrufe, dieser Funktion dann Integer Werte für Tag, Monat, Jahr und dann ein Element vom Typ struct tm übergebe, damit dort die Werte in das struct eingefügt werden und man in der aufrufenden Funtkion das Datum zur Verfügung hat.

    Das klappt leider absolut nicht. In der aufrufenden Funktion ist das Datum nicht vorhanden. Und in der Funktion, in welcher das Datum erstellt wird, wird mir scheinbar murks ausgegeben.

    Ich fänd es super, falls sich das mal jemand anschauen könnte.

    P.s. Die anderen Werte (hier nicht mit dargestellt, da denke ich irrelevant) werden dem BLUBB struct erfolgreich hinzugefügt. Nur falls das wichtig ist.

    typedef struct tm Datum;
    
    /*[...]*/
    
    struct blubb {
        /*[...]*/
        Datum datum;
    };
    typedef struct blubb BLUBB;
    
    /*[...]*/
    
    void funktion {
        /*[...]*/
        int tag = 30;
        int monat = 9;
        int jahr = 2011;
    
        iniDatum(blubb->datum,tag,monat-1,jahr-1900);
        /*[...]*/
    }
    
    /*[...]*/
    
    void iniDatum(Datum *datum, int tag, int monat, int jahr) {
        datum = (Datum *) calloc(1,sizeof(Datum));
        datum->tm_mday = tag;
        /* Hier gibt er mir datum->tm_mday als 2293516 aus, anstatt als 30. 
        Wenn man zurück zu der Funktion geht, in welcher iniDatum aufgerufen wurde, sind die member (tm_mday & co) überhaupt nicht vorhanden. 
        Versucht man auf diese zuzugreifen, schmiert das Programm ab. */
        printf("Tag: %d\n",datum->tm_mday);
        datum->tm_mon = monat;
        datum->tm_year = jahr;
    }
    


  • da ist alles verkorkst dranne.
    calloc werte tut man mit zeigern abholen, du übergibst aber keinen zeiger.
    wozu willst du überhaupt speicher mit calloc reservieren wenn du schon mit
    Datum datum; speicher besorgst, da ist genug platz für die werte auch ohne calloc.
    außerdem fehlen die runden klammern bei der deklaration von funktion



  • Ja, ok die runden Klammern bei der Funktion hatte ich vergessen. Ist halt ne leicht abgespeckte Version für's Forum. Sorry, dass ich das übersehen habe.

    Speicher mit calloc allokiert habe ich, weil das Programm sonst direkt abgeschmiert ist, wenn...

    datum->tm_mday = tag;

    ...ausgeführt wurde. Mit dem calloc wird es immerhin ausgeführt. Ich war mir nicht sicher, ob man da ein calloc braucht, aber hab es dann testweise probiert, weil es ohne einfach nicht lief.

    Außerdem ist datum in der iniDatum Funktion doch eigentlich sehr wohl ein Zeiger oder nicht? Also übergebe ich ja prinzipiell schon einen Zeiger.

    Aber vom theoretischen Prinzip her wäre es so richtig?
    Also in der einen Funktion die iniDatum Funktion aufrufen, dieser blubb->datum übergeben und zusätzlich tag, monat, jahr, damit diese in blubb->datum eingefügt werden. Oder hab ich da schon nen groben Denkfehler?



  • auzerdem kannst du nicht einfach so

    iniDatum(blubb->datum,tag,monat-1,jahr-1900);
    

    nen datentyp an eine funktion übergeben.
    du brauchst scho ne vairable für

    BLUBB blubber;
    

    die du danne übergebehn tuhst



  • Batman schrieb:

    Aber vom theoretischen Prinzip her wäre es so richtig?

    nein.
    du musst den rückgabewert von calloc in einem zeiger speichern. du übergibst aber keinen zeiger.

    Batman schrieb:

    Oder hab ich da schon nen groben Denkfehler?

    ja.
    siehe oben.



  • Batman schrieb:

    Oder hab ich da schon nen groben Denkfehler?

    Abgesehen von dem, was schon genannt wurde, hast du noch das Problem, dass der Aufrufer von der Erzeugung deiner Struktur mit calloc nichts mitbekommen würde.
    Du musst entweder die erzeugte Struktur aus der Funktion herausgeben,

    Datum* iniDatum(int tag, int monat, int jahr);
    

    Oder einen Zeiger auf einen Zeiger übergeben:

    int iniDatum(Datum** datum, int tag, int monat, int jahr);
    

    Sonst geht der von calloc zurückgegebene Wert verloren.
    Der Rückgabewert int könnte hier z.B. eine erfolgreiche/misslungene Erzeugung signalisieren.



  • Hab es jetzt glaub ich beseitigt bekommen. Trotzdem danke an alle, die was gepostet haben 😉

    Musste nur beim Funktionsaufruf &blubb->datum übergeben, anstatt blubb->datum. So wird mir der Tag korrekt ausgegeben und ist auch in der aufrufenden Funktion nutzbar. Dann konnte auch das calloc ohne Probleme weg.

    Jetzt läuft es einwandfrei.



  • Batman schrieb:

    Hab es jetzt glaub ich beseitigt bekommen. Trotzdem danke an alle, die was gepostet haben 😉

    Musste nur beim Funktionsaufruf &blubb->datum übergeben, anstatt blubb->datum. So wird mir der Tag korrekt ausgegeben und ist auch in der aufrufenden Funktion nutzbar. Dann konnte auch das calloc ohne Probleme weg.

    Jetzt läuft es einwandfrei.

    blubb ist ein Datentyp, das kann so nicht funktionieren.
    Dann kompilierst du etwas anderes, als du uns hier zeigst.



  • Die Bezeichnungen sind leicht anders, ja. Und natürlich ist hier bei weitem nicht der komplette Code. Dass ich nicht einfach den Datentyp nehme, sondern eine Variable vom Datentyp ist schon klar. Dachte, das wäre aus meiner Beschreibung hervor gegangen. Wenn nicht, dann sorry. Wollte es nur nicht mit zu viel (für die iniDatum Funktion irrelevantem) Code unübersichtlich machen.

    Sollte ich nochmal Probleme habe, werde ich mehr Code zeigen oder es besser erklären.


Anmelden zum Antworten