Telegramme zerlegen, Zeigerarithmetik

Gast #1239466
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
Angehängte Dateien:
#1239583
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.
Gast #1239603
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.

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