Gast
#821414
Hallo Leute, ich kompiliere mit GNUARM, und bekomme diese Warnung: pointer of type 'void *' used in arithmetic im Bezug auf diese Zeile:
1 | |
2 | |
3 | |
4 | |
5 | |
Weiss jemand was diese Warnung Bedeutet? Danke!
|
Anzeige
|
Pointer Warning..
Gast
#821414
Hallo Leute, ich kompiliere mit GNUARM, und bekomme diese Warnung: pointer of type 'void *' used in arithmetic im Bezug auf diese Zeile:
Weiss jemand was diese Warnung Bedeutet? Danke!
Gast
#821436
sollte das nicht + *data heißen? ^^ Aber was wäre der Inhalt von data (*data), wenn data ein "Zeiger auf Nichts" (void *data) ist ;-)
Gast
#821445
sollte das nicht + *(my_type *) data heißen? -> also ein Cast zu einem Pointer auf den Typ Deiner Wahl. Woher soll der Compiler denn sonst wissen, auf was data zeigt, schließlich ist das ja generisch (könnte z.B. auch ein struct sein)? Und void - Zeiger darf man nicht einfach dereferenzieren! Gruß Bimmy and Jimmy
Gast
#821448
Danke für eure schnelle Antworten, vielleicht was ich noch sagen musste ist das payload auch einen void* pointer ist. Dann könnte eine Zuweisung p->payload = data; Sinn machen. Aber die Berechnung p->payload = 0x01 + 0x02 + data; ist obskur. Was soll das bewirken? Der void * ist ein ganz spezieller Pointer: Er zeigt nicht auf einen
Datentyp, sondern auf 'Nichts', Stefan "stefb" B. schon schrieb.
Bei gewöhnlichen Pointern wird Pointerarithmetik angewandt, wenn man
damit rechnet. So macht der Compiler z.B. aus diesem Ausdruck
int i[5] = { 0 };
int *pI = i + 3;
folgende Berechnung:
int *pI = (int *) ((char *) i + 3 * sizeof (int));
(Der Name eines Array-Objekts ohne Indizierung - i - ergibt einen
Pointer auf das 0. Element!)
Da ein void * auf ein unbekanntes Objekt ohne Länge zeigt, ergibt
Pointerarithmetik damit keinen Sinn, sondern ist ein Indiz für einen
Fehler -- der wird vom Compiler angezeigt.
Gast
#821466
Ich möchte die zwei Byte im Kopf der Puffer schreiben, das ist aber schwachsinnig wie ich das gemacht habe, ich kann doch einen Pointer keine Daten zuweisen aber eine Adresse.Habt ihr eine Idee wie ich das am besten machen kann?
Gast
#821483
In diesem Fall kannst Du deinen generischen Pointer in einen unsigned long Wert umwandeln. Dieser Typ ist per Definition hinreichend groß, um einen beliebigen Pointer aufzunehmen. Danach kannst Du diesen Wert ändern und zuweisen. Kleines Beispiel:
Solche Probleme solltest Du im Allgemeinen aber eleganter lösen. Gruß Bimmy and Jimmy
Gast
#821489
Ich danke euch Leute, manchmal braucht man eine Backpfeife um zu denken;-), für die Leute, die sich dafür interessieren wie ich das gelöst habe:
Gast
#821490
@Bimmy and Jimmy: Danke dir, ich habe deine Antwort erst gesehen nachdem ich gepostet habe.
Gast
#821508
Es gibt aber noch ein Problem, und zwar es wird immer eine Null dazu angehängt, woran kann das denn liegen? Ich würde mal sagen, das liegt daran, wie du den Wert für den Parameter DataSize bestimmst. Aus deinem Codeausschnitt geht das leider nicht hervor.
Gast
#821613
Den DataSize-Wert wird mittels SizeOf() bestimt, z.B:
Das dachte ich mir. Wenn du sizeof "Hallo" berechnen läßt, kommt 6 heraus - warum wohl?
Gast
#821640
Gibt es vielleicht eine andere Möglichkeit, wo diese Terminierungsnull nicht mitgezählt wird? strlen oder den Puffer nicht mit einem String initialisieren - macht hier eh wenig Sinn -, sondern die Länge in [] angeben. Das kann auch ein konstanter Ausdruck sein.
Gast
#821661
> Das kann auch ein konstanter Ausdruck sein.
Ein Beispiel wäre super.
Danke.
unsigned char HAllO_MSG[5]; oder unsigned char HAllO_MSG[3 + 2]; Wie dirs besser gefällt ;-)
Gast
#821684
Ich habe mir die erste Variante ausgesucht(strlen), vielen Dank! Das ist leider die aller schlechteste...
Gast
#821729
Wenn *data sowieso in einen (unsigned char*) gecastet wird, warum definierst du die Funktion dann nicht auch gleich so? Also:
Ich kann übrigens keinerlei Sinn in deinem obigen Code erkennen. Was soll der denn eigentlich machen? Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|