2016-04-14 4 views
1

BMIを計算するためにかなり基本的なプログラムをコンパイルしようとしていますが、それを修正する方法。デルファイ:互換性のない型:両方の値が実数として割り当てられている場合、「整数」と「拡張」

これらは私の変数であり、次のように

weight : real; 
height : real; 
bmi : real; 

私のコーディングは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    weight := strtofloat(inputbox('weight', 'Enter your weight in  kilograms','')); 
    height := strtofloat(inputbox('height', 'Enter your height in centimeters','')); 
    bmi := weight/sqr(height); 
    EDIT1.Text := floattostr(BMI); 
end; 

は、どのように私はこのエラーを修正することができ、そして何がそれを引き起こしていますか?

答えて

7

Heightは、Self.Heightと誤解されています。これは、フォームのHeightプロパティ(整数)を参照しています。変数には別の名前を使用するか、メソッドのスコープ内でローカルにします。私のためにうまく次の作品は:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Weight, Height, BMI: Real; 
    s: string; 
begin 
    s := InputBox('Weight', 'Enter your weight in kilos', ''); 
    Weight := StrToFloat(s); 
    s := InputBox('Height', 'Enter your height in centimeters', ''); 
    Height := StrToFloat(s); 
    BMI := Weight/sqr(Height); 
    Edit1.Text := FloatToStr(BMI); 
end; 

私の推奨されるソリューションは、将来の任意の可能な混乱を避けるために、別の名前を使用することです。私はおそらくもっとこのような何かをするでしょう:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    BodyWeight, BodyHeight, BMI: Real; 
    s: string; 
begin 
    s := InputBox('Weight', 'Enter your weight in kilos', ''); 
    BodyWeight := StrToFloat(s); 
    s := InputBox('Height', 'Enter your height in centimeters', ''); 
    BodyHeight := StrToFloat(s); 
    BMI := BodyWeight/sqr(BodyHeight); 
    Edit1.Text := FloatToStr(BMI); 
end; 
+0

ありがとうございます。プログラミング時に、私は変数名がエラーメッセージ "Incompatible types: 'Integer'と 'Extended'の両方の値が実際に割り当てられているために発生したと考えていませんでしたが、助けてくれてありがとうございます。私はプログラミングの際にそれを念頭に置いています。 – 1337x

+0

可能な方法を完全に網羅するために、 'BMI:= Weight/sqr(Unit1.Height);のようなユニット名でグローバル変数をスコープする3番目のオプションもあります。それらの変数はTForm1クラスのメンバです。しかし、この特定のケースでは、その性質上の変数は一時的な変数であり、ローカル変数(#1メソッド)はプログラムを設計する正しい方法です。 –

関連する問題