Delphi初心者です。
プログラムを組んで、コンパイルまではできたのですが、「不正な浮動小数点演算」により実行時エラーが生じてしまいます。しかも、ステップ実行でみてみると、For i := 1 to N doの部分(i,Nは勿論Integer)でとまっています。
どうすればよいのか、検討がつきません。
回答側でも見当(検討じゃないよ)がつきません。
これだけの情報で回答できたらすごいですね。
質問でしょうか?それともコメント(独り言)なんでしょうか?
エラーは ループでおこっているんじゃない。
現場(演算部分で)でおこっているんだ!(古ッ!)
今いえることはエラーの起こっている場所を把握し、
「浮動小数点演算を正しくしてください」としか回答できません。
>>地獄の魔人さん
独り言でも冗談でもないです。
現場(演算部分)とは、何をしめすのですか?
作成したProcedureの中身のことですか?
問題のコードを書いた方が良いですね。
<ここです> for NTime := 1 to NTimeMx do
begin
force (N, L, RC, Switch) ;
CC0 := 1.0 / K;
CC1 := 1.0;
for j := 1 to N do
begin
if j = NA + 1 then
begin CC1 := CC0; end;
RXI := 2.0 * RX[j] - RXO[j] + FX[j] * HSQ * CC1;
RYI := 2.0 * RY[j] - RYO[j] + FX[j] * HSQ * CC1;
RXO[j] := RX[j] ;
RYO[j] := RY[j] ;
RX[j] := RXI ;
RY[j] := RYI ;
end;
if (NTime mod NPrint) = 0 then
begin
Time := H * Ntime ;
PrintOut (N, NA, Time, Np);
end;
if (NTime mod NGraph) = 0 then
begin
NOPT := NOPT + 1;
writeln(Fout,NOPT:4) ;
Write(fout,N) ;
Write(fout,NA) ;
write(fout,NB) ;
write(fout,L) ;
s := H * NTime;
write(Fout, S) ;
for q := 1 to N do
begin
if q < NA then
begin R := 1; end
else if q >= NA then
begin R := 1.5; end;
writeln(Fout, q);
writeln(Fout, R);
writeln(Fout, RX[q]);
writeln(Fout, RY[q]);
end;
が、問題のコードです(だとおもいます…)。
全ての変数の宣言が欲しいですね・・・
implementation
const
pi = 3.141592653589793;
NN = 80;
NRanMx = 50000;
T = 5.0;
K = 10.0;
NA = 20;
NB = NA;
H = 0.001;
RC = 3.0 ;
N = NA + NB ;
NDENS = 0.1 ;
HSQ = H*H;
NP = 9;
NTimeMx = 10000;
NPrint = 1000;
NGraph = 2000;
L = 20;
var
RX, RY, RXO, RYO: array [1..NN] of real;{position of molecular}
FX, FY, VELX, VELY : array [1..NN] of real ;
Ran : array [1..NRanMx] of real ;
NRan, IX : integer;
Switch, Nopt : integer;
CC0, CC1,RXI, RYI, Time,R : real;
で、ローカル変数は、
var i,j,q: integer;
NTime : Integer;
fout : TextFile;
FName : String;
s : real;
です。
この段階では、Switchは10です。
ながながとすみません。
>For i := 1 to N doの部分(i,Nは勿論Integer)でとまっています。
どこ?
地獄の魔人さん
for NTime := 1 to NTimeMx doです。
「force」って何でしょうか?
>>deldel さん
Forceはprocedureです。
Force(N : integer; L, RC : real; Switch : integer;)
>「force」って何でしょうか?
forceそれは力じゃよ
ってトレースのやり方はご存知かな?
>>ヨーダさん
しりませんでした…。
みなさんお時間とらせてすみませんでした。
もうすこし自分でやってみます。
>ステップ実行でみてみると、
>For i := 1 to N doの部分(i,Nは勿論Integer)でとまっています。
ステップ実行はエラーが出た後の行でとまるから、
問題はこれ以前にあるはず。
ソース見る限りでは、抜き出しているみたいだから
For i := 1 to N do 〜
のソースがないと回答できません。
>>地獄の魔人さん
>ステップ実行はエラーが出た後の行でとまるから、
>問題はこれ以前にあるはず。
しりませんでした。コードを最初から一行ずつ検証しなおします。
ありがとうございました。
for NTime := 1 to NTimeMx do
ここでブレークポイントを作成し(F5を押す)、
実行し、止まった後、F7キーを押していくと、
きっとエラー箇所が見つかると思います。
>for NTime := 1 to NTimeMx do
>ここでブレークポイントを作成し(F5を押す)、
>実行し、止まった後、F7キーを押していくと、
>きっとエラー箇所が見つかると思います。
[for NTime := 1 to NTimeMx do] で、
エラー停止しているって書いてるやん
こんなところにブレークポイントいれても無駄やん!!
ブレークポイントいれやんでもとまるでぇ!
入れるのはこの行の処理よりも前や!
ありゃ・・・ごめんなさい^^;
試してみました、
結果、for ループ中のForce,PrintOutもしくはファイルIOが原因です。
しかし、この中身についてはMolMolさんは隠蔽していますので、これ以上は分かりません。
ちなみに、質問するときは、これくらい出せば分かるだろうとくくって問題を小出しにするのではなく、問題の状況を再現できる最小のコードを表示しないと普通は誰も教えてくれませんよ。
まだ、解決できていないのかねぇ
>問題の状況を再現できる最小のコードを表示しないと
>普通は誰も教えてくれませんよ。
そうや!
>結果、for ループ中のForce,PrintOutもしくはファイルIOが原因です。
[for NTime := 1 to NTimeMx do begin]ここでとまってるってことは
Force や PrintOut までは動いとらんやろぉ。
IOエラーが出るのはオープンしとらんハンドルにアクセスするからやで、
コード見る限りでは fout はローカルやさけ、fout のオープンが必要
やし[for NTime := 1 to NTimeMx do begin]の前には
少なくともこれらの初期設定しとる部分とかあるはずや!
>コードを最初から一行ずつ検証しなおします。
問題となるんは直前に実行されている処理内容がわからんからやけど
まぁ、「ステップ実行はエラーが出た後の行でとまる」こと知らんから
その行もしくはその行以降でエラーが出てると勘違いし、
勘違いな部分のソース送ってきたんや。
「最初から一行ずつ検証」やのうて、直前の処理を調べやぁ!
>>地獄の魔人さん
>>deldel
>>メラトニン
(なんとかですが…)解決しました。
お時間取らせて申し訳ありませんでした。
>>deldelさん
>>メラトニンさん
失礼しました。
重要な箇所を読み飛ばしていました
●[for NTime := 1 to NTimeMx do begin]
ここでとまってるんですね…
地獄の魔人さんのおっしゃるようにその直前がエラー箇所です。
申し訳ございません。
ツイート | ![]() |