Constraint_error : puiss4.adb:126 index check failed

Constraint_error : puiss4.adb:126 index check failed - Ada - Programmation

Marsh Posté le 17-04-2004 à 10:01:30    

Salut
 
on est en ce moment de faire un puissance4 pour un projet en dut mais on a cette erreur a l'execution : Constraint_error : puiss4.adb:126 index check failed
 
je vous met le code source :
 

Code :
  1. with simple_io; use simple_io ;
  2. procedure Puiss4 is
  3.    --definition des variables et des types
  4.    Nbl,Nbc : Integer := 1 ;
  5.    type Tpuis4 is array (1..Nbl,1..Nbc) of Character  ;
  6.    puis4:tpuis4;
  7.    type Tres is (Ordi,Util,Nul);
  8.    --definition des sous-programmes
  9.    procedure Demande_Taille (Puis4 : in out Tpuis4 ; Nbl : out Integer ; Nbc : out Integer);
  10.    procedure Affiche_Grille (Puis4 : in out Tpuis4 ;Nbl,Nbc : in Integer );
  11.    procedure Affiche_Rond (Puis4 : in out Tpuis4 ;L,C : in Integer );
  12.    procedure Affiche_Croix (Puis4 : in out Tpuis4 ;L,C : in Integer );
  13.    function Debut_Partie (Puis4 : Tpuis4 )return  Boolean ;
  14.    procedure Demande_Position (Puis4 : in out Tpuis4 ;L,C : out Integer );
  15.    procedure Affiche_Resultat (Puis4 : in out Tpuis4 ;Res : in Tres);
  16.    procedure Autre_Partie (Puis4 : in out Tpuis4 ;Autrepartie : out Boolean );
  17.    procedure Vide_Puiss4 (Puis4 : in out Tpuis4 ;Nbl,Nbc : in Integer ) ;
  18.    function Position_Correcte (Puis4 : in  Tpuis4 ;L,C : integer) return Boolean ;
  19.    procedure Met_Croix (Puis4 : in out Tpuis4 ;L,C : in Integer );
  20.    procedure Met_Rond (Puis4 : in out Tpuis4 ;L,C : in Integer );
  21.    procedure Reponse_Ordinateur (Puis4 : in out Tpuis4 ;L,C : out Integer; Partiefinie : out Boolean; Res : out Tres );
  22.    function Nbpions (Puis4 : Tpuis4)return Integer ;
  23.    procedure Rectifipos (Puis4 : in out Tpuis4 ;L,C : in out Integer );
  24.    procedure Aleatoire (puis4:in tpuis4;L,C : out Integer ; Plein :out Boolean );
  25.    procedure Ordi_4(puis4:in out tpuis4;L,C : out Integer ; Fin : out Boolean );
  26.    procedure Vertical_4_X (Puis4 : in out Tpuis4 ;L,C : out Integer ; Vertical : out Boolean );
  27.    procedure Horizontal_4_X (Puis4 : in out Tpuis4 ;L,C : out Integer; Horizontal : out Boolean );
  28.    procedure Diagonal_4_X_1 (Puis4 : in out Tpuis4 ;L,C : out Integer ; Diag : out Boolean );
  29.    procedure Diagonal_4_X_2(Puis4 : in out Tpuis4 ;L,C : out Integer; Diag : out Boolean );
  30.    procedure Ordi_3 (Puis4 : in out Tpuis4 ;L,C : out Integer ; Fin : out Boolean );
  31.    procedure Vertical_3_X (Puis4 : in out Tpuis4 ;L,C : out Integer ; Vertical : out Boolean );
  32.    procedure Horizontal_3_X ( Puis4 : in out Tpuis4 ;L,C : out Integer ; Horizontal : out Boolean );
  33.    procedure Diagonal_3_X_1(puis4:in out tpuis4;L,C : out Integer ; Diag : out Boolean );
  34.    procedure Diagonal_3_X_2(Puis4 : in out Tpuis4 ;L,C : out Integer ; Diag : out Boolean );
  35.    procedure Util_4 (Puis4 : in out Tpuis4 ;L,C : out Integer ; Stop : out Boolean ; Perdu : out Boolean );
  36.    procedure Vertical_4_0(Puis4 : in out Tpuis4 ;L,C : out Integer ; Vertical : out Boolean ; Perdu : out Boolean );
  37.    procedure Horizontal_4_0(Puis4 : in out Tpuis4 ;L,C : out Integer ; Horizontal,Perdu : out Boolean );
  38.    procedure Diagonal_4_0_1(Puis4 : in out Tpuis4 ;L,C : out Integer ; Diag,Perdu : out Boolean );
  39.    procedure Diagonal_4_0_2(Puis4 : in out Tpuis4 ;L,C : Out Integer ; Diag,Perdu : out Boolean );
  40.    --corps des procedures et fonctions
  41.    procedure Demande_Taille(Puis4 : in out Tpuis4 ; Nbl : out Integer ; Nbc : out Integer) is
  42.    begin
  43.       loop
  44.          Put_Line("Saisir le nombre de lignes(entre 4 et 6)" );
  45.          Get(Nbl);
  46.          exit when ((Nbl<=6) and (Nbl>=4));
  47.       end loop;
  48.       loop
  49.          Put_Line("saisir le nombre de colonnes(entre 4 et 7)" );
  50.          Get(Nbc);
  51.          exit when ((Nbl<=7) and (Nbc>=4));
  52.       end loop;
  53.    end Demande_Taille ;
  54.    procedure Affiche_Grille (Puis4 : in out Tpuis4 ;Nbl,Nbc : in Integer )is
  55.       begin
  56.       for J in 1..Nbc loop
  57.          for I in 1..Nbl loop
  58.            Put(Puis4(I,J));
  59.          end loop;
  60.       end loop;
  61.       end Affiche_Grille ;
  62.    procedure Affiche_Rond (Puis4 : in out Tpuis4 ; L,C : in Integer )is
  63.    begin
  64.       Met_Rond(Puis4,L,C);
  65.       Affiche_Grille(Puis4,Nbl,Nbc);
  66.    end Affiche_Rond ;
  67.    procedure Affiche_Croix (Puis4 : in out Tpuis4 ; L,C : in Integer )is
  68.    begin
  69.       Met_Croix(Puis4,L,C);
  70.       Affiche_Grille(Puis4,Nbl,Nbc);
  71.    end Affiche_croix ;
  72.    function Debut_Partie (Puis4 : Tpuis4 ) return Boolean is
  73.       D : String (1..3) ;
  74.       Debutpartie : Boolean ;
  75.    begin
  76.       Debutpartie:=False ;
  77.       Put_Line ("Voulez vous commencer à jouer ? (oui ou non)" );
  78.       Get(D);
  79.       if D="oui" then
  80.          Debutpartie:=True ;
  81.       end if ;
  82.       return Debutpartie ;
  83.    end Debut_Partie ;
  84.    procedure Demande_Position (Puis4 : in out Tpuis4 ;L,C : out Integer ) is
  85.    begin
  86.       Put_Line ("Donnez le numero de la ligne ou vous voulez placez le pion" );
  87.       Get(L);
  88.       Put_Line ("Donnez le mumero de la colonne ou vous voulez placez le pion" );
  89.       Get(C);
  90.    end Demande_Position ;
  91.    procedure Affiche_Resultat (Puis4 : in out Tpuis4 ;Res : in Tres) is
  92.    begin
  93.       if Res=Ordi then
  94.          Put_Line("Vous avez perdu" );
  95.       elsif Res=Util then
  96.          Put_Line("Vous avez gagné" );
  97.       else
  98.          Put_Line("Match nul" );
  99.       end if;
  100.    end Affiche_Resultat;
  101.    procedure Autre_Partie (Puis4 : in out Tpuis4 ;Autrepartie : out Boolean ) is
  102.    Rep : String (1..3) ;
  103.    begin
  104.       Put_Line ("voulez vous rejouez ?" ) ;
  105.       get (Rep);
  106.       if Rep="oui" then
  107.          Autrepartie:=True ;
  108.       else
  109.          Autrepartie:=False ;
  110.       end if ;
  111.    end Autre_Partie ;
  112.    procedure Vide_Puiss4 (Puis4 : in out Tpuis4 ;Nbl,Nbc : in Integer ) is
  113.    begin
  114.       for I in 1..Nbl loop
  115.          for J in 1..Nbc loop
  116.             Puis4(I,J):='V' ;
  117.          end loop ;
  118.       end loop ;
  119.    end Vide_Puiss4 ;
  120.    function Position_Correcte (Puis4 : in  Tpuis4 ;L,C : integer) return Boolean is
  121.       Pos : Boolean ;
  122.    begin
  123.       Pos := True ;
  124.       if not(Puis4(L,C)='V') then
  125.          Pos:=False ;
  126.       end if ;
  127.       if Pos=True then
  128.          if L>1 then
  129.             for I in 1..Nbl loop
  130.                if Puis4(I,C)='V' then
  131.                   Pos:=False ;
  132.                end if ;
  133.             end loop;
  134.          end if;
  135.       end if;
  136.           return pos;
  137.    end Position_Correcte ;
  138.    procedure Met_Croix (Puis4 : in out Tpuis4 ;L,C : in Integer ) is
  139.    begin
  140.       Puis4(L,C):='x' ;
  141.    end Met_Croix ;
  142.    procedure Met_Rond (Puis4 : in out Tpuis4 ;L,C : in Integer ) is
  143.    begin
  144.       Puis4(L,C):='o' ;
  145.    end Met_Rond ;
  146. -- ______________________________________
  147.    procedure Reponse_Ordinateur (puis4:in out tpuis4;L,C : out Integer; Partiefinie : out Boolean; Res : out Tres ) is
  148.   -- declarations et initialisations
  149. nb:integer;
  150. lo,co,lo2,Co2,la,ca,lu,cu:Integer;
  151. finordi4,stoputil_4,finordi2,rempli,ordiperdu,grillepleine:boolean;
  152. --corps du programme
  153. begin
  154. Nb:=nbpions(puis4);
  155. ordi_4(puis4,lo,co,finordi4);
  156. ordi_3(puis4,lo2,co2,finordi2);
  157. aleatoire(puis4,la,ca,rempli);
  158. util_4(puis4,lu,cu,stoputil_4,ordiperdu);
  159. if ordiperdu then
  160.         L:=lu;
  161.         c:=cu;
  162.         partiefinie:=true;
  163.         res:=util;
  164. elsif finordi4 and then Lo/=0 then
  165.         l:=lo;
  166.         c:=co;
  167.         partiefinie:=false;
  168.         res:=ordi;
  169. elsif stoputil_4 and then Lu/=0 then
  170.         l:=lu;
  171.         c:=cu;
  172.         partiefinie:=false;
  173.         res:=nul;
  174. else
  175.         l:=la;
  176.         c:=ca;
  177.         if rempli then
  178.                 partiefinie:=true;
  179.         else partiefinie:= false;
  180. end if;
  181. res:=nul;
  182. end if;
  183. if L/=0 then
  184.         rectifipos(puis4,L,C);
  185. end if;
  186. if not partiefinie then
  187.         grillepleine:=(nb+1)>=nbl*nbc;
  188.         partiefinie:=grillepleine;
  189. end if;
  190. end Reponse_Ordinateur;
  191. -- ______________________________________
  192.    function Nbpions (puis4 : Tpuis4 )return Integer is
  193.         --declarations
  194.         som:Integer:=0;
  195.         --corps de la fonction
  196.             begin
  197.             for i in 1..nbl loop
  198.                 for j in 1..nbc loop
  199.                         if puis4(i,J)/='V' then
  200.                                 som:=som+1;
  201.                         end if;
  202.                 end loop;
  203.         end loop;
  204.         return som;
  205. end nbpions;
  206.    -- ______________________________________
  207.    procedure  Rectifipos (Puis4 : in out Tpuis4 ;L,C : in out Integer ) is
  208.         --declarations
  209.         vide:boolean:=false;
  210.         --corps du programme
  211.         begin
  212.         while (puis4(L+1,C)='V')and then (L<nbl) loop
  213.                 L:=l+1;
  214.                 vide:=true;
  215.         end loop;
  216.         if not vide then
  217.                 while (puis4(L,C)/='V') and then (L>0)loop
  218.                 l:=l-1;
  219.         end loop;
  220. end if;
  221. end rectifipos;
  222.    -- ______________________________________
  223.    procedure Aleatoire (puis4:in tpuis4;L,C : out Integer ; Plein :out Boolean )is
  224.    -- declarations et initialisations
  225.    I:Integer:=Nbl+1;
  226.    J:Integer;
  227.    -- corps du programme
  228.    begin
  229.    Plein:=True;
  230.    L:=0;
  231.    C:=0;
  232.    while (Plein and then (I>0))loop
  233.       I:=I-1;
  234.       J:=Nbc+1;
  235.       while (Plein and then (J>0))loop
  236.          J:=J-1;
  237.          if  (puis4(I,J)='V') then  -- T est le tableau de puis4 ( voir function Nbpions)
  238.             L:=I;
  239.             C:=J;
  240.             Plein:= False;
  241.          end if;
  242.       end loop;
  243.    end loop;
  244. end Aleatoire;
  245. -- ______________________________________
  246. procedure Ordi_4(puis4:in out tpuis4;L,C : out Integer ; Fin : out Boolean )is
  247.         --declarations
  248. lh,ch,lv,cv,ld1,cd1,ld2,cd2:integer;
  249. horizontal,vertical,diag1,diag2:boolean;
  250. -- corps du programme
  251. begin
  252. horizontal_4_X(puis4,Lh,ch,horizontal);
  253. vertical_4_X(puis4,lv,cv,vertical);
  254. diagonal_4_X_1(puis4,ld1,cd1,diag1);
  255. diagonal_4_X_2(puis4,ld2,cd2,diag2);
  256. L:=0;C:=0;
  257. fin:=false;
  258. if vertical then
  259.         l:=lv;c:=cv;fin:=true;
  260. elsif horizontal then
  261.         l:=lh;c:=ch;fin:=true;
  262. elsif diag1 then
  263.         l:=ld1;c:=cd1;fin:=true;
  264. elsif diag2 then
  265.         l:=ld2;c:=cd2;fin:=true;
  266. end if;
  267. end ordi_4;
  268. -- ______________________________________
  269.    procedure Vertical_4_X (puis4:in out tpuis4;L,C : out Integer ; Vertical : out Boolean )is
  270. --declarations
  271. m,p:integer;
  272. --corps du programme
  273. begin
  274. vertical:=false;l:=0;c:=0;m:=nbc+1;
  275. while (m>1)and then (not vertical) loop
  276.         m:=m-1;p:=nbl+1;
  277.         while (p>4)and then (not vertical) loop
  278.                 p:=p-1;vertical:=((puis4(p,M)='C')and (puis4(p-1,M)='C') and (puis4(p-2,M)='C'));
  279.                 if vertical then
  280.                         if (puis4(p-3,M)='V') then
  281.                                 l:=p-3;c:=m;
  282.                         else
  283.                                 vertical:=False;
  284.                         end if;
  285.                 end if;
  286.         end loop;
  287. end loop;
  288. end Vertical_4_X;
  289.    -- ______________________________________
  290.    procedure Horizontal_4_X (puis4:in out tpuis4;L,C : out Integer; Horizontal : out Boolean )is
  291.         --declarations
  292.         p,m:integer;
  293.         -- corps du programme
  294.         begin
  295.         horizontal:=false;l:=0;c:=0;
  296.         p:=nbl+1;
  297.         while (p>1) and (not horizontal)loop
  298.                 p:=p-1;m:=nbc+1;
  299.                 while (m>3)and (not horizontal) loop
  300.                         m:=m-1;horizontal:=(puis4(p,m)='C')and (puis4(p,m-1)='C')and (puis4(p,m-2)='C');
  301.                         if horizontal then
  302.                                 if (m<=(nbc-1))and (puis4(p,m+1)='V')then
  303.                                 l:=p;c:=m+1;
  304.                         elsif (m>3)and (puis4(p,m-3)='V') then
  305.                                 l:=p;c:=m-3;
  306.                         elsif (M>=3)and (m<=(nbc-1)) and (puis4(p,m+1)='V') then
  307.                                 l:=p;c:=m+1;
  308.                         else
  309.                                 horizontal:=false;
  310.                         end if;
  311.                 end if;
  312.         end loop;
  313. end loop;
  314. end Horizontal_4_X;
  315.   -- ______________________________________
  316.    procedure Diagonal_4_X_1 (puis4:in out tpuis4;L,C : out Integer ; Diag : out Boolean )is
  317.         --declarations
  318.         p,m:integer;
  319.         -- corps du programme
  320.         begin
  321.         diag:=false;l:=0;c:=0;
  322.         p:=nbl+1;
  323.         while (p>3) and (not diag)loop
  324.                 p:=p-1;m:=nbc+1;
  325.                 while (m>3)and (not diag) loop
  326.                         m:=m-1;diag:=(puis4(p,m)='C')and (puis4(p-1,m-1)='C')and (puis4(p-2,m-2)='C');
  327.                         if diag then
  328.                                 if (m=nbc)and (p=nbl)and (puis4(p-3,M-3)='V') then
  329.                                         l:=p-3;c:=M-3;
  330.                                 elsif (p=3) and (M/=nbc) and (puis4(p+1,M+1)='V')then
  331.                                         l:=p+1;c:=M+1;
  332.                                 elsif (m<nbc) and (p<nbl) and (p>=3) and ( puis4(p+1,M+1)='V') then
  333.                                         l:=p+1;c:=m+1;
  334.                                 elsif (m<=nbc) and (p<=nbl) and (p>3) and(m>3)and (puis4(p-3,M-3)='V') then
  335.                                         l:=p-3;c:=M-3;
  336.                                 else diag:=false;
  337.                         end if;
  338.                 end if;
  339.         end loop;
  340. end loop;
  341. end Diagonal_4_X_1;
  342.   -- ______________________________________
  343.    procedure Diagonal_4_X_2(puis4:in out tpuis4;L,C : out Integer; Diag : out Boolean )is
  344.         --declarations
  345.         p,m:integer;
  346.         -- corps du programme
  347.         begin
  348.         diag:=false;l:=0;c:=0;
  349.         p:=nbl+1;
  350.         while (p>3) and (not diag)loop
  351.                 p:=p-1;m:=0;
  352.                 while (m<(nbc-3))and (not diag) loop
  353.                         m:=m+1;diag:=(puis4(p,m)='C')and (puis4(p-1,m+1)='C')and (puis4(p-2,m+2)='C');
  354.                         if diag then
  355.                                 if (m=1)and (p=nbl)and (puis4(p-3,M+3)='V') then
  356.                                         l:=p-3;c:=M+3;
  357.                                 elsif (p=3) and (M/=1) and (puis4(p+1,M-1)='V')then
  358.                                         l:=p+1;c:=M-1;
  359.                                 elsif (m>1) and (p<nbl) and (p>3) and ( puis4(p+1,M-1)='V') then
  360.                                         l:=p+1;c:=m-1;
  361.                                 elsif (m<=nbc) and (p<=nbl) and (p>3) and(m<(nbc-3))and (puis4(p-3,M+3)='V') then
  362.                                         l:=p-3;c:=M+3;
  363.                                 else diag:=false;
  364.                         end if;
  365.                 end if;
  366.         end loop;
  367. end loop;
  368. end Diagonal_4_X_2;
  369.    -- ______________________________________
  370.    procedure Ordi_3 (puis4:in out tpuis4;L,C : out Integer ; Fin : out Boolean )is
  371.         --declarations
  372. lh,ch,lv,cv,ld1,cd1,ld2,cd2:integer;
  373. horizontal,vertical,diag1,diag2:boolean;
  374. -- corps du programme
  375. begin
  376. horizontal_3_X(puis4,Lh,ch,horizontal);
  377. vertical_3_X(puis4,lv,cv,vertical);
  378. diagonal_3_X_1(puis4,ld1,cd1,diag1);
  379. diagonal_3_X_2(puis4,ld2,cd2,diag2);
  380. L:=0;C:=0;
  381. fin:=false;
  382. if vertical then
  383.         l:=lv;c:=cv;fin:=true;
  384. elsif horizontal then
  385.         l:=lh;c:=ch;fin:=true;
  386. elsif diag1 then
  387.         l:=ld1;c:=cd1;fin:=true;
  388. elsif diag2 then
  389.         l:=ld2;c:=cd2;fin:=true;
  390. end if;
  391. end ordi_3;
  392.    -- ______________________________________
  393.    procedure Vertical_3_X (puis4:in out tpuis4;L,C : out Integer ; Vertical : out Boolean ) is
  394.    --declarations
  395. m,p:integer;
  396. --corps du programme
  397. begin
  398. vertical:=false;l:=0;c:=0;m:=nbc+1;
  399. while (m>1)and then (not vertical) loop
  400.         m:=m-1;p:=nbl+1;
  401.         while (p>3)and then (not vertical) loop
  402.                 p:=p-1;vertical:=((puis4(p,M)='C')and (puis4(p-1,M)='C'));
  403.                 if vertical then
  404.                         if (puis4(p-2,M)='V') then
  405.                                 l:=p-2;c:=m;
  406.                         else
  407.                                 vertical:=False;
  408.                         end if;
  409.                 end if;
  410.         end loop;
  411. end loop;
  412. end Vertical_3_X;
  413.    -- ______________________________________
  414.    procedure Horizontal_3_X (puis4:in out tpuis4;L,C : out Integer ; Horizontal : out Boolean ) is
  415.                 --declarations
  416.         p,m:integer;
  417.         -- corps du programme
  418.         begin
  419.         horizontal:=false;l:=0;c:=0;
  420.         p:=nbl+1;
  421.         while (p>1) and (not horizontal)loop
  422.                 p:=p-1;m:=nbc+1;
  423.                 while (m>2)and (not horizontal) loop
  424.                         m:=m-1;horizontal:=(puis4(p,m)='C')and (puis4(p,m-1)='C');
  425.                         if horizontal then
  426.                                 if (m<=(nbc-1))and (puis4(p,m+1)='V')then
  427.                                 l:=p;c:=m+1;
  428.                         elsif (m>2)and (puis4(p,m-2)='V') then
  429.                                 l:=p;c:=m-2;
  430.                         elsif (M>=2)and (m<=(nbc-1)) and (puis4(p,m+1)='V') then
  431.                                 l:=p;c:=m+1;
  432.                         else
  433.                                 horizontal:=false;
  434.                         end if;
  435.                 end if;
  436.         end loop;
  437. end loop;
  438. end Horizontal_3_X;
  439.   -- ______________________________________
  440.    procedure Diagonal_3_X_1(puis4:in out tpuis4;L,C : out Integer ; Diag : out Boolean )is
  441.         --declarations
  442.         p,m:integer;
  443.         -- corps du programme
  444.         begin
  445.         diag:=false;l:=0;c:=0;
  446.         p:=nbl+1;
  447.         while (p>2) and (not diag)loop
  448.                 p:=p-1;m:=nbc+1;
  449.                 while (m>2)and (not diag) loop
  450.                         m:=m-1;diag:=(puis4(p,m)='C')and (puis4(p-1,m-1)='C');
  451.                         if diag then
  452.                                 if (m=nbc)and (p=nbl)and (puis4(p-2,M-2)='V') then
  453.                                         l:=p-2;c:=M-2;
  454.                                 elsif (p=2) and (M/=nbc) and (puis4(p+1,M+1)='V')then
  455.                                         l:=p+1;c:=M+1;
  456.                                 elsif (m<nbc) and (p<nbl) and (p>=3) and ( puis4(p+1,M+1)='V') then
  457.                                         l:=p+1;c:=m+1;
  458.                                 elsif (m<=nbc) and (p<=nbl) and (p>2) and(m>2)and (puis4(p-2,M-2)='V') then
  459.                                         l:=p-2;c:=M-2;
  460.                                 else diag:=false;
  461.                         end if;
  462.                 end if;
  463.         end loop;
  464. end loop;
  465. end Diagonal_3_X_1;
  466. -- ______________________________________
  467.    procedure Diagonal_3_X_2(puis4:in out tpuis4;L,C : out Integer ; Diag : out Boolean )is
  468.    --declarations
  469.         p,m:integer;
  470.         -- corps du programme
  471.         begin
  472.         diag:=false;l:=0;c:=0;
  473.         p:=nbl+1;
  474.         while (p>2) and (not diag)loop
  475.                 p:=p-1;m:=0;
  476.                 while (m<(nbc-2))and (not diag) loop
  477.                         m:=m+1;diag:=(puis4(p,m)='C')and (puis4(p-1,m+1)='C');
  478.                         if diag then
  479.                                 if (m=1)and (p=nbl)and (puis4(p-2,M+2)='V') then
  480.                                         l:=p-2;c:=M+2;
  481.                                 elsif (p=2) and (M/=1) and (puis4(p+1,M-1)='V')then
  482.                                         l:=p+1;c:=M-1;
  483.                                 elsif (m>1) and (p<nbl) and (p>3) and ( puis4(p+1,M-1)='V') then
  484.                                         l:=p+1;c:=m-1;
  485.                                 elsif (m<=nbc) and (p<=nbl) and (p>2) and(m<(nbc-2))and (puis4(p-2,M+2)='V') then
  486.                                         l:=p-2;c:=M+2;
  487.                                 else diag:=false;
  488.                         end if;
  489.                 end if;
  490.         end loop;
  491. end loop;
  492. end Diagonal_3_X_2;
  493.   -- ______________________________________
  494.    procedure Util_4(puis4:in out tpuis4;L,C : out Integer ; Stop : out Boolean ; Perdu : out Boolean )is
  495.         --declarations
  496. lh,ch,lv,cv,ld1,cd1,ld2,cd2:integer;
  497. horizontal,perduH,vertical,perduV,diag1,perduD1,diag2,perduD2:boolean;
  498. -- corps du programme
  499. begin
  500. perdu:=false;
  501. stop:=false;
  502. horizontal_4_0(puis4,Lh,ch,horizontal,perduH);
  503. vertical_4_0(puis4,lv,cv,vertical,perduV);
  504. diagonal_4_0_1(puis4,ld1,cd1,diag1,perduD1);
  505. diagonal_4_0_2(puis4,ld2,cd2,diag2,perduD2);
  506. L:=0;C:=0;
  507. stop:=false;
  508. if perduH or perduV or perduD1 or perduD2 then
  509.         perdu:= true;
  510.         elsif vertical then
  511.         l:=lv;c:=cv;stop:=true;
  512. elsif horizontal then
  513.         l:=lh;c:=ch;stop:=true;
  514. elsif diag1 then
  515.         l:=ld1;c:=cd1;stop:=true;
  516. elsif diag2 then
  517.         l:=ld2;c:=cd2;stop:=true;
  518. end if;
  519. end util_4;
  520.   -- ______________________________________
  521.    procedure Vertical_4_0(puis4:in out tpuis4;L,C : out Integer ; Vertical : out Boolean ; Perdu : out Boolean )is
  522.    --declarations
  523. m,p:integer;
  524. --corps du programme
  525. begin
  526. vertical:=false;l:=0;c:=0;m:=nbc+1;
  527. while (m>1)and then (not vertical) loop
  528.         m:=m-1;p:=nbl+1;
  529.         while (p>4)and then (not vertical) loop
  530.                 p:=p-1;vertical:=((puis4(p,M)='C')and (puis4(p-1,M)='C') and (puis4(p-2,M)='C'));
  531.                 perdu:=(p<nbl)and((p>3)and(puis4(p,m)='R')and (puis4(p-1,m)='R')and(puis4(p-2,m)='R')
  532.                 and((puis4(p-3,m)='R')or(puis4(p+1,m)='R')));
  533.                 if vertical and not perdu then
  534.                         if (puis4(p-3,M)='V') then
  535.                                 l:=p-3;c:=m;
  536.                         else
  537.                                 vertical:=False;
  538.                         end if;
  539.                 end if;
  540.         end loop;
  541. end loop;
  542. end Vertical_4_0;
  543.    -- ______________________________________
  544.    procedure Horizontal_4_0(puis4:in out tpuis4;L,C : out Integer ; Horizontal,Perdu : out Boolean )is
  545.         --declarations
  546.         p,m:integer;
  547.         -- corps du programme
  548.         begin
  549.         horizontal:=false;l:=0;c:=0;perdu:=false;
  550.         p:=nbl+1;
  551.         while (p>1) and (not horizontal)loop
  552.                 p:=p-1;m:=nbc+1;
  553.                 while (m>3)and (not horizontal) loop
  554.                         m:=m-1;horizontal:=(puis4(p,m)='R')and (puis4(p,m-1)='R')and (puis4(p,m-2)='R');
  555.                         perdu:=(m<nbc)and((m>3)and(puis4(p,m)='R')and (puis4(p,m-1)='R')and(puis4(p,m-2)='R')
  556.                 and((puis4(p,m-3)='R')or(puis4(p,m+1)='R')));
  557.                         if horizontal and not perdu then
  558.                                 if (m<nbc)and (puis4(p,m+1)='V')then
  559.                                 l:=p;c:=m+1;
  560.                         elsif (m>3)and (puis4(p,m-3)='V') then
  561.                                 l:=p;c:=m-3;
  562.                         elsif (M>=3)and (m<=(nbc-1)) and (puis4(p,m+1)='V') then
  563.                                 l:=p;c:=m+1;
  564.                         else
  565.                                 horizontal:=false;
  566.                         end if;
  567.                 end if;
  568.         end loop;
  569. end loop;
  570. end Horizontal_4_0;
  571.    -- ______________________________________
  572.    procedure Diagonal_4_0_1(puis4:in out tpuis4;L,C : out Integer ; Diag,Perdu : out Boolean )is
  573.    --declarations
  574.         p,m:integer;
  575.         -- corps du programme
  576.         begin
  577.         diag:=false;l:=0;c:=0;perdu:=false;
  578.         p:=nbl+1;
  579.         while (p>3) and (not diag)loop
  580.                 p:=p-1;m:=nbc+1;
  581.                 while (m>3)and (not diag) loop
  582.                         m:=m-1;diag:=(puis4(p,m)='R')and (puis4(p-1,m-1)='R')and (puis4(p-2,m-2)='R');
  583.                         perdu:=(m<nbc)and((m>3)and(p<nbl)and(p>3)and(puis4(p,m)='R')and (puis4(p-1,m-1)='R')and(puis4(p-2,m-2)='R')
  584.                 and((puis4(p-3,m-3)='R')or(puis4(p+1,m+1)='R')));
  585.                         if diag and not perdu then
  586.                                 if (m<=nbc)and (p<=nbl)and (p>3)and (m>3)and (puis4(p-3,m-3)='V')then
  587.                                 l:=p-3;c:=m-3;
  588.                         elsif (m<nbc)and(p<nbl)and (p>=3)and (puis4(p+1,m+1)='V')then
  589.                         l:=p+1;c:=m+1;
  590.                 else
  591.                         diag:=false;
  592.                 end if;
  593.                 end if;
  594.         end loop;
  595. end loop;
  596. end Diagonal_4_0_1;
  597.    -- ______________________________________
  598.    procedure Diagonal_4_0_2(puis4:in out tpuis4;L,C : Out Integer ; Diag,Perdu : out Boolean )is--declarations
  599.         p,m:integer;
  600.         -- corps du programme
  601.         begin
  602.         diag:=false;l:=0;c:=0;perdu:=false;
  603.         p:=nbl+1;
  604.         while (p>3) and (not diag)loop
  605.                 p:=p-1;m:=0;
  606.                 while (m<(nbc-3))and (not diag) loop
  607.                         m:=m+1;diag:=(puis4(p,m)='R')and (puis4(p-1,m+1)='R')and (puis4(p-2,m+2)='R');
  608.                         perdu:=(m<nbc-3)and((m>1)and(p<nbl)and(p>3)and(puis4(p,m)='R')and (puis4(p-1,m+1)='R')and(puis4(p-2,m+2)='R')
  609.                 and((puis4(p+1,m-1)='R')or(puis4(p-2,m+3)='R')));
  610.                         if diag and not perdu then
  611.                                 if (m>1)and (p<nbl)and (p>3)and  (puis4(p+1,m-1)='V')then
  612.                                 l:=p+1;c:=m-1;
  613.                                 elsif (m>=1)and(p<=nbl)and (p>3)and(m<(nbc-3))and (puis4(p-3,m+3)='V')then
  614.                         l:=p-3;c:=m+3;
  615.                                 else
  616.                         diag:=false;
  617.                                 end if;
  618.                 end if;
  619.         end loop;
  620. end loop;
  621. end Diagonal_4_0_2;
  622.    -- variables de travail de la procedure principale :
  623.    Partie : Boolean :=true;
  624.    partie_finie:boolean;
  625.    Debut : Boolean ;
  626.    Nbt : Integer ; --nb de tour joué
  627.    Nbtmax : Integer ; -- nb de tour max
  628.        L,C : Integer ;
  629.        Res : Tres ;
  630.    -- procedure principale :
  631. begin
  632.    while Partie loop
  633.       Demande_Taille(puis4,Nbl,Nbc) ;
  634.       Vide_Puiss4(Puis4,Nbl,Nbc) ;
  635.       Debut := Debut_Partie(Puis4) ;
  636.       Nbtmax := Nbl*Nbc ;
  637.       Nbt:=0 ;
  638.       L:=-1 ;
  639.       C:=-1;
  640.       if Debut then
  641.          while not Position_Correcte(puis4,L,C) and (L>0) and (C>0) and (L<Nbl) and (C<Nbc) loop
  642.             Demande_Position(puis4,L,C);
  643.          end loop ;
  644.          Met_Rond(puis4,L,C);
  645.          Nbt := Nbt+1 ;
  646.       end if ;
  647.       Partie_Finie:=False ;
  648.       while not Partie_Finie and (Nbt<=Nbtmax)loop
  649.          Reponse_Ordinateur(puis4,L,C,Partie_Finie,Res);
  650.          Met_Croix(puis4,L,C);
  651.          if not Partie_Finie then
  652.            while not Position_Correcte(puis4,L,C) and L>0 and C>0 and C<Nbc and L<Nbl loop
  653.               Demande_Position(puis4,L,C);
  654.            end loop;
  655.            Met_Rond(puis4,L,C);
  656.          end if ;
  657.          Nbt:=Nbt+1 ;
  658.          Affiche_Grille(puis4,L,C);
  659.       end loop;
  660.       Affiche_Resultat(puis4,Res);
  661.       --Partie:=Autrepartie ;
  662.           autre_partie(puis4,partie);
  663.    end loop ;
  664. end Puiss4;


 
