【求助】請幫我看一下這個vb程式碼哪邊錯了

顯示結果從第 1 筆 到 3 筆,共計 3 筆
  1. #1
    會員
    註冊日期
    2001-09-27
    討論區文章
    7

    【求助】請幫我看一下這個vb程式碼哪邊錯了

    執行會出現錯誤



    == 第一部分.宣告 ==

    '---設定Visual Basic選項---
    Option Explicit

    '---針對節點開一個11x11的矩陣---
    Dim M(1 To 11, 1 To 11) As Double
    Dim i As Integer, j As Integer
    '---宣告區段到此結束.以下是執行程序---

    ' == 第二部分.初始假設 ==

    '---假定矩陣各元素之初始值(由0開始)---
    Private Sub Command1_Click()

    M(1, 1) = 0: M(1, 2) = 0: M(1, 3) = 0: M(1, 4) = 0: M(1, 5) = 0: M(1, 6) = 0: M(1, 7) = 0: M(1, 8) = 0: M(1, 9) = 0: M(1, 10) = 0: M(1, 11) = 0
    M(2, 1) = 0: M(2, 2) = 0: M(2, 3) = 0: M(2, 4) = 0: M(2, 5) = 0: M(2, 6) = 0: M(2, 7) = 0: M(2, 8) = 0: M(2, 9) = 0: M(2, 10) = 0: M(2, 11) = 0
    M(3, 1) = 0: M(3, 2) = 0: M(3, 3) = 0: M(3, 4) = 0: M(3, 5) = 0: M(3, 6) = 0: M(3, 7) = 0: M(3, 8) = 0: M(3, 9) = 0: M(3, 10) = 0: M(3, 11) = 0
    M(4, 1) = 0: M(4, 2) = 0: M(4, 3) = 0: M(4, 4) = 0: M(4, 5) = 0: M(4, 6) = 0: M(4, 7) = 0: M(4, 8) = 0: M(4, 9) = 0: M(4, 10) = 0: M(4, 11) = 0
    M(5, 1) = 0: M(5, 2) = 0: M(5, 3) = 0: M(5, 4) = 0: M(5, 5) = 0: M(5, 6) = 0: M(5, 7) = 0: M(5, 8) = 0: M(5, 9) = 0: M(5, 10) = 0: M(5, 11) = 0
    M(6, 1) = 0: M(6, 2) = 0: M(6, 3) = 0: M(6, 4) = 0: M(6, 5) = 0: M(6, 6) = 0: M(6, 7) = 0: M(6, 8) = 0: M(6, 9) = 0: M(6, 10) = 0: M(6, 11) = 0
    M(7, 1) = 0: M(7, 2) = 0: M(7, 3) = 0: M(7, 4) = 0: M(7, 5) = 0: M(7, 6) = 0: M(7, 7) = 0: M(7, 8) = 0: M(7, 9) = 0: M(7, 10) = 0: M(7, 11) = 0
    M(8, 1) = 0: M(8, 2) = 0: M(8, 3) = 0: M(8, 4) = 0: M(8, 5) = 0: M(8, 6) = 0: M(8, 7) = 0: M(8, 8) = 0: M(8, 9) = 0: M(8, 10) = 0: M(8, 11) = 0
    M(9, 1) = 0: M(9, 2) = 0: M(9, 3) = 0: M(9, 4) = 0: M(9, 5) = 0: M(9, 6) = 0: M(9, 7) = 0: M(9, 8) = 0: M(9, 9) = 0: M(9, 10) = 0: M(9, 11) = 0
    M(10, 1) = 0: M(10, 2) = 0: M(10, 3) = 0: M(10, 4) = 0: M(10, 5) = 0: M(10, 6) = 0: M(10, 7) = 0: M(10, 8) = 0: M(10, 9) = 0: M(10, 10) = 0: M(10, 11) = 0
    M(11, 1) = 0: M(11, 2) = 0: M(11, 3) = 0: M(11, 4) = 0: M(11, 5) = 0: M(11, 6) = 0: M(11, 7) = 0: M(11, 8) = 0: M(11, 9) = 0: M(11, 10) = 0: M(11, 11) = 0

    '------------------------------------------------------------------------------------------------------------------------------------------------------------

    ' == 第三部分.運算部分 ==

    '---1.計算邊界數值---
    If 1 <= i <= 11 And j = 1 Then
    M(i, j) = 0 + i * (30 / 10)
    End If

    If 1 <= i <= 11 And j = 11 Then
    M(i, j) = 50 + i * (50 / 10)
    End If

    If 2 <= j <= 10 And i = 1 Then
    M(i, j) = 0 + j * (50 / 10)
    End If

    If 2 <= j <= 10 And i = 11 Then
    M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
    End If

    '---2.計算內部數值(每個點之值=鄰近四點和/4)---
    If 2 <= i <= 10 And 2 <= j <= 10 Then
    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
    End If

    '-----------------------------------------------------------------------------------------------------------------------------------------------------------

    ' == 第四部分.迴圈結構 ==

    '---Do Loop 由猜值推估修正到正確值---
    Dim O As Double
    Dim N As Double
    Do
    If 2 <= i <= 10 And 2 <= j <= 10 Then
    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
    M(6, 6) = O
    End If

    If 2 <= j <= 10 And i = 11 Then
    M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
    End If

    If 2 <= i <= 10 And 2 <= j <= 10 Then
    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
    M(6, 6) = N
    End If

    If 2 <= j <= 10 And i = 11 Then
    M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
    End If

    Loop Until (O / N) <= 10 ^ (-5) '---如果(舊值/新值)<10^(-5),則離開迴圈---

    '--------------------------------------------------------------------------------------------------------------------------------------------------

    ' == 第五部分.結果輸出 ==

    '---將此問題的結果輸出(檔案名"solution")---

    Open "solution" For Output As #1
    Print #1, M(i, j)

    End Sub



    錯誤訊息是

    執行階段錯誤 '9'

    陣列索引超出範圍

    偵錯後說

    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4

    有問題



    thx



  2. #2
    嘴炮戰隊隊長 ivantw 的大頭照
    註冊日期
    2002-05-04
    所在地區
    CHT FTTH 100M/20M Static IP
    討論區文章
    4,903
    錯的一榻糊塗...

    第三部份應該是如此吧?
    語法:
            For i = 1 To 11
                For j = 1 To 11
                    Select Case j
                       Case 1
                         M(i, j) = 0 + i * (30 / 10)
                       Case 11
                         M(i, j) = 50 + i * (50 / 10)
                       Case Else
                         Select Case i
                            Case 1
                              M(i, j) = 0 + j * (50 / 10)
                            Case 11
                              M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
                            Case Else
                              M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
                         End Select
                    End Select
                Next j
            Next i
    第四部分錯的更離譜,沒For Next迴圈來Assign i,j的值,O與N也沒給初值,
    測試條件 (O / N) <= 10 ^ (-5) <-- 肯定是一跑就錯誤 0/0 除數為零,迴圈中也沒指定新值給 O and N ,就算你給初值給 O and N這Do...Loop迴圈不是只跑一次,就是永不結束。

  3. #3
    會員
    註冊日期
    2001-09-27
    討論區文章
    7
    這是經過ivan lin 指導修改過的 可是還是有點問題 請問哪邊還需要修改 我第一次寫程式 不知道如何表達 我要達成的目的

    Private Sub Command1_Click()
    ' == 第一部分.初始假設 ==
    '---針對節點開一個11x11的矩陣---
    Dim M(1 To 11, 1 To 11) As Double
    Dim i As Integer
    Dim j As Integer

    Dim O As Double
    Dim N As Double

    '---假定矩陣各元素之初始值(由0開始)---
    For i = 1 To 11
    For j = 1 To 11
    M(i, j) = 0
    Next j
    Next i

    '-----------------------------------------------------------------------------------------------------------------------------------------------------------

    ' == 第二部分.運算部分 ==

    '---1.計算邊界數值---
    '1-1.下邊界數值
    For i = 1 To 11
    For j = 1 To 1
    M(i, j) = 0 + i * (30 / 10)
    Next j
    Next i
    '1-2.上邊界數值
    For i = 1 To 11
    For j = 11 To 11
    M(i, j) = 50 + i * (50 / 10)
    Next j
    Next i
    '1-3.左邊界數值
    For i = 1 To 1
    For j = 2 To 10
    M(i, j) = 0 + j * (50 / 10)
    Next j
    Next i
    '1-4.右邊界數值
    For i = 11 To 11
    For j = 2 To 10
    Option Explicit

    M(i, j) = (2 * M(10, j) + M(11, j - 1) + M(11, j + 1)) / 4
    Next j
    Next i

    '---2.計算內部數值(每個點之值=鄰近四點和/4)---
    For i = 2 To 10
    For j = 2 To 10
    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
    Next j
    Next i

    '-----------------------------------------------------------------------------------------------------------------------------------------------------------


    For i = 1 To 11
    Debug.Print i, ;
    For j = 1 To 11
    'Debug.Print Left(M(i, j), 8), ;

    Debug.Print Format(M(i, j), ".##########"), ;
    Next j
    Debug.Print
    Next i

    Debug.Print "M(6,6): "; M(6, 6)

    '-----------------------------------------------------------------------------------------------------------------------------------------------------------
    ' == 第三部分.迴圈結構 ==

    '---Do Loop 由猜值推估修正到正確值---
    Do
    '1.計算一次內部值,並取 M(6, 6)的數值作為舊值(O)
    For i = 2 To 10
    For j = 2 To 10
    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
    Next j
    Next i
    O = M(6, 6)
    '2.計算一次右邊界值
    For i = 11 To 11
    For j = 2 To 10
    M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
    Next j
    Next i
    '3.再計算一次內部值,並取 M(6, 6)的數值作為新值(N)
    For i = 2 To 10
    For j = 2 To 10
    M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
    Next j
    Next i
    N = M(6, 6)
    '4.再計算一次右邊界值
    For i = 11 To 11
    For j = 2 To 10
    M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
    Next j
    Next i

    Debug.Print O, N, (O / N)

    DoEvents
    Loop Until (O / N) <= 10 ^ (-1) '---如果(舊值/新值)<10^(-5),則離開迴圈---

    MsgBox "ok"

    '--------------------------------------------------------------------------------------------------------------------------------------------------

    ' == 第四部分.結果輸出 ==

    For i = 1 To 11
    Debug.Print i, ;
    For j = 1 To 11
    'Debug.Print Left(M(i, j), 8), ;

    Debug.Print Format(M(i, j), ".##########"), ;
    Next j
    Debug.Print
    Next i

    Debug.Print "M(6,6): "; M(6, 6)

    '---將此問題的結果輸出(檔案名"solution")---

    Open "solution" For Output As #1
    Print #1, M(i, j)

    End Sub

    附上題目說明,謝謝!!
    已知有一個流場的邊界如下圖所示:


    而其中關於O與N的收斂值部分,我之前是問同學如何讓這個矩陣判定結束迴圈,我同學的建議是任一抽取其中的一個數值作為基準,在以此值計算的新值與舊值做比較來作為結束迴圈的條件.所以我才會作如此的假設.但是如此的假設似乎是造成無法跑出迴圈的原因,所以想請問能否有更好的方式呢?

