#vb.net #do-while
#vb.net #do-while
Вопрос:
Я пытаюсь выполнить итеративное исчисление через цикл Do while / until. Я установил его, но во время отладки я получаю обратно эту ошибку: Index was out of range. Must be non-negative and less than the size of the collection.
Это код, который я использую:
t=0
Do While TEMsprinkler(t) < CInt(TextBox12.Text)
t = 1
TEMsprinkler(t 1) = (TEMsprinkler(t) ((tjet(t 1) - TEMsprinkler(t)) * (1 - Math.Exp(-1 / tau(t 1)))) ((tjet(t 1) - tjet(t)) * t * ((Math.Exp(-1 / tau(t 1))) - (1 / tau(t 1)) - 1)))
Loop
Теперь я не могу понять, где может быть ошибка: объявлен TEMsprinkler(t) (как граничное условие для начала итерации); другие переменные (список double) уже объявлены и заполнены положительными числами. Где я делаю неправильно? Заранее спасибо. С наилучшими пожеланиями.
Редактировать: я пытался отредактировать свой код несколькими способами. Поскольку я работаю со списком (из Double), а не с массивами, я отредактировал строку TEMsprinkler следующим образом:
Do While TEMsprinkler(t) < CInt(TextBox12.Text)
t = 1
TEMsprinkler.Add(TEMsprinkler(t) ((tjet(t 1) - TEMsprinkler(t)) * (1 - Math.Exp(-1 / tau(t 1)))) ((tjet(t 1) - tjet(t)) * t * ((Math.Exp(-1 / tau(t 1))) - (1 / tau(t 1)) - 1)))
Loop
Я возвращаюсь к той же ошибке. Затем я попытался отредактировать позицию индекса: индекс t 1 стал t, а индекс t стал позицией t-1 и начал увеличивать t с 1 и не более с 0, но у меня всегда ошибка out-bounds.
Редактирование II: как и было предложено, я отредактировал свой код, объявив отдельные переменные, и проблема, похоже, находится в строке Do While:
t=1
Do While TEMsprinkler(t) < CInt(TextBox12.Text)
t = 1
Dim TSPKITEM = TEMsprinkler(t)
Dim TJITEM = tjet(t)
Dim ITEMTJ = tjet(t 1)
Dim TAUITEM = tau(t 1)
TEMsprinkler.Add(TSPKITEM ((ITEMTJ - TSPKITEM) * (1 - Math.Exp(-1 / TAUITEM))) ((ITEMTJ - TJITEM) * t * ((Math.Exp(-1 / TAUITEM)) - (1 / TAUITEM) - 1)))
Loop
Очевидно, что ошибка всегда одна и та же.
Редактирование III: * Я создал три разных списка (Double) с их нижним граничным условием, которые понадобятся мне для выполнения итераций. Размерность этих списков больше, чем значение CInt(Textbox12.Text). Затем я объявил цикл Do While для создания переменной TEMsprinkler (также объявленной как List (of Double)). Вот код:
Dim tjet As New List(Of Double)()
Dim ujet As New List(Of Double)()
Dim tau As New List(Of Double)()
Dim TEMsprinkler As New List(Of Double)()
Dim t As Integer
t = 1
TEMsprinkler.Add(CDbl(TextBox8.Text))
tjet.Add(CDbl(TextBox8.Text))
ujet.Add(0)
tau.Add(0)
For i = 1 To CInt(Form3.ListBox1.Items.Count) - 1
tjet.Add(CDbl(TextBox8.Text) (5.38 * ((CDbl(Form3.ListBox1.Items(i)) / r) ^ 0.666) / h))
ujet.Add(0.197 * (CDbl(Form3.ListBox1.Items(i)) ^ 0.333) * (h ^ 0.5) / r ^ 0.833)
tau.Add((CInt(TextBox2.Text) / (ujet(i) ^ 0.5)))
Next
Do While t < TEMsprinkler.Count - 1 AndAlso TEMsprinkler(t) < CInt(TextBox12.Text)
t = 1
Dim TSPKITEM = TEMsprinkler(t)
Dim TJITEM = tjet(t)
Dim ITEMTJ = tjet(t 1)
Dim TAUITEM = tau(t 1)
TEMsprinkler.Add(TSPKITEM ((ITEMTJ - TSPKITEM) * (1 - Math.Exp(-1 / TAUITEM))) ((ITEMTJ - TJITEM) * t * ((Math.Exp(-1 / TAUITEM)) - (1 / TAUITEM) - 1)))
Loop
Комментарии:
1. Как только вы дойдете до конца своей коллекции, вы получите исключение index out of range, потому что вы увеличиваете значение
t
, но сразу после этого получаетеTEMsprinkler(t 1)
. Удалите1
, и все должно быть хорошо.2. @David спасибо за комментарий. Я отредактировал свой ответ, учитывая ваше предложение.
3. Попробуйте разделить значения на переменные, чтобы при возникновении исключения вы точно знали, где оно возникает. Например.:
Dim temSprinnklerItem = TEMsprinkler(t) Dim tjetItem = tjet(t 1) Dim tauItem = tau(t 1) 'etc...
4. @David Я снова отредактировал свой пост. К сожалению, всегда появляется одна и та же ошибка.
5. Я полагал, что вы получите ту же ошибку, но в какой строке возникает ошибка?