Vertändnnis Problem
-
Hallo ich weis das ist ganz einfach doch ich sehe den Wald vor laute Bäumen nicht.Ich versuche gerade ein Programm zu verstehen.Darin ist folgende Funktion
int ReturnCheck(COH_MessageType *MessagePtr) { int Status =0; if (MessagePtr.bit.ReturnStatus!=NORMAL) { if(MessagePtr.bit.ReturnStatus==STARTUP) { Status = UP; } else if(MessagePtr.bit.ReturnStatus==NIT) { Status = INIT; } else { Status = ERROR ; } } return = Status; }
Ich verstehe die Funktion. Aber mein Code ist unvollständig wie wurde der Funktionsaufruf in der Main zu dieser Funktion aussehen und müste da noch was deklariert werden?
-
Wie man eine Funktion aufruft, sollte eigentlich Grundwissen sein
COH_MessageType msg; //andere Funktionen aufrufen, um msg mit Inhalten zu füllen int check=ReturnCheck(&msg);
PS: Bist du sicher, daß das compiliert? Um die Struktur-Elemente hinter einem Zeiger zu erreichen, muß man diesen erstmal dereferenzieren.
-
Sorry ich mach gerade neben der Schule ein Parktikum und habe noch nicht so viel gelesen. Was meinst du mit dereferenzieren?
-
C_Anfänger schrieb:
Was meinst du mit dereferenzieren?
Ein Pointer ist nur die Adresse einer Variablen - und "dereferenzieren" bedeutet, den Wert hinter dieser Adresse zu holen (das geht mit
*MessagePtr
bzw.MessagePtr->bit
- wobei letzteres gleich einen Elementzugriff darstellt)
-
MessagePtr ist ein Zeiger (wegen dem * in COH_MessageType *MessagePtr)
Mit MessagePtr sprichst du den Zeiger an und mit *MessagePtr den Inhalt. Der Zeiger wird dereferenziert.
Das COH_MessageType ist hier aber ein struct (wegen der . in MessagePtr.bit.ReturnStatus) und da wird nicht mit * sondern mit -> dereferenziert.
Da structs in einem C-Buch/Kurs i.A. erst nach Funktionsaufrufen und Zeigern kommen, solltest du dein Buch mal von vorne anfangen zu lesen und nicht mittendrin.
-
Würde das ganze dann so ausssehen?
Main.cCOH_MessageType msg; //Hier ist irgend welcher Code MainSCI(&msg);
SCI.c
MainSCI(COH_MessageType *MessagePtr) { //Hier ist irgend ein Code int ReturnCheck(*MessagePtr); } int ReturnCheck(COH_MessageType **MessagePtr) { int Status =0; if (MessagePtr->bit.ReturnStatus!=NORMAL) { if(MessagePtr->bit.ReturnStatus==STARTUP) { Status = UP; } else if(MessagePtr->bit.ReturnStatus==NIT) { Status = INIT; } else { Status = ERROR ; } } return = Status; }
-
Wozu brauchst du denn jetzt Doppel-Pointer? Du solltest dich am besten nochmal mit den Grundlagen von C (Pointer, Funktionsaufrufe, etc) beschäftigen, bevor du so etwas umzusetzen versuchst.
(nebenbei: mit dem "*MessagePtr" in der MainSCI bekommst du nichts, was für die ReturnCheck() verwertbar wäre - und den Doppel-Pointer in dieser Funktion müsstest du auch doppelt dereferenzieren)