Forum: Compiler & IDEs Pointer Frage


von Pointe (Gast)


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

von Sebastian V. (sebi_s)


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.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

kann es sein das dein echter code anders aussieht?
1
ptemp->dlc

gibt es doch gar nicht in der struct.
1
struct smsg *next = NULL;

das dürfte auch nicht funktionieren.

von Pointe (Gast)


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?!

von Peter II (Gast)


Lesenswert?

Pointe schrieb:
> Wieso sollte das nicht funktionieren?

ich würde behaupten das man keine members beim anlegen einer stuct 
direkt zuweisen kann.

Oder ist das eine C11 Feature.

von Pointe (Gast)


Lesenswert?

Wo du natürlich vollkommen recht hast...ich deklariere ja einen typ und 
keine variable. Die muss ich instanzieren.

Vielen Dank auch für diese Hilfe!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> ich würde behaupten das man keine members beim anlegen einer stuct
> direkt zuweisen kann.

Natürlich kann man das. Das nennt sich Initialisierung und ist kein 
C11-Feature, das kann schon C89.
1
struct bla
2
{
3
  int a;
4
  char b;
5
  float c;
6
};
7
8
struct bla x = { 1, 'z', 1.234 };

von Dirk B. (dirkb2)


Lesenswert?

Es geht um
1
struct smsg
2
{
3
 uint8_t id;
4
 uint8_t data[8];
5
6
 struct smsg *next = NULL;  Funktioniert das ?
7
}
Das ist ja nur die Definition einer struct. Keine Variable.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Natürlich kann man das. Das nennt sich Initialisierung und ist kein
> C11-Feature, das kann schon C89.

darum ging es aber nicht!
1
struct smsg
2
{
3
 uint8_t id;
4
 uint8_t data[8];
5
6
 struct smsg *next = NULL;
7
}
das habe ich für nicht zulässig gehalten.

von Rufus Τ. F. (rufus) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.