www.mikrocontroller.net

Forum: Compiler & IDEs Telegramme zerlegen, Zeigerarithmetik


Autor: Thomas2 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
par->type = **ptr_data;
(*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

Autor: Markus F. (pippo)
Datum:

Bewertung
0 lesenswert
nicht 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
if (*ptr_data > ptr_last) return 0;

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

So zumindest mach ich es immer.

Autor: Thomas2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
par->type = *ptr_data++;
machen.

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

Autor: Wolfgang Mües (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum nicht:
*(*ptr_data++);

Autor: Thomas2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> warum nicht:
> *(*ptr_data++);

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.