어레이 요소를 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)가 에 의해 인식되었음을 나타내는 데만 사용됩니다.farray2
function은 실제로 해당 요소의 주소입니다.
메모 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
'source' 카테고리의 다른 글
새 행의 선택 가능 영역을 작게 만들지 않고 WPF DataGrid 셀을 오른쪽으로 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
---|---|
콘텐츠가 화면에 맞았을 때 UITableView 테이블 스크롤을 비활성화하는 방법 (0) | 2023.04.14 |
"비원자"라는 성질이 무슨 뜻이죠? (0) | 2023.04.14 |
SQL Server의 Group By, Having 및 Where 절 실행 시퀀스 (0) | 2023.04.14 |
Swift의 'open' 키워드는 무엇입니까? (0) | 2023.04.14 |