類似的主題

  1. 可以幫我看一下這個數據可以嗎??8M/640K
    作者:牛小貓 所在討論版:---- ADSL 連 線 測 速 版
    回覆: 1
    最後發表: 2006-03-04, 08:01 PM
  2. 【求助】幫我看一下這個配備
    作者:babydog201 所在討論版:-- 電 腦 硬 體 討 論 版
    回覆: 0
    最後發表: 2005-05-04, 04:20 PM
  3. 【求助】有人可以幫我看一下這個全英文的網站嗎?
    作者:Age 所在討論版:-- 閒 話 家 常 灌 水 版
    回覆: 5
    最後發表: 2005-04-18, 01:33 AM
  4. 【求助】請幫我看一下這個電視盒該怎麼裝吧?
    作者:zadpos 所在討論版:-- 電 腦 硬 體 討 論 版
    回覆: 0
    最後發表: 2005-02-13, 01:29 PM
  5. 【求助】可以幫我看一下這個錯誤訊息嗎?
    作者:hugo888 所在討論版:-- Windows 討 論 版
    回覆: 8
    最後發表: 2002-09-25, 09:08 AM

 

此網頁沒有從搜尋引擎而來的訪客

發表文章規則

  • 不可以發表新主題
  • 不可以回覆文章
  • 不可以上傳附加檔案
  • 不可以編輯自己的文章
  •