Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизInvalid floating point operation Найти похожие ветки
← →
Radagast (2006-02-25 19:56) [0]Помогите плз с прогой студенту-первокурснику.
В универе задали наклепать небольшую прогу, которая рисует 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
← →
Virgo_Style © (2006-02-25 20:06) [1]по части 1 - "у тебя ошибка в программе" (c).
что касается кодов - можно написать программку, которая их будет показывать, но красивше воспользоваться константами VK_ (в unit Windows). Напр. VK_MENU - это ALT, VK_RETURN - это Enter, и т.д.
Делись проблемным куском исходника, однако.
← →
Marser © (2006-02-25 20:09) [2]Ошибка в 17-й строке. Покажи код.
> Причем когда прохожу по Ф8 (пошагово), то почему-то в начале
> procedure TMainForm.Button2Click рядом с 4мя строчками кода
> не появляются синие точки и Watcher подтверждает, что эти
> операции присвоения не выполняются. Скажите плз, в чем может
> быть причина.
Если не появляются синие точки, это значит, что строки нескомпилированы. Вероятно, оптимизатор определил, что нет у тебя такого варианта ветвления, прикотором эти строки выполнятся. Проверь логику ветвлений.
← →
Radagast (2006-02-25 21:09) [3]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 чисто текстового файла.
← →
Virgo_Style © (2006-02-25 21:42) [4]оптимизатор выбросил неиспользуемые вычисления, ведь присвоенные значения далее не используются.
← →
Virgo_Style © (2006-02-25 21:47) [5]да, ну и что там с пошаговым прохождением, где возникает ошибка-то?
← →
Галинка © (2006-02-25 22:03) [6]Вот здесь
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);
ты несколько раз переопределяешь одни и те же переменные. Какие из значений тебе нужны?
← →
Галинка © (2006-02-25 22:07) [7]в
cx:=cpx/scale;
cy:=cpy/scale;
scale не определена или равно 0. У тебя наверное деление на ноль, ИМХО.
← →
Radagast (2006-02-25 22:13) [8]Кажется я понял, в чем ошибка, сейчас буду проверять. И еще одно:
Нашел в учебнике по Делфи главу по событиям, был пример такого кода:
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); мб еще что-то надо было сделать?
← →
Radagast (2006-02-25 22:20) [9]ошибка с floating point operation исправлена (в 1 букве ошибка была! :)), а что скажете с клавой делать?
← →
Галинка © (2006-02-25 22:28) [10]Radagast (25.02.06 22:13) [8]
но кнопка должна быть нажата "в форме". как отследить в форме она нажата или нет?
← →
Virgo_Style © (2006-02-25 22:35) [11]Radagast (25.02.06 22:20) [9]
Галинка © (25.02.06 22:28) [10]
TForm.KeyPreview в true, если я правильно протелепатировал?
← →
Галинка © (2006-02-25 23:49) [12]Virgo_Style © (25.02.06 22:35) [11]
спасибо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c