Макрос выглядит так:
#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()
функционировать? Спасибо!
Я нашел вашу проблему:
Посмотрите на эту документацию http://www.cplusplus.com/reference/clibrary/cstdio/printf/
Заметьте что-нибудь о% d и% i? подписанный десятичное целое
Вы должны использовать% u или% lu, потому что clock_t без знака, а беззнаковое целое также явно без знака.
Редактировать: это была только половина проблемы, другая половина состояла в том, что он был уничтожение его стека (Макс больше, чем CNT) в функции битной сортировки, спасибо @nneonneo в чате за то, что нашли это.
Других решений пока нет …