Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Invalid floating point operation [D6]


Radagast ©   (2006-02-25 19:56:00) 

Помогите плз с прогой студенту-первокурснику.
В универе задали наклепать небольшую прогу, которая рисует 2 опред контура напосредственно на форме и считает центр тяжести всех точек контуров и площадь внешнего минус площадь внутреннего (в см^2, т.е. используется масштаб, но это не суть важно). Программу я написал, синтаксических ошибок (Делфи 6) не выводит, рисует нормально,но при нажатии на кнопку посчитать выводит Invalid floating point operation. Причем когда прохожу по Ф8 (пошагово), то почему-то в начале procedure TMainForm.Button2Click рядом с 4мя строчками кода не появляются синие точки и Watcher подтверждает, что эти операции присвоения не выполняются. Скажите плз, в чем может быть причина.
И расскажите еще плз, как сделать обработчик нажатия клавиши на клаве? т.е. Object inspector-mainform-events-onkeydown это понятно, а дальше? где взять таблицу кодов клавиш (в частности, стрелок) и какой оператор этот код возвращает?
Спасибо.

http://www.delphisources.ru/forum/attachment.php?attachmentid=6&d=1140886525


Галинка   (2006-02-25 23:49:00) [1]

Virgo_Style ©   (25.02.06 22:35) [11]

спасибо.


Virgo_Style   (2006-02-25 22:35:00) [2]

Radagast   (25.02.06 22:20) [9]
Галинка ©   (25.02.06 22:28) [10]

TForm.KeyPreview в true, если я правильно протелепатировал?


Галинка   (2006-02-25 22:28:00) [3]

Radagast   (25.02.06 22:13) [8]

но кнопка должна быть нажата "в форме". как отследить в форме она нажата или нет?


Radagast   (2006-02-25 22:20:00) [4]

ошибка с  floating point operation исправлена (в 1 букве ошибка была! :)), а что скажете с клавой делать?


Radagast   (2006-02-25 22:13:00) [5]

Кажется я понял, в чем ошибка, сейчас буду проверять. И еще одно:
Нашел в учебнике по Делфи главу по событиям, был пример  такого кода:
procedure TForm1.FormKeyDown(Sender: TObject;
                            var Key: Word;
        Shift: TShiftState);
begin
 MessageDlg(Chr(Key), mtInformation, [mbOk], 0);
end;

я так понял эта процедура при нажатии любой клавиши выдает сообщение с названием этой клавиши. На деле ничего не происходит вообще. Т.е. я как положено на Object inspector-mainform-events-onkeydown двойной щелчок, вставил строчку MessageDlg(Chr(Key), mtInformation, [mbOk], 0); мб еще что-то надо было сделать?


Галинка   (2006-02-25 22:07:00) [6]

в
cx:=cpx/scale;
cy:=cpy/scale;


scale не определена или равно 0. У тебя наверное деление на ноль, ИМХО.


Галинка   (2006-02-25 22:03:00) [7]

Вот здесь
    cpx:=0;
    cpy:=0;
    for i:=1 to 7 do
     begin
      cpx:=cpx+arx[i];
      cpy:=cpy+ary[i];
     end;
    cpx:=round(cx/7);
    cpy:=round(cy/7);


ты несколько раз переопределяешь одни и те же переменные. Какие из значений тебе нужны?


Virgo_Style   (2006-02-25 21:47:00) [8]

да, ну и что там с пошаговым прохождением, где возникает ошибка-то?


Virgo_Style   (2006-02-25 21:42:00) [9]

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


Radagast   (2006-02-25 21:09:00) [10]

thx за ответы, вот исходник:

unit Main;

interface

uses
 SysUtils, Windows, Messages, Classes, Graphics, Controls,
 Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus;

type
 TMainForm = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   Label2: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 end;
 ar1=array [1..7]of integer;
const xmax=15; ymax=10;
var
 MainForm: TMainForm;
 arx:ar1=(70,120,80,10,70,80,50);
 ary:ar1=(10,40,110,50,30,60,50);
 xpmax,ypmax,x1,y1,x2,y2:integer;scale:real;
implementation

{$R *.DFM}
procedure draw;

begin
with MainForm,Canvas do
begin

moveto(arx[1],ary[1]);
lineto(arx[2],ary[2]);
lineto(arx[3],ary[3]);
lineto(arx[4],ary[4]);
lineto(arx[1],ary[1]);
moveto(arx[5],ary[5]);
lineto(arx[6],ary[6]);
lineto(arx[7],ary[7]);
lineto(arx[5],ary[5]);
end;
end;

function matrix(x1,y1,x2,y2:integer):integer;
begin
 matrix:=x1*y2-x2*y1;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
draw;
xpmax:=mainform.clientwidth;
ypmax:=mainform.clientheight;
scale:=round(xpmax/xmax);
with MainForm,Canvas do
begin
 moveto(5,ypmax-5);
 lineto(xpmax-5,ypmax-5);
 textout(xpmax div 2, ypmax-20, '15 cm');
 moveto(xpmax-5,5);
 lineto(xpmax-5,ypmax-10);
 textout(xpmax-35, ypmax div 2, '10 cm');
end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var i,cpx,cpy,sp1,sp2:integer; cx,cy,s:real;
begin
>  cpx:=0;
>  cpy:=0;
for i:=1 to 7 do
begin
>  cpx:=cpx+arx[i];
>  cpy:=cpy+ary[i];
end;
cpx:=round(cx/7);
cpy:=round(cy/7);
cx:=cpx/scale;
cy:=cpy/scale;
cx:=cx*10;
cx:=round(cx);
cx:=cx/10;
cy:=cy*10;
cy:=round(cy);
cy:=cy/10;
label1.caption:='Öåíòð âàãè: '+floattostr(cx)+' cm '+floattostr(cy)+' cm';
sp1:=0;sp2:=0;
for i:=1 to 3 do
begin
sp1:=matrix(arx[i],ary[i],arx[i+1],ary[i+1])+sp1;
end;
for i:=5 to 6 do
begin
sp2:=matrix(arx[i],ary[i],arx[i+1],ary[i+1])+sp2;
end;
s:=(sp1-sp2)/sqr(scale);
s:=s*100;
s:=round(s);
s:=s/100;
label2.caption:='Ïëîùà: '+floattostr(s)+' cm^2';
end;

end. {of unit main}

ну и стандартный основной текст программы
program AppName;

uses
 Forms,
 Main in 'MAIN.PAS' {MainForm};

{$R *.RES}

begin
 Application.Initialize;
 Application.CreateForm(TMainForm, MainForm);
 Application.Run;
end.

Button1 рисует 2 контура, Button2 считает то, что я написал выше.
символом >  я обозначил строки возле которых не появляются синие точки.
Я так понял, тут нельзя вкладывать файл в сообщение, я бы выложил целиком прогу. Жаль, нельзя как в Console application, когда вся прога состояла из 1 чисто текстового файла.


Marser   (2006-02-25 20:09:00) [11]

Ошибка в 17-й строке. Покажи код.

> Причем когда прохожу по Ф8 (пошагово), то почему-то в начале
> procedure TMainForm.Button2Click рядом с 4мя строчками кода
> не появляются синие точки и Watcher подтверждает, что эти
> операции присвоения не выполняются. Скажите плз, в чем может
> быть причина.

Если не появляются синие точки, это значит, что строки нескомпилированы. Вероятно, оптимизатор определил, что нет у тебя такого варианта ветвления, прикотором эти строки выполнятся. Проверь логику ветвлений.


Virgo_Style   (2006-02-25 20:06:00) [12]

по части 1 - "у тебя ошибка в программе" (c).

что касается кодов - можно написать программку, которая их будет показывать, но красивше воспользоваться константами VK_ (в unit Windows). Напр. VK_MENU - это ALT, VK_RETURN - это Enter, и т.д.

Делись проблемным куском исходника, однако.


Наверх

Титульная страница Поиск, карта сайта Написать письмо