![]() |
|
Модераторы: bsa |
![]()
|
|
| SubZero |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Необходимо создать программу, формирующую двунаправленный линейный список из структур типа car:
struct car { char *mark; char *colour; char *number; } Все части программы оформляются в виде функций: 1) ввод данных (выделение памяти, создание и заполнение вводимыми с клавиатуры данными элементов списка); 2) сохранение введенной информации в задаваемом пользователе файле; 3) восстановление списка (заполнение его информацией, считываемой из файла). Написать программу необходимо именно на С!! Т.е. никаких классов и т.п. средств из С++ использовать нельзя Использую компилятор Borland Turbo C++ 3.0. Данные упорно не печатаются. Не могу понять, в чем у меня ошибка.. Вот текст самой программы:
Заранее спасибо! Это сообщение отредактировал(а) SubZero - 4.6.2008, 12:45 |
|||
|
||||
| rrrFer |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
SubZero,
используй кнопку КОД и напиши функцию для печати списка - ту которая не получается, искать ее в твоем коде мне, например, вломы ------- вот тут уже ошибка:
вы в функцию InputAuto передаете вообще не инициализированный указатель ptrCurrent, а также чтобы номально инициализировать, например, ptrFirst надо писать: ptrFirst=new record; потому что, если написать record *ptrFirst=NULL; а потом пытаться использовать этот указатель, то компилятор(в зависимости от версии) может выдать ошибку -------- вывод списка выглядит ПРИМЕРНО так:
примерно - потому что не проверял(у меня твоя программа вообще выдает ошибку почти в каждой строчке) Это сообщение отредактировал(а) rrrFer - 3.6.2008, 12:29 |
||||
|
|||||
| SubZero |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
rrrFer, огромное спасибо за помощь - программа заработала!! Вы были правы, дело заключалось в указателях. Вместо:
оказалось достаточным написать:
Также я добавил функцию PrintList(), подобно вашему примеру:
Таким образом в Турбо С++ 3.0 программа заработала. Теперь необходимо перенести проект в Visual Studio 2003 (Win32-приложение). Буду сейчас пробовать Это сообщение отредактировал(а) SubZero - 3.6.2008, 14:18 |
||||||||
|
|||||||||
| SubZero |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Поторопился я однако с выводами, вторая часть программы пока еще не работает (восстановление списка). Скорее всего ошибка лежит здесь:
Выходит сообщение об ошибке - "Null pointer assignment", видимо неправильно работаю с указателями. Часть программы, где вызывается данная функция:
На всякий случай приведу текст всей программы:
P.S. Я новичок в программировании на С/С++, поэтому уж не обессудьте за корявый стиль.. Это сообщение отредактировал(а) SubZero - 4.6.2008, 11:21 |
||||||
|
|||||||
| rrrFer |
|
||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
SubZero,
функция clrscr(); там неработает
как я понял "*" вы используете, чтобы определить конец файла, дак вот, при достижении конца возвращается eof, а также есть фукция feof();, вобщем так:
а затем вы пишете программу(как будто бы вы ее и не правили, посмотрите мой предыдущий пост, я там уже писал, что вы в функцию передаете неправильно инициализированные указатели), вы пишите:
т.е. указтели есть а обьекта нет, можно исправить так:
как я понял вы пишите компилятором не поддерживающим С++(где то в ващей программе видел malloc) вот вам предстоит и тут писать не new а malloc Это сообщение отредактировал(а) rrrFer - 3.6.2008, 17:20 |
||||||||||||
|
|||||||||||||
| SubZero |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Насчет clrscr() я в курсе, а что есть вместо нее? Программу я исправил, просто там не так много изменений)) Ваш метод исправления указателей не подходит - вылетает ошибка. Пользуюсь компилятором Borland Turbo С++ 3.0. Само собой С++ он поддерживает Насчет feof() знаю, просто мне показалось более наглядным использовать свой метод) Что же касается
то скорее всего это необходимо в Visual Studio 2003, там все-таки более строгий компилятор. |
|||
|
||||
| bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Он не поддерживает актуальный (текущий) стандарт. -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
| SubZero |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
||||
|
||||
| rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
SubZero,
system("cls"); можно так. |
|||
|
||||
| SubZero |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Вот еще возник вопрос. Данный код работает нормально:
Если же пытаюсь написать более правильно
то программа вылетает с ошибкой. Думаю виновата функция
Насколько я понимаю она работает с копиями указателей, не изменяя при этом их значения. Проэтому после ее вызова значение ptrFirst по-прежнему не определено. Вроде бы нужно писать
но тогда компилятор выдает вообще кучу ошибок.. С другой стороны в первом варианте также используется значение ptrFirst после вызова функции InputAutos и ошибки не возникает! Чудеса какие-то.. Честно говоря, не пойму, в чем же тогда дело? Это сообщение отредактировал(а) SubZero - 4.6.2008, 11:24 |
||||||||
|
|||||||||
| SubZero |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Оставлю пока проблемы с PrintList(), это не так важно. По-прежнему не могу разобраться, почему неправильно работает функция LoadAutos()
Выходит сообщение об ошибке - "Null pointer assignment", т.е. я неправильно работаю с указателями. Часть программы, где вызывается данная функция:
Написать программу нужно именно на С Неужели никто не может сказать в чем проблема? |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
в C нет cout
void InputAuto(avto *&p, record *&ptrFirst, record *&ptrCurrent, record *&ptrLast) а лучше заведи примерно такую структуру struct list { record *ptrFirst; record *ptrCurrent; record *ptrLast; }; и передавай ее вместо кучи параметров )) Это сообщение отредактировал(а) mes - 4.6.2008, 13:29 |
||||
|
|||||
| SubZero |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Виноват, насчет cout я, конечно, лажанулся)) Исправил заголовок функции InputAuto(), заодно у SaveAutos() и LoadAutos(). Теперь программа заработала!!! Огромное спасибо Единственное, немного смущает надпись "Null pointer assignment", которая все равно вылезает в ветви 2 программы по завершении распечатки данных. Это сообщение отредактировал(а) SubZero - 4.6.2008, 14:22 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
немного?? а ты память выделяешь? сильно сомневаюсь.. |
|||
|
||||
| SubZero |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Да, немного) Дело в цикле while:
В последней итерации цикла ptrCurrent становится равным NULL. Что касается выделения памяти, то, само собой, я это делаю. Посмотри функции InputAuto() и LoadAutos() P.S. Как правильно цитировать пост несколько раз по частям, что-то не пойму как это сделать.. |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |