Forum: Mikrocontroller und Digitale Elektronik Probleme mit Pointerstruktur


von User (Gast)


Lesenswert?

Hallo,

ich möchte die empfangenen Daten vom Pointer ppkt im Debuggerfenster 
anschauen. Leider verstehe ich die Struktur nicht richtig.
Was müsste ich tun, damit ich die Daten im Pointer ppkt sehen kann ?
1
unsigned char * ppkt
2
unsigned long offset = 0, framelength = 0;
3
...
4
...
5
for(offset=0; offset<framelength; offset++)
6
{
7
(*(ppkt + offset)) = (*(__IO uint8_t *)((DMARxDescToGet->Buffer1Addr) + offset));
8
}

von Karl H. (kbuchegg)


Lesenswert?

Würde es dir helfen, wenn ich dir sage, dass man anstelle von

  (*(ppkt + offset))

auch

  ppkt[offset]

schreiben könnte?
Du kannst also deinen Debugger normalerweise durchaus anweisen, dass er 
dir den Inhalt von ppkt[0], ppkt[1], etc. anzeigen soll. Und 
normalerweise gibt es auch in den meisten Debuggern auch ein spezielle 
Syntax, in dem man im mitteilt, doch bitte von einem Array alle Elemente 
aus einem Bereich von Indizes auszugeben.

von User (Gast)


Lesenswert?

Vielen Dank für die Unterstützung.

Wenn ich folgendes im Debug Watchfenster einfüge, dann erscheint auch 
das richtige empfangene Zeichen.
1
(uint8_t *)DMARxDescToGet->Buffer1Addr+1

Im Zielpuffer kann ich die Daten nicht sichtbar machen.

von User (Gast)


Lesenswert?

Ich habe nun mal den Speicher angeschaut. Die empfangenen Daten werden 
richtig im Speicher abgelegt (Adresse von DMARxDescToGet->Buffer1Addr).
Das Kopieren der Daten auf eine andere Speicheradresse (Adresse von 
ppkt) funktioniert nicht.

von User (Gast)


Lesenswert?

ich kann nicht nachvollziehen, warum die Daten nicht ab der Adresse von 
ppkt liegen.

von Karl H. (kbuchegg)


Lesenswert?

User schrieb:
> ich kann nicht nachvollziehen, warum die Daten nicht ab der Adresse von
> ppkt liegen.


Das kann aber hier auch keiner mit 3 Zeilen Code.

Sieh dir halt den Pointer mal im Zahlenwert an. Stimmt die in ihm 
gespeicherte Adresse? Wo kommt die überhaupt her? Existiert der Speicher 
auf den ppkt verweist? Welchen Wert hat framelength. etc. etc.

So ist das nun mal beim Programmieren. Da gehört Debuggen genauso dazu, 
wie man seine Sprache beherrschen muss.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Würde es dir helfen, wenn ich dir sage, dass man anstelle von
>   (*(ppkt + offset))
> auch
>   ppkt[offset]
> schreiben könnte?

ist nicht genaugenommen

ppkt[offset] := (*(ppkt + (offset * sizeof(ppkt)))

?

von Karl H. (kbuchegg)


Lesenswert?

Vielleicht liegt aber auch der Fall vor, dass du dir unter einem Pointer 
etwas völlig falsches vorstellst. Einige deiner Forumlierungen lassen zb 
darauf schliessen.

Nur weil du einen Pointer hast, hast du noch lange keinen Speicher, in 
dem du Daten ablegen kannst. Ein Pointer ist NICHT sowas wie ein Array 
mit unbegrenztem Speicher!


Ein Pointer ist nichts anderes als ein Verweis auf anderen Speicher. 
Sozusagen die Karteikarte in einer Bibliothek. Auf der Karteikarte 
steht: das Buch findet sich in Gang 5, Regal B, 3.tes Fach von oben, 
6.tes Buch von links.
Die Karteikarte ist NICHT das Buch. Wenn der Autor kommt und etwas zum 
Buchtext ergänzen will, dann kann der die Karte benutzen um das Buch zu 
finden, aber die Karte selbst ist nur der Verweis dorthin. Die 
Textergänzung muss ins Buch und nicht auf die Karteikarte. Das Buch muss 
seperat hergestellt werden und dann kann man auch eine Karteikarte dafür 
in den Schrank legen. Aber zuallererst und zuoberst benötigt man erst 
mal das Buch und nicht die Karte.

Deine Pointervariable kann die Speicheradresse enthalten, an der Daten 
abgelegt werden können. Aber nur weil du einen Pointer hast, hast du 
noch lange nicht den Speicher, um dort Daten abzulegen.

Also: wo zeigt der Pointer hin? Wie ist der Speicher, auf den der 
Pointer zeigt, erzeugt worden? Wo kommt der her? Ist der Speicher groß 
genug?

von User (Gast)


Lesenswert?

Es handelt sich hier um eine Empfangsfunktion ETH_HandleRxPkt. Die 
Funktion wird in einer Applikation aufgerufen:

[c]

unsigned char * out;
unsigned long len;

int ReceiveEthFrames(char* pRecvData, int Len)
{
  if (ETH_CheckFrameReceived())
  {
    len = ETH_HandleRxPkt((unsigned char*)out);
          }
  return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

Random ... schrieb:
> Karl Heinz Buchegger schrieb:
>> Würde es dir helfen, wenn ich dir sage, dass man anstelle von
>>   (*(ppkt + offset))
>> auch
>>   ppkt[offset]
>> schreiben könnte?
>
> ist nicht genaugenommen
>
> ppkt[offset] := (*(ppkt + (offset * sizeof(ppkt)))
                                      sizeof(*ppkt)


Nein.
Das sizeof ist in der Pointerarithmetik automatisch drinnen. Die 
Äquivalenz

    *( pointer + offset )   <==>    pointer[offset]

gilt für alle Datentypen T, von denen man einen

    T * pointer;

hat.

Und für einen beliebigen Datentyp T, von dem man einen
    T * ptr;
hat, gilt wiederrum automatisch

    ptr + offset    <==>    ((char*)ptr) + offset*sizeof(T)

(d.h. der Offset wird implizit automatisch mit der sizeof des 
Basis-Datentyp des Pointers multipliziert)

von User (Gast)


Lesenswert?

Ich habe die Ursache gefunden. Anstatt eines Pointer habe ich nun ein 
Array mit 50 Elementen definiert. Siehe da die Daten kann ich nun 
ansehen.

von Karl H. (kbuchegg)


Lesenswert?

User schrieb:
> Ich habe die Ursache gefunden. Anstatt eines Pointer habe ich nun ein
> Array mit 50 Elementen definiert. Siehe da die Daten kann ich nun
> ansehen.

Womit wohl dieser Fall hier zumindest nicht ganz unzutreffend gewesen 
sein dürfte:
Beitrag "Re: Probleme mit Pointerstruktur"

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.