Forum: Compiler & IDEs Telegramme zerlegen, Zeigerarithmetik


von Thomas2 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich möchte ein Telegramm zerlegen welches folgendermaßen aufgebaut ist:
3 Bytes allgemeiner Header, im 3. Byte steht die Gesamtlänge des 
Telegrammes. Im Telegramm sind verschiedene Parametersätze die 
unterschiedlich lang sein können.

Ein Parametersatz sieht so aus:
1. Byte: Typ
2. Byte: Länge
x Bytes: Daten

Mein Testprogramm habe ich mal angehängt.
Folgende Fragen hätte ich dazu:

1.
Kann ich die Zeigerarithmetik die ich jetzt in zwei Zeilen:
1
par->type = **ptr_data;
2
(*ptr_data)++;
aufgeteilt habe auch in eine zusammenfassen?

2.
Da man sich nie sicher sein kann dass die Längenangaben die von außen 
herein kommen stimmen, überprüfe ich jedes Mal wenn ich den Zeiger 
weitersetze dass er nicht über das Ende hinausgeht.
Gibt es vielleicht eine schönere Möglichkeit sowas zu überprüfen, als 
mit den zwei Zeigern die ich mir da "gebaut" habe?

Gruß
Thomas

von Markus F. (pippo)


Lesenswert?

Zu 1.
Ich schätze dir gehts vor allem darum, dir die {} - Klammern bei der 
for-Schleife zu sparen. Da muss ich dir aber sagen, dass der Sinn guter 
Programmierung nicht darin liegt, alles so kurz wie möglich zu 
gestalten, sondern so verständlich wie möglich. Fördern tust du 
letzteres damit sicherlich nicht.

Nebenbei: Ich wüsste nicht, wie man das in 1 Anweisung bekäme, in 1 
Zeile bekommst du es aber mit Backspace ;)


Zu 2.
Wenn du das Daten-Array um 1 Feld größer machst, als maximal Daten 
reingeschrieben werden und du es mit NULL vorbelegst, kannst du statt
1
if (*ptr_data > ptr_last) return 0;

auch einfach
1
if (!(*ptr_data)) return 0;

So zumindest mach ich es immer.

von Thomas2 (Gast)


Lesenswert?

Zu 1. meinte ich:
Wenn ich einen "einfachen" Zeiger habe kann ich die Zuweisung und das 
erhöhen des Zeigers in einer Zeile so:
1
par->type = *ptr_data++;
machen.

Meiner Funktion wird aber ein Zeiger auf den eigentlichen Zeiger 
übergen.

von Wolfgang Mües (Gast)


Lesenswert?

warum nicht:
*(*ptr_data++);

von Thomas2 (Gast)


Lesenswert?

> warum nicht:
> *(*ptr_data++);

Geht ja nicht. ptr_data ist ein Zeiger auf einen Zeiger.
Aber so gehts doch:
1
par->type = *(*ptr_data)++;

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.