2009-11-17 4 views
3

이제 DLL 함수를 호출하기 위해 Interfaces.C 패키지를 통해 Ada에 표준 Boolean 유형을 전달하는 방법을 설명합니다. 부울 형식이 ANSI C에 없기 때문에 Interfaces.C 패키지에 Ada Boolean 형식이 없습니다. 내 보낸 함수 프로토 타입에 Bool 형식의 인수가있는 C++로 작성된 DLL 함수가 있습니다. DLL 내 보낸 함수를 호출하기 위해 Intefaces.C 패키지에서 어떻게 전달됩니까?Interfaces.C에서 Boolean Ada 유형을 전달하십시오.

+0

각각 1과 0으로 변환 해 보았습니까? –

+0

Adrien의 대답 중 일부만 백업하면 Bool은 어디에 정의되어 있습니까? –

답변

4

전통적으로 C에서는 부울이 int 유형으로 표시됩니다. C++에서 bool 유형이 정의되었지만 소문자 'b'에 유의하십시오. 인수가 Bool 인 경우 (대문자 'B'에주의하십시오), 유형 구현에 대해 더 자세히 알려줄 C++ 라이브러리의 어딘가에 클래스 선언이 있어야합니다. 일반적으로 이러한 Bool 클래스는 언어의 일부 아티팩트를 통해 표준 bool 유형과 호환됩니다. Bool 클래스는 가상 함수를 정의하지 않고 클래스의 정의에 우선적으로 배치 된 멤버에 값을 유지합니다.

나는 그것을 테스트하지 않았지만 int 유형으로 갈 수 있다고 말하고 싶습니다. 그것이 C++ 함수에 의해 받아 들여지는지 확인하기위한 테스트를해라. 부울을 int으로 변환하는 경우 Interfaces.C.int(Boolean'Pos(your_bool_value))과 같은 것을 사용할 수 있습니다.

Ada 참조 설명서 [B.3.62] : An implementation may provide additional declarations in the C interface packages.에 명시된대로 Interfaces.C의 구현을 확인하면 bool 유형의 정의가 포함될 수 있습니다.

+0

'Bool'에 대해서는 모르겠지만 WinDef.h에서'BOOL'은 시스템에서'int'로 typedef되어 있습니다. –

0
type Boolean_2_Int is (Bool : Boolean := False) is 
record 
    I : Interfaces.C.Unsigned_Long := 0; 
    case Bool is 
     when True => 
      I := 1; 
     when False => 
      I := 0; 
    end case; 
end record;