2008-09-17 2 views
3

레코드를 직렬화하기 위해 Ada로 쓰기를 호출하면 결과 바이너리에 무엇이 있을지 예측할 수 있기를 원합니다. 내가 이것을 볼 수있는 곳을 아십니까?Ada가 레코드를 직렬화하는 방법 이해하기

레코드를 쓰는 방법으로 바이너리 파일을 생성하는 기존의 Ada 소프트웨어가 있는데 호환 가능한 이진 파일을 작성해야하는 C++ 프로그램을 디버깅해야합니다. 그래서 C++ 코드가 기능적으로 동일한 레코드를 생성 할 수 있도록 Ada가 레코드를 직렬화 할 때 어떤 규칙을 따르는 지 알고 싶습니다. . 초등학교 유형의

", 스트림 요소의 관점에서 표현이 구현 정의 된 복합 유형의 경우, 각 구성 요소에 대한 쓰기 나 읽기 속성이 호출됩니다

:

+1

내가 실수하지 않는다면, 이것은 Stackoverflow의 첫 번째 Ada 질문입니다! 우! –

답변

1

추가 지침없이 컴파일러는 레코드 레이아웃에 대한 자체 결정을 내릴 것입니다. 가장 좋은 방법은 원본 코드를 변경하여 특정 레이아웃을 사용하여 레코드를 작성하는 것입니다. 특히, record representation clause은 Ada 프로그래머가 레코드의 실제 레이아웃을 정확하게 지정할 수있게합니다. 실제로 원래 코드에 해당 유형에 해당하는 코드가 있는지 확인해야합니다. 그렇다면이 질문에 정확하게 대답 할 것입니다.

1

Ada95 Language Reference Manual는 (섹션 13.13.2)를 말한다 표준 구성 요소의 표준 순서는 배열에 대해 가장 빠른 마지막 차원이며 레코드의 위치 집계 순서입니다. "

+0

참고를 보내 주셔서 감사합니다. 누군가가 주제에 대해 좀 더 광범위하게 작성했기를 바랍니다. –

+0

Ada 사람들은 표준을위한 끈적 거리는 경향이 있습니다. 우리는 참조 할 정규 구현을 가지고 있지 않습니다. 그래서 "만약에 에이다가 X를 어떻게합니까?"라고 묻는다면 그리고 누군가는 "그건 구현이 무시되었습니다."라고 답합니다. 그것은 그 문제의 끝이 다소 있습니다. –

2

기본적으로 컴파일러는 레코드 유형에 pragma PACK 또는 pragma PRESERVE_LAYOUT 명령을 사용하지 않는 한 레코드 유형의 구성 요소를 재정렬합니다. 또한 컴파일러는 레코드 구성 요소 정렬을 유지하기 위해 개체를 채 웁니다. 구성 요소는 다음과 같습니다

정수 : 8, 16, 또는 32 비트의 보수 서명 숫자

플로트 : 32 비트 IEEE 형식

Long_Float : 64 비트 IEEE 형식

고정 소수점 : 8, 16 또는 32 비트; 그러나, 지정된 범위와 델타는 16

32 인 영향을 미칠 수 열거 : 열거 객체, 8 비트 길이의 LSB 저장 값 : 0 = 거짓 정수는 보통 첫번째 요소는 0

부울로 표시되는 1 = TRUE

문자 : 0 값은 NULL

어레이를 나타내는 32 비트 32 비트 : 8 비트 길이 열거 객체, 서명 0 127 개

액세스 유형을 통해 로우 -에 연속적으로 저장된 주요 명령 크기는 기본 유형에 따라 다릅니다. 배열은 모든 요소가 해당 유형에 적합한 정렬을 갖도록 패딩되어 있습니다.

3

'Write'의 직렬화 된 출력 형식은 표현 절과 관련해서는 전혀 없음 입니다.

기본적으로 컴파일러는 표준에 정의되지 않은 변환 체계를 사용하여 레코드 선언에 기록 된 순서대로 정렬 패딩이없는 레코드 구성 요소를 출력합니다 (따라서 상호 운용성이 확보되지 않을 수도 있음). 컴파일러). GNAT (GCC Ada 컴파일러)는 전체 바이트 수로 각 구성 요소를 출력합니다.

형식이 다른 형식을 사용하여 형식의 값을 스트리밍하려는 경우 '형식에 맞게 쓰기'를 재정의 할 수 있습니다. 특이한 예로 XML로 스트리밍 할 수 있습니다.

관련 문제