none
有關於使用陣列大小的問題 RRS feed

  • 問題

  •  

    各位大大

     

    今天 我使用VS2005 我在寫測試程式時

    因為 資料量很大

    所以宣告了一個 一維陣列大小 是60000

     

    當我 將值逐一填入陣列後

    我在END SUB 那行 設定一個中斷點

     

    剛宣告的時候 我看到的是 0~60000 值 都是nothing

    結果 只有0~510 有值 510以後 值都不見了  沒有 nothing 沒有 "" 連項次 都變成 ?

    且 我使用滑鼠 去點該陣列

    每去 看一次 陣列的有值的部份 就會少一半

    0~510 有值 其餘項次的部份都是問號

    0~254

    0~126

    0~62

    0~30

    陣列大小 消失了 完全沒辦法看到陣列了

    我以為是我宣告太大的陣列 看勢在MSDN上看到的大小 是( 2 ^31) -1

     

    請問 這是 為何?

    是我記憶體不夠嗎(我的記憶體是2G)?

    能麻煩各位大大

    幫我看看是何原因?

    怎麼陣列 中的值會消失

     

    謝謝各位大大了

    2008年6月16日 上午 10:03

解答

  • 感覺是VS2005的蟲蟲,我改用簡單的程式碼來測試

    Code Snippet
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim str(1023) As String
            For z As Integer = 0 To 1023
                Label1.Text = z
                str(z) = "12345"
            Next
        End Sub

     

    在VS2005裡面用快速監看式去看變數內容是正常的

    但是滑鼠停在變數上面即時監看的變數內容會有樓主描述的狀況

     

    到最後VS2005會整個掛點,同樣的Code用VS2008來測是正常的..

    2008年6月17日 上午 06:57
    版主
  • 我能重現了

     

    滑鼠跳出這部分我很少用,我通常反白按 Shift+F9 ,因為那邊能慢慢看,還能看子節點~

    2008年6月17日 上午 07:29
    版主
  • 我看不懂你這段要表達什麼。

     

    這段可以這樣精簡:

    Code Snippet

     

            Do'判斷式 一堆 感覺很....壘綴

    ...

                'Call DateTime() '來去計算時間

     

    改寫為:

    Code Snippet

    Dim iLen As Integer

      For i As Integer = 1 To 14
       Select Case i
        Case 1 To 8
         iLen = 6
        Case Else
         iLen = 4
       End Select

       If Save_Data(i) = 1 Then
        Temporary &= Mid(BufStr, NowDot, iLen)
        NowDot += iLen
       Else
        Temporary &= New String("-", iLen)
       End If
      Next

     

    註:我自己會把 Temporary 改為 StringBuilder ,不過這邊依照你原先的邏輯,不做大變動。
    2008年6月17日 下午 02:09
    版主

