Другие языки программирования и технологии

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

unit OOP4; interface uses SysUtils, Variants, Classes; type TRational = class(TObject) private procedure Reduce(A,B:Int64;var AO,BO:Int64); public A:Int64; B:Int64; C:Int64; D:Int64; procedure Add(var FA,FB:Int64); Constructor Create(FA,FB,FC,FD: Int64); Destructor Destroy; end; implementation procedure TRational.Reduce(A,B:Int64;var AO,BO:Int64); var i,NOD:Integer; begin for i:=1 to a do if (a mod i = 0) and (b mod i = 0) then NOD:=i; AO:=A div NOD; BO:=B div NOD; end; procedure TRational.Add(var FA,FB:Int64); var PA,PB:Int64; begin PA:=A*D+B*C; PB:=B*D; Reduce(PA,PB,A,B); end; Constructor TRational.Create(fa,fb,fc,fd:Int64); begin inherited Create; A:=1; <------------------------Ошибка тут B:=2; C:=1; D:=3; end; destructor TRational.Destroy; begin inherited Destroy; end; end.
Sultan Ryspaev
Sultan Ryspaev
3 354
Ищите в другом месте. У меня ошибки нет. Обращался так

procedure TForm1.Button1Click(Sender: TObject);
var R : TRational;
begin
R := TRational.Create (3,5,6,7);
Label1.Caption := IntToStr(R.A);
end;

Как и положено, в лейбл вывело единицу. Правда, тип вместо Int64 делал Integer.

И еще. Подозреваю, что этот вопрос является продолжением предыдущего о рациональных дробях. В таком случае, что за поля C и D? У дроби только один числитель и знаменатель. В данном случае это А и В.

Далее. В процедуре добавления вы параметрами передаете что-то, но затем напрочь забываете об этом. Похоже, вы не совсем представляете себе, что делаете. К тому-же не понятно, зачем параметры передавать по ссылке. В общем, что-то такое должно быть

type
TRational = class(TObject)
private
procedure Reduce(A,B:Integer; var AO,BO:Integer);
public
A:Integer;
B:Integer;
procedure Add(R: TRational);
Constructor Create(FA,FB: Integer);
Destructor Destroy;
end;

implementation

procedure TRational.Reduce(A,B:Integer;var AO,BO:Integer);
var i,NOD:Integer;
begin
NOD := 1;
for i:=1 to a do if (a mod i = 0) and (b mod i = 0) then NOD:=i;
AO:=A div NOD;
BO:=B div NOD;
end;

procedure TRational.Add(R: TRational);
var PA,PB:Integer;
begin
PA := A * R.B + B * R.A;
PB := B * R.B;
Reduce(PA, PB, A, B);
end;

Constructor TRational.Create(fa,fb:Integer);
begin
inherited Create;
A := FA;
B := FB;
end;

destructor TRational.Destroy;
begin
inherited Destroy;
end;

А обращаться так

procedure TForm1.Button1Click(Sender: TObject);
var R1, R2 : TRational;
begin
R1 := TRational.Create (1,3);
R2 := TRational.Create (2,3);
R1.Add(R2);
Label1.Caption := IntToStr(R1.A) + '/' + IntToStr(R1.B);
end;

В результате имеем в лейбле 1/1, что есть правильно.

И последнее. Нет проверки на нулевой знаменатель, что может привести к ошибке во время использования такого класса.
Аброр Абдуфаттаев
Аброр Абдуфаттаев
59 613
Лучший ответ
а ошибку мы должны угадать?
Sultan Ryspaev скрин добавил