超初心者です。
var s:single;として
---------
sには値が入っているはずで sは0以上の値です。
if s<=0 then とすると エラーがでます。
なぜなのでしょうか?
再現しません。
再現するコードを提示してください。
エラーが出るというのも、コンパイルエラーなのか実行時エラーなのか、その内容もわかりません。
わかりやすく書けば、問題は解決すると思います。
それと、「入っているはず」という推測で全て済めば、バグは発生しませんよ。
推測ではなく、確実に入っている、というコードでおためしください。
例えば、
var
s:single;
begin
s := 1.5;
if s <= 0 then
begin
ShowMessage('<= 0');
end
else
begin
ShowMessage('> 0');
end;
end;
では '> 0'が表示されます。
にしの さんありがとうございます。
エラーはデバッガ例外が発生というものです。
’不正な浮動小数点数演算命令’というメッセージBOXが表示されます。
全てでエラーがでるわけではなくて特定の数値(変数に入っているはずの値)を比較した時に発生するようです。
比較変数Sが空っぽの場合はやはりこのようなエラーがでるのでしょうか?
また、変数S(single)が空っぽかどうか知る方法はありますか?
>また、変数S(single)が空っぽかどうか知る方法はありますか?
ifで空っぽな場合にダイアログを表示
ってか、デフォルトは0なんじゃないんですか?
>エラーが出るというのも、コンパイルエラーなのか実行時エラーなのか、その内容もわかりません。
Ctrl+F9でコンパイルしてからexeファイルを実行すれば良いのでは?
空かどうかを知るよりも、初期値を設定すべきです。
空かどうかは、一応はコンパイル警告を見ればわかります。
さて、不正な浮動小数点数演算命令というエラーですが、もしかしたら
Set8087CW($133f);
を実行しておくことで回避できるかもしれません。
再現できるテストケースが解っているのであれば、このコマンドをFormCreateなどで実行しておいた場合と比較してみてください。
>>エラーが出るというのも、コンパイルエラーなのか実行時エラーなのか、その内容もわかりません。
>Ctrl+F9でコンパイルしてからexeファイルを実行すれば良いのでは?
ミスです、にしのさんの発言でした
>また、変数S(single)が空っぽかどうか知る方法はありますか?
使えるかどうかわかりませんがisNanという関数があります。
あと、例外が発生しているから単純にtry ... exceptで処理する方法もあります。
try
if s <= 0 then ...
except
// エラー時の処理 例えば s := 0; とするとか。
end;
てな感じです。
S の値をファイルから読み込むとかであればこの方が良いと思います。
追伸です。
IsNanで S が不正な値かどうかを判断できます。
var
s : Single;
p : PDWORD;
begin
p := @s;
p^ := $7F800001; // s に不正値を設定
if IsNan(s) then
ShowMessage('s is NaN');
end;
ちなみにif IsNan(s) then ... を if s <= 0 then...にすると例外が発生します。
みなさんありがとうございます。
バックアップしておいたソースに書き換えたらエラーが出なくなりました。
同じファイルから S に値をよみこんでテストしましたので
変数 S に入っている値は正常だと思います。
エラーは if S<=0 then の部分で本当に発生したのでしょうか?
なんだか不思議です。
>エラーは if S<=0 then の部分で本当に発生したのでしょうか?
コードを載せないと誰もわからないと思うんですが。
ツイート | ![]() |