mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointer Warning..


Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich kompiliere mit GNUARM, und bekomme diese Warnung:

pointer of type 'void *' used in arithmetic

im Bezug auf diese Zeile:
void SetData(void* data)
{
 struct pbuf p;
 p->payload = 0x01 + 0x02 + data;
}
Weiss jemand was diese Warnung Bedeutet?

Danke!

Autor: horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sollte das nicht + *data heißen? ^^

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber was wäre der Inhalt von data (*data), wenn data ein "Zeiger auf 
Nichts" (void *data) ist ;-)

Autor: Bimmy and Jimmy (Gast)
Datum:

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

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure schnelle Antworten, vielleicht was ich noch sagen musste 
ist das payload auch einen void* pointer ist.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann könnte eine Zuweisung

 p->payload = data;

Sinn machen.

Aber die Berechnung

 p->payload = 0x01 + 0x02 + data;

ist obskur. Was soll das bewirken?

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Bahos (Gast)
Datum:

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

Autor: Bimmy and Jimmy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
#include <stdio.h>

int bla (void *f)
{
void *p;
unsigned long q;

        q = (unsigned long) f;
        q += 3;
        p = (void *)q;

        printf ("%p => %p\n", f, p);
}

int main (void)
{
int a = 23;
        bla (&a);
        return 0;
}

Solche Probleme solltest Du im Allgemeinen aber eleganter lösen.
Gruß
Bimmy and Jimmy

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
void SetData(void* data, unsigned int DataSize)
{
 struct pbuf p;
 unsigned char* SrcBuffer; 
 unsigned char* DestBuffer;

 DestBuffer = (unsigned char*) p->payload;
 SrcBuffer  = (unsigned char*)data; 
 
 *(UDPBuffer++) = 0x01;
 *(UDPBuffer++) = 0x02;

 for (i = 0; i < DataSize;i++ ) 
  *(UDPBuffer++) = *(DataBuffer++);
}

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bimmy and Jimmy:
Danke dir, ich habe deine Antwort erst gesehen nachdem ich gepostet 
habe.

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt aber noch ein Problem, und zwar es wird immer eine Null dazu 
angehängt, woran kann das denn liegen?

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den DataSize-Wert wird mittels SizeOf() bestimt, z.B:
unsigned char HAllO_MSG[] ='Hallo';
SetData(HAllO_MSG, sizeof(HAllO_MSG));

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das dachte ich mir.

Wenn du sizeof "Hallo" berechnen läßt, kommt 6 heraus - warum wohl?

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es vielleicht eine andere Möglichkeit, wo diese Terminierungsnull 
nicht mitgezählt wird?

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das kann auch ein konstanter Ausdruck sein.
Ein Beispiel wäre super.
Danke.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char HAllO_MSG[5];

oder

unsigned char HAllO_MSG[3 + 2];

Wie dirs besser gefällt ;-)

Autor: Bahos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir die erste Variante ausgesucht(strlen), vielen Dank!

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist leider die aller schlechteste...

Autor: Johnny Maxwell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn *data sowieso in einen (unsigned char*) gecastet wird, warum 
definierst du die Funktion dann nicht auch gleich so? Also:
void SetData(unsigned char *data, unsigned int DataSize);

Ich kann übrigens keinerlei Sinn in deinem obigen Code erkennen. Was 
soll der denn eigentlich machen?

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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