[C] Nested Structures

byte_head

Captain
Registriert
Jan. 2005
Beiträge
3.674
Hi,

ich habe ein struct in einem struct (nested structures), aber ich kann nicht darauf zugreifen?

struct.struct.variable geht nicht aber struct->struct->variable auch nicht. :(

Wenn es nur um eine Struktur geht funktioniert nur struct->variable nicht die "." Variante funktioniert hier nicht.

Code:
reminder.c:100: error: invalid type argument of '->'

Mit dem Code stimmt alles, Freund von mir hat auch schon drübergeschaut es geht nur darum. :(
Hoffe mir kann jemand helfen.

mfg, byte
 
Der Unteschied zwischen dem . und dem -> Operator kennst du?
-> bei Zeigern und . wenn man halt direkt auf das Objekt zugreifen kann.

Wie sieht nun deine Struktur aus auf die du zugreifen willst?
 
Zuletzt bearbeitet:
Mit dem Code stimmt alles, Freund von mir hat auch schon drübergeschaut es geht nur darum.
Hier musste ich doch wieder herzlich lachen. Du behauptest also korrekten Code geschrieben zu haben, aber der Compiler will es nicht übersetzen.

Ich gebe dir einen Rat: Gehe einfach davon aus, dein Compiler wurde von Leuten entwickelt, die dafür bezahlt werden und die extrem hohe Anforderungen an die Qualität ihres Produktes stellen. Ausgiebige Tests aller möglichen Anwendungsfälle der Programmiersprache die damit übersetzt werden soll stehen bei solchen Firmen auf der Tagesordnung. Mir selbst sind in 15 Jahren professioneller SW-Entwicklung erst zwei wirkliche Compiler-Bugs begegnet. Du kannst also nahezu immer davon ausgehen, dass der Fehler in deinem Code liegt und nicht beim Compiler.

Bei deinem Problem würde ich dir ja gerne behilflich sein, aber da du leider keine einzige Zeile deines Quellcodes postest, tu ich mich bei der Fehlersuche etwas schwer. Deine Fragestellung klingt für mich wie: "Mein Auto fährt nicht, aber am Auto kann's nicht liegen, das hat ein Kumpel von mir schon gecheckt. Wer kann mir helfen?"

Poste bitte deinen Code und dein Problem wird gelöst.

j o e
 
Hi,

ja so war das nicht gemeint ist mir schon klar das der Compiler nicht den Fehler macht, dachte nur vielleicht ist mein Compiler falsch eingestellt oder irgendwas an der IDE. (die ist Geany btw)
Hier die Funktion und das global definierte struct.

Code:
struct rem {
    struct tm calender;
    char heading[MAX1];
    char description[MAX2];
    time_t sdate_s;
    char sdate[MAX2];
    time_t ldate_s;
    char ldate[MAX2];
} tasks[50];




void writetask(struct rem *datasatz)
{
    char buffer[10];

    printf("\nUeberschrift > ");
    fgets(datasatz->heading, MAX1, stdin);
    printf("\nBeschreibung > ");
    fgets(datasatz->description, MAX2, stdin);
    printf("\nBis wann zu erledigen?\n");
    time(&datasatz->ldate_s);
    struct tm *structpointer;
    structpointer=localtime(&datasatz->ldate_s);
    
    printf("Heute?  (j/n) >");
    fgets(buffer, 1, stdin);

    if(buffer[0]=='n')
    {
        printf("\nTag eingeben (Zahl) >");
        fgets(datasatz->calender->tm_day, 2, stdin);
        //continue;
    }

    printf("\nStunde? > ");
    fgets(datasatz->calender->tm_hour, 2, stdin);

    printf("\nMinute? > ");
    fgets(datasatz->calender->tm_min, 2, stdin);

    starttime(&tasks[counter]);
    endtime(&tasks[counter]);
}

Vielen Dank. :)
 
So wird die Sache schon klarer. Ich hab mir das mal angeschaut, benutze allerdings VC++ als IDE. Wie es aussieht, hast du gleich mehrere Fehler gleichzeitig gemacht.

Ich gehe mal davon aus, dass die Definition der Struktur tm bei beiden IDEs die gleiche ist. Insofern gibt es in der Zeile

fgets(datasatz->calender->tm_day, 2, stdin);

kein Element tm_day, sondern nur tm_mday, tm_yday oder tm_wday.

Desweiteren müssten die drei Aufrufe von fgets wie folgt aussehen:

fgets(datasatz->calender.tm_mday, 2, stdin);
fgets(datasatz->calender.tm_hour, 2, stdin);
fgets(datasatz->calender.tm_min, 2, stdin);

Zumindest meldet bei mit der Compiler dann keinen Fehler mehr beim Zugriff auf die inneren Strukturelemente.

Als drittes schau dir mal die Definition von fgets an. Als erster Parameter wird dort nämlich ein char* erwartet und nicht wie in deiem Code ein int. Bei mir meldet der Compiler da nämlich auch Fehler.

j o e
 
Okay, vielen Dank Joe. :)

Wie mache ich das jetzt mit dem Rückgabewert?
Soll ich eine andere Funktion verwenden?
Ich habe gehört man kann soetwas "casten" aber wie ich das mit fgets machen soll weiss ich nicht. :freak:

Sonst bekomme ich keine Fehler mehr. :)

thx & lg, byte
 
Wie mache ich das jetzt mit dem Rückgabewert?
Soll ich eine andere Funktion verwenden?
Für eine saubere Implementierung wirst du um etwas mehr Aufwand an dieser Stelle nicht rumkommen. Mit Hilfen von fgets kannst du die Zeichen der Tastatureingabe in einen Puffer einlesen, z.B.

Code:
char buffer[10];     // hast du ja bereits definiert
.
.
.
fgets(buffer, 2, stdin);

anschließend musst du den String der jetzt in buffer steht in einen binären Integer umwandeln z.B. mit atoi.

Code:
datasatz->calender.tm_mday = atoi(buffer);

Ich empfehle dir in dem Zusammenhang in jedem Fall noch zu prüfen, ob die eingegebenen Werte auch sinnvoll sind, sonst hast du evtl. später bei der Weiterverarbeitung Probleme wenn ein Datum mit ungültigen Werten eingegeben wurde (z.B. 65.34.2007).

j o e
 
Zurück
Oben