2009-09-26 2 views
2

내 계획은 말하자면 배열의 상위 범위를 객체의 가장 높은 요소를 검색하는 함수를 만드는 것입니다. 즉, 함수의 코드를 얻으려고합니다. 지금까지 시도 것을개체의 가장 높은 요소를 검색하는 함수를 다시 만드는 방법은 무엇입니까?

:

function High2(var X):integer; 
begin 
    Result:=Pbyte(Cardinal(@X)-1)^-1; 
end; 

기능은 상기 물체 (배열/문자열)의 첫 번째 요소의 위치 이전의 값 (길이)를 읽고이 1만큼 감소 반환한다. 그러나 정적 또는 동적 배열 유형에서는 올바른 결과를 검색하지 않습니다.

파스칼에서 High() 함수를 어떻게 다시 작성합니까?

+0

나는 당신이 원하는 것을 조금이라도 생각하지 못했습니다. 예를 들어 줄 수 있습니까? –

답변

4

Delphi가 High() 컴파일러 매직 함수를 내장하고 있지만 여기에 OK가있는 이유는 확실하지 않습니다.

정적 배열 : 수행 할 수 없습니다. 크기 정보는 컴파일러가 알고 변경 될 수 없기 때문에 런타임에 저장되지 않습니다. High()는 필요한 숫자를 상수로 코드에 드롭합니다.

동적 배열 : 컴파일러는 DynArrayLength - 1을 반환하는 DynArrayHigh에 대한 DynArrayHigh 호출로 변환합니다. DynArrayLength는 배열의 시작 부분에서 4 바이트 뒤로 (1 단계 밟기 만하고) 길이는 바이트가 아닌 정수로 사용됩니다.

희망이 있으면 도움이됩니다. 왜 당신은 그냥 높은, BTW를 사용하지 않는 이유는 무엇입니까?

+2

FWIW, Delphi 2010에서 확장 RTTI는 실제로 배열이 관리되는 유형이 아니더라도 정적 배열에 요소 수 (플랫)를 저장합니다. 힙 추적에 필요합니다. –

+3

물론 그 데이터는 정적 배열 데이터와 같은 위치에 있지 않으므로 일반적인 추론이나 연관된 PTypeInfo를 따르는 다른 방법 없이는 도움이되지 않습니다. –

+0

@Mason Wheeler, 터보 파스칼에서 사용하고 싶습니다. 아주 오래된 것이고 High() 함수가 있는지 확실하지 않습니다. 그래서 물었습니다. –

5

High() (및 Low()) 함수는 "표준 함수"라고하며 이는 컴파일러에 내장되어 있음을 의미합니다. Write 및 Writeln과 마찬가지로, 이들은 정상적인 파스칼 함수 선언으로 존재하지 않습니다. 컴파일러는 편의상 "시스템"단위 범위에 있고 다른 범위 내에서 같은 이름의 기능을 허용 할 수 있도록합니다. 또한 System.High()를 사용하여 System unit 버전을 명시 적으로 참조하여 한정 할 수 있습니다. 내부적이기 때문에 컴파일러는 고려중인 유형에 적합한 코드 시퀀스를 자동으로 생성합니다. 이것은 또한 그것들의 모든 기능을 복제하려는 것은 거의 불가능하다는 것을 의미합니다. 내장 된 표준 기능을 고수하십시오.

+1

+1 우수 답변;). – RRUZ

+1

Allen은 "compiler magic"그룹의 일부인 기능을 High, Low, Writeln 등으로 설명하고 자세히 설명하는 문서가 있습니까? – RRUZ

+0

Rruz, Delphi 설명서에서 이러한 기능에 대해 설명합니다. 하지만 정보가 귀하의 비즈니스가 아니기 때문에 그 정보가 어떻게 작동하는지는 알 수 없습니다. Delphi 릴리스에서 변경 될 수있는 구현 세부 사항입니다. –

관련 문제