void pointer inkrementieren

OP #1318782
Hallo Forum,

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

3
// void Pointer casten
4
if(dataType == UNSIGNED_16){
5
  (u16 *)log_data;
6
  ........
7
}
8
else if(dataType == SIGNED_8){
9
  (s8 *)log_data;
10
  ........
11
}
12
else if(dataType == UNSIGNED_32){
13
  (u32 *)log_data;
14
  ........
15
}
16

17
// Aktion durchführen
18
for(i=0; i<arraySize; i++){
19
  printf(formatToken, log_data+i);
20
  ...
21
  ...
22
  ...
23
}

Klar, der Void Pointer lässt sich schlecht inkrementieren, aber gibt es 
eine Alternative, bei der meine Programmstruktur hinhauen könnte?
Gast #1318793
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.
#1318818
Oder du machst daraus einen Pointer auf uint8_t und legst über dataType 
einen Multiplikator fest.

So in etwa:
1
void *log_data;
2

3
uint8_t *data = (uint8_t*)log_data;
4
uint8_t data_size;
5

6
if(dataType == UNSIGNED_16){
7
  data_size = sizeof(u16);
8
}
9
else if(dataType == SIGNED_8){
10
  ...
11

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

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.
Moderator Persönliche Seite #1318887
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.
Gast #1318897
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.
Persönliche Seite #1318930
>   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.
Gast #1319210
> 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

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.