Kuriose Ausgabe eines struct-union-Typ



  • Hallo,

    ich habe eine kleine Datenbank programmiert mit struct und union.
    Dazu auch Funktionen. Die alle funktionieren bis auf zwei. Da gibt er Sachen aus die im Code nicht vorkommen.

    struct-union Typ

    struct weiblich {
    	char letzte_Brustuntersuchung[10];
    	char schwangerschaft;
    };
    struct maennlich {
    	char letzte_lymphunters[10];
    };
    union m_or_w{
    	struct weiblich woman;
    	struct maennlich man;
    };
    
    typedef struct patient {
    				char name[31];
    				char vorname[31];
    				unsigned short alter;
    				char geschlecht;
    				unsigned short gewicht_kg;
    				unsigned short koerpergroesse_cm;
    				union m_or_w test;
    }patient;
    

    Funktion 1:

    void no_investigate() {
    
    	struct patient *p;
    
        p = patienten_db;
        while (p - patienten_db < patient_size) {
        	if(strcmp(p->test.man.letzte_lymphunters, "00.00.0000") == 0){
                printf("%s, %s\n", p->name, p->vorname);
        	}
        	if(strcmp(p->test.woman.letzte_Brustuntersuchung, "00.00.0000") == 0 ){
                printf("%s, %s\n", p->name, p->vorname);
        	}
        	p++;
        	}
        }
    

    00.00.0000 ist bei mir die Defintion von man hatte keine Voruntersuchung.
    Wenn ich meine Datenbank durchlaufen lasse, sollten mir zwei Einträge geliefert werden. Einer von einem männlichem Patienten (Mueller, Hans) , der andere Eintrag von einem weiblichem Patienten (Vogel, Karen).
    Ausgegeben wird:

    Mueller, Hans
    Mueller, Hans
    

    Warum wird Muller Hans zweimal ausgegeben und Vogel Karen gar nicht? Liegt es am union? Kenn ich mich da nicht so aus.

    Funktion 2:

    void firstname(char* name){
    	struct patient *p;
    
        p = patienten_db;
        while (p - patienten_db < patient_size) {
        	if(strcmp(p->name, name) == 0){
        		printf("%c, %d Jahre",p->geschlecht, p->alter);
        		printf("\n%s, %s", p->name, p->vorname);
        		printf("\n%d cm, %d kg", p->koerpergroesse_cm, p->gewicht_kg);
    
        		if(p->geschlecht == 'm'){
        		printf("\n%s Letzte Untersuchung", p->test.man.letzte_lymphunters);
        		}
        		if(p->geschlecht == 'w'){
            	printf("\n%s Letzte Untersuchung, Schwanger: %c", p->test.woman.letzte_Brustuntersuchung, p->test.woman.schwangerschaft);
        		}
        		break;
        	}
        	p++;
        }
    }
    

    Dort wird bei Eingabe des Nachnamens, alles, was über die Person gespeichert wurde, ausgegeben.
    Bei Männern funktioniert dies.
    Bei Frauen kommt in der letzten Zeile folgendes:

    [...]
    00.00.0000j Letzte Untersuchung, Schwanger: j
    

    Nach dem 00.00.0000 kommt das j, obwohl es eigentlich erst wie es auch geschieht bei Schwanger ausgegeben werden soll.
    Liegt das erneut am union bzw struct?

    Vielen Dank für Hilfe.
    mfg werdas34



  • Funktion1:
    Bei einer union wird derselbe Speicherbereich benutzt.
    Damit haben man.letzte_lymphunters und woman.letzte_Brustuntersuchung denselben Inhalt

    Darum kommt der doppelte Inhalt aus demselben Schleifendurchlauf.

    Funktion2:
    Deine Arrays sind mit 10 Zeichen zu klein, für deine Art der Datumsangabe.

    Darum kommmt bei Funktion1 auch keine Frau, weil das Datum nicht übereinstimmt.


Log in to reply