Zeiger auf Array an Funktion übergeben
-
Dann hätte doch eine funktionieren müssen.
Das dachte ich auch
Hmm, da bin ich mir halt nicht sicher. Also ich habe ja auch schon in Büchern etc. gelesen. Aber es gelten ja andere Vorschriften für normale Variablen als für Arrays. Ich sehe den Wald vor lauter Bäumen nicht mehr.
Also wo sollte ich das Array denn am besten indizieren? Im Funktionsaufruf oder in der Funktion selbst? Und welche Pointer Arithmetik verwende ich wann?
-
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.
-
...