ps : on est vraiment des noobs donc si ça se trouve c'est une erreur toute conne, mais la on est bloqué  :cry:  
 
 
merci d'avance pour votre aide !  :jap:  
 
Dmey et son binome.

Reply

Marsh Posté le 17-04-2004 à 10:01:30   

Reply

Marsh Posté le 17-04-2004 à 10:59:38    

c'est quoi exactement la ligne de l'erreur ?
 
Tu as dû tenter d'affecter une valeur trop grande dans une variable d'un type qui n'admet que des valeurs plus petites.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 07-05-2004 à 13:12:13    

Au passage, tu peux aussi corriger quelques erreurs de programmation qui pourraient bien expliquer ton exception.
 
En Ada, les tableaux connaissent leur propre longueur, alors il est inutile de se trimballer avec les tailles à côté :

Code :
  1. procedure Affiche_Grille (Puis4 : in Tpuis4)is
  2. begin
  3.     for J in Puis4'Range(2) loop
  4.         for I in Puis4'Range(1) loop
  5.             Put(Puis4(I, J));
  6.         end loop;
  7.     end loop;
  8. end Affiche_Grille;


Mes leçons d'Ada remontent à très loin, mais ce code devrait être correct.
 
De plus, il est toujours préférable de ne pas mettre en "in out" un paramètre qu'on ne modifie pas, donc ici, "Puis4" n'étant pas modifié, c'est paramètre en "in". L'avantage, c'est que derrière, avec ce genre d'informations, le compilateur peut effectuer ses propres optimisations sur le code qu'il génère, sans que tu aies à t'en préoccuper.

