Forum: Mikrocontroller und Digitale Elektronik Denkblockdade Zeiger


von Patrick P. (xadas)


Lesenswert?

Guten Tag,

ich sitze gerade an einem Projekt und habe mich irgendwie festgefahren.
Ich habe folgende Strukturen und eine Funktion:
1
typedef struct item item_t;
2
typedef struct telegram telegram_t;
3
4
struct item{
5
  uint8_t data;
6
  item_t *pNext;
7
};
8
9
struct telegram{
10
  uint8_t targetADR;
11
  uint8_t returnADR;
12
  uint8_t cmd;
13
  uint8_t length;
14
  item_t *pData;
15
  uint8_t checksum;
16
};
17
18
item_t* addLink( uint8_t newData ){  
19
   item_t* newItem = malloc(sizeof(item_t));  // reserve memory
20
   newItem->data = newData; //    set data field
21
   newItem->pNext = NULL;  // end of the list      
22
   return newItem;
23
}
24
25
....
26
27
telegram_t newTelegram;
28
telegram_t *pNewTelegram = &newTelegram;
29
30
....
31
32
if(!(pNewTelegram->length == 0x00)){
33
   item_t* pCurrentItem = pNewTelegram->pData;
34
   for ( uint8_t i = 0; i<pNewTelegram->length; i++ ){  
35
      (in die hier gespeicherte Adresse)pCurrentItem = addLink(Daten);
36
      pCurrentItem = pCurrentItem->pNext; //Zeige auf Adresse für nächstes Datenfeld
37
   }
38
}
Der in der Struktur definierte Zeiger auf ein Element vom Typ item_t 
soll mit reserviertem Speicher gefüllt werden und eine Anzahl weiterer 
Datenfelder dranhängen, so dass eine Liste variabler Länge an dieser 
Struktur hängt. Ich habe sämtliche * & Kombinationen ausprobiert so das 
ich mich jetzt in meinen Gedankengängen selber überschlage ... es wäre 
nett wenn mir kurz jemand behilflich sein könnte.

Ich bitte um konstruktive Hilfe, boar bist du doof hilft mir leider 
nicht weiter ;=)

Gruß
   Patrick

von ... (Gast)


Lesenswert?

Meinst Du so etwa?
1
if(!(pNewTelegram->length == 0x00)){
2
   item_t** pCurrentItem = &pNewTelegram->pData;
3
   for ( uint8_t i = 0; i<pNewTelegram->length; i++ ){  
4
      *pCurrentItem = addLink(Daten);
5
      pCurrentItem = &(pCurrentItem->pNext);
6
   }
7
}

von Andreas B. (Gast)


Lesenswert?

Einfach
1
pCurrentItem->pNext = addLink(Daten);
oder habe ich die Frage falsch verstanden?

Das alles funktioniert auch nur, wenn das telegram nicht weniger als 1 
item hat (sonst ist telegram->pData undefiniert) und auch nicht mehr als 
1 (sonst Speicherleck).

Der Name addLink ist auch etwas irreführend, denn es fügt das item 
nirgends hinzu und ein item ist auch kein Link.

Zweckmäßig wäre es, die verkettete Liste von hinten aufzubauen, da gibt 
es weniger Probleme:
1
item_t *item, *items = NULL;
2
for (int i = 0; i < pNewTelegram->length; i++) {
3
        item = new_item(Daten);
4
        item->next = items;
5
        items = item;
6
}
7
pNewTelegram->pData = items;

von Patrick P. (xadas)


Lesenswert?

Andreas B. schrieb:
>
1
> item_t *item, *items = NULL;
2
> for (int i = 0; i < pNewTelegram->length; i++) {
3
>         item = new_item(Daten);
4
>         item->next = items;
5
>         items = item;
6
> }
7
> pNewTelegram->pData = items;
8
>

ja super vielen Dank, zwar hab ich die Daten dann in der verkehrten 
Reihenfolge aber das lässt sich ja recht schnell anpassen.

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.