Ada:索引检查失败

Mad*_*Nel 5 compiler-errors ada

尝试运行我的程序时,出现错误:引发 CONSTRAINT_ERROR:tp3.adb:41 索引检查失败 有问题的行是:(IF CaveF5.Infos(H).Nom = Nom_Bout洞穴有问题?)感谢您的帮助!这是代码:

--But : Gestion d'une cave à vin

   TYPE CouleurVin IS (Rose, Rouge, Blanc);
   PACKAGE CouleurIO IS NEW Enumeration_io(CouleurVin);
   USE CouleurIO;


   TYPE Bouteille IS RECORD
      Nom : Unbounded_String;
      Couleur : CouleurVin;
      Millesime : Integer;
      Quantite : Integer;
   END RECORD;


   N: CONSTANT Integer := 1000;
   TYPE Cave IS ARRAY (1..N) OF Bouteille;


   TYPE Cave_Bis IS RECORD
      Infos : Cave;
      Nbeff : Integer;
   END RECORD;
    


   PROCEDURE Recherche_Seq(Nom_Bout: IN Unbounded_String; CaveF5: IN Cave_Bis; PRESENT: OUT BOOLEAN; ICI: OUT Integer) IS

      H: Integer;
      
   BEGIN
      PRESENT:= False;
      H :=0;
      ICI := 0;
      WHILE NOT PRESENT AND H <= CaveF5.Nbeff LOOP
         IF CaveF5.Infos(H).Nom = Nom_Bout
         Then
            PRESENT := TRUE;
            ICI := H;
         ELSE
            H := H + 1;
         END IF;
      END LOOP;
      
   END Recherche_Seq;

PROCEDURE Ajouter(BOUF4 : In Bouteille; CaveF2: IN OUT Cave_Bis) IS

      Quant_B : Integer;
      Coul_B : CouleurVin;
      Year_B : Integer;
      J : Integer := 1;
      Present : Boolean;
      Ici: Integer;

      BEGIN
      
      IF CaveF2.NBeff<N
      THEN
         Put("Combien de bouteilles en ajoutez-vous?");
         New_Line;
         Get(Quant_B);
         Put("Rentrez la couleur de votre vin: ");
         New_Line;
         Get(Coul_B);
         Put("Quel est son millésime?");
         New_Line;
         GET(Year_B);
         
         WHILE CaveF2.Infos(J).nom<BOUF4.Nom AND J <= CaveF2.Nbeff LOOP
            J:=J+1;
         END LOOP;
         CaveF2.Nbeff := CaveF2.Nbeff + 1;
         FOR L IN REVERSE J+1..CaveF2.Nbeff LOOP
            CaveF2.Infos(L) := CaveF2.Infos(L-1);
         END LOOP;
         Recherche_Seq(BOUF4.Nom,CaveF2,Present,Ici);
         IF PRESENT THEN 
            CaveF2.Infos(ICI).NOM:=BOUF4.Nom;
            CaveF2.Infos(ICI).Couleur:=Coul_B;
            CaveF2.INFOS(ICI).Millesime:=Year_B;
            CaveF2.Infos(ICI).Quantite:=Quant_B;
         END IF;
         
      Else PUT("La cave est pleine ! ");
      END IF;
   END Ajouter; ```
Run Code Online (Sandbox Code Playgroud)

Bri*_*ond 7

好吧,那条线上唯一的索引是 H。

其中初始化为0。

它索引的东西的索引范围是 1 .. N。

所以...

不。不会工作。

但至少它会提前告诉你,而不是让你发现困难的方法。

你有一个不错的类型系统:学会使用它。
我建议定义 Integer 的 SUBTYPE,范围为 1 .. 1000
subtype MyIndex is Natural range 1 .. 1000;
(消除 N 因为它现在是多余的:MyIndex'Last如果需要,请使用它)
并将该子类型命名为 Cave 的索引类型。
并声明该子类型的 H,而不是 Integer。

这样做后,创建该错误有点困难。
每个边界违规或缓冲区溢出或 Heartbleed 都是一个简单的类型错误。

  • “一个像样的类型系统”?实际上,这是有史以来最好的类型系统:-)! (2认同)