übergabe von var addresse an pointer

#3601749
Lesenswert?

ich versuche eine Funktion zu schreiben die eine variable beliebigen 
Datentyps in char(8bit) zerlegt und sendet.

meine ide:
1
void senden(unsigned long add,char* DATA,char beyts)
2
{
3
  while(beyts)
4
  {
5
    send_beyte(*DATA);
6
    DATA++;
7
    beyts--;
8
  }
9
}
10

11

12
long testvar = 5143;
13
senden(&testvar,sizeof(long)/sizeof(char));
14

15
int testvar2 = 143;
16
senden(&testvar2,sizeof(int)/sizeof(char));

das problem ist das der compieler nicht mitspielt
1
argument of type "int *" is incompatible with parameter of type "char *"

wie bekomme ich das Problem am besten gelöst?
Moderator Persönliche Seite #3601914
Lesenswert?

joachim j. schrieb:
> ich versuche eine Funktion zu schreiben die eine variable beliebigen
> Datentyps in char(8bit) zerlegt und sendet.
>
> meine ide:

Deine Idee ist eine ganz schlechte. Diese funktioniert prinzipiell nur 
dann, wenn die Zielmaschine den gleichen Endian (also die Reihenfolge, 
wie "höherwertige Typen" als Bytes auf der jeweiligen Maschine 
gespeichert wird) besitzen.

Eine portable Möglichkeit ist, sich erstmal auf ein Format (nämlich MSB 
first oder LSB first) festzulegen. Anschließend kann man die Werte nach 
dieser Vorgabe in einzelne Bytes zerlegen.

Beispiel für LSB first:

Sender:
1
unsigned char buf[4];
2

3
unsigned long x = 1234;
4

5
buf[0] = x & 0xFF;
6
buf[1] = (x >> 8) & 0xFF;
7
buf[2] = (x >> 16) & 0xFF;
8
buf[3] = (x >> 24) & 0xFF;
9

10
senden (buf, 4);

Das Maskieren mit 0xFF könntest Du auch weglassen. Mehr als 8 Bit gehen 
in buf[x] sowieso nicht rein.

Empfänger:
1
unsigned char buf[4];
2
unsigned long x;
3

4
empfangen (buf, 4);
5

6
x = ((unsigned long) buf[0]      ) | ((unsigned long) buf[1] << 8) |
7
    ((unsigned long) buf[2] << 16) | ((unsigned long) buf[3] << 24);

Ist zwar Arbeit, aber nur so portabel. Wenn man das nicht explizit so 
hinschreiben will wie ich oben, kann man natürlich mit Schleifen und 
sizeof() arbeiten. Kommt darauf an, wieviele verschiedene Typen von 
Variablen Du hast, welche verschickt werden sollen.

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