cast to pointer from integer of different size - Warnung

Gast #5836450
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?
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?
Gast
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
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
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.
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.