線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1469
推到 Plurk!
推到 Facebook!

delphi 怪事....

 
蜻蜓草
一般會員


發表:22
回覆:30
積分:10
註冊:2002-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-16 17:49:54 IP:61.221.xxx.xxx 訂閱
怪事.....有人可以幫個忙看一下, 方框中為何不是有效行啊, 為什麼沒有藍點出現
而且, 寫在裡面的程式, 執行起來好怪 , 不能正確執行 ,
p^:= read_policy(s); 以下 好像跟本沒被執行一樣
單步執行也跳不進去

yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-02-16 20:14:27 IP:220.229.xxx.xxx 訂閱
你先把array_index設成0, 
然後迴圈中又是26 downto 1
當然compiler後會變成無效區。
編譯器發現迴圈無效後, array_index這個變數如果之後都沒用到的話, 當然也是無效宣告。
所以應該是你誤會Delphi啦~
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-02-16 20:36:00 IP:61.64.xxx.xxx 訂閱
回圈執不執行
跟是否給予其初值無關

for i := 26 to 1 本來就是個不會執行的敘述

你的 Delphi 語法「非常」不熟喔

for I := A to B do 做的是 A 到 B 遞增的工作,所以 B 要大於等於 A

不然 A 若是小於等於 B 請用 for I := A downto B
蜻蜓草
一般會員


發表:22
回覆:30
積分:10
註冊:2002-03-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-02-16 22:27:23 IP:61.218.xxx.xxx 訂閱
不好意思小弟是不太熟.....有點弄懂了
另..我先把問題還原一下 , 一開始我的程式是這樣的,上面那個是被我改來改去作實驗的
我弄不懂為何我的 array_index 會是從26開始 downto 1, 我下的指令明明是 "to"
圖中我到中斷點後按單步執行的情況, 我沒按到 26 次
另我發現 如果我在其迴圈中 有包含一行 帶個 showmessage(inttostr(array_index ));
則真的會從 1 TO 26 正常 , 而 port_array[array_index] 這種的不行, 我不懂為何會有這樣的結果
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-02-17 16:00:36 IP:61.64.xxx.xxx 訂閱
哈這就難了

port_array[array_index] 這種的不行」,不知道是什麼狀況
很努力的讀你的圖了,但沒辦法,不好意思
沒看到完整程式碼,沒法解,圖被切掉了
蜻蜓草
一般會員


發表:22
回覆:30
積分:10
註冊:2002-03-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-01 10:07:52 IP:61.221.xxx.xxx 訂閱
剛試過了, 下面這段也是會一樣,
我設中斷點監看, n1會從 20 to 1 而非 1 to 20,
雖然不影響結果,但是可以讓它正常嗎?
我用的是 DELPHI 7 是有什麼編譯參數要改嗎?


procedure TForm1.Button1Click(Sender: TObject);
var s:array[0..20] of pointer; n1,n2:integer;
begin

for n1:=1 to 20 do
s[n1]:=nil;
end;

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-03 16:32:28 IP:61.64.xxx.xxx 訂閱
procedure TForm1.Button1Click(Sender: TObject);
var s:array[0..20] of pointer; n1,n2:integer;
begin

for n1:=1 to 20 do
s[n1]:=nil;
end;

如果是這樣,由 1 到 20 與 20 到 1 ,有何不同?就算隨便亂跳,都沒差別,結果一樣
所以編譯器,最佳化後,就是那樣

你可以改成
for n1:=1 to 20 do begin s[n1]:=nil; end;

n1:=1 to 20 do s[n1]:=aa;
其中
function aa: pointer;
begin
result := nil;
end;

編譯器會發現,原來不是一件相同的是,那他就會乖乖做了,如果你很介意一定要由 1 到 20,即使沒差別

這只是因為
結果一樣,不然還是依據 1 to 20 與 20 downto 1 的法則
呵呵,結果是,編譯器,比你聰明
系統時間:2024-05-17 17:56:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!