VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

我對以下這個程序有點問題

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
impotence



註冊時間: 2005-02-21
文章: 135
來自: Hong Kong

第 1 樓

發表發表於: 星期三 五月 30, 2007 2:40 pm    文章主題: 我對以下這個程序有點問題 引言回覆

我對以下這個程序有點問題 , 希望有人能幫我解釋 !
有一個 table -- test 如下


SID Nscore
1001 50
1002 60
1003 70
1004 40
1005 80
1006 50
1007 90
1008 50
1009 90
1010 80

運行以下的 test.prg


lnSeq = 0
lnScore = -1
lnNext = 0
lmTmp = -1

SELECT sid, nscore FROM test INTO CURSOR tmp1 ORDER BY nscore DESC
SELECT sid, nscore, GetSeq(@lnSeq, nScore) as nTopNum FROM tmp1 INTO TABLE tmp2
Use in tmp1
SELECT tmp2
BROWSE

FUNCTION GetSeq(tnNumber, tnscore)
IF tnscore # lnScore
lnScore=tnscore
tnNumber=tnNumber+1+lnNext
lnNext=0
RETURN tnNumber
ELSE
lnNext=lnNext+1+lnTmp
lnTmp=0
RETURN tnNumber
ENDIF
ENDFUNC

出來的結果是 :


Sid Nscore Ntopnum
1007 90 1
1009 90 1
1005 80 3
1010 80 3
1003 70 5
1002 60 6
1001 50 7
1006 50 7
1008 50 7
1004 40 10

我試過把 test.prg 更改後 , 如下 :

lnSeq=0
lnScore=-1
lnNext=0
lnTmp=-1

SELECT sid, nscore FROM test INTO CURSOR tmp1 ORDER BY nscore DESC
SELECT sid, nscore, lnseq as seq1 , lnnext as Next1, lntmp as Tmp1, GetSeq(lnSeq, nScore) as nTopNum, lnseq as seq2, lnnext as next2, ;
lntmp as tmp2 FROM tmp1 INTO TABLE test2
USE IN tmp1
SELECT test2
BROWSE

FUNCTION GetSeq(tnNumber, tnscore)
IF tnscore # lnScore
lnScore=tnscore
tnNumber=tnNumber+1+lnNext
lnNext=0
lnSeq=tnNumber
RETURN tnNumber
ELSE
lnNext=lnNext+1+lnTmp
lnTmp=0
RETURN tnNumber
ENDIF
ENDFUNC


sid nscore Seq1 Next1 Tmp1 Ntopnum Seq2 Next2 Tmp2
1007 90 1 0 -1 1 1 0 0
1009 90 1 0 0 1 1 1 0
1005 80 1 1 0 3 3 0 0
1010 80 3 0 0 3 3 1 0
1003 70 3 1 0 5 5 0 0
1002 60 5 0 0 6 6 0 0
1001 50 6 0 0 7 7 0 0
1006 50 7 0 0 7 7 1 0
1008 50 7 1 0 7 7 2 0
1004 40 7 2 0 10 10 0 0

我的問題如下 :

(一) GetSeq(@lnSeq, nScore) 的 @lnSeq 的 @ 是什麼用途 ?
(二) 為什麼 lnTmp 在 GetSeq(@lnSeq, nScore) 之前是 -1 , 但之後就變為 0 ?

謝謝 !

_________________
一個常常忘記 Command 的人 !
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2160


第 2 樓

發表發表於: 星期三 五月 30, 2007 3:34 pm    文章主題: 引言回覆

(一) @ 表示 用"傳址" 的方式來傳遞參數, 表示@變數的內容會隨著在函數裡的運算而被變更.
(二) 你可以在FUNCTION GetSeq裡找到一行
lnTmp=0

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
impotence



註冊時間: 2005-02-21
文章: 135
來自: Hong Kong

第 3 樓

發表發表於: 星期三 五月 30, 2007 3:42 pm    文章主題: 引言回覆

謝謝你 garfield ,
第一個答案我明白了 ,
但 ... 第二個 , 在第一次運行 (1007,90 .. 那時候 lnTmp = -1) GetSeq 之後 -- tnscore # lnScore . 並沒有 lnTmp =0 的動作 , 要在第二次 (1009,90) GetSeq 之後 經 ELSE 才應該變為 0 .....

_________________
一個常常忘記 Command 的人 !
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2160


第 4 樓

發表發表於: 星期三 五月 30, 2007 5:00 pm    文章主題: 引言回覆

對啊
要lnTmp=0的條件是 not ( tnscore # lnScore )

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
impotence



註冊時間: 2005-02-21
文章: 135
來自: Hong Kong

第 5 樓

發表發表於: 星期三 五月 30, 2007 5:13 pm    文章主題: 引言回覆

是啊 ~~~ 但你可從我修改之後 , 得到的答案中比較 , lnTmp 在運行 nscore=90, sid=1007 之前是 -1 (我的表中第一行的 tmp1), 但在運行 GetSeq (nscore=90,sid=1007, 並沒有啟動 ELSE ) 之後 , lnTmp = 0 (我的表中第一行的 tmp2) .....
_________________
一個常常忘記 Command 的人 !
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作