VBScript中For循环无法终止问题排查:请求定位错误原因
问题描述
第二个外层For循环内的For Each循环存在问题:变量t会一直递增到数组末尾,明明只存入了25个有效数据,但循环却执行完了整个数组的所有元素。以下是代码及输出结果:
Set Jakobi = Rastr.Tables("jakobi") Set yzel_i = Jakobi.Cols("ni") Set yzel_j = Jakobi.Cols("nj") Set dp_dv = Jakobi.Cols("b") Dim array1(50, 2), j j = 0 Dim array_r(50, 2) k = 0 Dim t, m For i = 0 To Jakobi.Size - 1 If yzel_i.Z(i) = yzel_j.Z(i) And yzel_i.Z(i) <> 0 Then array1(j, 0) = yzel_i.Z(i) array1(j, 1) = dp_dv.Z(i) j = j + 1 End If Next k = 0 For i = 0 To Jakobi.Size - 1 If yzel_i.Z(i) <> yzel_j.Z(i) Then t = 0 m = yzel_i.Z(i) For Each x In array1 Rastr.Printp array1(t, 0) If x <> m Then array1(t, 2) = array1(t, 2) - dp_dv.Z(i) End If t = t + 1 '<------问题位置 Rastr.Printp t Next array_r(k, 1) = array1(t, 1) - dp_dv.Z(i) array_r(k, 0) = yzel_i.Z(i) k = k + 1 End If Next For i = 0 To UBound(array1) Rastr.Printp array1(i, 0) & " " & array1(i, 2) Next
输出结果:
我仅存25个值,但循环执行到数组末尾:
51
1
52
2
4
3
3
4
1
5
2
6
152
7
151
8
15
9
7
10
71
11
6
12
72
13
8
14
13
15
9
16
12
17
101
18
102
19
11
20
10
21
14
22
141
23
142
24
5
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
问题定位与修复方案
错误原因
- For Each遍历二维数组的特性:你定义的
array1是(50,2)的二维数组,总共有51*3=153个元素。For Each x In array1会遍历数组里的每一个元素,包括未赋值的空白元素,所以t会一直递增到153,而非停在25个有效数据的位置。 - 遍历逻辑错误:你想按行处理
array1的有效数据,但For Each拿到的是单个元素的值,不是整行数据,这里的x变量完全无用,还会导致判断逻辑混乱。 - 后续赋值错误:循环结束后
t的值等于有效数据行数j,array1(t,1)是未赋值的空白元素,直接用它赋值给array_r(k,1)会导致数据错误。
修复代码
把原来的For Each循环替换成基于有效数据行数j的For循环(j已记录有效数据数量),同时修正后续的赋值逻辑:
' 替换原For Each循环及后续赋值部分 t = 0 m = yzel_i.Z(i) Dim targetIndex As Integer targetIndex = -1 ' 只遍历前j行有效数据 For t = 0 To j - 1 Rastr.Printp array1(t, 0) ' 记录目标m对应的行索引 If array1(t, 0) = m Then targetIndex = t Else array1(t, 2) = array1(t, 2) - dp_dv.Z(i) End If Rastr.Printp t + 1 Next ' 找到目标行后再赋值 If targetIndex <> -1 Then array_r(k, 1) = array1(targetIndex, 1) - dp_dv.Z(i) array_r(k, 0) = yzel_i.Z(i) k = k + 1 End If
这样就能保证只处理25个有效数据,不会遍历到数组末尾,同时修正了后续的赋值错误。
内容的提问来源于stack exchange,提问作者young_energizer
相关产品推荐
相关产品推荐

