2017-04-11 20 views
0

マージソートの実行時間を計算するコードが見つかりました。 「voidをintに変換できません」というエラーが表示されます。そして、私はx = malloc(n * sizeof (int));x = malloc(n * sizeof(int)); voidをintに変換できません

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

ここではC++とCが異なります。 C++は、何に変換できるかについてより厳しい規則を持っています。 'void *'はそれを 'int *'に変換するためにキャストが必要です。とにかくC++で 'malloc'を使うのはなぜですか?あなたは 'new'を使いやすくする必要があります。 – user4581301

+5

[mcve]を入力してください。あなたが投稿したコードのほとんどは無関係です。 3行のプログラムが行います。 – juanchopanza

+0

これで重要なことである 'x'の宣言が欠落しています。 – juanchopanza

答えて

0

を言います。このコードの一部からエラーを取得していますが、このようにmallocをキャストする必要があります。

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

malloc関数は、ちょうど

+0

最初のケースでは 'malloc'を使うべきではありません。 Cコンパイラを使用するか、それを使用します。 – user4581301

+0

@jingbeそれは動作しますが、今私はLingking .. \ SOURCE \ MERGY.EXEと言っているエラーを受けました – Leve

+1

@Leveそのエラーは多分コンパイラや開発ツールのためです。使用するツールをリセットしてみてください – jingbe

1

C++コンパイラは、Cコンパイラよりも厳しいのvoidポインタを返すため。したがって、すべてのCコードがC++コンパイラを使用してコンパイルされるわけではないので、C++の機能を使用していない場合はC++コンパイラを使用しないでください。 、

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

しかし、あなたは、その後のコメントで述べたように、C++やmalloc関数を使用する必要がある場合:

mallocは、あなたが対応する型にキャストする必要がありvoid *を返しますが、Cコンパイラを使用していることを提供しましたC++のパワーと使用を抱擁:この質問は、C++でタグ付けされているので、私は完全に別のソリューションをお勧めしますCスタイルのキャストは、最後の手段であるべきとするのではなくstatic_cast

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

誰かが無作為にダウン投票しています... – Mansuro

+0

これは動作しますが、Lingking .. \ SOURCE \ MERGY.EXE – Leve

+0

というエラーが表示されます。@Leve Linkerのエラーは扱いにくく、コンパイルしたときに詳細情報を提供する必要があります – Mansuro

2

を使用する必要がありますa std::vector

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

この方法では、メモリ割り当てを手動で管理する必要がなくなります。 vectorが有効範囲外に出ることが許可されると、ストレージは自動的に解放されます。

Documentation on std::vector

+0

を見つけたリンクをチェックしてください。新しいコードでは 'std :: vector'を使うべきです。 コードに後で何が起こるかわからないので、質問に答えて、間違っているかもしれません。新しく割り当てられた配列は、ポインタの所有権を持ち、後でそれを削除する(コンパイルしない)関数に渡すこともできます(バグ)。 –

+0

@ GertWollny私はコードの残りの部分を知っています。それは、アルファベットスープの不幸な方言を使用するどこかからコピーされたマージソートOPのC実装です。はい、OPは 'vector'を受け入れるために別の関数を変更する必要がありますが、' malloc'や 'new'よりも' vector'が好ましいと考えられます。場合によっては直接的ではなく劣った答えを提供するよりもX-Yに行かなければならないことがあります。我々は、特にmallocではなく、生のポインタを推奨するべきではありません。 'malloc'は目的を果たします。これはそうではありません。 – user4581301

+0

この回答の主な理由は、他の回答が新しくなったこともなく、私はそれを見つめて停止し、「自尊心の高いプログラマがここでは「ベクトル」を使用しないだろうか」と考えました。 – user4581301

関連する問題