2

BinaryとHexを使用して、Cで基本的な練習を書こうとしています。2の倍数(2の累乗)を印刷する方法と、その2の倍数の16進形式を印刷する別の方法を作成しました。

#include <stdlib.h>
#include <stdio.h>

const char one = 1;
const int bits = 31;

void    print2       ()
{
    unsigned int  u = (int)one;
    unsigned int j;

    printf("The powers of 2 are:\n");

    for(j=0;j<bits;j++)
    {
            unsigned int temp = u<<j;
            printf("%d\n",abs(temp));
            printhex(temp);
    }

    printf("\n\n");
}

void    printhex       (unsigned int   u)
{
    printf("0x%08X\n",u);
}

int main ()
{
    print2();
    return(EXIT_SUCCESS);
}

私が理解していないのは、メソッド「printHex」を呼び出すと「競合するタイプ」というエラーが発生する理由です。特に符号なし整数を要求し、パラメーター内でメソッドを呼び出すと(符号なし整数 "temp"と想定)、コンパイラーは受け入れません。

4

2 に答える 2

6

printhex()使用する前にプロトタイプを提供していないため、問題が発生します。

ソースファイルのprinthex()前に物理的に配置するか、宣言を追加します。print2()

extern void printhex(unsigned int u);

print2()に定義されています。printhex()(内部で宣言しないでくださいprint2()。構文的には合法ですが、そうすることは悪い習慣です。)


コンパイラが呼び出しを実行するとprinthex(temp)、(C89ルールの下で)不確定な引数リストを持つ関数であると想定しますint(ただし、正式には可変引数リストではありません。のようなvarargs関数printf()は、常にスコープ内にプロトタイプが必要です。 )。後でそれを返すものとして定義するとvoid、それは動揺し、競合するタイプのエラーを報告します。C99ルールでは、関数を使用する前に、スコープ内にプロトタイプがあることになっています。

あなたのレイアウトについてコメントしたいと思います。それは少し非正統的です。

関数定義には、それほど多くの空白は必要ありません(関数定義で使用する空白を少なくしてください)。

void    print2       ()
void    printhex       (unsigned int   u)

だろう:

void print2(void)
void printhex(unsigned int u)

私がそれらを書いていたら。(void)関数のプロトタイプ表記と一致するように、定義に明示的な関数を記述します。実際、私がそれらを書いていた場合、それらには接頭辞が付いている可能性が高くなりますstatic。私が書いた関数が、それが含まれているソースファイルの外部で使用されない場合は、自動的に静的にします。さらに、関数が使用される前に静的として定義されている場合は、関数の2番目の宣言は必要ありません。関数が静的でない場合、私の本には、関数を宣言するヘッダーがあり、そのヘッダーは、関数を定義するファイルと関数を使用するファイルの両方で使用する必要があります。これにより、一貫性が保証されます。

また、abs(temp)少し奇妙なものを使用します。unsigned intこれは、を署名付きに変換するための長い道のりですが、次のintように書く方がよいでしょう。

 printf("%u\n", temp);

最後に、ループでより多くの空白を使用することをお勧めします。for

for (j = 0; j < bits; j++)

カンマまたはセミコロンの前にスペースを入れないでください。二項演算子の前後のスペース(単項演算子、または添え字やメンバー(.または->)演算子などの非常に緊密にバインドされた演算子ではありません)。

出力は16進数と10進数をインターリーブします。あなたはそれを使う方が良いと思うかもしれません:

printf("%10u ", temp);

10進値を行の右揃えにし、16進数を同じ行の後に表示します。

于 2013-01-27T01:59:17.800 に答える
4

printhex宣言する前に使用(呼び出し)しようとしています。と言って前方宣言するかvoid printhex (unsigned int u)void printhex (unsigned int)定義を前に移動しますprint2

于 2013-01-27T01:59:23.097 に答える