Forum: Compiler & IDEs Pointer Frage


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Pointe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hab da mal ne Frage.

Der gezielte Aufbau ist vereinfacht so:

ich habe ein struct:
struct smsg
{
 uint8_t id;
 uint8_t data[8];

 struct smsg *next = NULL;
} 

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

while(1)
{
 hol_dir_die_can_msgs(&canmsg1);
}

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...
void hol_dir_die_can_msgs(struct smsg *pcandata)
{
 struct smsg *ptemp = pcandata;
 // IDs holen und unter ptemp->id speichern
 // Das selbe mitm DLC
 
 for(mob = 0; mob < MAXRXMOBS; mob++)
  if(MOBNOTBUSY) // entspricht MSG empfangen
  {
   for(uint8_t i = 0; i < ptemp->dlc; i++)
    *(ptemp->data)++ = CANMSG;
  }
 ptemt->next = ptemp;
 }
 // MOB wieder aktivieren
}


Hat jemand ne Ahnung, iwie sitz ich grad voll aufm Schlauch...

von Sebastian V. (sebi_s)


Bewertung
0 lesenswert
nicht lesenswert
Pointe schrieb:
> *(ptemp->data)++ = CANMSG;

Diese Zeile stimmt nicht. Wenn schon dann:
*(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
ptemp->data[i] = CANMSG;
schreiben, da das deutlich übersichtlicher ist.

: Bearbeitet durch User
von Peter II (Gast)


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

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

das dürfte auch nicht funktionieren.

von Pointe (Gast)


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

Da war ich mir auch sicher


>Wenn schon dann:
>
*(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
>
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?
>
>
> ptemp->dlc
> 
>
> 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:
>
> struct smsg *next = NULL;
> 
>
> 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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.
struct bla
{
  int a;
  char b;
  float c;
};

struct bla x = { 1, 'z', 1.234 };

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Es geht um
struct smsg
{
 uint8_t id;
 uint8_t data[8];

 struct smsg *next = NULL;  Funktioniert das ?
} 
Das ist ja nur die Definition einer struct. Keine Variable.

von Peter II (Gast)


Bewertung
0 lesenswert
nicht 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!
struct smsg
{
 uint8_t id;
 uint8_t data[8];

 struct smsg *next = NULL;
} 
das habe ich für nicht zulässig gehalten.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.