Pointer Frage

Gast #4046279
Lesenswert?

Hallo Leute,

ich hab da mal ne Frage.

Der gezielte Aufbau ist vereinfacht so:

ich habe ein struct:
1
struct smsg
2
{
3
 uint8_t id;
4
 uint8_t data[8];
5

6
 struct smsg *next = NULL;
7
}

die aufrufende Funktion in der main schaut ca. so aus:
1
struct smsg canmsg1, canmsg2;
2
canmsg1.next = &canmsg2;
3

4
while(1)
5
{
6
 hol_dir_die_can_msgs(&canmsg1);
7
}

Und hier kommt meine 1. Frage:
Ich will jetzt aus dem CANMSG Register die Botschaften holen und in das 
Array speichern. Iwie funktioniert das aber nicht, ich glaub ich hab da 
nen Knoten im Kopf...
1
void hol_dir_die_can_msgs(struct smsg *pcandata)
2
{
3
 struct smsg *ptemp = pcandata;
4
 // IDs holen und unter ptemp->id speichern
5
 // Das selbe mitm DLC
6
 
7
 for(mob = 0; mob < MAXRXMOBS; mob++)
8
  if(MOBNOTBUSY) // entspricht MSG empfangen
9
  {
10
   for(uint8_t i = 0; i < ptemp->dlc; i++)
11
    *(ptemp->data)++ = CANMSG;
12
  }
13
 ptemt->next = ptemp;
14
 }
15
 // MOB wieder aktivieren
16
}


Hat jemand ne Ahnung, iwie sitz ich grad voll aufm Schlauch...
#4046289
Lesenswert?

Pointe schrieb:
> *(ptemp->data)++ = CANMSG;

Diese Zeile stimmt nicht. Wenn schon dann:
1
*(ptemp->data++) = CANMSG;
Aber das ginge auch nur wenn ptemp->data kein Array ist. Oder man kann 
die Klammern auch weglassen weil Dereferenzierung niedrigere Priorität 
als Post-Increment hat. Ich würde aber einfach
1
ptemp->data[i] = CANMSG;
schreiben, da das deutlich übersichtlicher ist.
Gast #4046305
Lesenswert?

Sebastian V. O. schrieb:
> Pointe schrieb:
>> *(ptemp->data)++ = CANMSG;
>
> Diese Zeile stimmt nicht.

Da war ich mir auch sicher


>Wenn schon dann:
>
1
*(ptemp->data++) = CANMSG;
> Aber das ginge auch nur wenn ptemp->data kein Array ist.

Ach du unheilige...da hab ich vollkommen falsch gedacht...ich hatte in 
nem ersten Versuch den Datenblock als ne 64bit Int deklariert und wollt 
die dann hochhangeln...vielen Dank...


Sebastian V. O. schrieb:
>Oder man kann
> die Klammern auch weglassen weil Dereferenzierung niedrigere Priorität
> als Post-Increment hat. Ich würde aber einfach
>
1
ptemp->data[i] = CANMSG;
> schreiben, da das deutlich übersichtlicher ist.

An das einfachste denk ich natürlich nicht...nochmal Danke!


Peter II schrieb:
> kann es sein das dein echter code anders aussieht?
>
>
1
> ptemp->dlc
2
>
>
> gibt es doch gar nicht in der struct.

Korrekt das ist zusammengeschrieben um nicht mit dem anderen Zeugs zu 
verwirren. Der DLC ist natürlich im echten Code noch im struct. Sorry 
für die Verwirrung.


Peter II schrieb:
>
1
> struct smsg *next = NULL;
2
>
>
> das dürfte auch nicht funktionieren.

Wieso sollte das nicht funktionieren?
Das ist einfach eine Liste, die ich mit NULL initialisere bis ich die 
richtige Adresse habe.
Oder bin ich jetzt total bekloppt?!
Persönliche Seite #4046733
Lesenswert?

Dirk B. schrieb:
> Das ist ja nur die Definition einer struct. Keine Variable.

In der Tat. Das ist was anderes, und da ist eine Initialisierung nicht 
möglich.

Das muss man bei der Instantiierung der Struktur durchführen, und da 
genügt ein
1
struct bla x = { 0 };

sofern es eine automatische (d.h. auf dem Stack angelegte) Variable ist.

Globale Variablen werden per Definition eh' null-initialisiert, und wenn 
man mit dynamischer Speicherverwaltung arbeitet, kann man statt malloc 
auch calloc verwenden, das nullt auch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren