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

Gast #3730004
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
*/
Gast #3730006
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.
Persönliche Seite #3730014
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.
Gast #3730024
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.
Gast #3730273
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.
Gast #3730465
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.