Другие языки программирования и технологии
При попытке присвоить значение вылетает ошибка. Класс создаеться на другой форме. Подскажите в чем ошибка?
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.
Ищите в другом месте. У меня ошибки нет. Обращался так
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, что есть правильно.
И последнее. Нет проверки на нулевой знаменатель, что может привести к ошибке во время использования такого класса.
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, что есть правильно.
И последнее. Нет проверки на нулевой знаменатель, что может привести к ошибке во время использования такого класса.
а ошибку мы должны угадать?
Sultan Ryspaev
скрин добавил
Похожие вопросы
- Всем привет, помогите в коде разобраться С++, вылетает ошибка, вроде все правильно..
- помогите пожалуйста как исправить ошибку попытка присвоить переменной integer выражения типа boolean
- Как присвоить значение одного массива другому? С++
- У меня постоянно вылетает ошибка "svchost.exe" и потом начинаютса такие глюки... ппц, что делать?
- Excel. Как значения каждой 3й строки таблицы умножить на 1000? Подскажите пожалуйста?!
- Подскажите пожалуйста, какая ошибка в программе на Pascal ABC.NET?
- C# Поле класса. Как присвоить не значение, а ссылку? Пример внутри.
- Как вернуть значение переменной присвоенное ранее? Pascal
- Есть четыре переменные, нужно рандомом присвоить им значения от 0 до 3, так чтобы значения не повторялись. пишу на Си)
- Проблема с программой в Pascal ABC,Встречено ';',а ожидалось ':'. Если менять, то вылетает ещё ошибка с if