2014-11-05 69 views
0

我試圖用Ada做的是創建一個Book對象,然後打印出那本書。問題是,該語言不是很可寫。當我編譯,生成的主要文件,然後執行該文件,它給了我這個錯誤:錯誤修正:提出CONSTRAINT_ERROR:book1.adb:28長度檢查失敗

raised CONSTRAINT_ERROR : book1.adb:28 length check failed 

這裏就是我在體內文件:

package body Book1 is 

function getAuthor (B: in Book) return AuthorName is 

begin 
    return B.getAuthor; 
end getAuthor; 

function getTitle (B: in Book) return TitleName is 

begin 
    return B.getTitle; 
end getTitle; 

function getNumberOfPages (B: in Book) return Pages is 

begin 
    return B.getNumberOfPages; 
end getNumberOfPages; 

function createBook (Author: in String; Title: in String; NumberOfPages: in Float) 
        return Book is 
    B: Book; 

begin 
    B.getAuthor := Author; 
    B.getTitle := Title; 
    B.getNumberOfPages := NumberOfPages; 
    return B; 
end createBook; 

end Book1; 

下面是我在spec文件:

package Book1 is 

type Book is tagged private; 

subtype AuthorName is String (1 .. 300); 
subtype TitleName is String (1 .. 750); 
subtype Pages is Float range 0.0 .. 5000000.0; 

function getAuthor(B: in Book) return AuthorName; 

function getTitle(B: in Book) return TitleName; 

function getNumberOfPages(B: in Book) return Pages; 

function createBook(Author: in String; Title: in String; NumberOfPages: in Float) 
        return Book; 

private 
    type Book is tagged 
    record 
    getAuthor: AuthorName; 
    getTitle: TitleName; 
    getNumberOfPages: Pages; 
    end record; 

end Book1; 

下面是我在測試文件:

with Book1, Ada.Text_IO, Ada.Float_Text_IO; 
use Book1, Ada.Text_IO, Ada.Float_Text_IO; 

procedure testBook is 

theRealBook: Book := createBook(Author => "Jordan White", 
             Title => "The Last Christmas", 
             NumberOfPages => 32.0); 

procedure Print_Book (B: in Book'Class) is 

begin 
    Put (getAuthor (B => B)); 
    Put (getTitle (B => B)); 
    Put (getNumberOfPages (B => B)); 
    New_Line; 
end Print_Book; 

begin 
Print_Book (theRealBook); 

end testBook; 

我究竟在做什麼來獲得這個錯誤,我該如何解決?

+0

有*必須*是這個問題的規範答案,但我找不到它。 – 2014-11-05 15:13:00

回答

1

你在這裏的講話:

theRealBook: Book := createBook(Author => "Jordan White", 
             Title => "The Last Christmas", 
             NumberOfPages => 32.0); 

具有這兩個作者和標題(字符串)中字符串的長度隱。 這意味着,當你在這裏指定作者和書名:

B.getAuthor := Author; 
    B.getTitle := Title; 

您正在假設「喬丹白」是一個長度爲300(標題爲同樣的問題)的字符串 我懷疑這是功課,所以生病讓你想出如何找到長度和字符串的界限,以及如何分配數組片。

相關問題