Forum: Compiler & IDEs übergabe von var addresse an pointer


von Joachim J. (felidae)


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?

von Peter II (Gast)


Lesenswert?

joachim j. schrieb:
> void senden(unsigned long add,char* DATA,char beyts)

void senden(unsigned long add,void* DATA2,char bytes) {

   char* DATA = (char*)data2;

von Peter II (Gast)


Lesenswert?

joachim j. schrieb:
> senden(&testvar,sizeof(long)/sizeof(char));

fehlt hier nicht noch  ein Parameter?

von Joachim J. (felidae)


Lesenswert?

man klar Typecast!  das ich da nicht selber drauf gekommen bin. Danke

von Joachim J. (felidae)


Lesenswert?

Peter II schrieb:
> joachim j. schrieb:
>> senden(&testvar,sizeof(long)/sizeof(char));
>
> fehlt hier nicht noch  ein Parameter?

Ja, is mir beim kopierten entfallen

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

joachim j. schrieb:
> void senden(unsigned long add,char* DATA,char beyts)

(...)

>     send_beyte(*DATA);


"beyts" und "beyt"?

von Frank M. (ukw) (Moderator) Benutzerseite


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.

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.