4

バイナリ、10 進数、16 進数、および 10 進数をこれらのオプションのいずれかに変換するプログラムを作成しています。16 進数の場合、9 より大きい値を A、B、C、D、E、F のいずれかにフォーマットする方法が必要です。これはいくつかの関数で繰り返されるため、次の関数を作成することにしました。

char hexRepresentation(double n){
    if(n > 9){
        if(n==10) return 'A';
        if(n==11) return 'B';
        if(n==12) return 'C';
        if(n==13) return 'D';
        if(n==14) return 'E';
        if(n==15) return 'F';
    }

    return (char)n;
}

ただし、コンパイルしようとすると、エラーが発生します

「hexRepresentation」のタイプが競合しています

私は Java から来た C の初心者で、実装するのが最も簡単であるべきことをめぐって壁に頭をぶつけています。どんな助けでも大歓迎です!

4

3 に答える 3

9

C では、関数を前方宣言しない場合、ほとんどのコンパイラは int 型を返す extern 関数を想定するため、宣言のようなエラーは発生しません。実際、コンパイラはこれについて警告するはずです (ほとんどの場合)。その後、コンパイラが実際に関数の実装に到達すると、別の戻り値の型 (この場合は char) が検出され、「競合する型」エラーがスローされます。この種のエラーを回避するには、すべての関数を前方宣言するだけです。

次のコードのようなもので、同様の結果が得られる最善の方法は何でしょうか。

if (n > 9)
{
   return('A' + (n - 10));
}
于 2012-10-20T21:19:52.217 に答える
1

投稿されたコードで何をしていてもdouble、関数内でデータ型をまったく使用していません。また、関数の戻り値の型から、戻り値が 127 を超えることはないようです。

このコードはいくつかの問題を強調しています:(これは単なる説明です)

char hexRepresentation(double n){
    if(n > 9){//comparing (double>int). Bad.
        if(n==10) return 'A';
        if(n==11) return 'B';
        if(n==12) return 'C';//You wrote if(double == int). Bad.
        if(n==13) return 'D';
        if(n==14) return 'E';
        if(n==15) return 'F';
    }

    return (char)n; //again unsafe downgrade from 8 bytes double to 1 byte char.
}

コンパイラ エラーを修正したとしても、関数内でのデータ型の危険な使用により、常に目的の結果が得られるとは限りません。

なぜ悪いのかを知るには、ここを見てください:

http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm

その関数本体fabs(n)のどこでも代わりに使用します。n

hexRepresentationまた、この関数定義の前に同じ名前の関数の以前の宣言または定義が存在する場合、「'hexRepresentation' の型が競合しています」というエラーが表示されます。また、関数を宣言せず、呼び出された後にのみ表示される場合はint、コンパイラによって自動的に想定されます。

そのため、main() の前に関数を宣言して定義するか、main() の前に宣言して、ファイル内の他の場所で関数を定義しますが、同じ関数プロトタイプを使用します。

行う:

 char hexRepresentation(double); //Declaration before main
 main()
 {
   ...
 }
 char hexRepresentation(double n){//Definition after main
 ...
 }

または

 char hexRepresentation(double n){ //Declaration and definition before main
  ...
 }

 main()
 {
    ...
 }
于 2012-10-20T21:32:50.003 に答える
0

プッシュ機能とポップ機能を持つ 1 つのスタック (char 用) を作成するだけです。同じ関数でそこに出力するだけで値を返すわけではありません。(整数値のみに実装されています)

#define max 100
char a[max];

void hex(int n)
{
 while(n>0)
 {
 int rem = n%16;
 if (rem<10)
   push(rem+'0');
 elsif(rem >=10 && rem <16)
   {
     switch(rem)
     {
       case 10:
         push('A');break;
         case 11:
         push('B');break;
         case 12:
         push('C');break;
         case 13:
         push('D');break;
         case 14:
         push('E');break;
         case 15:
         push('F');break;
     }
    else
       n=n/16;
   }
   }
   i=0;
   while(top>-1)
     a[i++]=pop();
   i=0;
   while(a[i]!='\0')
     printf("%c",a[i++]);
}

役に立ちましたか?

于 2012-10-20T21:09:54.060 に答える