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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.