PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : assignment from incompatible pointer type



geronet
22-12-2008, 19:31
Hi Jungs!
Schon lang nicht mehr hier gewesen, aber jetzt bräucht ich mal nen Tipp:

C-Programm mit AVR-GCC auf Atmega, folgende Struktur und Funktion:


struct IP_header{
uint16_t IP_checksum;
uint8_t IP_sourceIp[4];
uint8_t IP_destIp[4];
};

void ip(uint8_t *buff)
{
struct IP_header *ip;

ip = (struct IP_Header *)&buff[24];
ip->IP_checksum = 0x00; // checksum auf null setzen
..usw


Aufruf der Funktion ip mit Zeiger auf Speicherbereichs-feld vom typ unsigned char, die Zeile mit dem cast bringt die Warnung "assignment from incompatible pointer type", das ganze funktioniert aber. Würde gern die Warnung wegbekommen, mit dem Prinzip des Struktur-Zeigers auf den Speicher ist das recht praktisch..
Irgendwelche Vorschläge?

Grüsse, Stefan

anda_skoa
24-12-2008, 22:35
Die Warnung ist dafür da, zu erinnern, dass das nicht garantiert ist.

Nachdem es laut deiner Aussage bei dieser Kombination von Plattform und Compiler geht, probier doch mal von auf void* "zwischen casten"

Ciao,
_

peschmae
28-12-2008, 07:19
Falls du das Sample so 1:1 kopiert hast kommt die Warnung daher dass dein struct-pointer vom Typ IP_header* ist und du nach IP_Header* castest. Das ist natürlich nicht dasselbe, da h != H in C.

MfG Peschmä

P.S. habs auch nicht selber gesehen; aber wenn man das durch g++ lässt ist die Fehlermeldung etwas deutlicher :D


test.c:11: error: cannot convert ‘IP_Header*’ to ‘IP_header*’ in assignment

geronet
09-01-2009, 06:19
Ach jetzt seh ich's auch, habs inzwischen schon umgeschrieben gehabt, dadurch besserte sich der Schreibfehler selber aus (mit typedef struct..).

Noch besser war der Witz:
Tu ich eine Woche lang an der Checksummenberechnung rum, warum die nich funktioniert. Hab den gleichen Code parallel am Computer laufen zum testen, dort rechnete es richtig..
es lag nur an dem einem cast:


uint16_t word16;
uint32_t sum;
sum += (uint32_t) word16;

Mit dem GCC am Rechner funktioniert es auch ohne den cast, auf dem AVR nicht (er verschlampt die Bits > 16 bit) :-(
Jetz hab ich festgestellt dass die Hardware das auch übernehmen kann, nur hat das anscheinend noch keiner gemacht ;-)

Grüsse, Stefan