source

어레이 요소를 ParamArray를 통해 함수에 전달하면 varpointer가 함수에 도달하는 이유는 무엇입니까?

factcode 2023. 4. 14. 22:12
반응형

어레이 요소를 ParamArray를 통해 함수에 전달하면 varpointer가 함수에 도달하는 이유는 무엇입니까?

사용할 때 VBA에서 이상한 점을 발견했습니다.ParamArray어레이 요소를 통과시킵니다.경우에 따라 함수에 도착하는 배열 요소의 값이 아니라 변수 포인터입니다(Excel 2016, 32비트).

몇 가지 터벅터벅한 후, 나는 변종 배열로서의 함수의 정의가 파라미터 목록과 결합된 것을 발견했다.ParamArray예상치 못한 행동이 발생한 것 같습니다만, 실현 가능한 이유를 알 수 없습니다.

다음과 같은 경우 동작은 정상으로 돌아갑니다.
1) 함수 선언에서 변수 r이 제거됨
2)b로 선언되어 있다.Dim b()
3) 함수가 a를 반환한다.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함수는 해당 변수에 필요한 메모리의 시작 주소 메모리 위치를 반환합니다.여기에서는 예기치 않은 번호(358808368)가 에 의해 인식되었음을 나타내는 데만 사용됩니다.farray2function은 실제로 해당 요소의 주소입니다.

메모 2: 이는 어레이 생성 방법과 무관하게 발생합니다(예:b=array(1,2,3),b=[1,2,3]등) 및 방법b선언되어 있다)b,b(1 to 3)등).단, 당신이 선언한 경우b와 함께Dim 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가 가리킵니다.

누군가 "*"를 잊어버린 것 같아요.

이 버그는 어레이의 "declaration"에 기인하는 것으로 생각됩니다.이 점에 있어서, Microsoft는 그 점을 분명히 하고 있다고 생각합니다.

어레이

변수를 선언하여 배열을 유지할 수 있으며, 여러 값을 유지할 수 있습니다.변수가 배열을 유지하도록 지정하려면 변수 이름 바로 뒤에 괄호를 추가합니다.

이쪽에

언급URL : https://stackoverflow.com/questions/52166802/why-when-passing-an-array-element-to-a-function-through-a-paramarray-does-a-va

반응형