mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich habe eine Funktion, die Folgende werte erwartet
const unsigned char *data, uint32_t len

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

wenn ich jetzt aber die Funktion aufrufe
for(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? und wenn doch von integer, deswegen 
schreibe ich doch (const unsigned char*) davor?

Was ist falsch an dem Funktionsaufruf?

Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Vlad T. (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko L. schrieb:
> Was willst du machen?

ich vermute, er möchte einen Pointer auf das Xte Element.


also:
  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
Autor: Dirk B. (dirkb2)
Datum:

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

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
aber auch wenn ich
updateData(&value[x], 0);
schreibe, bekomme ich eine warnung

pointer targets in passing argument 1 of 'updateData' differ in 
signedess

Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> Hallo,
> aber auch wenn ich
>
> 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...

Autor: zitter_ned_aso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welcher Zeile hast du die Fehlermeldung?



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

Nein.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: zitter_ned_aso (Gast)
Datum:

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

Verstehe ich nicht.

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

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> Hallo,
> aber auch wenn ich
>
> 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.

Autor: Vlad T. (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.