Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Калькулятор


Автор: MacTag 27.2.2009, 01:39
Здрасте, читаю книгу Г.В. Галисеев Самоучитель по Delphi 8, это первая книжка, которую читаю по Delphi, ничего ещё не понимаю в нём. Хотелось, чтобы всё шло гладко, но дошел до создания калькулятора, перепечатал код, пробую запустить, ничего не выходит. Выдаёт ошибку. Помогите понять, где ошибка в программе, почему она вылетает и почему автор допустил ошибку.
  У меня стоит Delphi 8 for the Microsoft .NET Framework, также как и у автора книги. У него всё работает, у меня - нет. Помогите.
   Код
Код

     program Projectl;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a,
b,
sign: Cardinal;
begin
{ TODO -oUser -cConsole Main : Insert code here }
while a<>0 do begin
Write('Input a: ') ;
Read(a) ;
Write('Input b: ') ;
Read(b);
Write('Operation: ') ;
Read(sign);
if sign=1 then begin
Write(' **Result: ') ;
Writeln(a+b);
end else begin
Write(' **Result: ') ;
Writeln(a-b);
end
end;
end. 


Вот ошибка:
Project Project5.exe encountered unhandled exception class System.NullReferenceException. Process stopped. Use Step or Run to continue.



Автор: Данкинг 27.2.2009, 02:15
Количество begin и end определённо не сходится...

Автор: MacTag 27.2.2009, 10:28
сходится, причина в чём-то другом

Автор: Poseidon 27.2.2009, 10:45
В бегинами все в порядке. Да и с кодом тоже. У меня на Delphi 7 Enterprise все компилится и работает. Не знаю что там на Delphi for .NET не так. На какую строчку ругается?


Автор: MacTag 27.2.2009, 12:06
to Poseidon,
на 11 строчку
пишет [Warning] Project5dpr(11):Variable 'a' might not have been initialized

 т.е. не инициализирована переменная "а" ?

Автор: Kbl4AH 27.2.2009, 12:08
Цитата(MacTag @  27.2.2009,  12:06 Найти цитируемый пост)
пишет [Warning] Project5dpr(11):Variable 'a' might not have been initialized

так это не ошибка ведь... это предупреждение (переменная а не инициализирована, т.е. ей не присвоено начальное значение, поэтому переменной а присваивается случайное значение)... у меня тоже его пишет, но программа компилируется и запускается...

Добавлено @ 12:10
добавь после 1-го begin (иницилизируй переменную)
Код

a := 1;

Автор: MacTag 27.2.2009, 12:31
подставил, теперь предупреждения нету, но всё равно

Project Project5.exe encountered unhandled exception class System.NullReferenceException. Process stopped. Use Step or Run to continue.

И появляется чёрное окошечко терминала, пустое совершенно. Когда закрываешь его - возвращаешься в редактор кода.
И так по кругу. 

Автор: CodeMonkey 27.2.2009, 12:59
А посмотреть, на какой строчке встало, не судьба?

Цитата(Kbl4AH @  27.2.2009,  12:08 Найти цитируемый пост)
так это не ошибка ведь... это предупреждение (переменная а не инициализирована, т.е. ей не присвоено начальное значение, поэтому переменной а присваивается случайное значение)... у меня тоже его пишет, но программа компилируется и запускается...

Ага, вот только именно это и может быть фатальным. Не могу сказать за .NET - не имею опыта, но вот http://transl-gunsmoker.blogspot.com/2008/12/ia64.html.

Автор: MacTag 27.2.2009, 13:09
Качаю Delphi 7 Enterprise, буду проверять на нём. 
  Хочется всё-таки докопаться до правды. В чём тут дело. Это беспокоит меня. Не даёт мне покоя. 
smile 
Пример вроде бы простой, в самом начале книги находится, всего на 60 странице.  Не могу я пропустить его и читать дальше.  Или пример начнёт работать, или я так и не прочитаю книгу)

Автор: CodeMonkey 27.2.2009, 13:35
Цитата(MacTag @  27.2.2009,  13:09 Найти цитируемый пост)
Качаю Delphi 7 Enterprise, буду проверять на нём. 

Проверять что? Вы вообще понимаете разницу между Delphi for Win32 и Delphi for .NET? Это два совершенно разных мира.

Цитата
Ключи потерял! - А ты их точно тут потерял? - Да нет! В соседнем переулке. - А чё ж тут лазишь? - А ТУТ СВЕТЛЕЕ!

