后缀变化的变量的定义 我想在VB里定义后缀变化的变量,如a1,a2,...an,n的值是不定的,要怎么实现(不是定义数组)?期待各位大神的回答 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定义后缀变化的变量?就是“定义变量”。在 VB 里定义变量,只有手工在代码里定义,当然有些也可以不定义。没有什么程序运行后定义变量的概念。因为定义变量这个过程,说白了就是编译时在编译代码中预留符合变量类型的空间而已,在程序使用时,只是作为内存地址在程序里被使用的内存数据。这种编译时预留内存空间的动作就是定义变量的过程。既然这个预留空间的动作是在编译时才会产生,那么就不可能在运行时做,运行时只能做的是另辟内存空间或修改内存数据,这种操作不叫定义,而是操作内存。而且变量名称其实只是在写代码的时候才有的概念,在程序运行时,是没有变量名称的概念,所以程序运行后,无论你什么样的变量名称,即使是中文的,也只会被程序当一个个内存地址来用,程序是不会知道编译前他是什么名称的。至于像 javascript 那种用字符串找对象的方法,和变量的概念不一样,因为那是找对象属性值,而不是找变量名。所以你应该搞清楚的是“什么是变量?”这个问题。 我的意思是像循环给数组赋值一样的给类似于a1,a2,...an的变量赋值,我用ScriptControl1,公式中有a1,a2,...an,要先给a1,a2,...an赋值才能计算出公式的值呀,期待您的回答! 但是数组好像在ScriptControl1中用不了 比如说我的公式是a1+a2+……+an,n的值不定,要算出a1+a2+……+an,必然要想给a1,a2,……,an赋值,我想知道在vb中可不可以实现这种赋值? 本帖最后由 bcrun 于 2011-11-20 10:44:08 编辑 看来你还没搞清楚变量是什么,在程序里就是,变量只是被预先分配的内存空间地址。没有名称的概念,你的a1,a2,a3...an都是以抽象过的名称来理解,但到了编译后处理的时候,这些名称会被替换成内存地址,所以名称将不会存在,也无处可寻。只能通过内存地址设置或读取那个内存中的值。至于脚本解释程序,因为尚未编译,是动态的分析脚本语法,所以根据脚本解释器的不同,可能有这种分析过程中去识别变脸名称的用法,但VB程序不是脚本,而是已经编译的程序,就不可能有这样的操作实现可能。从底层点来说吧:在汇编程序里,所谓的变量就是分配一块内存,然后可以通过直接的地址或所谓的变量名称访问那块内存地址,其实在编译后,那个所谓的变量名称还是以地址出现的。如:ORG 7C00H ; 将代码加载到内存的 7C00 这个地址处执行jmp main ; 跳转到 main 段落所在地址var1 db 0x0F ; 分配一个 1 Byte 的空间,并且初始化值为 15,并用 var1 来表示该地址var2 dw 0x0000 ; 分配一个 2 Byte 的空间,并且初始化值为 0,并用 var2 来表示该地址main: mov al, [var1] ; 将 var1 地址处内容移动到 al 寄存器 xor bx, bx ; 让 bx 寄存器清零 mov bl, al ; 将 bx 的低 8 位 设置成 ax 的低 8 位 mov [var2], bx ; 将 bx 的值移动到 var2 地址处 jmp $上面的程序很容易理解,如果在 VB 的角度理解,就是定义了两个变量,一个是var1 这个一个字节的变量,还有一个是 var2 这个两个字节的变量然后把 var1 的值赋值给 var2 里,然后死循环,就这么简单看到源程序里用的 [var1] 和 [var2] 等这些东西,很像在操作名称为 var1或 var2 的东西,但是,看看编译代码后再反编译出来的代码如何jmp short 0x7c05 ; 这里就是 jmp main 这一句因为 main 其实就是在程序开始偏移5个字节处add [bx+si],al ; 这里就是 var1 db 0x0F add [bx+si+0x7c02],ah ; 这里就是 var2 dw 0x0000; 发现了没有,编译后根本就没有什么变量的概念,编译器只是按照地址分配了所谓变量的内存空间而已。xor bx,bxmov bl,almov [0x7c03],bx ;关键在这里:mov [var2], bx ;其实 var2 就是在内存地址偏移3个字节处的两个字节的内存空间地址 ; 被编译后就根本没有任何关于变量名称的东西,剩下的只是内存地址而已jmp short 0x7c10看了上面的汇编程序,应该对变量是什么的概念有点清楚了把。你再看看你的需求,觉得脱离这种计算机工作方式的想法可行吗?当然,脚本解码是另外一会事,因为脚本保留了源代码,程序可以分析文本根据需求来解析,但编译后的程序是没有保留源代码的,这种需求也就变得是不现实了。 非常感谢SupermanKing!非常感谢btxdlibin!非常感谢给我回帖的各位热心的朋友!btxdlibin好像实现了我想要实现的东西,SupermanKing使我学到了变量的深层次的内涵,明天把它加进程序里,然后结贴给分! 用数组解决即可. ScriptControl只是让程序变得低效而已.而且从你的描述中也看不出不能使用数组的理由来.如果你无法学会把实际问题用编程的方法表达出来的话,终究会碰到难以逾越的瓶颈的. VB 那些参考书籍比较好? 熟悉 SEH 的朋友帮忙看一下这段代码,不熟悉的朋友也帮忙支持一下,谢谢。 Sql Server中修改表结构的问题 请帮一下忙:这个图像能显示,但不能保存。 如何获取一个Label控件的句柄? 高手来 EXCEL中隐藏部分列后打印出的可见列部分最右边框残缺不全。 ??我糊涂了啊!!!!!!!!!!!!!!!!! sos谁来帮我看看excel进程无法结束的问题 VB中使用sql语句的疑问(急急急急急急急急急) VB加载弧形图片后,边界有白边,如何解决此问题 实时错误13 类型不匹配
在 VB 里定义变量,只有手工在代码里定义,当然有些也可以不定义。
没有什么程序运行后定义变量的概念。因为定义变量这个过程,说白了就是编译时在编译代码中预留符合变量类型的空间而已,
在程序使用时,只是作为内存地址在程序里被使用的内存数据。
这种编译时预留内存空间的动作就是定义变量的过程。既然这个预留空间的动作是在编译时
才会产生,那么就不可能在运行时做,运行时只能做的是另辟内存空间或修改内存数据,
这种操作不叫定义,而是操作内存。而且变量名称其实只是在写代码的时候才有的概念,
在程序运行时,是没有变量名称的概念,所以程序运行后,无论你什么样的变量名称,即使是
中文的,也只会被程序当一个个内存地址来用,程序是不会知道编译前他是什么名称的。
至于像 javascript 那种用字符串找对象的方法,和变量的概念不一样,因为那是找对象属性值,
而不是找变量名。所以你应该搞清楚的是“什么是变量?”这个问题。
没有名称的概念,你的a1,a2,a3...an都是以抽象过的名称来理解,但到了编译后处理
的时候,这些名称会被替换成内存地址,所以名称将不会存在,也无处可寻。只能通过
内存地址设置或读取那个内存中的值。
至于脚本解释程序,因为尚未编译,是动态的分析脚本语法,所以根据脚本解释器的不同,
可能有这种分析过程中去识别变脸名称的用法,但VB程序不是脚本,而是已经编译的程序,
就不可能有这样的操作实现可能。
从底层点来说吧:在汇编程序里,所谓的变量就是分配一块内存,然后可以通过直接的地址或所谓的变量名
称访问那块内存地址,其实在编译后,那个所谓的变量名称还是以地址出现的。
如:ORG 7C00H ; 将代码加载到内存的 7C00 这个地址处执行
jmp main ; 跳转到 main 段落所在地址
var1 db 0x0F ; 分配一个 1 Byte 的空间,并且初始化值为 15,并用 var1 来表示该地址
var2 dw 0x0000 ; 分配一个 2 Byte 的空间,并且初始化值为 0,并用 var2 来表示该地址main:
mov al, [var1] ; 将 var1 地址处内容移动到 al 寄存器
xor bx, bx ; 让 bx 寄存器清零
mov bl, al ; 将 bx 的低 8 位 设置成 ax 的低 8 位
mov [var2], bx ; 将 bx 的值移动到 var2 地址处
jmp $上面的程序很容易理解,如果在 VB 的角度理解,就是定义了两个变量,一个是
var1 这个一个字节的变量,还有一个是 var2 这个两个字节的变量
然后把 var1 的值赋值给 var2 里,然后死循环,就这么简单
看到源程序里用的 [var1] 和 [var2] 等这些东西,很像在操作名称为 var1
或 var2 的东西,但是,看看编译代码后再反编译出来的代码如何jmp short 0x7c05 ; 这里就是 jmp main 这一句因为 main 其实就是在程序开始偏移5个字节处
add [bx+si],al ; 这里就是 var1 db 0x0F
add [bx+si+0x7c02],ah ; 这里就是 var2 dw 0x0000
; 发现了没有,编译后根本就没有什么变量的概念,编译器只是按照地址分配了所谓变量的内存空间而已。
xor bx,bx
mov bl,al
mov [0x7c03],bx ;关键在这里:mov [var2], bx
;其实 var2 就是在内存地址偏移3个字节处的两个字节的内存空间地址
; 被编译后就根本没有任何关于变量名称的东西,剩下的只是内存地址而已
jmp short 0x7c10
看了上面的汇编程序,应该对变量是什么的概念有点清楚了把。
你再看看你的需求,觉得脱离这种计算机工作方式的想法可行吗?
当然,脚本解码是另外一会事,因为脚本保留了源代码,程序可以分析文本根据需求来解析,但编译后的程序
是没有保留源代码的,这种需求也就变得是不现实了。
而且从你的描述中也看不出不能使用数组的理由来.
如果你无法学会把实际问题用编程的方法表达出来的话,终究会碰到难以逾越的瓶颈的.