gpt4 book ai didi

arrays - 为什么当通过 ParamArray 将数组元素传递给函数时,函数中会到达 varpointer?

转载 作者:行者123 更新时间:2023-12-01 16:52:26 24 4
gpt4 key购买 nike

当使用ParamArray并通过它传递数组元素时,我注意到VBA中有一个奇怪的地方。在某些情况下,到达函数的不是数组元素的值,而是 var 指针。 (Excel 2016,32 位)。

经过一番苦苦挣扎后,我发现函数作为变体数组的定义 - 与参数列表和 ParamArray 相结合 - 似乎是意外行为的起源,但我可以'没有看到任何可行的理由来解释为什么会这样。

在以下情况下行为会恢复正常:
1) 函数声明中删除变量r
2) b 使用 Dim b()
声明3) 该函数返回一个 Variant,而不是 Variant()

我知道这是一个相当深奥的问题,而且它似乎可以通过多种方式控制,但是有没有解释可以阐明这种行为?

Sub Variantarraybug()
Dim b: b = [{1, 2, 3}]

Debug.Print farray1(2, b(1))(0)
Debug.Print Application.WorksheetFunction.Sum(farray1(2, b(1)))
Debug.Print Join(farray1(2, b(1)), " ")

Debug.Print farray2(2, b(1))(0)
Debug.Print Application.WorksheetFunction.Sum(farray2(2, b(1)))
Debug.Print Join(farray2(2, b(1)), " ")
Debug.Print VarPtr(b(1)), VarPtr(b(2))
End Sub

Function farray1(r, ParamArray plop()) As Variant
farray1 = Array(plop(0), 3)
End Function
Function farray2(r, ParamArray plop()) As Variant()
farray2 = Array(plop(0), 5)
End Function

调试窗口中的结果:

 1  
4
1 3
1
6
358808368 5
358808368 358808384

注1:我的理解是,VarPtr函数返回该变量所需内存的起始地址的内存位置。这里它仅用于演示 farray2 函数看到的意外数字 (358808368) 实际上是该元素的地址。

注释 2: 这种情况的发生与生成数组的方式无关(例如 b=array(1,2,3)b=[1, 2,3] 等)以及如何声明 b(bb(1 to 3) 等)。 )。但是,如果您使用 Dim b() 声明 b,意外行为就会消失。 (在这种情况下,您无法打印 VarPtr(b),因为 VarPtr 无法接受数组变量。)

最佳答案

我认为,这是“C”中的一个粗心。你会得到这样的错误

#include <stdio.h>

int main(int argc, char **argv)
{
int *X;
int i;

i = 7;
X = &i;

printf("%d\n", X);
printf("%d\n", *X);

return(0);
}

详细说明:

“C”是一种抽象汇编程序。您必须了解通过地址(或指针)访问内存的概念。与

int i;

你声明一个变量,它保存一个整数(这个整数的位数取决于编译器)。与

i = 7;

您在内存中定义该变量的值(此处为 7)。与

int *X;

您声明一个变量,该变量保存指向某个位置的指针值(指针的位数取决于编译器;通常整数和指针的位数相等),该位置包含整数。与

X = &i;

将指针 X 的值定义为变量 i 的地址。与

*X

您可以访问 X 指向的位置的内存中的(整数)值。与

printf("%d\n", X);

打印指针 X 的值(解释为整数)。与

printf("%d\n", *X);

打印 X 指向的内存(整数)值。

我相信,有人忘记了一个“*”。

关于arrays - 为什么当通过 ParamArray 将数组元素传递给函数时,函数中会到达 varpointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52166802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com