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 的一些事情了吗?有符号十进制整数

您必须使用 %u 或 %lu 因为 clock_t 是无符号的,而 unsigned int 显然也是无符号的。

编辑:这只是问题的一半,另一半是他在 bitsort 函数中破坏了他的堆栈(MAX 大于 CNT),感谢聊天中的@nneonneo 发现了这一点。

于 2012-10-06T07:13:44.247 回答