hallo,
ich habe eine Funktion, die Folgende werte erwartet
1
constunsignedchar*data,uint32_tlen
jetzt habe ich ein array
1
charvalue={0x00,0x01,0x02,0x04};
wenn ich jetzt aber die Funktion aufrufe
1
for(x=0;x<4;x++)
2
{
3
updateData((constunsignedchar*)value[x],0);
4
}
bekomme ich die Warnung
cast to pointer from integer of different size.
Aber ich caste doch von char? und wenn doch von integer, deswegen
schreibe ich doch (const unsigned char*) davor?
Was ist falsch an dem Funktionsaufruf?
Felix schrieb:> updateData((const unsigned char*)value[x], 0);
hier liest du den x. Wert aus dem array und castest das Ding auf einen
Pointer...
Was willst du machen?
Heiko L. schrieb:> Was willst du machen?
ich vermute, er möchte einen Pointer auf das Xte Element.
also:
1
updateData(&value[x], 0);
edit:
hier bekommst du warhscheinlich eine unsigned/signed-warnung.
Gewöhn dir ab, wild Typen zu mischen. Pointer auf andere Typen zu
casten, ist wirklich nur ganz selten angebracht.
Definiere die Variablen direkt korrekt.
Interessant wäre natürlich noch die Definition, oder wenigstens die
Deklaration von upateData.
Felix schrieb:> wenn ich jetzt aber die Funktion aufrufefor(x=0; x<4; x++)> {> updateData((const unsigned char*)value[x], 0);> }> bekomme ich die Warnung>> cast to pointer from integer of different size.>> Aber ich caste doch von char?
Ja, von char in einen Zeiger. Was denkst du, was rauskommt, wenn man den
char als Zeiger uminterpretiert und damit z.B. 0x02 als Adresse
verwendet?
> schreibe, bekomme ich eine warnung>> pointer targets in passing argument 1 of 'updateData' differ in> signedess
Ja, richtig. Weißt du, was du tust? Warum muss das array aus "char"
bestehen? Warum braucht updateData() einen "unsigned char*" als 1.
Argument?
Die_Warnung lässt sich mit einem Cast beseitigen, wie oben steht...
Felix schrieb:> pointer targets in passing argument 1 of 'updateData' differ in> signedess
Warum ist value ein Array aus char, data dagegen aber ein Zeiger auf
unsigned char?
zitter_ned_aso schrieb:> Es fehlen doch die eckingen Klammern. Warum soll das ein Array sein?
Da hast du natürlich recht. Hatte ich übersehen. Ich vermute aber, dass
das in dem Code, den er ausprobiert hat, nicht so steht, denn sonst
würde die Warnung nicht dazu passen.
> schreibe, bekomme ich eine warnung>> pointer targets in passing argument 1 of 'updateData' differ in> signedess
Üblicherweise ein ungünstiges Design des Interfaces von updateData. Das
erste Argument ist am besten ein void* oder ein const void*, so dass man
beim Aufruf keine Warnung bekommt und nicht immer einen hässlichen Cast
braucht. Erst in updateData() wird dann z.B. auf ein unsigned char*
oder const char* oder was auch immer man verwenden will gecastet.
Johann L. schrieb:> Üblicherweise ein ungünstiges Design des Interfaces von updateData. Das> erste Argument ist am besten ein void* oder ein const void*, so dass man> beim Aufruf keine Warnung bekommt und nicht immer einen hässlichen Cast> braucht.
Da ist ja kompletter Quatsch.
Der Pointer auf die übergebenen Daten sollte den Typ haben, der intern
erwartet wird.
Der Prototyp ist der Vertrag zwischen Implementierung und Benutzer der
Funktion.
Wenn der Benutzer da andere Daten reinstecken will, weil er sich sicher
ist, dass sie kompatibel sind, muss er das dem Compiler explizit
mitteilen.
Das zeugt aber meist von einem kaputten Design, dessen Lösung aber nicht
sein kann, nur void Zeiger zu verwenden.
In diesem Fall ist das Problem, dass der Funktionsbenutzer
offensichtlich die Falschen Datentypen verwendet hat:
Felix schrieb:> char value = {0x00, 0x01, 0x02, 0x04};
Ein char ist ein Zeichen im Sinne von Buchstaben, Ziffern, oder
ähnliches.
Er will aber scheinbar Rohbytes oder 8-Bit Integer haben.
Für ersteres wäre "unsigned char" und für zweiteres, abhängig vom
nötigen Wertebereich, "unsigned char" oder "signed char" die richtige
Wahl.
Noch besser wäre natürlich die Verwendung der stdint.h - Typen.
char ohne signedness-Specifier sollte wirklich nur für Zeichen und
Strings verwendet werden, da im Standard nicht festgelegt ist, ob ein
reines char signed oder unsigned ist.