Denkblockdade Zeiger

OP #2136135
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
Gast #2136180
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
}
Gast #2136184
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;

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