übergabe von var addresse an pointer

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.