2013-02-27 11 views
1

숙제를 마무리하고 마지막 부분까지 내려 가고 있습니다. 먼저, 내가 다루고있는 타입을 보여 드리겠습니다 :Ada 문자열 연결 문자열

TYPE Book_Collection IS 
    RECORD 
    Books  : Book_Collection_Array; 
    Max_Size  : Integer; 
    Size : Integer; 
    END RECORD; 

TYPE Book_Type IS 
    RECORD 
    Title, 
    Author, 
    Publisher : Title_Str; 
    Year  : Year_Type; 
    Edition : Natural; 
    Isbn  : Isbn_Type; 
    Price  : Dollars; 
    Stock  : Natural; 
    Format : Format_Type; 
    END RECORD; 

Book_Collection_Array는 book_type의 배열입니다. 이것들은 private 형이기 (위해) 때문에, 배열은 바운드되고 있습니다 (1..200).

Book_type을 입력으로 사용하고 book_type의 모든 요소 문자열을 반환하는 별도의 패키지에 ToString이라는 함수가 있습니다. 내가 만들 필요가있는 함수는 book_collection을 매개 변수로 사용하고 제공된 book 함수에 의해 반환 된 모든 문자열을 연결하는 문자열을 그 book_collection에있는 book_type에 대해 반환하는 함수입니다. 여러 번 시도했지만 범위 검사 실패가 계속 발생했습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

* 편집 : 두 분 모두 도와 주셔서 감사합니다. 묶여 있지 않은 문자열을 사용하고 각 문자열을 추가 한 다음 출력 문자열을 선언하고이를 unbounded_string의 To_String과 동일한 상수 문자열로 설정합니다. *

+0

다른 힌트 : Ada.Strings.Unbounded. @ T.E.D.와 다른 방법은 무엇입니까? 제안. – NWS

+0

예. 일련의 단계를 거쳐 점진적으로 동일한 변수에 문자열을 작성하는 C/Java 관용구를 실제로 사용해야하는 경우에는 Java 스타일 문자열처럼 작동하는 Ada.Strings.Unbounded.Unbounded_String을 사용하는 것이 훨씬 쉽습니다 (또는 C++ std :: string). –

+0

@ T.E.D.이 기괴한 숙제에 연결하기 위해 최대 200 개의 문자열이있을 수 있으므로 Unbounded가 반드시 가야한다고 생각합니다. Title_Str (Book_Type에서 사용 된)이 어떻게 생겼는지 궁금합니다. –

답변

4

힌트.

Ada 문자열은 C 또는 Java 문자열과 같이 처리되거나 처리되지 않는 것이 이상적입니다. C 문자열은 버퍼에있는 데이터의 끝을 지정하기 위해 후행 nul (0) 문자로 계산됩니다. 자바 문자열은 자신의 길이를 추적하고 필요할 경우 적절한 길이를 유지하기 위해 동적으로 자신을 재 할당합니다. 따라서 이러한 언어에서 일반적인 문자열 처리 관용구는 점진적으로 문자열 변수를 수정하는 것으로 생각하지 않습니다.

Ada 문자열은 생성 될 때 완벽한 크기이 될 것으로 예상됩니다. 대부분의 루틴은 문자열 배열의 모든 요소에 유효한 문자 데이터가 포함되어 있다고 가정하고 데이터를 할당 한 대상 문자열은 해당 문자를 보관할 수있는 크기로 완벽하게 채워집니다. 그렇지 않은 경우 일반적으로 예외가 발생합니다 (대부분 프로그램이 충돌 할 가능성이 큽니다).

문자열을 작성할 때이를 처리 할 수있는 여러 가지 방법이 있습니다. 한 가지 방법은 정말 큰 문자열 객체를 버퍼로 생성하고 별도의 길이 변수를 유지하여 코드가 실제로 얼마나 많은 양의 데이터에 있는지 알려주는 것입니다. 그런 다음 Ada 문자열 루틴을 호출하면 유효한 문자열에서 데이터 조각 만 제공 할 수 있습니다. 예 : Put_line (My_New_String(1..My_String_Length));

더 좋은 방법은 완벽한 크기의 상수 문자열을 처리하는 것입니다. 당신이 함께 String1String2을 압정하려는 경우 예를 들어,이 작업을 수행 할 수있는 안전 에이다 방법은 다음과 같습니다 그런

My_New_String : constant String := String1 & String2; 

나중에 회에 String3이 문자열 인 문자열하려는 경우 :

My_New_New_String : constant String := My_New_String & String3; 

자세한 내용은이 브라우저 창의 오른쪽에있는 "관련"머리말에있는 링크 중 일부를 참조하십시오. 나는 거기에 좋은 것들을 많이 볼 수 있습니다.