Zeiger auf Array an Funktion übergeben



  • Das hatten wir vor wenigen Minuten, siehe Post 17:26:51 19.02.2013.



  • Und was ist z.B. mit der Funktion memcpy? Ist die denn so richtig?



  • prinzipiell ja



  • Ich habe mein Programm jetzt angepasst. So wie ihr es vorgegeben habt. Es funktioniert trotzdem nur mit der Übergabe array[0].

    Ich verstehe das nicht.

    typedef struct 
    { 
        int         TLC; 
        uint16_t    LaneCrossing; 
    
    }CANmsgLKABResult; 
    
    int markerLANEside = 1; 
    CANmsgLKABResult currLKABMessage[2]     = {{255, 0},{255, 0}}; 
    
    void ctdCanControl( CCanMessage* canMsg, int newApp ) 
    { 
    
      canMsgToLKABResult(canMsg, &newLKABMessage[1]); 
      isLKABChanged(&newLKABMessage[1],   &currLKABMessage[1]); 
      memcpy( &currLKABMessage[1], &newLKABMessage[1], sizeof( CANmsgLKABResult ) ); 
    
      if(idxSignalChanged[NEW_LANE_TLC]) 
      { 
        ctdCtrlLDW(newApp, &currLKABMessage[markerLANEside]); 
      } 
    
    } 
    
    void isLKABChanged(CANmsgLKABResult* newLKABMessage, CANmsgLKABResult* currLKABMessage) 
    { 
      if (newLKABMessage->TLC != currLKABMessage->TLC) {idxSignalChanged[NEW_LANE_TLC] = ON;} 
            else idxSignalChanged[NEW_LANE_TLC] = OFF; 
    
      if (newLKABMessage->LaneCrossing != currLKABMessage->LaneCrossing) {idxSignalChanged[NEW_LANE_CROSSING] = ON;} 
            else idxSignalChanged[NEW_LANE_CROSSING] = OFF; 
    } 
    
    void ctdCtrlLDW(int app, CANmsgLKABResult* currLKABMessage) 
    { 
      if (idxSignalChanged[NEW_LANE_TLC]) 
      { 
        if(20 == currLKABMessage->TLC) 
        { 
          drawLDWONlane(app, markerLANEside); 
        } 
      idxSignalChanged[NEW_LANE_TLC] = OFF; 
      } 
    }
    


  • Wie wäre es, wenn du ein kompilierfähiges Minimalbeispiel min einer main-Funktion programmierst, dass dein Problem beschreibt und es dann postest wenns nicht laufen sollte? Mit deinem Code lässt sich so nicht allzu viel anfangen.



  • ALso ich programmiere es für eien µC (AVR AT90CAN128). Die Ausgabe erfolgt auf einem Display.

    Also das Problem ist, dass in der Funktion "ctdCtrlLDW" der TLC wert nach übergabe 0 ist. Wenn ich "RIGHT" übergebe. Bei "LEFT" kommt der wert an, den ich auch ins Array geschrieben habe.

    /*
     * GccApplication1.c
     *
     * Created: 19.02.2013 19:17:04
     *  Author: cpa87
     */ 
    
    #include <avr/io.h>
    #include <string.h>
    
    #define LEFT = 0;
    #define RIGHT = 1;
    
    typedef struct
    {
    	int			TLC;
    	uint16_t	LaneCrossing;
    
    }CANmsgLKABResult;
    
    void fillArray(CANmsgLKABResult* newLKABMessage);
    void isLKABChanged(CANmsgLKABResult* newLKABMessage, CANmsgLKABResult* currLKABMessage);
    void ctdCtrlLDW( CANmsgLKABResult* currLKABMessage);
    
    CANmsgLKABResult currLKABMessage[2]		= {{255, 0},{255, 0}};
    CANmsgLKABResult newLKABMessage[2]		= {{255, 0},{255, 0}};
    
    int markerLANEside = 3;
    int idxSignalChanged = 0;
    
    int main(void)
    {
        while(1)
        {		
    		markerLANEside = RIGHT;
    
    		fillArray(&newLKABMessage[markerLANEside]);
    
    		isLKABChanged(&newLKABMessage[markerLANEside], &currLKABMessage[markerLANEside]);
    		memcpy( &currLKABMessage[markerLANEside], &newLKABMessage[markerLANEside], sizeof( CANmsgLKABResult ) );
    
    		if (idxSignalChanged)
    		{
    			ctdCtrlLDW(&currLKABMessage[markerLANEside]);
    		}
        }
    }
    
    void fillArray(CANmsgLKABResult* newLKABMessage)
    {
    	newLKABMessage->TLC = 35;
    }
    
    void ctdCtrlLDW( CANmsgLKABResult* currLKABMessage)
    {			
    	if ((RIGHT == markerLANEside) && (50 > (currLKABMessage->TLC)))
    	{		
    		// irgendeine ausgabe
    	}
    }
    
    void isLKABChanged(CANmsgLKABResult* newLKABMessage, CANmsgLKABResult* currLKABMessage)
    {
    	if (newLKABMessage->TLC != currLKABMessage->TLC) {idxSignalChanged = 1;}
    		else {idxSignalChanged = 0;}
    	if (newLKABMessage->LaneCrossing != currLKABMessage->LaneCrossing) {idxSignalChanged = 1;}
    		else {idxSignalChanged = 0;}
    }
    


  • Guck dir mal deine defines an, das ist vermutlich nicht wirklich das, was du möchtest. Ich tippe eher du willst sowas:

    #define LEFT 0
    #define RIGHT 1
    


  • Oh wieder ein dummer Fehler. Das kommt daher, dass ich es in meinen Originalprogramm in einem enum definiert habe.

    Aber mein Problem bleibt bestehen. Ich habe es auch mit Zahlenwerten statt RIGHT versucht.



  • fillArray(&newLKABMessage[markerLANEside]);
    

    touch too much! 😃



  • Ok 😕

    Leider weiß ich nicht was du meinst? 🙂



  • CANmsgLKABResult newLKABMessage[2]      = {{255, 0},{255, 0}};
    int markerLANEside = 3;
    fillArray(&newLKABMessage[markerLANEside]);
    

    Jetzt vielleicht?



  • Den Inhalt von isLKABChanged würde ich auch noch einmal überdenken.



  • was ist an markerLANEside verkehrt? Also ich initialisiere einmal am Anfang mit irgendeinen Wert und im laufenden Programm kann es sich doch ändern?



  • cpa87 schrieb:

    was ist an markerLANEside verkehrt? Also ich initialisiere einmal am Anfang mit irgendeinen Wert und im laufenden Programm kann es sich doch ändern?

    Ja, da hast du recht.
    Aber, wozu soll das gut sein mit einem Wert zu initialisieren, der die Arraygrenze überschreitet?
    Und wenn dir solche eigenartige Art zu initialisieren zur Gewohnheit wird und sich der Wert dann doch nicht im laufenden Programm ändert? :p



  • Oh man, ich sitze eindeutig zu lange vor dem Bildschirm 🙂 Da hast du natürlich recht. Aber ich versichere, dass ich das in meinem Programm nicht getan habe.

    Ich kann ja den ersten Wert des Array ausgeben. Nur halt den zweiten nicht. Und vor der Übergabe lasse ich den zweiten auch noch mal ausgeben. Dort ist er richtig. Erst nach der Übergabe ist er 0.



  • Du meinst den Wert des ersten Members der Strukur?
    Den änderst du in fillArray, sonst änderst du nix.



  • Nein, nein, ich meinte den ersten Wert des Arrays. Also "newLKABMessage[0]". Den kann ich ausgeben.



  • Ok, ich habe jetzt herausgefunden, dass die Botschaft nicht gefüllt wird nachdem ich die Pointer etc so gemacht habe wie ihr es gesagt habt. newLKABMessage[0] wird befüllt.



  • ...



  • Ich habe den Fehler gefunden. Ich hatte ja die Kurzversion meines Programmes gepostet. Da habe ich die Botschaft richtig gefüllt.

    In meinem originalen Programm habe ich es nicht geändert.

    Dort habe ich die mit

    newLKABMessage[1].TLC = 40; befüllt.

    Das hat nicht geklappt.

    Ich möchte mich wirklich recht herzlich bei für die tolle Unterstützung bedanken. Noch eine Nacht hätte ich nicht überlebt 😛

    Aber eine Frage habe ich noch. Wann genau verwende ich für den Zugriff den "." und wann "->"??

    Nochmals vielen Dank!


Anmelden zum Antworten