Reply

Marsh Posté le 07-05-2004 à 13:21:58    

Après avoir parcouru ton code, j'ai trouvé au moins un cas typique où tu es sûr de te récupérer une Constraint_Error.
 
En Ada, quand tu écris "if A and B then", Ada évalue toujours A et B. Il ne fait pas d'évaluation booléenne optimisée comme en C, par exemple, qui n'évalue B que si A est vrai (en se basant sur le fait que si A est faux, l'expression globale sera nécessairemnt fausse).
Ceci dit Ada offre la possibilité de faire une évaluation optimisée des expressions booléennes, à condition d'utiliser les opérateurs "and then" et "or else" à la place de "and" et "or".
 
Ainsi, dans Horizontal_4_X, quand tu écris :

Code :
  1. ... elsif (m>3)and (puis4(p,m-3)='V') then ...


l'exception Constraint_Error sera toujours levée si m <= 3 puisque "puis4(p, m-3)" est toujours évalué, et que dans ce cas, tu essaies d'accéder à un index négatif du tableau.
Pour éviter ça, il te faut écrire :

Code :
  1. ... elsif (m > 3) and then (puis4(p, m - 3) = 'V') then ...


 
Dernier commentaire sur ton code : je trouve qu'il contient beaucoup de code quasi dupliqué. C'est dommage.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed