Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Непонятная ошибка в программе на BDS2006 
:(
    Опции темы
Kbl4AH
Дата 26.2.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Здравствуйте...
Читаю книгу по BDS2006, в ней был пример (код и екзешник) консольного приложения для делфи вин32...
Екзешник работает нормально... скопировал код в свой проект - ошибка, каких я еще никада не видел...
Почему так? Что не корректно в коде?
Код:
Код

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;

type
  PAnimal = ^TAnimal; { pointer to a TAnimal record }
  TAnimal = record
    Name: string;
    Age: Integer;
    Hungry: Boolean;
  end;

procedure ShowInfo(AAnimal: PAnimal);
const
  HUNGRY_STRING: array[Boolean] of string = ('No', 'Yes');
begin
  if AAnimal = nil then Exit;  
  with AAnimal^ do
  begin
    WriteLn('Name: ', Name);
    WriteLn('Age: ', Age);
    WriteLn('Hungry: ', HUNGRY_STRING[Hungry]);
  end; // with AAnimal
end;

var
  MyDog: TAnimal;
  MyDynamicCat: PAnimal;

begin
  MyDog.Name := 'Apollo';
  MyDog.Age := 10;
  MyDog.Hungry := False;
  ShowInfo(@MyDog);
  New(MyDynamicCat);
  ShowInfo(MyDynamicCat);
  Dispose(MyDynamicCat);
  ReadLn;
end.

Результат выполнения:
user posted image


M
Alexeis
Модератор: Название темы должно отражать ее суть!

PM MAIL ICQ   Вверх
SneG0K
Дата 26.2.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 3
Всего: 54



У меня все отлично выполняется. Думаю, что это проблема с IDE. У меня Delphi7

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  dpr.rar 21,44 Kb
PM WWW Skype   Вверх
SneG0K
Дата 26.2.2009, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 3
Всего: 54



user posted image

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  dpr.rar 21,44 Kb
PM WWW Skype   Вверх
CodeMonkey
Дата 26.2.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Как насчёт попробовать:
Код
New(MyDynamicCat);
FillChar(MyDynamicCat^, SizeOf(TAnimal), 0);



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kbl4AH
Дата 26.2.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Пробовал делать трассировку... Кажется, что проблема в строке 
Код

WriteLn('Hungry: ', HUNGRY_STRING[Hungry]);
 во время выполнения 
Код

ShowInfo(MyDynamicCat);

при комменте врайтэлена все нормально или при добавлении 
Код

MyDynamicCat.Hungry := True;

тоже все отрабатывает, но не корректно (почему-то кошачий возраст становится 1)...
В общем, как-то загадочно для меня(((
Вставил 
Код

FillChar(MyDynamicCat^, SizeOf(TAnimal), 0);
 все заработало... 
Поэтому вопрос...
1) Как понять 'Думаю, что это проблема с IDE.'?
2) Что-то в памяти не так делается? Без принудительного заполнения памяти для указателя рандомом что ли заполняет у меня? Можно услышать пару слов о происходящем в памяти в случае без филлчара?

Это сообщение отредактировал(а) Kbl4AH - 26.2.2009, 09:51
PM MAIL ICQ   Вверх
CodeMonkey
Дата 26.2.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Этот вопрос требует дальнейшего исследования. Вообще, после New FillChar не нужен. Так указано в документации. Поэтому это-то и странно.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
CodeMonkey
Дата 26.2.2009, 11:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Ага, попался.
На самом деле FillChar всё же нужен. Это баг в исходном тексте книжки. И вот почему.
Из New выходит частично-инициализированная структура (в отличие от GetMem, из которого выходит вовсе не инициализированная структура). Частичная инициализация означает, что все динамические типы данных гарантировано равны nil. Значение остальных полей не определено.
Поэтому после New(MyDynamicCat) у вас MyDynamicCat^.Name = nil, а поля Age и Hungry заполнены мусором. Так получается, что в D7 и D2006 этот мусор выглядит по-разному, и в одном случае вылет происходит, а в другом - нет.
Почему вообще происходит вылет? 
Проблема действительно сидит в строке WriteLn('Hungry: ', HUNGRY_STRING[Hungry]). Если Hungry у нас мусор (а не 0 или 1, как ожидает этого код), то HUNGRY_STRING[Hungry] трактует некоторое место в вашей программе как строку. Но там лежат строки только для индексов 0 и 1. Для всех прочих индексов там тоже мусор.
Поэтому вывод WriteLn('Hungry: ', HUNGRY_STRING[Hungry]) на самом деле пытается вывести на консоль какую-то область памяти (случайную), пытаясь трактовать её как строку.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kbl4AH
Дата 26.2.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



CodeMonkeySneG0K, спасибо!
PM MAIL ICQ   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1249 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.