所有回覆

  • 我測試這樣程式碼是正常的:

    Code Snippet

    Dim dt(60000) As String

    For ibd As Integer = 0 To UBound(dt)

         dt(ibd) = ibd

    Next

     

    你的描述看不懂:

    Code Snippet

    結果 只有0~510 有值 510以後 值都不見了  沒有 nothing 沒有 "" 連項次 都變成 ?

    且 我使用滑鼠 去點該陣列

    每去 看一次 陣列的有值的部份 就會少一半

     

    2008年6月16日 上午 10:29
    版主
  • 謝謝璉璉大大

    這是我測試的程式碼

     

    Code Snippet

    Dim yi As Long
            Dim ys As String = Nothing
            Do
                Application.DoEvents()
                ys &= "000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F00010203040506070809"
                yi += 1
            Loop Until yi > 18078 '模擬 生成字串
            
            yi = 0
            Dim ya(65535) As String

            Do
                Application.DoEvents()
                ya(yi) = Mid(ys, (yi * 16) + 1, 16) '模擬處理字串丟入陣列
                yi += 1
            Loop Until yi > 65535

           

     

     

    關於我的問題

    圖片的位置

    http://lighting0499.spaces.live.com/photos/

     

    再次麻煩各位大大了

    2008年6月16日 下午 12:05
  • ...

    大量字串相加,請利用 StringBuilder 類別或是 Join 連接,否則光是你第一個迴圈

    ys &= 跑個一萬次你就受不了了

     

    ys 大小為 256 * 18079 = 4628224 bytes = 4.6 mb

     

    ya 陣列大小為 (32+4+4) * 65536 = 2621440 bytes = 2.6 mb (位元組+遠程指標+字串長度)

     

    你得程式碼跑太久了,我受不了,我把中間改為:

    Code Snippet

    Dim yb As New System.Text.StringBuilder

    Do

         Application.DoEvents()

    yb.Append("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F00010203040506070809")

         yi += 1

    Loop Until yi > 18078 '模擬生成字串

    Dim ys As String = yb.ToString

     

     
    閃一下就出來了,怎樣看 ya 都正常。
     
    你的圖太小,無法看清楚字,請改用 SkyDrive 來塞圖,那邊不會縮圖。
     
    如果你改用 StringBuilder 就正常,可能是堆積或堆疊爆了,那個都不大。
     
     
    這篇你先看一下:
    2008年6月17日 上午 05:55
    版主
  • 感覺是VS2005的蟲蟲,我改用簡單的程式碼來測試

    Code Snippet
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim str(1023) As String
            For z As Integer = 0 To 1023
                Label1.Text = z
                str(z) = "12345"
            Next
        End Sub

     

    在VS2005裡面用快速監看式去看變數內容是正常的

    但是滑鼠停在變數上面即時監看的變數內容會有樓主描述的狀況

     

    到最後VS2005會整個掛點,同樣的Code用VS2008來測是正常的..

    2008年6月17日 上午 06:57
    版主
  • 我能重現了

     

    滑鼠跳出這部分我很少用,我通常反白按 Shift+F9 ,因為那邊能慢慢看,還能看子節點~

    2008年6月17日 上午 07:29
    版主
  • 這個狀況要再向上回報嗎?還是能請 lolota 大幫忙反應一下;話說我的技術支援點數放到現在都沒用..快到期了...

    2008年6月17日 上午 07:50
    版主
  • 謝謝各位大大

    百忙之中

    還幫我測試

    我也自己測試半天多(因為一直認為是自己還不熟,是個人的問題)

     

    本來 也沒注意

    是發現處理後的 TABLE上面,永遠只有 511項資料

    我才這樣看,已確定我陣列中塞的是我要的值

    才發現越看越少

    ...><"

     

    目前我先把硬體上的資料讀出後丟到檔案中

    在從檔案中一次讀出處理

     

     

    真的是謝謝各位了

     

     

    更是謝謝璉大了

    提供我更好的字串相加方式

     

    至於璉大

    幫我算的這個

    ys 大小為 256 * 18079 = 4628224 bytes = 4.6 mb

    ya 陣列大小為 (32+4+4) * 65536 = 2621440 bytes = 2.6 mb (位元組+遠程指標+字串長度)

    因為這裡我模擬的 1MB 字串 其實是硬體送回來給我的,也就是1048576 bytes *2 的字元

     

    順帶再問一個字串處理的問題

    假設硬體送給我的字串如下

     

    5CC5 FFFF 0101 1617 0608 0384 0003 1111 2222 3333 4444 5555 6666

    標頭 中斷點 秒分  時日 月 年 秒數 幾個值

    FFFF 0101 1717 0608 0384 0003 1111 2222 3333 4444 5555 6666 7777

    8888 9999 AAAA BBBB CCCC DDDD EEEE ..............後面如果沒值的話就是一推的FFFFFFFFFFFFFFFF.......

     

    0xFFFF表示我遇到中斷點 時間日期幾秒紀錄一次紀錄哪些值,就必須從新判斷

    0x0384 =900秒 記錄一次

    0003 =>二進位 0000 0000 0000 0011  表示 我有16個值 只紀錄兩項

    假設1個BYTE等於一筆資料

    所以 第一筆 080617 160101 1111

           第二筆 080617 161601 2222 (+900秒)...

    遇到FFFF

    第N筆 080617 170101 1111

    第N+1筆 080617 171601 2222(+900秒)...

    目前我就是將所有資料串在一起

    宣告一個 長度long 的變數 來做指標

    遇到FFFF就位移 在從新 紀錄 日期時間等等

    一筆一筆的填入TABLE中

    速度是還不錯快

    不過CODE 程式碼如下

     

     

    Code Snippet

    Sub DataArray(ByVal BufStr As String) '處理

            Dim i As Int16
            Date_T = ""
            Date_D = ""
            For i = 1 To 3
                Date_T = Mid(BufStr, NowDot, 2) & Date_T
                NowDot += 2
            Next i
            Date_T = Mid(Date_T, 1, 2) & ":" & Mid(Date_T, 3, 2) & ":" & Mid(Date_T, 5, 2)

            For i = 1 To 3
                Date_D = Mid(BufStr, NowDot, 2) & Date_D
                NowDot += 2
            Next i
            Date_D = Date.Parse(Mid(Date_D, 1, 2) & "/" & Mid(Date_D, 3, 2) & "/" & Mid(Date_D, 5, 2))

            Time_Gap = Val("&H" & Mid(BufStr, NowDot, 4) & "&")
            Call TMS() '自己定義的SUB 計算秒分時
            NowDot += 4
            Dim temp As String = HEX_To_BIN(Mid(BufStr, NowDot, 4))'自己定義的SUB 轉二進位
            NowDot += 4
            For i = 1 To 16
                If i >= 1 And i <= 8 Then
                    Save_Data(i) = Mid(temp, 9 - i, 1)
                    If Mid(temp, 9 - i, 1) = "1" Then
                        SVCount += 3
                    End If
                Else
                    Save_Data(i) = Mid(temp, 25 - i, 1)
                    If Mid(temp, 25 - i, 1) = "1" Then
                        SVCount += 2
                    End If
                End If
            Next

            Dim Temporary As String = Nothing

            Do'判斷式 一堆 感覺很....壘綴
                Application.DoEvents()

                Temporary = ""

                If Save_Data(1) = 1 Then '總W   6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(2) = 1 Then '總VAR 6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(3) = 1 Then 'A相W   6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(4) = 1 Then 'B相W   6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(5) = 1 Then 'C相W   6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(6) = 1 Then 'A相VAR 6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(7) = 1 Then 'B相VAR 6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(8) = 1 Then 'C相VAR 6
                    Temporary &= Mid(BufStr, NowDot, 6)
                    NowDot += 6
                Else
                    Temporary &= "------"
                End If
                If Save_Data(9) = 1 Then 'A相A 4
                    Temporary &= Mid(BufStr, NowDot, 4)
                    NowDot += 4
                Else
                    Temporary &= "----"
                End If
                If Save_Data(10) = 1 Then 'B相A 4
                    Temporary &= Mid(BufStr, NowDot, 4)
                    NowDot += 4
                Else
                    Temporary &= "----"
                End If
                If Save_Data(11) = 1 Then 'C相A 4
                    Temporary &= Mid(BufStr, NowDot, 4)
                    NowDot += 4
                Else
                    Temporary &= "----"
                End If
                If Save_Data(12) = 1 Then 'A相V 4
                    Temporary &= Mid(BufStr, NowDot, 4)
                    NowDot += 4
                Else
                    Temporary &= "----"
                End If
                If Save_Data(13) = 1 Then 'B相V 4
                    Temporary &= Mid(BufStr, NowDot, 4)
                    NowDot += 4
                Else
                    Temporary &= "----"
                End If
                If Save_Data(14) = 1 Then 'C相V 4
                    Temporary &= Mid(BufStr, NowDot, 4)
                    NowDot += 4
                Else
                    Temporary &= "----"
                End If
                'Call DateTime() '來去計算時間
                If Date_D.Length = 8 Then sw.WriteLine(Date_D & "  " & Date_T & Temporary)
                If Date_D.Length = 9 Then sw.WriteLine(Date_D & " " & Date_T & Temporary)
                If Date_D.Length = 10 Then sw.WriteLine(Date_D & Date_T & Temporary)

                Call DateTime()'自己定義的SUB 計算時間日期
            Loop Until NowDot >= BufStr.Length Or G_Quit = True Or Mid(BufStr, NowDot, 4) = "FFFF"

            If Mid(BufStr, NowDot, 4) = "FFFF" And Mid(BufStr, NowDot, 8) <> "FFFFFFFF" Then
                NowDot += 4
                'Debug.Print("FFFF" & " " & NowDot)
                Call DataArray(BufStr)'遇到FFFF 且不是一推FFFFFFF....的時候表示欲到中斷點

                '所以我SUB CALL SUB 不知道這樣會不會有問題
            End If

        End Sub

     

    就是想 請問各位大大

    我這樣 SUB CALL SUB

    會不會有問題

     

     

    2008年6月17日 上午 08:21
  • 我看不懂你這段要表達什麼。

     

    這段可以這樣精簡:

    Code Snippet

     

            Do'判斷式 一堆 感覺很....壘綴

    ...

                'Call DateTime() '來去計算時間

     

    改寫為:

    Code Snippet

    Dim iLen As Integer

      For i As Integer = 1 To 14
       Select Case i
        Case 1 To 8
         iLen = 6
        Case Else
         iLen = 4
       End Select

       If Save_Data(i) = 1 Then
        Temporary &= Mid(BufStr, NowDot, iLen)
        NowDot += iLen
       Else
        Temporary &= New String("-", iLen)
       End If
      Next

     

    註:我自己會把 Temporary 改為 StringBuilder ,不過這邊依照你原先的邏輯,不做大變動。
    2008年6月17日 下午 02:09
    版主
  • 謝謝璉大

     

    我表達比較差一點 真是不好意思

    璉大的已經是我想要的答案了

    謝謝

     

    2008年6月18日 上午 12:31