[cdev] Задача_6. гр 135
Grigoriy A. Sitkarev
sinclair80 на gmail.com
Пн Мар 1 13:07:41 MSK 2010
Если ответить коротко, то не работает, потому что ты пилишь сук на котором
сидишь.
В функции prioq_new ты сначала выделил память и для самой структуры очереди
и для кучи, при этом указатель на кучу ты тут же присвоил в поле heap. Затем
ты структуру обнуляешь через memset(3) и всё её содержимое будет заполнено
нулями, в том числе и поле, где у тебя хранился указатель на кучу. Ты
"потерял" указатель, теперь попытка получить доступ к куче через
queue->heap[i] в queue_put равносильна разыменованию нулевого указателя, что
приводит к ошибке сегментации. У тебя в этот момент queue->heap указывает
уже в NULL.
Тебе нужно сначала выделить память для структуры очереди, очистить её. Затем
выделить память для самой кучи (указатель уже можно сохранить в поле
структуры очереди - heap), также очистить её. Не забудь проверить что тебе
возвращал malloc(3) на каждом из шагов, это обязательно.
Если собрать все замечания, то первое что тебе надо сделать, ознакомиться с
документом LKCS - Linux Kernel Coding Style и придерживаться его далее. Это
по сути осовремененный стиль K&R, который себя хорошо зарекомендовал на
практике.
http://www.kernel.org/doc/Documentation/CodingStyle
Дальше, у тебя какой-то очень странный редактор, потому что в каких-то
местах отступы сделаны пробелами, где-то табуляцией, куча лишних пробелов
везде оставлено. Расширение файла должно быть `.c' мы же пишем программы для
Unix. Компилироваться они должны компилятором GCC. Здесь есть проблемы,
потому что видимо тот компилятор, которым пользуешься ты, очень "лоялен"
ошибкам и декларациям. Например, в prioq_new():40 и prioq_new():42 ты
приводишь значение, возвращаемое malloc(3) к несуществующим (с точки зрения
GCC) типам. И вообще говоря этого делать и не надо потому что malloc(3)
возвращает void * а он приводится к любому типу.
--
Г.А.
1 марта 2010 г. 2:03 пользователь Алексей Петрунёв <alexeypetrunev на gmail.com>
написал:
> Здравствуйте.
>
> Программа компилируется, но не работает. В чем ошибка? Функция put просто
> добавляет элементы в массив heap.
>
> _______________________________________________
> Cdev mailing list
> Cdev на wiki.syktsu.ru
> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://amplab.syktsu.ru/pipermail/cdev/attachments/20100301/1169a555/attachment.htm>
Подробная информация о списке рассылки cdev