Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 182
от 28.08.2005, 22:26

Администратор:Калашников О.А.
В рассылке:Подписчиков: 190, Экспертов: 28
В номере:Вопросов: 1, Ответов: 4


Вопрос № 25213: Добрый день уважаемые эксперты. Изучаю язык С++ и столкнулся с проблемой. Написал кусочек кода и никак не могу понять почему вылезает ошибка. В программе используется оператор new для того, чтобы создать динамический массив из необходимого числа стру...

Вопрос № 25.213
Добрый день уважаемые эксперты. Изучаю язык С++ и столкнулся с проблемой. Написал кусочек кода и никак не могу понять почему вылезает ошибка. В программе используется оператор new для того, чтобы создать динамический массив из необходимого числа структур, а перед выходом из программы используется оператор delete, но при прогоне программа в среде MS Visual C++ 6.0 выводит модальное окно в котором предлагается или завершить программу или попасть в отладчик... Компилятор Borland C++ 5 сразу отправляет в отладчик. Помогите найти ошибку.

Приложение:

Отправлен: 23.08.2005, 16:25
Вопрос задал: Filth (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: BOIL
Здравствуйте, Filth!

Рекомендую отказаться от выделения оператором new памяти для глобальной переменной подобным способом

делайте это в теле main()

тогда и delete пройдет без замечаний

Удачи!...
Ответ отправил: BOIL (статус: 3-ий класс)
Отправлен: 23.08.2005, 16:39
Оценка за ответ: 5
Комментарий оценки:
Спасибо!!! Теперь всё как надо!

Отвечает: yatagan
Здравствуйте, Filth!
ну вот например здесь:

"

int ArSize; // количество структур в массиве

// создаем динамический массив структур типа CandyBar
CandyBar *candy = new CandyBar [ArSize];

"

переменная ArSize не проинициализированая, там может быть все что угодно даже отрицательное число...

надо ему присвоить какое-то значение, например:
int ArSize = 40;

p.s.
я дальше не смотрел :), может еще есть ошибки...
---------
Україна понад усе!
Ответ отправил: yatagan (статус: 3-ий класс)
Отправлен: 23.08.2005, 17:04
Оценка за ответ: 3
Комментарий оценки:
Переменная шициализируется оператором cin>>ArSize; до своего использования в массиве разве этого недостаточно? Даже если и нет, то это не решает проблему...

Отвечает: igor87
Здравствуйте, Filth!

int ArSize; // количество структур в массиве

// создаем динамический массив структур типа CandyBar
CandyBar *candy = new CandyBar [ArSize];

Динамический массив создается без инициализации переменной содержащей его размер, т.е. ArSize. Эта перменная вводится в функции main так что надо перенести строчку
CandyBar *candy = new CandyBar [ArSize];
в функцию main и расположить ее сразу за:
cin>>ArSize;
или на несколько строк ниже, но обязательно до первого использования массива. В вашем случае необходимо расположить строчку до цикла.

// для того чтобы указатель снова указывал на начальную область памяти
// приводим к значению с адресом candy[0]

candy = 0;

ЗАЧЕМ???? candy в данном случае всегда указывает на первый элемент, ведь здесь не используется адресная арифметика. Эту строку удаляем.

// считываем символ " " доставшийся в наследство от cin
cin.get();

это тоже можно удалить.
Ответ отправил: igor87 (статус: 2-ой класс)
Отправлен: 23.08.2005, 17:32
Оценка за ответ: 4
Комментарий оценки:
Да вы правы, перенеся
CandyBar *candy = new CandyBar [ArSize];
в main() программа заработала... Однако, если убрать cin.get();как вы предлагаете то я никогда не заполню поле name, т.к. там всегда будет " "... если убрать строку candy = 0, то снова выдается ошибка...

Отвечает: Raptor1
Здравствуйте, Filth!
У тебя создание массива вообще говоря не происходит, тебе строку
CandyBar *candy = new CandyBar [ArSize];
необходимо поместить в функцию main после ввода значения ArSize
остальное не смотрел
Ответ отправил: Raptor1 (статус: 6-ой класс)
Отправлен: 23.08.2005, 23:59
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Уже осознал!!!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться
Вспомнить пароль

В избранное