Константин, спасибо за Труд, смотрю с удовольствием. Позвольте покритиковать вашу реализацию problem_pe. 1) Вы как-то очень смело сравниваете внутри fill() в циклах индексы с "n*8+1", но это отличный шанс улететь за границы массива при упаковке по 8 флагов в n байтах. Надо бы "< sv->n*8", хватаем диапазоны [0,7] в 1 байте, [0,15] в двух и т.д - то, что надо. 2) По поводу main() Справедливости ради, надо сказать, что main(), в данном случае - не часть решения, скорее - элемент теста, но и о его качестве желательно позаботиться. 2.1) Запросить массив на 1 char больше, выделяя память calloc'ом в main(), при целочисленном делении n/8 точно не помешает, из-за округления последним битикам может не достаться байта для хранения - опять выход за границы массива. Правда, тут ни этого, ни самого деления не надо, раз уж выяснилось, что по условию задачи, n - число байтов в массиве решета. 2.2) Само собой, надо проверить ввод данных и результат выделения памяти. 3) Вместо "8" красивее везде использовать CHAR_BIT из limits.h, или хотя бы добавить assert(CHAR_BIT==8), вы упоминали про возможность другой ёмкости char'ов (и байтов - минимально адресуемых единиц). Прямой эфир, явный цейтнот - вопросов нет. А в комментариях, придирки мои, возможно, лишними не будут. Всем успехов, ещё раз спасибо!
не знаю как в ПК устроено, но на микроконтроллерах real-time-clock тактируется от отдельного генератора (обычно 32768Гц), а время выполнения (например на ARM-ах) можно замерить по отдельному счётчику тактов ядра
16:19 У меня вопросы по поводу функции diff. Зачем внутри нее создавать еще timespec temp? Зачем манипуляции с вычитанием одной секунды, а также константами ...AS_NSEC? Можно ведь данную функцию реализовать так: double diff(struct timespec* tsStart, struct timespec* tsEnd) { double nSecStart = (*tsStart).tv_nsec, nSecEnd = (*tsEnd).tv_nsec, nSecDuration; if (nSecStart > nSecEnd) nSecDuration = nSecStart - nSecEnd; else nSecDuration = nSecEnd - nSecStart; return ((*tsEnd).tv_sec - (*tsStart).tv_sec + nSecDuration / 1000000000); } Или в моей реализации будут проблемы с точностью из-за неявного приведения к double?
@@tilir нет тестов я не писал. Но я опробовал игрался с данной функцией на примитивной реализации Фибоначи (рекурсивной). А также опробовал ее просто выводя строку на экран - это уже делал в годболте чтобы хоть какое-то время увидеть. Или мне нужно было тест написать для самой функции?
21:06 Всё-таки 2 гигогерца это 2 * 10^9 тактов в секунду, поэтому проверка займёт намного меньше времени чем 10 часов. 2^50 это ещё не слишком большое число