C/C++

Измерение времени на си. Почему-то скорость сортировки массива выводится со второго раза.. И еще надо измерить память

Надо измерить память, которую занимает сортированный массив
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

clock_t fTimeStart, fTimeStop;

// добавление элементов в стек
Plan c1 = { "Бананы", 250, 50 };
push(c1);
Plan c2 = { "Йогурт", 180, 60 };
push(c2);
Plan c3 = { "Хлопья", 100, 30 };
push(c3);
Plan c4 = { "Хлебцы", 60, 15 };
push(c4);
int n = top + 1; // get the size of the stack
Plan plans[MAX_SIZE];
int i = 0;
printf_s("Изначальный массив:\n");
int current_top = top; // save the current top of the stack
for (int i = 0; i < n; i++) {
plans[i] = stack[current_top];
current_top--;
}
// print out the contents of the array
for (int i = 0; i < n; i++) {
printf_s("Name: %-10s gramm: %-10d kkal: %-10d'\n'", stack[i].name.c_str(), stack[i].gramm, stack[i].kkal);
}
printf_s("\n");
int pam = sizeof(plans);


double duration = 0;
int a = 0;
do {
printf("Введите операцию:\n");
printf_s("0: Отсортировать массив пузырьком\n");
printf_s("1: Отсортировать массив слиянием\n");

scanf_s("%d", &a);
switch (a)
{
case 0:
printf("Отсортированный пузырьков массив:\n");
fTimeStart = clock();
BubbleSort(stack, n);
for (i = 0; i < n; i++)
{
printf_s("Name: %-10s gramm: %-10d kkal: %-10d'\n'", stack[i].name.c_str(), stack[i].gramm, stack[i].kkal);
}
fTimeStop = clock();
duration = (double)(fTimeStop - fTimeStart) / CLOCKS_PER_SEC;
printf("Time: %f\n", duration);
printf("Memory: %f\n", pam);

break;
case 1:
printf("Отсортированный слиянием массив:\n");
fTimeStart = clock();
merge(stack, n);
for (i = 0; i < n; i++)
{
printf_s("Name: %-10s gramm: %-10d kkal: %-10d'\n'", stack[i].name.c_str(), stack[i].gramm, stack[i].kkal);
}
fTimeStop = clock();
duration = (double)(fTimeStop - fTimeStart) / CLOCKS_PER_SEC;
printf("Time: %f\n", duration);
printf("Memory: %f\n", pam);
break;
}
} while (a != -1);

}
IS
Iskan S.r
60
Форматная спецификация неправильная.
 %f  - float
%lf - double
Учитывая расположение знака, экспонента и мантиссы в памяти, использование не той спецификации будет выводить чушь. Это не то же самое, что ошибиться между int и long.

А int выводить с %f - гарантированно выведет не то.
 %d  - int
%ld - long
%u - unsigned int
%lu - unsigned long

Вообще современные компиляторы выдают предупреждения на тему несоответствия форматных спецификаций printf и типов аргументов. Вы их игнорируете, лишь бы запустилось?

И потом, в коде отсутствует вывод строки "Массив в отсортированном виде", а в выводе он есть. Вывод - от другого кода.
Юрий Бацман
Юрий Бацман
87 571
Лучший ответ
Iskan S.r как исправить?
Вывод массива продублирован в функции сортировки, поэтому такой двойной вывод, один без времени (внутри функции), второй со временем (внутри основной программы).
Общество анонимных трубкозубов рекомендует реализовать отдельную функцию для вывода результатов, а таковую реализацию внутри программы и функций сортировки - убрать.
Так же фиксация времени не должна включать операции не связанные с сортировкой - а именно печать результатов.
Засекаем время - сортировка - фиксируем сколько времени прошло - вывод результата.
Консилиум стандартизаций колбасных изделий настоятельно рекомендует писать либо в стиле Си либо в стиле С++ а не смешанно как у вас. Выглядит как письмо Федора родителям.
Так же не понятно что должна мерять память. Массив каким был таким и остается. А размер дополнительно создаваемых (как Plan* c) такой же как и у основного.