Forum: Compiler & IDEs incompatibler typ warum ?


von Alex (Gast)


Lesenswert?

Hallo ich habe folgendes Problem. Ich übergebe eigentlich ein unsigned 
char Array, der Compiler sagt mir das es nicht so ist wieso?

  typedef struct
  {
    unsigned char eth_dst[6];
    unsigned char eth_src[6];
    unsigned char eth_type[2];
  }ETHHEAD;
  typedef struct
  {
    unsigned char arp_htyp[2];
    unsigned char arp_ptyp[2];
    unsigned char arp_len;
    unsigned char arp_plen;
    unsigned char arp_op[2];
    unsigned char arp_smac[6];
    unsigned char arp_sip[4];
    unsigned char arp_dmac[6];
    unsigned char arp_dip[4];
  }ARP_HEADER;
  typedef struct
  {
    ETHHEAD  ethhead;
    ARP_HEADER arphead;
  }ARPPACKET;


  ARPPACKET packet;
  uint8_t i;
  for(i=0;i<6;i++)
  {
    packet.ethhead.eth_dst[i] = arp_dmac[i];
    packet.ethhead.eth_src[i] = mymac[i];
  }
  packet.ethhead.eth_type[0] = 0x80;
  packet.ethhead.eth_type[1] = 0x60;
  packet.arphead.arp_htyp[0] = 0x00;
  packet.arphead.arp_htyp[1] = 0x01;
  for(i=0;i<2;i++)
    packet.arphead.arp_ptyp[i] = ptyp[i];  // Arp Typ
  packet.arphead.arp_len = 0x06;
  packet.arphead.arp_plen = 0x04;
  if(op[0] == 1 || op[0] == 2)
  {
    for(i=0;i<2;i++)
      packet.arphead.arp_op[i] = op[i];

  }
  else
  {
   return 255;
  }
  for(i=0;i<6;i++)
  {
    packet.arphead.arp_smac[i] = mymac[i];
    packet.arphead.arp_dmac[i] = arp_dmac[i];
  }
  IP mip = getmyIP();
  packet.arphead.arp_sip[0] =mip.a;
  packet.arphead.arp_sip[0] =mip.b;
  packet.arphead.arp_sip[0] =mip.c;
  packet.arphead.arp_sip[0] =mip.d;
  for(i=0;i<4;i++)
    packet.arphead.arp_dip[i] = arp_dip[i];
  enc_send_packet(sizeof(packet),packet);

Beim aufrufen der enc_send_packet( unsigned int len, unsigned char *buf 
) Funktion gibt mir der Compiler für das 2 Argument einen "incompatible 
type" Fehler. Jemand eine Idee ?

Vielen Danke im Vorraus
Alex

von Alex (Gast)


Lesenswert?

Entschludigt,habe noch Quelltext vergessen zwischen den 
Typendefinitionen und dem erstellen des Packetes:

  unsigned char ptyp[2];
  ptyp[0]= 0x08;
  ptyp[1]= 0x06;

  unsigned char arp_dmac[6];
  arp_dmac[0]= 0xFF;
  arp_dmac[1]= 0xFF;
  arp_dmac[2]= 0xFF;
  arp_dmac[3]= 0xFF;
  arp_dmac[4]= 0xFF;
  arp_dmac[5]= 0xFF;

  unsigned char arp_dip[4];
  arp_dip[0]=169 ;
  arp_dip[1]=254 ;
  arp_dip[2]=10 ;
  arp_dip[3]=55;

  unsigned char op[2];
  op[0]=0x00;
  op[1]=0x01;

  unsigned char mymac[6];
        mymac[0]=0xFF;
        mymac[1]=0xFF;
        mymac[2]=0xFF;
        mymac[3]=0xFF;
        mymac[4]=0xFF;
        mymac[5]=0xFF;


Grüsse

Alex

von Klaus (Gast)


Lesenswert?

Wo bitte ist packet ein char array?!?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

packet ist ein Struct, die Funktion erwartet einen char Pointer.

Machs mit einem Cast:
>   enc_send_packet(sizeof(packet),(unsigned char*)packet);

EDIT:
Aber du solltest dir dann sicher sein, dass die Anordnung und 
Ausrichtung der Bytes im Struct passt. Und nichts irgendwie auf 16-Bit 
aligned wird....

von Philipp B. (philipp_burch)


Lesenswert?

Lothar Miller schrieb:
> packet ist ein Struct, die Funktion erwartet einen char Pointer.
>
> Machs mit einem Cast:
>>   enc_send_packet(sizeof(packet),(unsigned char*)packet);

'packet' ist damit aber immer noch kein Zeiger.
1
(unsigned char *)&packet

von Alex (Gast)


Lesenswert?

Danke euch!
Mit dem (unsigned char *)&packet vom Philipp geht es

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.