2009-04-25 11 views
3

私は6ビットの数字を取り、最初の3ビットを取り除き、それに基づいて "r"、 "w"または "o"を返すという単純な関数をC言語で書いています。「警告:戻り値は、キャストのないポインタから整数を作る」とはCの意味ですか?

しかし、コンパイルすると、 'returnはキャストなしでポインタから整数を作ります'という警告が表示されます。次に、私がプログラムを実行すると、関数が間違いなく3つのうちの1つではない奇妙な文字を返すことがわかります。

ここでは何が起こっていますか?前もって感謝します。

は、ここに私の機能です:

char 
readorwrite(int opcode) 
{ 
    if (opcode >> 3 == 4) { 
     return "r"; 
    } else if (opcode >> 3 == 5) { 
     return "w"; 
    } else { 
     return "o"; 
    } 
} 
+3

ニールバターワースは、あなたがすべき今削除答えで指摘shiftやANDやORなどのビット単位の演算子を、等価などの比較と混在させることには非常に注意してください。シフト演算子は、比較よりも優先順位が高くなります。しかし、私はそれをチェックするために優先順位テーブルに行っていなければなりませんでした。私はCの初心者ではありません。ビットマスキングとビットシフトの際に特に問題があります。コードを見直すために私に提示されたかどうかは、コンパイラが意図したとおりに正確に処理するにもかかわらず、シフト操作の周りに余分な括弧を要求します。 –

答えて

18

問題は "R"、 "W" と "O" は、彼らの実際の型がchar []またはchar *があることを意味し、文字列定数、ということです。これはあなたの関数がゼロ終端文字列へのポインタを実際に返していることを意味します。 1文字の場合は、代わりに 'r'、 'w'、 'o'を使用してください。あなたはconst char *を返す

4

、つまりあなたが文字を返すべきである場合、文字列の「o」が格納されているメモリ内の場所へのポインタ「O」

関連する問題