Ada 错误修复:引发约束\u错误:book1.adb:28长度检查失败

Ada 错误修复:引发约束\u错误:book1.adb:28长度检查失败,ada,Ada,我想用Ada做的是创建一个Book对象,然后打印出那本书。问题是,这种语言不是很好写。当我编译、构建主文件,然后执行该文件时,会出现以下错误: 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; en

我想用Ada做的是创建一个Book对象,然后打印出那本书。问题是,这种语言不是很好写。当我编译、构建主文件,然后执行该文件时,会出现以下错误:

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;
以下是规范文件中的内容:

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;
我到底在做什么来获取此错误,以及如何修复它?

您在这里的陈述:

theRealBook: Book := createBook(Author => "Jordan White",
                                      Title => "The Last Christmas",
                                      NumberOfPages => 32.0);
对于作者和标题(字符串文字)都具有字符串的隐式长度。 这意味着在此处指定作者和标题时:

  B.getAuthor := Author;
  B.getTitle := Title;
您假设“Jordan white”是长度为300的字符串。(标题问题相同) 我怀疑这是一个家庭作业,所以我将让您来决定如何找到字符串的长度和边界,以及如何分配数组切片。

这个问题必须有一个规范的答案,但我找不到。