Telegramme zerlegen, Zeigerarithmetik

Gast #1239466
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.