X의 동적 배열의 Delphi Dynamic 배열의 메모리 레이아웃은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1519016

  •  19-09-2019
  •  | 
  •  

문제

C#의 Delphi DLL에서 절차를 호출하려고합니다. 절차는 발신자가 PrealLocation 및 입력을 기대합니다. array of array of TSomeRecord, 그런 다음, 그것은 그것을 조작 할 것입니다 TSomeRecord 결과를 반환하는 수단으로 요소. 따라서 X의 배열의 Delphi Dynamic 어레이를 수작업해야합니다.
지금, 나는 여기서 찾았다 그 역학 array of X 동적 배열의 첫 번째 요소에 대한 포인터로 구성되며, 해당 첫 번째 요소는 기준 수와 배열의 길이 (요소 수)가 있으며 (32 비트 정수 모두) 요소가 인라인 및 요소에 저장되어 있습니다. 연속적으로, 모든 것이 메모리에서 다음과 같이 보이도록 :

rrrrllll000...000111...12...
        ^

rrrr의 참조 수, llll 길이, 0123 요소, ^ 포인터가 가리키는 곳. 이것은 나옵니다. 나는 그것을 테스트했고 그것은 작동합니다.
다차원 동적 배열의 경우 대체 할 수 있다고 가정했습니다. array of YX 안에 array of X, 다시 말해, 외부 치수는 단순히 동적 배열 (포인터에서) 동적 배열입니다.

rrrrllll000011112222...
        ^

요소 0000, 1111 등이 이제 독립적으로 배정 된 다이나믹 어레이에 32 비트 포인터입니다. 그러나 이런 식으로 그렇게하면 문제에 대한 액세스 위반을 얻습니다. 이것은 분명히 델파이가 내가 그렇게하기를 기대하는 방식이 아닙니다. 누구든지 나에게 내가 어떻게 설명 할 수 있습니까? ~이다 이것을해야합니까?

도움이 되었습니까?

해결책

동적 배열은 포장 된 요소 블록에 대한 포인터입니다.

따라서 Tsomerecord의 배열 배열은 포인터의 배열에 대한 포인터이며, 각각은 길이 (배열 [Firstlevel]) 요소를 가진 블록 메모리를 가리 키거나 없으면 NIL이 없습니다.

다시 말해, 당신이 생각하는 것은 거의 정확합니다. 요소가 0 인 배열은 nil입니다. 당신이 무엇을하고 있는지 실제로 알지 못한다면 참조 수를 바꾸고 길이를 바꾸지 않아야합니다.

예제 코드없이 충돌 원인을 결정하는 것은 어려운 일입니다. 그것을 명심하십시오 모두 자동화 된 델파이 유형 (widestring 제외), 모든 동적 메모리는 델파이 메모리 관리자가 할당해야합니다.

인터페이스하는 언어의 메모리 관리자를 사용하는 시도는 불가능합니다.

다른 팁

언어 가이드 (매우 유용한 인쇄 매뉴얼로 제공되면 온라인 도움말 에서이 정보를 찾는 것은 매우 어렵습니다)는 다음과 같이 말합니다.

"다차원 배열은 먼저 가장 오른쪽 치수가 증가하여 저장됩니다."

따라서 Afaik 당신은 많은 포인터 배열이 없습니다. 단순히 각 차원 데이터는 가장 오른쪽에서 시작하여 더 이상 간접이 없기 때문에 더 빠르다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top