mikrocontroller.net

Forum: Compiler & IDEs void pointer inkrementieren


Autor: Frank Maier (fuzzy-vibes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

Ich habe hier verschiedene Arrays mit allen möglichen Datentypen.
Diese würde ich gerne durchlaufen
void *log_data;

// void Pointer casten
if(dataType == UNSIGNED_16){
  (u16 *)log_data;
  ........
}
else if(dataType == SIGNED_8){
  (s8 *)log_data;
  ........
}
else if(dataType == UNSIGNED_32){
  (u32 *)log_data;
  ........
}

// Aktion durchführen
for(i=0; i<arraySize; i++){
  printf(formatToken, log_data+i);
  ...
  ...
  ...
}

Klar, der Void Pointer lässt sich schlecht inkrementieren, aber gibt es 
eine Alternative, bei der meine Programmstruktur hinhauen könnte?

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne das der Pointer einen Typ hat wirst Du nicht viel machen können. 
Das heisst Du wirst nicht umher kommen als zu casten, in der For 
Schleife eine switch Anweisung mit dem Typ und dann casten.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder du machst daraus einen Pointer auf uint8_t und legst über dataType 
einen Multiplikator fest.

So in etwa:
void *log_data;

uint8_t *data = (uint8_t*)log_data;
uint8_t data_size;

if(dataType == UNSIGNED_16){
  data_size = sizeof(u16);
}
else if(dataType == SIGNED_8){
  ...

for(i=0; i<arraySize; i++){
  printf(formatToken, data+(i*data_size));
  ...
}

PS: Für uint8_t kannst du natürlich auch einen eigenen 8-Bit-Typ nehmen.

PPS: Das printf wird dann aber das nächste Problem sein. Daher wird ein 
switch innerhalb der Schleife die bessere Lösung sein.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du im GCC-Forum postest: der GCC kann (als Erweiterung zum Standard)
auch einen void*-Zeiger inkrementieren; der wird dann behandelt wie
ein char*-Zeiger.

Ist natürlich klar, dass das unportabel ist, aber falls das für dich
keine Rolle spielen sollte, kannst du das natürlich benutzen.

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch der SUN CC kann void* inkrementieren (ich kenn eigentlich kein 
Compiler der das nicht kann :-). Nur löst das sein Problem nicht, da er 
ja je danch Datentyp inkrementieren muss.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   printf(formatToken, data+(i*data_size));

Das funktioniert aber nur, wenn es ein zum jeweiligen Datentyp passendes 
"formatToken" gibt, das nicht den Typ selbst, sondern Pointer auf Typ 
spezifiziert.

Ich kenne keine Formatierungsanweisung für printf, mit der man z.b. 
Pointer auf int oder Pointer auf char spezifizieren könnte.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Das funktioniert aber nur, ...

Deswegen ja auch mein PPS. ;-)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PS: Für uint8_t kannst du natürlich auch einen eigenen 8-Bit-Typ
> nehmen.

Oder einfach char. Das ist der Typ, der in C per Definition immer eine 
Größe von 1 hat.

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.