Почему я получаю отрицательное значение при использовании таймера MACRO на основе clock ()?

Макрос выглядит так:

#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() функционировать? Спасибо!

1

Решение

Я нашел вашу проблему:

Посмотрите на эту документацию http://www.cplusplus.com/reference/clibrary/cstdio/printf/

Заметьте что-нибудь о% d и% i? подписанный десятичное целое

Вы должны использовать% u или% lu, потому что clock_t без знака, а беззнаковое целое также явно без знака.

Редактировать: это была только половина проблемы, другая половина состояла в том, что он был уничтожение его стека (Макс больше, чем CNT) в функции битной сортировки, спасибо @nneonneo в чате за то, что нашли это.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector