Forum: Compiler & IDEs void pointer inkrementieren


von Frank M. (fuzzy-vibes)


Lesenswert?

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?

von Rene H. (Gast)


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.

von Stefan E. (sternst)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Rene H. (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Stefan E. (sternst)


Lesenswert?

Rufus t. Firefly schrieb:
> Das funktioniert aber nur, ...

Deswegen ja auch mein PPS. ;-)

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.