Header-Dateien - struct - Anfänger ist verwirrt



  • Hallo,

    wie im Titel zu erkennen bin ich noch blutfrischer Anfänger.

    Als Aufgabe sollten wir eine Datenbank für eine Arztpraxis schreiben, mit der später durch andere Funktionen einzelne Patienten ermittelt werden.

    Ich habe die Grundzüge von Header-Dateien verstanden, aber bei meiner Aufgabe bringen sie mir nicht wirklich was.
    Gibt es eine gute Internetseite, die das sehr umfassend erklärt oder ähnliches?

    Mein Versuch:
    db.h

    #ifndef DB_H_
    #define DB_H_
    
    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 {
    				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;
    
    extern struct patient patienten_db[100];
    
    //Lädt Datenbank
    
    void initialize_db();
    
    #endif /* DB_H_ */
    

    db.c

    #include "db.h"
    #include <string.h>
    
    struct patient patienten_db[100];
    
    void initialize_db(){
    	//Pateint #1
    	strcpy(patienten_db[0].name, "Mueller");
    	strcpy(patienten_db[0].vorname, "Hans");
    	patienten_db[0].geschlecht = 'm';
    	patienten_db[0].gewicht_kg = 80;
    	patienten_db[0].koerpergroesse_cm = 185;
    	strcpy(patienten_db[0].test.man.letzte_lymphunters, "00.00.0000");
    
    }
    

    Die anderen Funktionen erspare ich euch, da die eigentlich nichts mit dem Hauptproblem zu tun haben.

    Aufgabe ist es eine Datenbank + Interface mit verschiedenden Auswahlmodien (jede führt eine neue Funktion aus).
    Es soll ein struct erstellt werden mit einem union (möglichst "Speichersparend") von dem ein patienten_db[100] erzeugt wird.

    Die Patientendaten werden so, wie beim Mueller Hans manuell eingeben.

    Problem:
    -bei db.c werden die einzelnen Variablen, nach dem Punktoperator (z.B.: name, vorname, alter, etc..) mit einem Field could not be resolved.

    Wäre echt jedem dankbar, der mir helfen kann und mir eventuell sogar was zu Header-Dateien geben kann, damit ich sie noch besser verstehe.

    mfg werdas34



  • Du hast eine anonyme struct den Namen patient gegeben (durch das typedef)
    Anonym, da hinter dem struct kein Bezeichner steht.

    Den Ausdruck struct patient gibt es nicht. patient dagegen schon (ohne struct)

    weiblich und maennlich sind benannte structs.

    Lass in db.h in Zeile 26 und Zeile 6 in db.c das struct weg.


  • Mod

    Dein Problem hat nichts mit Headern zu tun, du hast schlicht deine structs falsch bezeichnet. Es gibt bei dir keinen Typen 'struct patient'. Es gibt bei dir ein typedef 'patient', welches ein Alias für ein namenloses struct ist, dass du in den Zeilen 16-24 von db.h definiert hast.

    Mögliche Abhilfen:
    -Nenn es immer 'patient', statt 'struct patient'. Das ist schließlich die vermutliche Absicht hinter dem Typedef, dass du das so machen möchtest.
    -Schrei in Zeile 16 ' typedef struct patient { '. Dann hast du beides, sowohl ein 'struct patient', als auch einen Alias 'patient' dafür und kannst nutzen, was immer du möchtest.



  • Gewöhne dir gleich mal die globalen Variablen ab.



  • Danke euch zweien.

    Nun hätte ich eine Frage, aber weiß nicht ob ich sie als eigenen Thread eröffnen soll. (Baut auf das struct auf.)
    Deshalb verschiebt den Thread/gibt mir Bescheid, damit ich es beim nächsten mal besser weiß.

    Ich soll eine Funktion schreiben, die angibt welche Patienten schwanger sind.
    Da stoß ich auf Schwierigkeiten:

    void identify_pregnant() {
        struct patient *p;
    
        p = patienten_db;
        while (p - patienten_db < patient_size) {
            if (p->test == woman) { // ???
               if (p->test.woman.schwangerschaft == 'j') { 
                   printf("%s, %s", p.name, p.vorname);
               }
            }
            p++;
        }
    }
    

    Ich weiß nicht wie ich sicherstellen kann, dass mein Programm nur in die if-Anweisung reingeht, sobald es sich um eine Frau handelt.
    Wie geht man da vor bzw wie löst man das geschickt?

    Danke
    werdas34



  • Suche dir den struct -Member, der das Geschlecht angibt.
    Und den überprüfst du dann.



  • DirkB schrieb:

    Suche dir den struct -Member, der das Geschlecht angibt.
    Und den überprüfst du dann.

    So war mein Gedankengang auch, nur die Frage ist mit was prüfe ich das?
    Was muss auf der anderen Seite der "Gleichung" stehen? patient.geschlecht.woman == ???
    Oder funktioniert das so: patient.geschlecht.woman == patient.geschlecht.woman ?



  • Wo gibt es denn den Member .geschlecht.woman ?

    Was steht denn in deinem Eröffnungspost in db.c in Zeile 13?



  • DirkB schrieb:

    Wo gibt es denn den Member .geschlecht.woman ?

    Was steht denn in deinem Eröffnungspost in db.c in Zeile 13?

    Das war nur ein Beispiel, um es besser zu verdeutlichen.
    Aber danke. Jetzt habe ich verstanden was du meintest.
    Ich prüfe .geschlecht == 'w'!

    Vielen Dank



  • eigentlich schreibt man da sowas:

    #define GENDER_UNKNOWN 1
    #define GENDER_MALE 2
    #define GENDER_FEMALE 3
    #define GENDER_BOTH 4
    #define GENDER_TRANS_FROM_MALE_TO_FEMALE 5
    #define GENDER_TRANS_FROM_FEMALE_TO_MALE 6
    

    und vergleicht dann etwa so:

    if(geschlecht == GENDER_FEMALE)
    {
         //mach was!
    }
    

    das ist übersichtlicher.



  • Wade1234 schrieb:

    eigentlich schreibt man da sowas:

    #define GENDER_UNKNOWN 1
    #define GENDER_MALE 2
    #define GENDER_FEMALE 3
    #define GENDER_BOTH 4
    #define GENDER_TRANS_FROM_MALE_TO_FEMALE 5
    #define GENDER_TRANS_FROM_FEMALE_TO_MALE 6
    

    Eigentlich nimmt man dafür enum.


Anmelden zum Antworten