Fehlermeldung: invalid conversion from void to char. Wer kann helfen?
-
Ich habe mit folgendem Programm Probleme. Beim Kompilieren bekomme ich folgende Fehlermeldung:
alloc.c: In function ‘int main()’: alloc.c:19: error: invalid conversion from ‘void*’ to ‘char**’ alloc.c:22: error: invalid conversion from ‘void*’ to ‘char*’ alloc.c:29: error: invalid conversion from ‘void*’ to ‘char*’Also immer an der Stelle an der ich dem Zeiger "test" einen Speicherbereich mit "malloc" zuordne. Ich bin mir sicher, dass es nur eine kleine Änderung an dem Programm bedarf, auf die ich aber bisher alleine nicht gekommen bin.
Hier das Programm, es geht dabei um dynamische Speicherbelegung, aber um die Fehlermeldung auszumerzen sind wahrscheinlich nur die fettgedruckten Zeilen interessant.
Vielen Danke für eure Hilfe.
#include <stdio.h> #include <stdlib.h> #include <time.h> unsigned int iterations=1000; // Anzahl der Wiederholungen fuer den Test unsigned int blockMax=10000; // Maximale Blockgroesse fuer malloc unsigned int vectorLength=500; // Laenge des Zeigervektors main() { char **test; unsigned int i,j,quot,t1,t2,blockSize; t1=clock(); // Stoppuhr an for(blockSize=500;blockSize<=blockMax;blockSize+=500) { quot=RAND_MAX/blockSize; // t1=clock(); test=malloc(vectorLength*sizeof(char *)); for(i=0;i<vectorLength;i++) // Initialisierungsschleife { test[i]=malloc((rand()/quot)*sizeof(char)); } for(j=0;j<iterations;j++) // free/alloc-Schleife { for(i=0;i<vectorLength;i++) { free(test[i]); test[i]= malloc((rand()/quot)*sizeof(char)); } } for(i=0;i<vectorLength;i++) // Freigabeschleife { free(test[i]); } // t2=clock(); // printf("%i %f\n",blockSize,((double)(t2-t1))/CLOCKS_PER_SEC); } free(test); t2=clock(); // Stoppuhr aus printf("%i %f\n",blockSize,((double)(t2-t1))/CLOCKS_PER_SEC); }/edit pumuckl [cpp
]-Tags - bitte demnächst selber machen
-
In C++ musst du die Rückgabe von malloc in den entsprechenden Zeigertyp casten (in C allerdings nicht).
-
Zwei mögliche Lösungen:
1. Nimm new[]/delete[]
2. Benutze einen C-CompilerEs gibt zwar noch eine dritte Lösung, aber die verschweige ich.
-
Wenn ich schon wieder sehe, dass 'main()' als gültiges C/C++ angenommen wird, würde ich sowieso einen anderen Compiler empfehlen. Was nimmst du denn?
-
Danke, für die schnelle Hilfe. Ich habe mich jetzt für die Lösung mit new/delete entschieden, da C-Compiler nicht möglich ist (das Programm ist Grundlage für ein anderes in dem ich Boost-Bibliotheken benutze).
Jetzt stehe ich vor folgender Herausforderung:
wie setze ich diesen Befehl
*test[i]=malloc((rand()/quot)sizeof(char));
in einen "new"-Befehl um. Soweit ich weiss, kann ich bei new nur größen wie "int" "char" etc. benutzen aber keine Werte wie hier bei Malloc (Zahl * sizeof(char)).
@SeppJ: ich benutze g++ Kompiler und würde gerne dabei bleiben.
-
Das mit new geht schon, einfach ausprobieren.
Ist rand() in malloc nicht ein wenig krank? Woher weißt du später, wieviel Speicher alloziert wurde, wenn du den zufallsgenerierten Wert nicht irgendwo wegspeicherst?
-
IngoBoetch schrieb:
Danke, für die schnelle Hilfe. Ich habe mich jetzt für die Lösung mit new/delete entschieden, da C-Compiler nicht möglich ist (das Programm ist Grundlage für ein anderes in dem ich Boost-Bibliotheken benutze).
Jetzt stehe ich vor folgender Herausforderung:
wie setze ich diesen Befehl
*test[i]=malloc((rand()/quot)sizeof(char));
in einen "new"-Befehl um. Soweit ich weiss, kann ich bei new nur größen wie "int" "char" etc. benutzen aber keine Werte wie hier bei Malloc (Zahl * sizeof(char)).
@SeppJ: ich benutze g++ Kompiler und würde gerne dabei bleiben.
- Bevor du die Boost-bibliotheken benutzen willst solltest du erstmal ein Grundlagentutorial durchgehen, da steht unter anderem drin, wie man new benutzt. Das ist in etwa als wolltest du Integralrechnung benutzen ohne das kleine Einmaleins zu können.
- Benutze bitte die [cpp]-Tags wie oben bereits gezeigt.
- Wie alt ist dein g++? Der Code den du uns da präsentierst hat einen schwerwiegenden Fehler (main-Funktion ohne Rückgabetyp ist in den 80ern vielleicht mal möglich gewesen, inzwischen sollte jeder Compiler einen Fehler ausgeben)
- Dein Code ist C, kein C++:
- malloc/free sind wie schon angedeutet C-Funktionen. In C++ benutzt main new/delete, spätestens bei der Benutzung von non-PODs erhälst du sonst undefiniertes Verhalten.
- <stdio.h>, <stdlib.h>, <time.h> sind alte C-Header die man in C++ nicht benutzen sollte (wenn die im C++-Tutorial/buch stehen schmeiß es weg und nimm ein richtiges)
- printf ist eine C-Funktion, in C++ benutzt man im Normalfall die <iostream>-Bibliothek
-
So jetzt funktionierts und zwar mit:
test[x]= new char(rand()/quot);
Danke für die Hilfe.
@matze: krank? kann sein. Ist eine Idee von meinem Prof. gewesen. Es ist gewollt dass einfach wild Speicher belegt und freigegeben wird. Hintergrund der Sache ist, dass im nächsten Schritt geprüft wird inwiefern sich das Zeitverhlaten ändert wenn man das ganze mit parallel-laufenden Threads probiert (auf Multi-Core-Rechnern).
-
IngoBoetch schrieb:
@matze: krank? kann sein. Ist eine Idee von meinem Prof. gewesen. Es ist gewollt dass einfach wild Speicher belegt und freigegeben wird. Hintergrund der Sache ist, dass im nächsten Schritt geprüft wird inwiefern sich das Zeitverhlaten ändert wenn man das ganze mit parallel-laufenden Threads probiert (auf Multi-Core-Rechnern).
Hm, der Sinn dahinter (und wie man da eine verlässliche Aussage bekommen will, und vor allem wozu) will sich mir noch nicht ganz erschließen, aber gut...
Übrigens: Wenn du malloc/new benutzt, solltest du normalerweise zur Sicherheit prüfen, ob nicht ein NULL-Zeiger zurückgegeben wurde (was üblicherweise Speichermangel bedeuten würde).
-
_matze schrieb:
Übrigens: Wenn du malloc/new benutzt, solltest du normalerweise zur Sicherheit prüfen, ob nicht ein NULL-Zeiger zurückgegeben wurde (was üblicherweise Speichermangel bedeuten würde).
Ich denk mal du meinst malloc/free
new wirft std::bad_alloc bei fehlschlag
-
pumuckl schrieb:
Ich denk mal du meinst malloc/free

Jepp, klar...