これって、Delphiのバグですか?特性ですか?
procedure TForm1.Button1Click(Sender: TObject);
begin
test();
end;
//--------------------------
procedure TForm1.test();
var
k,x:integer;
begin
paintbox1.Canvas.pen.Color:=clBlack ;
x:=0;
for k:=1 to 3 do
begin
paintbox1.Canvas.moveto(x,0);
paintbox1.Canvas.lineto(x,paintbox1.Height);
x:=x+2;
end;
end;
forループ内にブレークポイントを付けて「k」の値の変化を見ると、3,2,1と逆順になります。
「x:=x+2」を「x:=x+k」に変更すると、1,2,3と普通の順になります。
なぜ、こうなるのか?
対処法はありますか?
Delphi Ver6・ターボDelphi どちらも同じ状況です。
No.2ベストアンサー
- 回答日時:
Delphi 7 で試してみましたが、確かになりますね。
詳しいことは分かりませんが、おそらくループカウンタをループ内の処理で使用していないことが原因だと思います。
カウンタをインクリメントしてもデクリメントしても処理結果が変わらないため、コンパイル時の最適化でデクリメントが優先されているのではないでしょうか。
もし、上記の推測が正しいとしたら、対処方法としては以下が考えられます。
(1)ループ内でカウンタを無意味でも使用する
(2)whileを使用する
(3)コンパイル時の最適化を切れるなら切る
ですが、これって別にどちらでも結果に影響はないのでは?
No.3
- 回答日時:
最適化の結果というのに一票ですね。
はき出されるアセンブラのソースを見ないと確かなことは言えませんが、このループでは、ルーブの制御変数をカウンタのレジスタに割り振っていると思います。
レジスタにおけるインクリメントとデクリメントの速度差の他に、終了判定時、0でループを抜けるのであれば、比較演算が必要ありません、直前のデクリメントによってゼロフラグが設定されたかでジャンプ命令を実行するだけでよいからです。
x86のアセンブラを忘れているので、ニーモニックは正確ではありませんが例として
加算の場合
LOOP:
inc REG
comp REG,LOOP
jeq EXIT
jmp LOOP
EXIT:
減算の場合
LOOP:
dec REG
jze EXIT
jmp LOOP
EXIT:
のように比較命令が一命令減りますから、ルーブ回数が増えてくると結構効きます
気持ちが悪ければループ変数を使えばいいのででしょうが、実行に影響なければ気にしないのが吉かと
そういえば遠~い昔デクリメントの方が速いって聞いたことがありました。
最適化って良いですね。でも、今回はちょっと困りました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) VBA 配列を使ったコードに直していただけますか 4 2023/05/06 15:18
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アクティブセルから、A列最終行...
-
画面を強制的に再描画させる方法
-
どなたかこのプログラミングを...
-
乱数の桁数指定、または範囲指定。
-
アセンブラによるウェイト(WAIT...
-
VBA for i=1 to lastrow
-
VBAでの一時停止と再開の方法
-
alarmの使用について
-
For文を使った九九表の作成
-
「偶数・奇数の和」のフローチ...
-
UWSCの終了の仕方
-
EXCEL VBA(初心者)印刷ルー...
-
テキストボックスの名前に変数...
-
C言語 4) int 型配列 month を...
-
ループフリー
-
VBA Dir関数でファイルをループ...
-
変数の扱える範囲
-
vb.netからエクセル関数書き込み
-
一巡伝達関数と開ループ伝達関数
-
while(*s++=*t++)の判定は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
DOSコマンドのループ内のTIMEコ...
-
ListBox 複数選択 で オートフ...
-
vbscriptでIE自動入力(途中で...
-
vb.netからエクセル関数書き込み
-
DoEventsが必要な理由について
-
Java 南京錠
-
アクティブセルから、A列最終行...
-
テキストボックスの名前に変数...
-
範囲指定したセルを1つずつ飛...
-
VBA Dir関数でファイルをループ...
おすすめ情報