cast to pointer from integer of different size - Warnung

Gast #5836450
Lesenswert?
• ▲
▼
hallo,
ich habe eine Funktion, die Folgende werte erwartet
1
const unsigned char *data, uint32_t len

jetzt habe ich ein array
1
char value = {0x00, 0x01, 0x02, 0x04};

wenn ich jetzt aber die Funktion aufrufe
1
for(x=0; x<4; x++)
2
{
3
  updateData((const unsigned char*)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?
#5836473
Lesenswert?
• ▲
▼
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.
#5836715
Lesenswert?
• ▲
▼
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?
#5836738
Lesenswert?
• ▲
▼
Felix schrieb:
> Hallo,
> aber auch wenn ich
>
1
> updateData(&value[x], 0);
> 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...
Persönliche Seite #5836944
Lesenswert?
• ▲
▼
Felix schrieb:
> Hallo,
> aber auch wenn ich
>
1
> updateData(&value[x], 0);
> 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.
#5837102
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren