Forum: PC-Programmierung HÄ? void* is not a pointer-to-object type. JaNe, nem void pointer nem (void)pointerZuweisenGehtNich?


von DasSams (Gast)


Lesenswert?

Geht nicht: arr[0]=p;
Kaputt!
Zieht die Notbremse!
1
#include <iostream>
2
3
using namespace std;
4
5
6
   void *arr=new void *[10];
7
   
8
   void f(void *p)
9
   {
10
       arr[0]=p; // warum geht das nicht? ich will dass so! wie kann ich mich beim Compiler einschleimen, damit das geht?
11
       return;
12
   }
13
14
int main()
15
{
16
   cout << "Hello damn void *" << endl; 
17
         
18
   int n=10;
19
   int *p=&n;
20
   f((void*)p);
21
   
22
   
23
   
24
   return 0;
25
}

/*
Fehlermeldung von:
http://www.compileonline.com/compile_cpp11_online.php

Compiling the source code....
$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 
2>&1

main.cpp: In function �void f(void*)�:
main.cpp:10:13: warning: pointer of type �void *� used in arithmetic 
[-Wpointer-arith]
        arr[0]=p;
Klappe du Warnung, ich bin schlauer als DU!

main.cpp:10:13: error: �void*� is not a pointer-to-object type
*/

von sebi707 (Gast)


Lesenswert?

void *arr ist gar kein Array von void Pointern sondern nur ein void 
Pointer. Versuch mal void **arr. Scheinbar ist der compiler doch 
schlauer als du... Im übrigen ist der cast zu void* in der main Funktion 
unnötig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

void *arr=new void *[10];

Was macht so eine Zeile außerhalb jedes Funktionsrumpfes?

Und wie ist "arr" deklariert?

arr ist ein Pointer auf void, kein Pointer auf Pointer auf void, den 
bräuchtest Du hier aber, denn um das Ding als Array zu dereferenzieren, 
muss der Compiler wissen, wie groß ein Element ist.

von DasSams (Gast)


Lesenswert?

void **arr=new void *[10];

Ahja, das war der Fehler, danke.

Wärh schöner wenn der compiler ne klarere Meldung geben würde als:

Voidzeiger ist nich ein Pointer auf Objet Typ.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

DasSams schrieb:
> Wärh schöner wenn der compiler ne klarere Meldung geben würde als:
>
> Voidzeiger ist nich ein Pointer auf Objet Typ.

Das ist eine klare Fehlermeldung.

Sie besagt: Void-Zeiger können nicht dereferenziert werden. Und da 
sollte es "klick" machen.

von jonas biensack (Gast)


Lesenswert?

Der Fehler war eine Zuweisung außerhalb eines Funktionsblocks. Wann soll 
das bitte ausgeführt werden?

GRuß Jonas

von Dirk B. (dirkb2)


Lesenswert?

DasSams schrieb:
> Wärh schöner wenn der compiler ne klarere Meldung geben würde als:
>
> Voidzeiger ist nich ein Pointer auf Objet Typ.

Welche würdest du denn toll finden?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

jonas biensack schrieb:
> Der Fehler war eine Zuweisung außerhalb eines Funktionsblocks.

Nein, der Fehler trat in der Funktion "f" auf.

Die Zuweisung außerhalb des Funktionsblocks, die mich anfänglich auch 
verwirrte, ist in C++ zulässig.

von Kaj (Gast)


Lesenswert?

DasSams schrieb:
> // warum geht das nicht? ich will dass so!
Das ist dem Compiler herzlich egal was Du willst! Du hast dich an 
die Regeln der Sprache zu halten, und wenn du es nicht machst, gibt es 
vom Compiler eben 'ne Schelle, basta!

DasSams schrieb:
> Wärh schöner wenn der compiler ne klarere Meldung geben würde
Wenn du die Schelle nicht verstehst, dann ist das ebenso wenig das 
Problem des Compilers. Dann muss man sich halt mal mit der Sprache, 
welche man gedenkt einzusetzen, beschaeftigen.

von rakudah (Gast)


Lesenswert?

DasSams schrieb:
> Klappe du Warnung, ich bin schlauer als DU!

Was hiermit widerlegt wäre...

von H4x0r (Gast)


Lesenswert?

Vernünftiger C++ Code braucht zum Glück keine (oder nur sehr selten) 
void-Pointer. Das ist ein Relikt aus C-Tagen...

von Rolf Magnus (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> jonas biensack schrieb:
>> Der Fehler war eine Zuweisung außerhalb eines Funktionsblocks.
>
> Nein, der Fehler trat in der Funktion "f" auf.
>
> Die Zuweisung außerhalb des Funktionsblocks, die mich anfänglich auch
> verwirrte, ist in C++ zulässig.

Zuweisungen sind dort auch in C++ nicht erlaubt. Es handelt sich aber 
nicht um eine Zuweisung, sondern um eine Initialisierung. Die ist in C++ 
im Gegensatz zu C auch mit dynamischem Initialisierer möglich.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

DasSams schrieb:
> Klappe du Warnung, ich bin schlauer als DU!

Keineswegs.

Es gibt überhaupt keinen Grund, warum der Compiler Dein sinnlos 
hingerotztes Geschreibsel anerkennen sollte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.