void pointer inkrementieren

OP #1318782
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?
Gast #1318793
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.
#1318818
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren