none
請問VB有指標變數嗎? RRS feed

  • 問題

  • 我想讓某些變數的記憶體位址設為相同

    據我所知

    VB是用BYREF

    在副程式中執行

    那如果不靠副程式傳址

    可以做嗎?

    2013年6月7日 上午 02:28

解答

  • 因為你的 EX1 基本上是有發生例外的, 這算是 Visual Studio 一個 bug, 當 Exception 發生在 Load 事件委派函式的時候, 你用 Visual Studio 執行偵錯的功能執行它例外不會跑出來, 你可以試著直接執行編譯好的 exe 檔, 你就會看到 NullReferenceException .

    那為什麼這樣會產生這種例外, 原因在於當你宣告該陣列DoSetA()時, 你所有的元素都指向 Nothing/Null , 也就是說畫面建立那些 Label 實體的程序是發生在你宣告陣列之後. 而 Label 偏偏又是個參考型別.

    所以當你在 Form_Load 中存取 DoSetA(0) 時, 它指向的並不是當時 DOStatus1 變數的位址 (此時 DOStatus1 變數指向一個已建立實體的 Label), 而 DoSetA(0) 指向的依然是 Nothing/Null.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 孤單之人 2013年6月9日 下午 01:04
    2013年6月7日 上午 03:40
    版主
  • 你到 Form Load 事件發生時, 所有的 Label 實體都已經建好了啊.

    參考以下文章, 可以瞭解 Form 的建立順序

    http://www.dotblogs.com.tw/billchung/archive/2011/01/08/20667.aspx


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年6月7日 上午 04:59
    版主

所有回覆

  • VB 沒有指標變數這種東西。

    C# 有,但要用 unsafe 模式。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年6月7日 上午 02:46
    版主
  • 小弟我實作時

    發現一個問題

    -------

    EX1:

    Dim DoSetA() As Label = {DOStatus1, DOStatus2, DOStatus3, DOStatus4, _

                             DOStatus5, DOStatus6, DOStatus7, DOStatus8}

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            DoSetA(2).Text = "OFF"
            DoSetA(3).Text = "OFF"
        End Sub

    此時我的DOStatus3和DOStatus4兩個label物件不會顯示OFF

    ----

    EX2:

        Dim DoSet() As Label

        Sub MakeLabelSet(ByRef DoSet() As Label)
            Dim LabelSet() As Label = {DOStatus1, DOStatus2, DOStatus3, DOStatus4, _
                             DOStatus5, DOStatus6, DOStatus7, DOStatus8}
            DoSet = LabelSet
        End Sub

       Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            DoSet(0).Text = "OFF"

            DoSet(1).Text = "OFF"

        End Sub

    此時我的DOStatus1和DOStatus2兩個label物件會顯示OFF

    ---

    這是為什麼?可以告訴我嗎?


    2013年6月7日 上午 02:49
  • 因為你的 EX1 基本上是有發生例外的, 這算是 Visual Studio 一個 bug, 當 Exception 發生在 Load 事件委派函式的時候, 你用 Visual Studio 執行偵錯的功能執行它例外不會跑出來, 你可以試著直接執行編譯好的 exe 檔, 你就會看到 NullReferenceException .

    那為什麼這樣會產生這種例外, 原因在於當你宣告該陣列DoSetA()時, 你所有的元素都指向 Nothing/Null , 也就是說畫面建立那些 Label 實體的程序是發生在你宣告陣列之後. 而 Label 偏偏又是個參考型別.

    所以當你在 Form_Load 中存取 DoSetA(0) 時, 它指向的並不是當時 DOStatus1 變數的位址 (此時 DOStatus1 變數指向一個已建立實體的 Label), 而 DoSetA(0) 指向的依然是 Nothing/Null.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 孤單之人 2013年6月9日 下午 01:04
    2013年6月7日 上午 03:40
    版主
  • 那我的EX2

    是否有讓變數的記憶體位址相同嗎?

    那為什麼我的EX2卻是可以實行?

    2013年6月7日 上午 04:03
  • 你的 EX2 程式有點不完全, 我看不出來你在哪個地方呼叫 MakeLabelSet 這個 Method .

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年6月7日 上午 04:07
    版主
  • 你的 EX2 程式有點不完全, 我看不出來你在哪個地方呼叫 MakeLabelSet 這個 Method .

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

        Dim DoSet() As Label

        Sub MakeLabelSet(ByRef DoSet() As Label)
            Dim LabelSet() As Label = {DOStatus1, DOStatus2, DOStatus3, DOStatus4, _
                             DOStatus5, DOStatus6, DOStatus7, DOStatus8}
            DoSet = LabelSet
        End Sub

       Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

          Call MakeLabelSet(DoSet)

            DoSet(0).Text = "OFF"

            DoSet(1).Text = "OFF"

        End Sub

    不好意思 我沒有複製到@@
    麻煩你幫我看一下

    我是在Form1_Load裡面做的

    2013年6月7日 上午 04:57
  • 你到 Form Load 事件發生時, 所有的 Label 實體都已經建好了啊.

    參考以下文章, 可以瞭解 Form 的建立順序

    http://www.dotblogs.com.tw/billchung/archive/2011/01/08/20667.aspx


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年6月7日 上午 04:59
    版主
  • VB.NET的指標變數要自己做, 請參考:VarPtr for .NET
    2013年6月7日 上午 06:40
  • 因為你的 EX1 基本上是有發生例外的, 這算是 Visual Studio 一個 bug, 當 Exception 發生在 Load 事件委派函式的時候, 你用 Visual Studio 執行偵錯的功能執行它例外不會跑出來, 你可以試著直接執行編譯好的 exe 檔, 你就會看到 NullReferenceException .

    那為什麼這樣會產生這種例外, 原因在於當你宣告該陣列DoSetA()時, 你所有的元素都指向 Nothing/Null , 也就是說畫面建立那些 Label 實體的程序是發生在你宣告陣列之後. 而 Label 偏偏又是個參考型別.

    所以當你在 Form_Load 中存取 DoSetA(0) 時, 它指向的並不是當時 DOStatus1 變數的位址 (此時 DOStatus1 變數指向一個已建立實體的 Label), 而 DoSetA(0) 指向的依然是 Nothing/Null.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    所以bill的意思是說

    EX1問題是

    "全體變數的陣列建立"已經比"表單內的物件建立"還要快嗎?

    所以無法得到我要的結果?

    2013年6月7日 下午 12:06
  • 2013年6月7日 下午 01:11