www.mikrocontroller.net

Forum: PC-Programmierung Probleme mit Struktur und Pointer


Autor: jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Microsoft Visual Studio C++ zeigt mir hier immer wieder folgende 
Fehlermeldungen an:

test.cpp(23) : error C2440: 'Initialisierung': 'void *' kann nicht in 
'PTData' konvertiert werden

test.cpp(30) : error C2440: 'Typumwandlung': 'void *' kann nicht in 
'PTData' konvertiert werden
typedef struct
{
  unsigned char ucValue1;
  unsigned char ucValue2;
}TData, PTData;

int _tmain(int argc, _TCHAR* argv[])
{
...
PTData ptrdata = (void*)0;
ptrdata = (PTData)MemPool_Get(&data);
}

Was kann ich da tun? Hab ich möglicherweise irgendwo einen heftigen 
Fehler gemacht?

Autor: jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab die Struktur falsch gepostet. Hier die richtige Definition.

typedef struct
{
  unsigned char ucValue1;
  unsigned char ucValue2;
}TData, *PTData;


Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Könnte es damit zusammemhängen??

PTData ptrdata = (void*)0;

Gruß
Joachim

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PTData *ptrdata = (void*)0;
       ^^
Zeiger?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was kann ich da tun?

Angeben, ob du das als C oder als C++ übersetzt, und die Zeilen, auf die 
sich die Fehlermeldungen beziehen, markieren. Eine Zeile 23 und eine 
Zeile 30 gibt es in deinem Code nicht.

Ich nehme mal an, daß es als C++ übersetzt wird und eine der 
Fehlermeldungen sich auf diese Zeile bezieht:
PTData ptrdata = (void*)0;

Zur anderen Fehlermeldung finde ich keine passende Zeile.

In C++ kann man einen void* nicht implizit in einen anderen Zeiger 
konvertieren. Warum castest du überhaupt die 0? Ohne den Cast sollte das 
gehen.

Übrigens: Du solltest dir abgewöhnen, Zeiger hinter irgendwelchen 
typedef-Namen zu verstecken. Also statt PTData lieber ein TData*. Da 
sieht man auf den ersten Blick, daß es ein Zeiger ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und anstatt der 0 sollte man sich angewöhnen das vordefinierte Makro 
NULL zu benutzen. Denn dann sieht man ebenfalls, dass es sich um etwas 
handelt, was mit Pointern zu tun hat.

NULL
0
'\0'

ist im Grunde alles dasselbe. Und trotzdem ist man gut beraten je nach 
Kontext die Version zu nehmen, die angemessen ist.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Und anstatt der 0 sollte man sich angewöhnen das vordefinierte Makro
> NULL zu benutzen. Denn dann sieht man ebenfalls, dass es sich um etwas
> handelt, was mit Pointern zu tun hat.

In C++ wird meistens eher empfohlen 0 statt NULL zu verwenden, da es 
dort eh keinen Unterschied macht und manchmal irreführend ist. Beispiel:
void foo(int i);
void foo(char* c);

// ...

foo(NULL);  // ruft foo(int) mit dem Wert 0 auf.

> NULL
> 0
> '\0'
>
> ist im Grunde alles dasselbe.

In C kann NULL auch als (void*)0 definiert sein. In C++ nicht.

> Und trotzdem ist man gut beraten je nach Kontext die Version zu nehmen,
> die angemessen ist.

Bei C++0x wird's dafür extra ein neues Schlüsselwort 'nullptr' geben, 
das zwar in beliebigen Pointer-Kontexten verwendet werden kann, aber 
nicht als Integer.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:

> Bei C++0x wird's dafür extra ein neues Schlüsselwort 'nullptr' geben,
> das zwar in beliebigen Pointer-Kontexten verwendet werden kann, aber
> nicht als Integer.

Endlich mal etwas, bei dem das Gremium reagiert hat.
Wenn man sie jetzt noch dazu bringen könnte, die Semantik von 'virtual' 
ein bischen zu ändern :-)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du damit?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In abgeleiteten Klassen ist das Schlüsselwort virtual 'optional'

Wenn du gezwungen bist, in einer Klasse eine Funktion virtual zu machen 
oder das virtual rauszunehmen, ändert sich die Semantik auch für 
abgeleitete Klassen. C++ hat keinen Mechanismus der einen zwingt, diese 
Fälle anzusehen

C# hat das in meinen Augen richtig gemacht.
Die 'erste' Funktion in der Ableitungshierarchie wird 'volatile' 
markiert, in den abgeleiteten Klassen heisst es dann 'override'

Sobald du damit in der Hierarchie irgendetwas änderst (ändern musst) 
klopft dir der Compiler auf die Finger:

   Existiert in der Basisklasse eine virtual Funktion und habe ich
   in der abgeleiteten Klasse dieselbe Funktion als nicht override,
   ist das ein Fehler.

   Ist in einer Klasse ein Member 'override', dann muss es in einer
   der vorhergehenden Basisklasse ein virtual dazu geben.

-> bin ich gezwungen in einer Basisklasse ein virtual nachzurüsten
   oder zu entfernen, dann zeigt mir der Compiler alle anderen Klassen,
   in denen sich das auswirken wird und ich kann mir das ansehen,
   was die Auswirkungen sein werden.

Bei größeren Projekten ist es zur Zeit in C++ extrem gefährlich ein 
virtual nachzurüsten, weil ich nicht mehr überblicke auf welche anderen 
Klassen sich das noch auswirken wird.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> In abgeleiteten Klassen ist das Schlüsselwort virtual 'optional'

Ok, stimmt. Das ist nicht ideal. Mir ist aber nicht bekannt, daß das 
geändert würde. Was bei C++0x im Vordergrund steht, ist immer, daß man 
möglichst wenig neue Schlüsselwörter einfügt und daß die alte Syntax 
weiter gültig bleibt, damit man bestehende Programme nicht ändern muß, 
um sie mit einem C++0x-Compiler übersetzt zu bekommen. Das schänkt 
natürlich immer etwas ein.

> Bei größeren Projekten ist es zur Zeit in C++ extrem gefährlich ein
> virtual nachzurüsten, weil ich nicht mehr überblicke auf welche anderen
> Klassen sich das noch auswirken wird.

Dazu hat man ja Doxygen ;-)

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.