我想在VB里定义后缀变化的变量,如a1,a2,...an,n的值是不定的,要怎么实现(不是定义数组)?期待各位大神的回答

解决方案 »

  1.   

    定义后缀变化的变量?就是“定义变量”。
    在 VB 里定义变量,只有手工在代码里定义,当然有些也可以不定义。
    没有什么程序运行后定义变量的概念。因为定义变量这个过程,说白了就是编译时在编译代码中预留符合变量类型的空间而已,
    在程序使用时,只是作为内存地址在程序里被使用的内存数据。
    这种编译时预留内存空间的动作就是定义变量的过程。既然这个预留空间的动作是在编译时
    才会产生,那么就不可能在运行时做,运行时只能做的是另辟内存空间或修改内存数据,
    这种操作不叫定义,而是操作内存。而且变量名称其实只是在写代码的时候才有的概念,
    在程序运行时,是没有变量名称的概念,所以程序运行后,无论你什么样的变量名称,即使是
    中文的,也只会被程序当一个个内存地址来用,程序是不会知道编译前他是什么名称的。
    至于像 javascript 那种用字符串找对象的方法,和变量的概念不一样,因为那是找对象属性值,
    而不是找变量名。所以你应该搞清楚的是“什么是变量?”这个问题。
      

  2.   

    我的意思是像循环给数组赋值一样的给类似于a1,a2,...an的变量赋值,我用ScriptControl1,公式中有a1,a2,...an,要先给a1,a2,...an赋值才能计算出公式的值呀,期待您的回答!
      

  3.   

    但是数组好像在ScriptControl1中用不了
      

  4.   

    比如说我的公式是a1+a2+……+an,n的值不定,要算出a1+a2+……+an,必然要想给a1,a2,……,an赋值,我想知道在vb中可不可以实现这种赋值?
      

  5.   

    本帖最后由 bcrun 于 2011-11-20 10:44:08 编辑
      

  6.   

    看来你还没搞清楚变量是什么,在程序里就是,变量只是被预先分配的内存空间地址。
    没有名称的概念,你的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
    看了上面的汇编程序,应该对变量是什么的概念有点清楚了把。
    你再看看你的需求,觉得脱离这种计算机工作方式的想法可行吗?
    当然,脚本解码是另外一会事,因为脚本保留了源代码,程序可以分析文本根据需求来解析,但编译后的程序
    是没有保留源代码的,这种需求也就变得是不现实了。
      

  7.   

    非常感谢SupermanKing!非常感谢btxdlibin!非常感谢给我回帖的各位热心的朋友!btxdlibin好像实现了我想要实现的东西,SupermanKing使我学到了变量的深层次的内涵,明天把它加进程序里,然后结贴给分!
      

  8.   

    用数组解决即可. ScriptControl只是让程序变得低效而已.
    而且从你的描述中也看不出不能使用数组的理由来.
    如果你无法学会把实际问题用编程的方法表达出来的话,终究会碰到难以逾越的瓶颈的.