Option ExplicitPrivate Sub Form_Click()
    Dim a(0 To 9) As Integer, i%, f As Boolean, l&, j%, s%
    For i = 10 To 1000
        Erase a
        l = i ^ 2
        Call y((l), a, f)
'问题:为什么要用(l)?带不带()是两种结果?
'请高手解释一下。
        If f Then
            For j = 0 To 9
                s = s + a(j)
            Next j
            If s = 2 Then
                List1.AddItem CStr(i) & "^2=" & Str$(l)
            End If
        End If
        s = 0
    Next i
End SubPrivate Sub y(x&, a() As Integer, b As Boolean)
    Dim n%, d%, i%
    b = False
    n = Len(CStr(x))
    For i = 1 To n / 2
        If Mid$(CStr(x), i, 1) <> Mid$(CStr(x), n - i + 1, 1) Then
            Exit Sub
        End If
    Next i
    b = True
    For i = 1 To n
        d = x Mod 10
        a(d) = 1
        x = x \ 10
    Next i
End Sub

解决方案 »

  1.   

    没注意过这个情况
    猜想, 这个()号貌似和参数的byref和byval方式有关........
    Private Sub y(ByVal x&, a() As Integer, b As Boolean)
      

  2.   

    我一般都不用l = i ^ 2,而是用l = i*i,这样要快一些,不容易出错。 
      

  3.   

    '改了三个地方:
    Option ExplicitPrivate Sub Form_Click()
        Dim a(0 To 9) As Integer, i&, f As Boolean, l&, j%, s%
        For i = 10 To 1000
            Erase a
            l = i * i
            Call y(l, a, f)
    '问题:为什么要用(l)?带不带()是两种结果?
    '请高手解释一下。
            If f Then
                For j = 0 To 9
                    s = s + a(j)
                Next j
                If s = 2 Then
                    List1.AddItem CStr(i) & "^2=" & Str$(l)
                End If
            End If
            s = 0
        Next i
    End SubPrivate Sub y(ByVal x as long, a() As Integer, b As Boolean)
        Dim n%, d%, i%
        b = False
        n = Len(CStr(x))
        For i = 1 To n / 2
            If Mid$(CStr(x), i, 1) <> Mid$(CStr(x), n - i + 1, 1) Then
                Exit Sub
            End If
        Next i
        b = True
        For i = 1 To n
            d = x Mod 10
            a(d) = 1
            x = x \ 10
        Next i
    End Sub
      

  4.   

    Private Sub y(x&, a() As Integer, b As Boolean) '你要求传入的 x& 参数是按地址传递的.
    Call y((l), a, f) '加上括号后,将按地址传递改为按值传递..即进行计算后,l 的值不变. 传进去是多少,出来还是多少.而Call y(l, a, f)  '不加括号,是按地址传递. 经过计算后.l 的值变为了 0 . (无论传进去的值是多少,因为进行了 多次 x = x \ 10  计算,结果是0了.)
      

  5.   

    在 VB 里 面 , 程 序 之 间 的 参 数 传 递 有 两 种 方 式 :「传 值 呼叫」(call by value)及「传 址 呼 叫」(call by address), 这 两 种 参 数传 递 方 式 在 表 面 上 很 容 易 让 人 忽 略 其 差 异 性 , 但 实 际 上却 会 影 响 程 式 执 行 的 结 果 , 以 下 先 以 一 个 例 子 来 说 明 这个 问 题 , 假 设 有 一 副 程 式 定 义 如 下 :   Sub AddOne( x )
        x = x + 1
    End Sub  而 以 下 是 两 种 不 同 的 呼 叫 方 式 :   i = 10
    Call AddOne( i ) 
    Print i i = 10
    Call AddOne( (i) )
    Print i   结 果 呼 叫「Call AddOne(i)」之 後 , 所 得 到 的 i 值 等 於 11, 而呼 叫「Call AddOne( (i) )」之 後 , 所 得 到 的 i 值 却 等 於 10。 
      

  6.   

    (l)是把l的值赋给一个临时变量,然后用临时变量作为实参
    函数y修改的是这个临时变量,不会影响到l
    猜的在FoxPro里面,函数只有类似于byref一种方式,
    有的时候不希望函数修改实参的值,
    就在调用函数的时候用()把实参括起来,这样就实现类似VB的byval效果了
      

  7.   

    通过查询MSDN,最终结论:对于byref传址型的参数,可以添加上括号,强制转换为byval传值型大家知道表达式一定是传值的,而VB中将变量转换为表达式最简单的方法就是给变量加上括号,这就是这个问题的原理
      

  8.   

    新的问题:Option ExplicitPrivate Sub Form_Click()
        Dim a(0 To 9) As Integer, i%, f As Boolean, l&, j%, s%
        For i=0 to 5' i = 10 To 1000
            Erase a
            l = i ^ 2
            Call y(l, a, f)
    '奇怪了,为什么如此定义:y(x%, a() As Integer, b As Boolean),
    '运行时提示byref类型不符合?
    '而x&不管结果正确与否,至少程序是可以执行。
    '道理何在?        If f Then
                For j = 0 To 9
                    s = s + a(j)
                Next j
                If s = 2 Then
                    List1.AddItem CStr(i) & "^2=" & Str$(l)
                End If
            End If
            s = 0
        Next i
    End SubPrivate Sub y(x%, a() As Integer, b As Boolean)
        Dim n%, d%, i%
        b = False
        n = Len(CStr(x))
        For i = 1 To n / 2
            If Mid$(CStr(x), i, 1) <> Mid$(CStr(x), n - i + 1, 1) Then
                Exit Sub
            End If
        Next i
        b = True
        For i = 1 To n
            d = x Mod 10
            a(d) = 1
            x = x \ 10
        Next i
    End Sub
      

  9.   


    这我知道,为什么定义成x&又可以呢?
      

  10.   

    l&
    这是传入的数据类型 & 长整型x%这是接收的数据类型 % 整数型& 与 % 的数据类型不同.
      

  11.   

    我知道定义的类型不通。
    但:
    Call y(l, a, f)
    为什么long可以传址调用,而integer不可以?
      

  12.   

    这是很基础的问题
    对于byref传递的参数,在调用时,其传入的类型必须与函数中声明的类型一致