一个简单的问题——怎么调试程序
vb吧
全部回复
仅看楼主
level 8
tbzp666 楼主
怎么在运行阶段查看变量的变化,已学会用断点和debug.print在立即窗口中查看
以下如何去设置,如何查看,这个不懂
2023年12月25日 01点12分 1
level 8
tbzp666 楼主
除了这些,还有其他方法么
2023年12月25日 01点12分 2
level 1
往程序里插msgbox[真棒]
2023年12月25日 09点12分 3
吧务
level 14
这个就是监视,添加监视,根据表达式及条件来看
2023年12月25日 10点12分 4
已经会用,感谢大哥
2023年12月26日 01点12分
level 8
tbzp666 楼主
erase 语句用于删除动态数组时为什么不能改变原数组数据类型?
erase不是释放数组所占的内存空间么?
2024年01月03日 01点01分 5
level 13
Erase可以释放内存,可以用ArrayPtr去得到数组的地址(MSVBVM60.DLL中的函数,就是VarPtr的参数变型),Erase后可以看到ArrayPtr得到是0,就是释放了。至于Erase后不能改变类型是VB内部解析时已经认定了初始类型,后面是不允许改变的(测试时VB解析也会提示)。当然不是不可以,需要自己去手动操作了。
VB的数组是安全数组,数组的地址是指向SafeArray的一个结构,里面的信息有数组维数、大小、数组元素长度。。。及指向真实数据地址的指针pvData。
如果是想用空数组,自己分配内存,可以让SafeArray的pvData指向VirtualAlloc分配的内存
2024年01月03日 05点01分 6
比如原先是Long,在SafeArray中元素长度是4,你可以将元素长度定义为1,这样pvData指向Long的数据块时,可以按一个字节一个字节读写操作
2024年01月03日 05点01分
level 13
这种SafeArray也无法从根本上改变数组类型,这个是VB解析初始类型时定死了。可以通过改变定义一个空数组,让SafeArray指向原数组,来变相转换类型。
如果这种觉得太复杂,可以参考这种
比如你原先定义了
dim a(0) as long
你想转换成Byte型
可以 dim b(3) as byte
然后用Copymemory把 a的数据拷贝到b,这个就转换成了byte
考虑到某种情况下,直接拷出来的数据,修改好后,并不能改变原数组的数据
所以需用要Copymemory把 b的数据拷贝回a
这种方法效率较低,建议是采用SafeArray的方法
2024年01月03日 06点01分 7
好的,我今天才发现这个问题,以前一直以为erase把整个数组结构删除了,也不再保留数据类型了,再次声明时可以任意设置数组的数据类型。谢谢大佬!
2024年01月03日 07点01分
@tbzp666 编译器的原因,vb .net好像有ctype可以直接转。不过VB SafeArray搞清楚了,差不多可以像C++那样用指针,指向需要的内存进行读写
2024年01月03日 07点01分
level 13
Private Type bytetype
e(3) As Byte
End Type
Private Type longtype
e As Long
End Type
Private Sub Form_Load()
Dim a() As bytetype
Dim b() As longtype
ReDim a(0)
ReDim b(0)
b(0).e = &H11223344
a = b
End Sub
这种方法可以省掉Copymemory,通过结构来避开VB类型检测,这样也可以达到转换类型。
不过这个方法内部也是和copymemory差不多的原理,只是可以不用调用API函数
2024年01月03日 08点01分 8
level 8
tbzp666 楼主
下标下界为0的冒泡排序怎么写,总感觉写的不对
原因是我把【排序】做成一个过程,调用时下标为0 的总是不对,但我把下标改成1时又对了
下面是下标为0的冒泡排序,各位大佬看看哪里写错了
2024年01月05日 06点01分 9
看了你楼下的代码,果然你对N的含义认识不清啊,你要搞清楚这个N到底是数组下标的【上界】,还是数组元素的【个数】,正确的理解应该是“上界”,而你这里当成元素个数来用了,所以错了,最后的a(N)没有参与排序
2024年01月06日 08点01分
@初音✨七奈 楼下的代码是把【排序 a(), 5】换作【排序 a(), 6】’就可以了吗?(主要是这个问题)另外调用【抽牌法 a(),5】无需用第二个参数,换作【抽牌法 a()】
2024年01月06日 13点01分
@tbzp666 排序那个把5改成6是可以,你愿意把N当成元素个数也没啥,但是建议还是把程序里的N统一一下含义,不要这个N表示上界,那个N表示元素个数
2024年01月06日 14点01分
@初音✨七奈 是的,感谢大神。定义N有点乱
2024年01月06日 14点01分
level 8
tbzp666 楼主
@初音
七奈,@隨風
缒夢
2024年01月05日 08点01分 10
level 8
tbzp666 楼主
我的题目是这样的:
双色球模拟,建立控件数组Text1(0)~text1(6)储存号码,
利用抽牌法建立随机数据
利用冒泡排序进行从小到大排序 Text1(0)~text1(5)
Dim a(0 To 32) As Integer
运行后发现文本框数组没有按从小到大顺序排序,哪里错了? ( 下标下届改为1就不会出现这样的问题。)
在【格式过程中】把For 语句改为For i=0 to n-1,前5个数据正常。改为For i=0 to n顺序就乱了。
2024年01月06日 07点01分 11
level 7
单步执行
2024年01月07日 02点01分 12
level 8
tbzp666 楼主
回复 初音✨七奈 :
再问大佬,①如果把控件数组作为传递对象,形参为什么不能写成数组形式,只能写个数组名(如:Private sub 排序(Text1() as object)错误)②Text1为什么不定义为TextBox (如:Private sub 排序(Text1 as Textbox)错误),是不是因为错误原因一样,形参是一个变量,而不是数组?
2024年01月08日 02点01分 13
从这个问题就可以明确地知道,控件数组并不是数组,控件数组整体的类型也不是单个控件的类型,事实上控件数组甚至没有单独的类型,只能用Object来表示
2024年01月08日 11点01分
明白了,大佬
2024年01月09日 01点01分
1