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.c

    COH_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)


Anmelden zum Antworten