ich kriegs nicht gebacken einfache if bedingung klappt nicht :( warum?



  • hi

    ich steh irgendwie auf dem schlauch wieso klappt diese einfach if bedingung nicht so wie ich will:

    int getdate (datum *p)
    {
    	static int tageimmonat[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    	int tag=0,monat=0,jahr=0;
    
    	printf("\nTag:    ");
    	scanf("%d",&tag);
    
    	if (tag<1||tag>31)
    	{
    		printf("tag fehler");
    		return (0);
    	}
    
    	printf("\nMonat:    ");
    	scanf("%d",&monat);
    
    	if (monat<1||monat>12||tag>tageimmonat[monat])
    	{
    		return(0);
    	}
    
    	printf("\nJahr:     ");
    	scanf("%d",&jahr);
    
    	if (jahr<1||(!isleapyear(jahr)&&tag>28&&monat==2))
    	{
                      printf("fehler jahr");
    		return (0);
    	}
    
    	p->tag=tag;
    	p->monat=monat;
    	p->jahr=jahr;
    
    	return(1);
    }
    

    so zeihl ist es ein datum einzulesen und gleich zu prüfen ob das ein gültiges datum ist. im großen und ganzen klappt das auch ausser wenn eben kein schaltjahr ist und der tag 29 ist und egal welcher monat springt er in die if bedingung also liefert er true.

    aber wieso ich raff es nicht. 😡

    also es geht um die if bedingung mit dem jahr.

    ich hoffe mir kann jemand helfen und ich hoffe der fehler ist nicht alzu offensichtlich 🙂

    mfg david

    ps: bitte nicht über die printf und scanf aufregen ich bin anfänger

    pss: wieso gibt er eigentlich auch nicht den text "fehler jahr" aus? er springt gleich zurück in die main aber wieso?



  • Trantüte schrieb:

    so zeihl ist es ein datum einzulesen und gleich zu prüfen ob das ein gültiges datum ist. im großen und ganzen klappt das auch ausser wenn eben kein schaltjahr ist und der tag 29 ist und egal welcher monat springt er in die if bedingung

    Trantüte schrieb:

    pss: wieso gibt er eigentlich auch nicht den text "fehler jahr" aus?

    Wenn "fehler jahr" nicht ausgegeben wird, dann wird auch nicht in den if-Block gesprungen.

    Trantüte schrieb:

    also liefert er true

    Wer oder was liefert denn hier true? Ich sehe kein bool.

    Mir scheint, dass dein Ablauf korrekt ist. Hast du schon mal jahr geprüft? Vielleicht ist das ja kleiner 1.



  • Ich glaube, in deinem Fall wäre die Funktion isleapyear interessant. Bei mir arbeitet das Programm tadellos.
    Noch ein Tipp: Wenn du sowieso nur 0 und 1 zurückgibst, würde es auch ein bool-Typ tuen, statt einem int (1 Byte gegen 4 Byte).
    Gruß

    FH



  • FH schrieb:

    Noch ein Tipp: Wenn du sowieso nur 0 und 1 zurückgibst, würde es auch ein bool-Typ tuen, statt einem int (1 Byte gegen 4 Byte).

    Der Standard schreibt nicht vor, wie gross bool oder int ist. Dein Beobachtung ist eine reine compilerabhängige Momentaufnahme.



  • ((signed, unsigned char)), bool = 1 Byte
    wchar_t = 2 Byte
    (unsigned) int = 2 oder 4 Byte
    short int = 2 Byte
    (unsigned) long int = 4 Byte

    So soll es laut Standard sein. Das es auf die Maschine ankommt ist klar (16 oder 32 Bit).

    Wenn sich die Compiler nicht daran halten dann sind sie nicht Standardkonform.
    Zumindest laut meiner aktuellen Tabelle.

    Was sein soll und was Tatsache ist .....



  • der standard schreibt keine größen fest, er sagt das eher so:

    char=1<=bool<=short<=wchar_t<=int<=long



  • Neun schrieb:

    Wenn sich die Compiler nicht daran halten dann sind sie nicht Standardkonform.
    Zumindest laut meiner aktuellen Tabelle.

    Am besten, du schmeisst deine Tabelle weg. Der Standard definiert folgendes
    char = 1 byte <= short <= int <= long

    Alles andere ist implementationsspezifisch. Allerdings müssen bool und wchar_t integrale Typen sein. Dh, bool und wchar_t müssen einem der oben aufgeführten Typen entsprechen.



  • hau mich tot 😃 jetzt klappt es

    war ein ganz blöder fehler.

    das programm bestannd aus 2 quelldateien und beim compilieren (erster versuch) habe ich erst die eine datei zuerst eingeben dann die andere. dann hab ich den fehler in der if bedingung festgestellt und ihn abgeändert (das was ich hier gepostet hab war schon die richtige version).

    dann hab ich die sache nochmals compiliert allerdings diesmal die dateien in dem compilierbefehl vertauscht so das er dann nicht die exe datei ersetzt hat sondern eine zweite mit dem namen der anderen datei angefertigt.

    leider habe ich beim test dann immer die alte exe datei aufgerufen und demzufolge war der alte fehler immer noch da :). echt dämlich.

    ich frag mich so was schon mal jemand anderen passiert ist.

    mfg david

    und sry das ich euch damit belästigt hab 😉



  • Trantüte schrieb:

    ich frag mich so was schon mal jemand anderen passiert ist.

    ja.
    sogar mehrmals. (immer im abstand von >1 jahr)



  • öfter mal compilieren! (und clearen!) 🕶



  • @wächter na dann bin ich ja beruhigt 🙂


Anmelden zum Antworten