Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.08.2011, 20:22

Wo der Sinn?

Wo ist der Sinn eines void-Zeigers?
Wie wird ein void-zeiger behandelt?

Danke.

2

26.08.2011, 20:42

Ein void-Zeiger kann jeden Datentyp referenzieren. Benutzen sollte man ihn eher nicht, wenn man das will lässt es meistens auf Designprobleme schließen.
Wie auch immer eine Anwendung ist zum Beispiel Boxing:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{ // .... 
};

void c(void* argument)
{
   A* myclass = reinterpret_cast<A>(argument);
   // Tue irgendetwas mit myclass
}

void b(void* argument)
{
   c(argument);
}

void a()
{
   A a;
   b(reinterpret_cast<void*>(a));
}


Die Methode c braucht ein Objekt vom Typ a. Die Methode b weiß nur, wen sie aufruft, aber nicht von welchem Typ das Argument ist, was c braucht.
Genau so macht das Beispiel natürlich keinen Sinn, weil a c auch direkt aufrufen könnte, aber manchmal ist das nicht der Fall. Ein Beispiel ist die Parameterübergabe an Events.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

26.08.2011, 21:05

Ein void* ist einfach ein "Pointer auf irgendwas nicht näher spezifiziertes". Um mit einem void* was anfangen zu können, musst du ihn erst in einen Pointer auf einen anderen Typ casten. Aber in C++ willst du void* prinzipiell eher vermeiden, weil es die Typsicherheit untergräbt.

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

4

26.08.2011, 21:15

Dann ist die SDL schlecht designt?
Denn dem Thread übergibt man immer einen void* zeiger den man auf die Daten zeigen lassen kann, die der Thread für die Berechnung nutzt.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

26.08.2011, 21:19

@DarioFrodo:
Es gibt Ausnahmen, wo es Sinn macht void Ponter zu benutzen. Vor allem im Zusammenhang mit C API's kommt man manchmal nicht umhin einen void Pointer zu benutzen (auch mit der WinAPI z.B).

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

26.08.2011, 21:21

Die SDL is eine C API. In C gibts eigentlich kaum eine bessere Möglichkeit als void*.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

26.08.2011, 21:45

Eine bessere Möglichkeit in C++ ist, abstrakte Klassen zu benutzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Object
{ //...
public:
   virtual void foo() = 0;
};

class a : public Object
{ //...
public:
   void foo();
};

class b : public Object
{ //...
public:
   void foo();
};

EineFunktion(Object *pObj)
{
   pObj->foo();
}


Ein Anwendungsgebiet für dies (oder eben für void*) wäre, wenn man beispielsweise ein ListBox-Control hat, dessen Items, durch einen String und einen Zeiger auf beliebige Daten, representiert werden.

8

26.08.2011, 23:23

A* myclass = reinterpret_cast<A*>(argument);

9

27.08.2011, 01:08

Stimmt natürlich, ich hab das nur schnell im Editor hier hingeschrieben ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

27.08.2011, 02:00

Wobei ich static_cast verwenden würd, ein reinterpret_cast ist da nicht notwendig.

Werbeanzeige