Abfrage von Datum und Uhrzeit



  • Hallo Forumianer,

    Ich hänge nun seit fast 2 Wochen an dem Code und komme einfach nicht weiter 😢

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define MAXJAHR 2012
    #define MINJAHR 0
    #define MAXDAY 31
    #define MINDAY 1
    #define MAXMONTH 12
    #define MINMONTH 1
    
    unsigned long diff()
    {
        time_t now;
        time (&now);
        printf("\n*******************************************");
        printf("\nS 1970  : %ld\n", now);            //RICHTIG!!!
        now = now / 86400; // umrechnen in Tage
        printf("t 1970 : %ld\n", now);               //RICHTIG!!!
        now = now + 709200; // 1970 Jahre dazufügen in Tagen
        printf("t total: %ld\n", now);               //RICHTIG!!!
        return now;
    }
    
    long convertToDays(long dTag,long dMonat,long dJahr)
    {
        // Umrechnen der Eingabe in Tage
        long zahl = dTag;
        zahl = zahl+ dMonat * 30;
        zahl = zahl + dJahr * 360;
        return zahl;
    }
    
    int main(int argc, char *argv[])
    {
    
    // Variabeln
        long datum, oTag, oWoche, oMonat, oJahr, age, between;
        int dTag, dMonat, dJahr;
        char name[20] = "null";
    
        time_t jetztSec;
        time_t gebDatumSec;
        struct tm* jetzt;
        struct tm* gebDatum;
    
    // Frage nach Name
        printf("Bitte geben sie Ihren Namen ein: ");
        scanf("%s", name);
        printf("Hallo ");
        printf("%s\n", name);
    
    // Frage nach Geburtsdatum
        printf("Wann bist du geboren ?\n\n");
    // Abfrage für Tag
        printf("Tag: ");
        scanf("%i", &dTag);
    // Validierung
        while (dTag<MINDAY || dTag>MAXDAY)
        {
            printf("Bitte geben sie eine Zahl zwischen 1 und 31 ein!\n");
            scanf("%d", &dTag);
        }
    // Abfrage für Monat
        printf("\nMonat: ");
        scanf("%i", &dMonat);
    // Validierung
        while (dMonat<MINMONTH || dMonat>MAXMONTH)
        {
            printf("Bitte geben sie eine Zahl zwischen 1 und 12 ein!\n");
            scanf("%i", &dMonat);
        }
    // Abfrage nach Jahr
        printf("\nJahr: ");
        scanf("%i", &dJahr);
    // Validierung
        while (dJahr<MINJAHR || dJahr>MAXJAHR)
        {
            printf("Bitte geben sie eine Zahl zwischen 0 und 2012 ein!\n");
            scanf("%d", &dJahr);
        }
    
        time ( &jetztSec );
    
        // Geburtsdatum als Struct TM
        gebDatum = localtime ( &jetztSec );
    
        gebDatum->tm_year = dJahr - 1900;
        gebDatum->tm_mon = dMonat - 1;
        gebDatum->tm_mday = dTag;
        gebDatumSec = mktime(gebDatum);
    
        // Jetzt als Struct TM
    
        jetzt = localtime ( &jetztSec );
        oJahr = jetzt->tm_year - gebDatum->tm_year;
        oMonat = jetzt->tm_mon - gebDatum->tm_mon;
        oTag = jetzt->tm_mday - gebDatum->tm_mday;
        printf("Test: %d", jetzt->tm_year);
    
    // Ausgabe des Geburtsdatums
        printf("\n\nDein Geburtsdatum: %02d.%02d.%04d\n", dTag, dMonat, dJahr);
        printf("TEST: %d" ,gebDatum->tm_year);
    // Aufrufen der Funktionen
    //    datum = convertToDays(dTag, dMonat, dJahr); //Tage bis eingegebenes Datum
    //    age = diff(datum);                          //Tage bis Heute
    // Überprüfen
        printf("\nTage bis INPUT: %ld", datum);
        printf("\nTage bis heute: %ld", age);
    
        between = age - datum; // Berechnen der Differenz
        printf("\nDifferenz    : %ld", between);
        printf("\n*******************************************\n");
    
    // Umwandeln
        printf("Dein Alter in:");
        printf("\n-Tagen:   %ld", between);
        printf("\n-Monaten: %ld", between / 30);
        printf("\n-Jahren:  %ld\n", between / 360);
    
    // Ausgabe
    
        /*
            printf("Dein Alter in:\n -Tagen %d \n", &oTag );
            printf("-Wochen %d", &oWoche);
            printf("-Monaten %d", &oMonat);
            printf("-Jahren %d", &oJahr);
        */
    
        system("PAUSE");
        return 0;
    }
    

    Ich hoffe, das meir einer sagen kann wie ich die Ausgabe per Strukt_tm machen kann und so diff und ConvertToDays weglassen kann 😉

    Liebe grüsse

    CGFH



  • localtime gibt eine zeiger auf eine static variable zurück (reserviert keinen speicher mit malloc) d.h.
    beim zweiten aufruf wird der gleich zeiger zurückgegeben wie beim ersten
    also wird beim zweiten Aufruf *gebDatum verändert.

    wenn ich es richtig sehe kannst du gebDatum einfach als struct tm definieren und entsprechende änderungen machen, dann sollte es so funktionieren wie du möchtest



  • So bekomme ich eine Fehlermeldung ;/

    X:\Users\#####\Desktop\Altersrechner\V.0.2\main.c|96|Fehler: unverträgliche Typen bei Zuweisung an Typ »struct tm« von Typ »struct tm *«|

    Oder kann ich das mit strftime ausgeben ?



  • Warum machst du überhaupt

    gebDatum = localtime ( &jetztSec );
    

    du nutzt das ergebnis sowiso nicht
    darauf beruht mein vorschlag

    du solltest dich mit Zeigern und Speicher auseinandersetzen

    edit: und die manpages lesen da steht alles drin



  • Ich würde das ganze am Schluss gerne in Tagen, Monaten und Jahren ausgeben, sowie alles zusammen.

    Langsam frustet es, ich sitze jetzt seit 14 Tagen 8h am Tag drann ohne nennenswerte Erfolge ;P



  • wo ist das problem

    // http://www.cplusplus.com/reference/ctime/tm/
    
    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
    	struct tm datum = {0};
    	int tag = 21, monat = 11, jahr = 1990; // geburtstag, simulierte eingabe
    
    	char* wochentag[] = { "Sonntag", "Montag",
                           "Dienstag", "Mittwoch",
                           "Donnerstag", "Freitag", "Samstag"};
    
    	datum.tm_year = jahr - 1900; // tm_year years since 1900 
    	datum.tm_mon = monat - 1;	// tm_mon months since January 0-11 
    	datum.tm_mday = tag; 		// tm_mday day of the month 1-31 
    
    	mktime ( &datum );
    	printf ("Du wurdest an einem %s geboren\n", wochentag[datum.tm_wday]);
    	return 0;
    }
    

Anmelden zum Antworten