Opened 5 years ago

Closed 5 years ago

#452 closed ожидается проверка (задача сдана)

WW #5

Reported by: sarmin.pavel Owned by: Артур Гулецкий (huletski)
Component: WW_c_io Version: 1.0
Keywords: Cc:

Description

Чуть-чуть опоздал, простите.

Change History (3)

comment:1 Changed 5 years ago by sarmin.pavel

Немного изменил считывание бинарного файла. Теперь считываю сразу 3 байта. Попробовал пройтись valgrind-ом. Испугался. Закрыл. Как исправить все эти ошибки не понял(( Зато программа работает. И malloc == free

Last edited 5 years ago by sarmin.pavel (previous) (diff)

comment:2 Changed 5 years ago by sarmin.pavel

Починил ошибки. Теперь valgrind не ругается. Как оказалось я выделял 3 байта размера интов, когда нужно было размера чаров

Last edited 5 years ago by sarmin.pavel (previous) (diff)

comment:3 Changed 5 years ago by Артур Гулецкий (huletski)

Resolution: задача сдана
Status: assignedclosed

Все еще есть ошибки:

  • count: в main.c:13 указатель на int ссылается на блок памяти размера 1 байт, но при подсчете числа элементов используются все sizeof(int) байт -> ошибка использования памяти -> -1.5. Fix: завести переменную на стеке (а не в динамической памяти) и передавать ее адрес как указатель при вызове apply;
  • запись в бинарный файл (функция fbprint): проблема та же - указатель на int инициализируется блоком памяти размером 1 байт, после чего с pointee работают как с int'ом -> -0.5, т.к. ошибка однотипная. Fix: тот же, что и в предыдущем случае; также можно записывать данные непосредственно из полей структуры (fwrite(&point->x, ...); ;
  • чтение из бинарного файла: поскольку элементы буфера имеют тип char, a он _signed_ (строго говоря, "знаковость" его отдается на откуп реализации компилятора; чаще всего реализуется как signed, у меня (gcc 9.2.1) - signed), то значения в интервале [0x80..0xFF] будут интерпретироваться как отрицательные при арифметических операциях -> конверсия буфер-int в строке main.c:30 не работает в общем случае -> -1. Dumb fix: добавить флаг -Wunsigned-char при компиляции; Ad-hoc fix: заменить тип элемента буфера на unsigned char (явно указать знаковость); Fix: читать значения в переменные непосредственно int x = 0; fread(&x, 3, 1, f_in); .

Складывается ощущениe, что у вас в понимании есть следующие неточности:

  • malloc(1) выделяет память под количество элементов массива. Это не так, аргумент задает размер блока памяти;
  • если что-то принимает указатель, то надо обязательно передавать переменную типа указатель или динамическую память. Это не так, обычно функция ожидает _адрес_ начала блока памяти, которая может быть и динамическая (в куче), и стековая. При выборе места хранения данных (heap vs stack) надо иметь в виду "время жизни" данных в памяти: если они не нужны после завершения функции - можно хранить на стеке, если их размер относительно небольшой.

Замечания:

  • отступы -> -1;
  • удаление последнего элемента списка после чтения: читается лишний элемент и вместо того, чтобы починить код чтения (проверять успешность чтения после каждой операции и, если прочесть элемент не удалось, выходить из цикла), был дописан неочевидный код удаления последнего элемента. Так делать не надо, надо разбираться в проблеме и чинить ее причину, а не следствие -> -0.5.

--
Итог: 5.5

Note: See TracTickets for help on using tickets.