Автор: Kbl4AH 27.2.2009, 13:41
Цитата(MacTag @  27.2.2009,  13:09 Найти цитируемый пост)
Пример вроде бы простой, в самом начале книги находится, всего на 60 странице.  Не могу я пропустить его и читать дальше.  Или пример начнёт работать, или я так и не прочитаю книгу)

 smile 

Автор: MoonDevil 27.2.2009, 13:49
Все прекрасно запускается и компилится,незнаю что там хочет Делфи 8 а мой 6ой проглотил нормально,а может ты не консольное прилоджение создалsmile?

Автор: Kbl4AH 27.2.2009, 13:57
CodeMonkey, а почему компилятор не инициализирует глобальную переменную, в данном случае, нулем?
По книжке, которую, я читаю должно быть именно так.
А в VCL-приложении - инициализирует нулем... 

Автор: Poseidon 27.2.2009, 14:11
Цитата(Kbl4AH @  27.2.2009,  13:57 Найти цитируемый пост)
CodeMonkey, а почему компилятор не инициализирует глобальную переменную, в данном случае, нулем?По книжке, которую, я читаю должно быть именно так.А в VCL-приложении - инициализирует нулем... 
Неа. В книжках не правильно пишут. Проверь сам:

Код
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  ShowMessage(IntToStr(i));
end;


Было время, очень долго не мог понять, почему в моих расчетах ошибка.


Автор: CodeMonkey 27.2.2009, 14:12
Цитата(Kbl4AH @  27.2.2009,  13:57 Найти цитируемый пост)
CodeMonkey, а почему компилятор не инициализирует глобальную переменную, в данном случае, нулем?

А кто это сказал? smile  Я не утверждал, что проблема здесь. Я сказал:
- что в общем случае может быть ГГ. 
- что нужно просто посмотреть, на какой строчке встала программа.
- что сравнивать Delphi for Win32 и Delphi for .NET - глупо.

Добавлено через 33 секунды
Цитата(Poseidon @  27.2.2009,  14:11 Найти цитируемый пост)
Проверь сам

А у вас разве глобальная переменная?

Автор: Kbl4AH 27.2.2009, 14:21
Цитата(Poseidon @  27.2.2009,  14:11 Найти цитируемый пост)
Неа. В книжках не правильно пишут.

Ты ошибашься... Сам проверь smile  Глобальные инициализируются нолем (для строк - '', для логических - False), локальные - случайным значением из диапазона типа..
По крайней мере для VCL-приложений так...
А вот в консольном почему-то не так... про это и спрашиваю...

Автор: MacTag 27.2.2009, 14:38
Создаю Console Application, 
качаю Delphi 7,  потому что тут кто-то сказал, что у него на этой версии всё работает.
  Просто у меня книга по той же версии, что установлена на компе, всё должно работать , повторяю я всё в точности, как в книге. 
Вот что там ещё пишет  Debug Inspector:
  "В экземпляре обьекта не задана ссылка на обьект"

Автор: Kbl4AH 27.2.2009, 14:40
Цитата(MacTag @  27.2.2009,  14:38 Найти цитируемый пост)
качаю Delphi 7,  потому что тут кто-то сказал, что у него на этой версии всё работает.

в Delhi 2006 fo Win32 тоже работает

Автор: Riply 27.2.2009, 14:41
IMHO, инициализация любых (глобальных, локальных) переменных вручную -
правило хорошего тона, переходящее в "хорошую практику" smile

Автор: Poseidon 27.2.2009, 14:43
Цитата(CodeMonkey @  27.2.2009,  14:12 Найти цитируемый пост)
А у вас разве глобальная переменная?
Прошу прощения, не заметил что речь идет про глобальные переменные.

Автор: THandle 27.2.2009, 14:43
Riply, +1

А вообще, ИМХО, топикстартеру следует начать изучение Delphi с версий обычных, не .NET. 

Автор: CodeMonkey 10.3.2009, 12:21
Цитата(Riply @  27.2.2009,  14:41 Найти цитируемый пост)
IMHO, инициализация любых (глобальных, локальных) переменных вручную -
правило хорошего тона, переходящее в "хорошую практику"  

...а после http://qc.embarcadero.com/wc/qcmain.aspx?d=71588 я вообще теперь параноик...  smile  ("by design"! это надо же!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)