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:2 Changed 5 years ago by
Починил ошибки. Теперь valgrind не ругается. Как оказалось я выделял 3 байта размера интов, когда нужно было размера чаров
comment:3 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Все еще есть ошибки:
- 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.
Немного изменил считывание бинарного файла. Теперь считываю сразу 3 байта. Попробовал пройтись valgrind-ом. Испугался. Закрыл. Как исправить все эти ошибки не понял(( Зато программа работает. И malloc == free