全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:899
推到 Plurk!
推到 Facebook!

這為什麼是無窮回圈.......?

尚未結案
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-18 22:56:49 IP:61.230.xxx.xxx 未訂閱
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TDataRecord=record DataBuf: array[0..83] of Char; end; type TForm1 = class(TForm) GroupBox1: TGroupBox; Edit1: TEdit; Button1: TButton; ProgressBar1: TProgressBar; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin ProgressBar1.Visible := False; Edit1.Text := 'C:\123.TXT'; Edit1.SetFocus; end; procedure TForm1.Button1Click(Sender: TObject); var InputData: TStringList; ReadRecord: TDataRecord; i: Integer; begin try InputData:=TStringList.Create; InputData.LoadFromFile(Edit1.Text); except Application.MessageBox('檔案開啟失敗,請檢查檔案路徑是否正確!!','開檔失敗',MB_OK MB_ICONHAND); Exit; end; ProgressBar1.Visible := True; ProgressBar1.Step := 1; ProgressBar1.Max := InputData.Count; for i := 0 to InputData.Count - 1 do begin if i <= InputData.Count - 1 then //這一段可以不用的,因為這個回圈停不下來,so....? if InputData.Strings[i]<>'' then begin StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); ProgressBar1.StepIt; end; end; InputData.Free; end; end. 123.TXT檔案內容如下: 1222233333333334444467777777888888899999999000000abbbbbbbccccccccdeeeefffffffggggggg 可否請各位大大幫忙看一下,debug了久還是不知道錯在那....?
azurecloud
中階會員


發表:52
回覆:108
積分:92
註冊:2003-09-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-19 05:16:00 IP:163.13.xxx.xxx 未訂閱
Hi, corey 您好:     請加入紅色這兩行 showmessage (我個人覺得 Debug 時不錯用) showmessage(inttostr(InputData.Count)); for i := 0 to InputData.Count - 1 do begin showmessage('InputData.Count = ' inttostr(i)); if i <= InputData.Count - 1 then //這一段可以不用的,因為這個回圈停不下來,so....? if InputData.Strings[i]<>'' then begin StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); ProgressBar1.StepIt; end; end; 您會發現 InputData.Count 的值是 0 然後您又 -1 ,迴圈變成 for i := 0 to -1 do ========================
我要努力向上
========================
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-19 08:14:12 IP:211.78.xxx.xxx 未訂閱
引言: Hi, corey 您好: 請加入紅色這兩行 showmessage (我個人覺得 Debug 時不錯用) showmessage(inttostr(InputData.Count)); for i := 0 to InputData.Count - 1 do begin showmessage('InputData.Count = ' inttostr(i)); if i <= InputData.Count - 1 then //這一段可以不用的,因為這個回圈停不下來,so....? if InputData.Strings[i]<>'' then begin StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); ProgressBar1.StepIt; end; end; 您會發現 InputData.Count 的值是 0 然後您又 -1 ,迴圈變成 for i := 0 to -1 do ======================== [blue]
我要努力向上 [/h5] ========================
請問你有開檔成功嗎?如果有InputData.Count 應該是1(要將123.TXT檔copy 到c:\),所以回圈應該是 for i:=0 to 0 do,不知為什麼回圈就是不停下來?
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-19 09:36:12 IP:61.56.xxx.xxx 未訂閱
是這行的問題... StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord));    請改成 StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord.DataBuf)-1); 請參考HELP的說明,函數StrLCopy的MaxLen包含null terminator,所以要-1 發表人 - 00156 於 2003/12/19 09:44:40
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-19 10:23:21 IP:211.78.xxx.xxx 未訂閱
引言: 是這行的問題... StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); 請改成 StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord.DataBuf)-1); 請參考HELP的說明,函數StrLCopy的MaxLen包含null terminator,所以要-1 發表人 - 00156 於 2003/12/19 09:44:40
原來是這麼簡單,真不好意思.... 想請問一下,為什麼上述原因,而導致無窮回圈....? 改成<>>也可以
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-19 11:17:16 IP:61.56.xxx.xxx 未訂閱
程式並沒有進入無窮迴圈,而是在StrLCopy中指定的最大容許長度超出你給的空間了,所以執行時產生錯誤而當掉了。這和函數本身有關,所以你改用StrCopy也行。在迴圈的部份你寫得很正確,沒有問題的
系統時間:2024-11-25 4:24:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!