Forum: PC-Programmierung cast to pointer from integer of different size - Warnung


von Felix (Gast)


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?

von Heiko L. (zer0)


Lesenswert?

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?

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


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.

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Ein char ist auch ein integer-Typ (Ganzzahl)
Da steht ja nicht int, falls du das meinst.

von Rolf M. (rmagnus)


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?

von Felix (Gast)


Lesenswert?

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

von Heiko L. (zer0)


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...

von zitter_ned_aso (Gast)


Lesenswert?

In welcher Zeile hast du die Fehlermeldung?



Felix schrieb:
> jetzt habe ich ein array
>char value = {0x00, 0x01, 0x02, 0x04};

Nein.

von Rolf M. (rmagnus)


Lesenswert?

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?

von zitter_ned_aso (Gast)


Lesenswert?

Felix schrieb:
> char value = {0x00, 0x01, 0x02, 0x04};

Verstehe ich nicht.

Es fehlen doch die eckingen Klammern. Warum soll das ein Array sein?

von Rolf M. (rmagnus)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


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.

von Vlad T. (vlad_tepesch)


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.

: Bearbeitet durch User
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.