2016-05-04 13 views
-2

私はC言語を学んでいますが、その漠然としたコンパイラのエラーメッセージはますますイライラしています。ここに私のコードは次のとおりです。returnはキャストのないポインタから整数を返す[-Wint-conversion]戻り値

char getkey (int minimo, int maximo, int alphalen, int index, char alpha[]) 
{ 
    int cociente, residuo, cont; 
    int i = 0; 
    char cand[maximo+1]; 
    char candidate[maximo+1]; 

    while (index != 0) 
    { 
     cociente = index/alphalen; 
     residuo = index%alphalen; 
     cand[i] = residuo; 
     index = cociente; 
     i+=1; 
    } 

    for (cont=i-1; cont>=0; cont--) 
    { 
     int pos = cand [cont]; 
     candidate[i] = alpha[pos];  
    } 
    return candidate; 
} 

これは、1回の警告を生成します。

  • リターンは、キャスト
    • リターン候補なしポインタから整数になります。

誰かがこれらの警告を説明できますか?

+0

あなたの関数はcharを返すことを期待していますが、charを返していますか? –

+2

候補は文字ではありません –

+0

あなたの関数は 'char'を返すとして宣言されていますが、あなたは' char * 'を返そうとしています。 –

答えて

3

ローカル変数candidateは、charの配列です。あなたが言うとき

return candidate; 

あなたはcharへのポインタを返します。 (これは、Cの配列とポインタの間の非常に密接な関係のためです。あなたがまだ分かっていない場合には、それについて学ぶ必要があります)。しかし、あなたの関数getkeyは、ポインターではなくcharを返します-char。

関数の戻り値をその型に一致させる必要があります。 returnステートメントを変更して、1つのcharを返すことができます。関数に文字列全体を返す場合は、その宣言をchar *getkey()に変更することができます。その場合は、candidate配列の割り当ても処理する必要があります。

警告の意味は次のとおりです。あなたはポインタを返そうとしました。この関数は、小さな整数として表される文字を返すことになっています。コンパイルは、あなたが本当にやりたいことがある場合に備えて、ポインタを整数に変換しようとしますが、それは通常は良い考えではないので、あなたに警告します。実際、この場合、警告はおそらく間違いを起こしたと伝えます。

+4

「Cでの配列とポインタの等価性」として本当に知られていますか?それは本当ではないので。配列は特定のコンテキスト(すなわち、渡したり戻ったりする)のもとでポインタに崩壊することがありますが、ポインタではありません。 – Kevin

+0

@ Kevin "Equivalence"は私たちがそれを呼び出すために使ったものです。 (誰もその言葉をもう使用しないのですか?)「同値」は、彼らが同じことを意味するわけではありません。彼らは密接に関係しているだけで、密接に関連しています。 http://c-faq.com/aryptr/aryptrequiv.htmlを参照してください。 –

+0

いいえ、配列とポインタは密接に関連していません。 1つはメモリアドレス、もう1つはメモリに連続して配置された_n_要素です。 – emlai

2

getkeycharを返すように宣言されていますが、あなたはchar配列であるcandidateを返すようにしようとしています。

おそらく、配列内の要素の1つ、つまりcandidate[x]を返すことを意味していました。

"array"ではなく "pointer"と表示される理由は、コンパイラがcandidateを配列の最初の要素へのポインタに変換していることです。配列をCの値で返す(またはパラメータとして渡す)ことはできません(What is array decaying?参照)。

関連する問題