2014-04-27 8 views
0

클래스에 대한 프로그래밍 할당을 알 수 있습니다. 만기가 오래되었으며 포인트를 얻지는 못했지만 곧 테스트가 나오고 ADA의 특정 기능을 사용하는 방법을 알고 싶습니다. 이 프로그램은 지금은 다르다. 초기 프로 시저 인 TestStudent에 test put 문을 써서 실행하면 GetStudent가 제대로 출력 할 것이다. 그러나 지금은 바닥, 선 (96)로 이동하고,왜 Ada 오류가 발생합니까?

with Ada.Text_IO; 
use Ada.Text_IO; 
with Ada.Integer_Text_IO; 
USE Ada.Integer_Text_IO; 
WITH Ada.Float_Text_IO; 
USE Ada.Float_Text_IO; 

procedure StudentFileLab is 
------------------------------------------------------------------------ 
--| This program stores records in an array, reading them in from a file 
--| and writing them out. 
------------------------------------------------------------------------ 

    subtype NameType is String(1..30); 
    subtype IDType is natural range 0..9999; 
    subtype GPAType is float range 0.0..4.0; 

    type StudentRecord is record 
     ID   : IDType; 
     GPA   : GPAType; 
     Name  : NameType := (others => ' '); 
    end record; 


    subtype StudentIndex is integer range 1..100; 
    TYPE StudentArrayType IS ARRAY (StudentIndex) OF StudentRecord; 


    -- Specification of input procedure. You are to write the body. 
    PROCEDURE GetStudent (File: IN File_Type; Student : OUT StudentRecord) is 

     Length : Integer; 

    BEGIN 
     For I In 0..Length Loop 
     Get(File, Student.ID); 
     For J In 0..Length Loop 
      Get(File, Student.GPA); 
      For K In 0..Length Loop 
       Get_Line (File, Student.Name, Length); 
     End Loop; 
     END LOOP; 
    End LOOP; 
    END GetStudent; 


    PROCEDURE PutStudent (Student : IN StudentRecord) IS 

    BEGIN 

     FOR Studentlist IN StudentIndex LOOP 
     Put (Student.ID, 
       width => 0); 
     Put (Item => " "); 
     Put (Student.GPA, 
      Exp => 0, 
      Fore=> 0, 
      Aft => 0); 
     Put (Item => ", "); 
     Put (Student.Name); 
     New_Line; 
     END LOOP; 

    END PutStudent; 

    StudentList : StudentArrayType; -- our array of students 

    CurrentIndex : Natural := 0; -- the index to the current array item 
    CurrentStudent : StudentRecord; -- the current student 

    Filename : String(1..30); -- name of the data file 
    Flength : Integer; -- length of the name of the data file 
    Infile : File_Type; 

begin -- StudentLab 
    Put_Line(Item=>"Welcome to the Student Information Program."); 
    Put_Line(Item=>"Please enter the student filename: "); 
    Get_Line(Item=> Filename, Last => Flength); 
    Open(File => Infile, Mode => In_File, Name => Filename(1..Flength)); 

    loop 
     -- Get the next student 
     GetStudent(File=> infile, Student => CurrentStudent); 
     exit when CurrentStudent.Id = 0; 
     CurrentIndex := CurrentIndex + 1; 
     StudentList(CurrentIndex) := CurrentStudent; 
    END LOOP; 
    close(file=>infile); -- close the data file after all data is read. 
    -- Output the header for the nicely formatted output. 


    FOR Index IN 1..CurrentIndex loop 
     PutStudent(Student => StudentList(Index)); 
    end loop; 


end StudentFileLab; 

프로그램은 다음과 같습니다 파일에서 읽을하도록되어 최종 오류를 가져옵니다.

1435 3.75 Jane Smith 
2233 2.94 Robert Robertson 
9634 3.86 Jennie Diver 
4325 3.42 Matt Pratt 
0 

따라서 96 번째 줄은 말 그대로 루프 줄입니다.

FOR Index IN 1..CurrentIndex loop 
    PutStudent(Student => StudentList(Index)); 
    -----> end loop; 

내가 틀릴 수도 있지만 내 주요 문제 같은 느낌이 여기에 본 PutStudent의 몸 지금 :

FOR Studentlist IN StudentIndex LOOP 
      Put (Student.ID, 
        width => 0); 
      Put (Item => " "); 
      Put (Student.GPA, 
       Exp => 0, 
       Fore=> 0, 
       Aft => 0); 
      Put (Item => ", "); 
      Put (Student.Name); 
      New_Line; 
      END LOOP; 

내가 기분이 라인의입니다하지만 난 방법을 말할 수 없다 그것을 고쳐라.

+0

오류가 발생한 줄을 알고 계십니까? 독자가 코드에 포함시키지 마십시오. 따라서 독자는 셀 수 없습니다. – usr2564301

+0

첫 루프에서와 같이 보이지만 처음부터 0 인 currentindex까지 1에서 반복하고 싶습니다. 이게 문제가 될 수 있니? 나는 당신이 0에서 길이 대신에 반복하고 싶다고 생각하니? –

+0

예 그 중 하나를 통해 읽을 수 없습니다. 범위를 벗어난 배열이 있습니다. 문제를 해결하고 문제를 해결하십시오. 다음 번에 게시하기 전에 중복 및 Google에 질문을 게시하지 마십시오. – Ramulis

답변

5

프로그램의 96 번째 줄에서 End_Error을 얻지 못하고 런타임 라이브러리에 있습니다. 나는 당신의 프로그램을 실행하면

, 나는 Ada.Text_IO.Get_Line에 사실상

raised ADA.IO_EXCEPTIONS.END_ERROR : a-tigeli.adb:96 

를 얻을. 나는 모든 경고와 함께 프로그램을 컴파일하면

, 내가

studentfilelab.adb:35:19: warning: "Length" may be referenced before it has a value 

얻고, 코드를보고,이 그래서

PROCEDURE GetStudent (File: IN File_Type; Student : OUT StudentRecord) is 

    Length : Integer; 

BEGIN 
    For I In 0..Length Loop    <<<<<<<< line 35 
     Get(File, Student.ID); 
     For J In 0..Length Loop 
     Get(File, Student.GPA); 
     For K In 0..Length Loop 
      Get_Line (File, Student.Name, Length); 
     End Loop; 
     END LOOP; 
    End LOOP; 
END GetStudent; 

이다, 첫째로, 당신은 값을 설정해야 Length에 대한 그러나 더 중요한 것은이 절차는 학생 학생의 데이터를 읽는 것으로 가정합니다 (이름과 컨텍스트로 판단). 그래서 처음에 무엇을 반복하고 있습니까?

GetStudent이 후에도 작업해야합니다 (입력 데이터를 끝내는 0 이후에 아무것도 읽지 마세요). 더 많은 문제가 있다고 생각하지만 계속 진행되어야합니다.