2017-04-11 2 views
0

konvertieren Ich habe einen Code gefunden, der die Ausführungszeit von merge sort berechnet. Ich erhalte den Fehler "Kann Void nicht in int umwandeln". Und ich bin immer den Fehler aus dem Teil des Codes, der sagt x = malloc(n * sizeof (int));x = malloc (n * sizeof (int)); kann void nicht in int

x = malloc(n * sizeof (int)); 
+1

C++ und C unterscheiden sich hier. C++ hat strengere Regeln darüber, was in was konvertiert werden kann. 'void *' erfordert eine Umwandlung, um es in ein 'int *' umzuwandeln. Warum sollte 'malloc' in C++ trotzdem verwendet werden? Sie sollten 'new' einfacher zu bedienen finden. – user4581301

+5

Sie sollten eine [mcve] bereitstellen. Der meiste Code, den Sie gepostet haben, ist irrelevant. Ein dreizeiliges Programm reicht aus. – juanchopanza

+0

Jetzt fehlt die Deklaration von 'x', was sehr wichtig ist. – juanchopanza

Antwort

0

Sie sollten die malloc wie diese werfen.

x = (int *)malloc(sizeof(int) * n) 

weil malloc Rückkehr nur void-Zeiger

+0

Sie sollten "malloc" im ersten Fall nicht verwenden. Das oder einen C-Compiler verwenden. – user4581301

+0

@jingbe es funktioniert, aber jetzt habe ich einen Fehler sagen Lingking .. \ SOURCE \ MERGY.EXE – Leve

+1

@Leve Dieser Fehler vielleicht wegen Compiler oder Entwicklungstool. Versuchen Sie, das von Ihnen verwendete Werkzeug zurückzusetzen – jingbe

1

C++ Compiler strenger sind als C-Compiler. Daher wird nicht der gesamte C-Code mit einem C++ - Compiler kompiliert, daher sollten Sie keinen C++ - Compiler verwenden, wenn Sie keine C++ - Funktion verwenden.

malloc kehrt ein void *, so dass Sie es auf den entsprechenden Typ umwandeln müssen, vorausgesetzt, dass Sie einen C-Compiler verwenden:

Type * x = (Type *) malloc (sizeof(Type)); 

Aber wenn Sie müssen mit C++ und malloc, dann wie in den Kommentaren erwähnt, die C-Casts ein letztes Mittel sein sollte und man lieber static_cast

Type * x = static_cast<Type *>(malloc(sizeof(Type))); 
+0

Jemand ist down-voting nach dem Zufallsprinzip ... – Mansuro

+0

es funktioniert, aber jetzt habe ich einen Fehler sagen Lingking .. \ SOURCE \ MERGY.EXE – Leve

+0

@Leve Linker-Fehler sind knifflig, müssen Sie weitere Informationen – Mansuro

2

Da diese Frage mit C markiert ++, empfehle ich eine ganz andere Lösung verwendet werden soll: Umfassen Sie die Leistung von C++ und Verwendung a std::vector.

std::vector<int> descriptiveNameHere(n); 

Mit diesem Ansatz müssen Sie die Speicherzuordnung nicht manuell verwalten. Wenn der vector den Gültigkeitsbereich verlassen darf, wird der Speicher automatisch freigegeben.

Documentation on std::vector

+0

gefunden haben, während ich sicherlich der Meinung bin, dass in neuen Code sollte man 'std :: vector' es nicht tun Beantworten Sie die Frage und vielleicht sogar das Falsche, da nicht bekannt ist, was später im Code passiert. Das neu zugewiesene Array könnte auch an eine Funktion übergeben werden (die dann nicht kompiliert werden würde), die den Besitzer des Pointers übernimmt und ihn später löscht (was ein Fehler wäre). –

+0

@GertWollny Ich weiß, was im Rest des Codes ist; es ist eine C-Implementierung von Merge-Sort-OP kopiert von irgendwo, die einen unglücklichen Dialekt der Alphabet-Suppe verwendet. Ja, OP müsste auch eine andere Funktion modifizieren, um den "Vektor" zu akzeptieren, aber ich sehe immer noch "Vektor" als besser als "malloc" und "neu". Manchmal muss man X-Y gehen, anstatt eine direkte, aber minderwertige Antwort zu geben. Wir sollten keine rohen Zeigern ermutigen, und vor allem nicht "malloc". 'malloc' dient einem Zweck. Das ist es nicht. – user4581301

+0

Der Hauptgrund, warum diese Antwort existiert, ist keine der anderen Antworten, die sogar "neu" aufgeworfen wurden. Ich stoppte und hielt dann inne und dachte: "Welcher Programmierer, der sich selbst respektiert, würde hier keinen' Vektor' verwenden? " – user4581301

Verwandte Themen