1

マクロは次のようになります。

#define MAX 10000000
#define CNT 1000000
#define TIMER_INIT             \
    clock_t starttime, endtime;    \
#define TIMER(txt, process)                     \
    starttime = clock();                        \
    process;                            \
    endtime = clock();                      \
    printf("%-20s %20ld\n",                     \
           txt, (endtime - starttime))

メインコードは次のとおりです。

char vector2[CNT/8 + 1];

TIMER(  "bitsort",
        for(i = 0; i < CNT; ++i)
            set1(rand() % MAX, vector2));

そして、set1関数は次のようになります。

void set1(int pos, char* vector)        /* set the position to 1 */
{
    vector[pos/8] |= (0x1 << pos%8);
}

プログラムを実行すると、出力は次のようになります。

bitsort                -36035411302143896

私がこのように違いをキャストしたとしてもunsigned int、それはまだ機能しません:

#define TIMER(txt, process)                     \
    starttime = clock();                        \
    process;                            \
    endtime = clock();                      \
    printf("%-20s %20d\n",                      \
           txt, (unsigned int)(endtime - starttime))

出力はbitsort -16766097

に変更しようとしまし%ld%dが、機能しません。

しかし、次のように、パラメーターで使用しない場合forは、次のようになります。

TIMER("bitsort", set1(rand() % MAX,vector2));

完璧にTIMER動作し、合理的な結果が得られます。

誰かが私のコードの何が問題になっているのか考えていますか?マクロによるものですか、それともclock()機能によるものですか?ありがとう!

4

1 に答える 1

2

私はあなたの問題を見つけました:

このドキュメントをご覧くださいhttp://www.cplusplus.com/reference/clibrary/cstdio/printf/

%dと%iについて何か気づきましたか?符号付き10進整数

clock_tは符号なしであり、unsigned intも明らかに符号なしであるため、%uまたは%luを使用する必要があります。

編集:これは問題の半分にすぎませんでした。残りの半分は、チャットで@nneonneoが見つけたおかげで、ビットソート関数でスタック(MAXはCNTよりも大きい)を破壊していたことです。

于 2012-10-06T07:13:44.247 に答える