如何在可视foxpro中比较两个数组及其元素?

时间:2019-12-16 07:50:39

标签: arrays visual-foxpro

我有两个分别名为atestNEWARRAY的数组,我试图将两个数组的元素与简单的if()进行比较,而这仅是比较数组的第一个元素,如何一次比较所有数组值,这是我的代码

    IF (Alltrim(atest)== Alltrim(NEWARRAY))

        Messagebox('Success',64,'Status')
    Else
        Messagebox('MisMatch',16,'Status')
    ENDIF


2 个答案:

答案 0 :(得分:0)

Fox有一些对整个数组起作用的函数-例如acopyascanasort-但没有内置函数可以比较整个数组。因此,您必须对每个元素进行比较元素,例如使用for循环。

是的,如果您使用数组名称作为表达式(包括按值传递),则会获取第一个数组元素的值。但是,有一个例外:当您在需要数组参数的位置将数组传递给内置函数时,编译器将在幕后自动发出引用令牌,以安排按引用而不是传递按值传递。

因此,如果您要向其传递数组f()的用户定义函数a,则需要这样调用它:f(@m.a),但是可以调用build -in函数采用如下数组:alen(a)(因为在这种情况下也可以忽略m.)。实际上,如果您编写了类似alen(@m.a)alen(@a)的代码,Fox会抱怨,并且在这种情况下,更老的Foxen甚至可能崩溃。

相反,如果数组是赋值的目标,如a = 42store 42 to a,则该值将分配给所有数组元素。这对于将数组初始化为0''.null.之类的文件很方便。

因此,如果您有两个数组ab,那么a = b会将b的第一个值分配给a的所有元素,并且{ {1}}将仅比较相应的第一个单元格。

旁注:如果您必须比较具有相同或等效结构的表中的记录,则应记住查找if a == b。它对对象有效,并分散记录Fox对数组不起作用的功能:它将整个销售进行比较。也就是说,它会将属性值与匹配的名称进行比较,并告诉您是否存在不匹配,并且它的执行速度比手工编写的代码要快得多。

理论上,您可以将一个数组收集到一个表/光标记录中,然后使用compobj()生成一个散点记录,然后可以将该散点记录与以类似方式生成的名为scatter name Walther的散点记录进行比较另一个数组的内容提供的流行方式:Herbert会告诉您原始数组是否相等。但是,我很难想象会在生产代码中使用类似代码的情况...

答案 1 :(得分:0)

您可以创建一个简单的过程进行比较:

Procedure CompareArrays(ta1, ta2)
    If Alen(ta1) != Alen(ta2)
        Return .F.
    EndIf
    Local ix
    For ix=1 to Alen(ta1)
        If (Type('ta1[m.ix]') != Type('ta2[m.ix]') or ta1[m.ix] != ta2[m.ix])
            Return .F.
        endif
    endfor
endproc

并通过引用传递您的数组。即:

isIdentical = CompareArrays(@laArr1, @laArr2)

如果数组成员可以容纳对象,则应使用compobj来比较数组元素。