Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1128233186
homm
2005-10-02 10:06
2006.03.12
16 битное значение цвета из 32 битного представления


8-1127918290
Виталька2005
2005-09-28 18:38
2006.03.12
Перемещение фигуры на TCanvas


2-1140530847
Korefey
2006-02-21 17:07
2006.03.12
преобразование числа в строку


4-1135073467
davinchi
2005-12-20 13:11
2006.03.12
Как дождаться окончания загрузки Win98


1-1139366458
Коля
2006-02-08 05:40
2006.03.12
Вопрос по RichEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский