2013-07-03 66 views
1

我已經使用VB6多年了,但我碰到了一些相當奇怪的事情,我無法自己確認這個結果。所以我想知道,如果下面的代碼的輸出將是參數傳遞ByRef與VB6 + Windows 7

下面的代碼:

Option Explicit 

Private Sub cmdOk_Click() 
Dim V As Integer 
V = 6 
Call AddV(V) 
Print V 

End Sub 

Sub AddV(ByRef P As Integer) 
P = P + 1 
Print P 

End Sub 

在我的系統(Windows XP中+ VB6),此按預期工作。所以我得到了第一個輸出。但是,我在Windows 7 + VB6上看到過相同的程序,輸出結果不一樣。

有人能解釋爲什麼這樣嗎?但是,在VB 2008 + Windows 7上,同樣的事情也很順利。我認爲通過值和call-by-reference是任何語言/操作系統的標準參數傳遞技術。

謝謝!

編輯:cmdOK是一個命令按鈕。

+0

我在VB6 + XP和VB6 + Win7(相同的exe)上得到了相同的結果(7 7)。 按照漢斯的描述,如果我使用Call關鍵字去除它,那麼我在兩個操作系統中都會看到(7 6)的預期結果。 – MarkL

回答

4
V = 6 
Call AddV(V) 

你不會用這段代碼觀察這種行爲。這與Windows版本無關,它不涉及VB6代碼執行。然而,你的觀察有一個簡單的解釋。您的代碼可能是這樣的:

V = 6 
AddV (V) 

換句話說,沒有呼叫關鍵字。現在在VB6中發生了一些非常可怕的事情。括號不再意味着同樣的事情了。只有當您調用函數時,才能使用括號來調用Sub。相反,它們成爲表達式的一部分,例如,當您編寫Print 4 * (5 + 6)時,將使用相同種類的括號。它產生一個副本的值V.被調用的過程更新該副本,它不再影響V變量的值。

雖然這是故意的,但該功能是一個重要的錯誤工廠,並沒有轉入VB.NET。在過程調用中括號現在總是意味着同樣的事情,並且您使用它們而不管被調用的過程是Sub還是Function。

+0

感謝您的輸入...請注意,我的問題代碼是我從Windows XP上的VB程序中獲取的確切內容。對我而言,它會產生'預期'輸出(這是第一個)。你有沒有在Windows 7上用VB6試過這段代碼?如果你這樣做,結果是什麼? – itsols

+0

當然不是。它將從Prez接受訂單,讓我擦拭我的Win8機器並安裝VB6。我給了你一個關於很多VB6程序員陷入陷阱的很好的解釋,顯然我認爲你只是另一個受害者。給我看一個截圖。 –

+0

公然偏離主題。淨皈依拋開(想想「被殭屍咬傷」)我不得不同意。這與操作系統版本沒有任何關係。 – Bob77