[ADA95] grrr c koi cette erreur ?

grrr c koi cette erreur ? [ADA95] - Ada - Programmation

Marsh Posté le 02-09-2002 à 22:41:16    

voila mon code :

Code :
  1. function image(liste : LISTES) return string is
  2.    i : INTEGER := 2;                      -- la  parenthèse+1
  3.    s : string(1..longueur_image(liste));
  4. begin
  5.    s(1):='(';
  6.    if liste.premier = NULL then
  7. return "()";
  8. else
  9.   while not en_fin(liste) loop
  10.    while liste.precourant.s.v /= null loop
  11.    s(i..(i+liste.precourant.s.v.all'length)) := liste.precourant.s.v.all;
  12.    i:=i+(liste.precourant.s.v.all'length);
  13.    end loop;
  14.    s(i..i+2):=", ";
  15.    i := i+2;  -- la virgule et l'espace
  16.    avancer(liste);     -- ERREUR ICI
  17.    end loop;
  18. s(i):=')';
  19.   return s;
  20. end if;
  21. end;


 
et az la compilation g l'erreur :
actual for list must be a variable


Message édité par swich le 03-09-2002 à 00:04:41
Reply

Marsh Posté le 02-09-2002 à 22:41:16   

Reply

Marsh Posté le 02-09-2002 à 22:54:31    

C'est quoi comme langage ça :??:
Le truc d'Oracle ? (PLSQL?)


Message édité par antp le 02-09-2002 à 22:55:01

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-09-2002 à 23:16:25    

C'est de l'ADA 95, non ?

Reply

Marsh Posté le 02-09-2002 à 23:19:06    

es-tu sûr que liste n'a pas été déclarée comme constante ?


Message édité par chicha le 02-09-2002 à 23:19:20
Reply

Marsh Posté le 02-09-2002 à 23:21:05    

ouaip c de l'ada 95

Reply

Marsh Posté le 02-09-2002 à 23:22:37    

et liste n'a pas ete declare comme une constante
vla mon code :

Code :
  1. with unchecked_deallocation;
  2. package body STRLISTE is
  3.  
  4.    type PTRS is access STRING;
  5.    type ELEMS is record
  6.       v : PTRS;
  7.       s : PELEMS;
  8.    end record;
  9.  
  10.    procedure liberer is new unchecked_deallocation(STRING, PTRS);
  11.    procedure liberer is new unchecked_deallocation(ELEMS, PELEMS);
  12.  
  13.    function taille(LISTE :LISTES) return NATURAL is
  14.    begin
  15.       return liste.n;
  16.    end;
  17.  
  18.    function valeur(LISTE : LISTES) return STRING is
  19.    begin
  20.       return LISTE.precourant.s.v.all;
  21.    exception when CONSTRAINT_ERROR =>
  22.       if en_fin(LISTE) then raise ERREUR; end if;
  23.       return LISTE.premier.v.all;
  24.    end;
  25.  
  26.    function en_fin(LISTE : LISTES) return BOOLEAN is
  27.    begin
  28.       return LISTE.premier = null or else (LISTE.precourant /= null and then LISTE.precourant.s = null);
  29.    end;
  30.  
  31.    procedure aller_en_debut(liste : in out LISTES) is
  32.    begin
  33.       if en_fin(liste) then raise ERREUR; end if;
  34.       liste.precourant := liste.precourant.s;
  35.    exception when CONSTRAINT_ERROR => liste.precourant := liste.premier;
  36.    end;
  37.  
  38.    procedure avancer (liste : in out LISTES) is
  39.       begin
  40.          if en_fin(LISTE) then raise ERREUR; end if;
  41.            LISTE.precourant := LISTE.precourant.s;
  42.               exception when constraint_error =>
  43.               LISTE.precourant := LISTE.premier;
  44.    end;
  45.              
  46.  
  47.  
  48.    procedure inserer(liste : in out LISTES; S : in STRING) is
  49.       c : PTRS := new STRING'(S);
  50.    begin
  51.       if liste.precourant = null then
  52.          liste.premier := new ELEMS'(c, liste.premier);
  53.          liste.precourant := liste.premier;
  54.       else
  55.          liste.precourant.s := new ELEMS'(c, liste.precourant.s);
  56.          liste.precourant := liste.precourant.s;
  57.       end if;
  58.       liste.n := liste.n + 1;
  59.    exception when STORAGE_ERROR => liberer(c); raise;
  60.    end;
  61.  
  62.    procedure retirer(liste : in out LISTES) is
  63.       p : PELEMS;
  64.    begin
  65.       if en_fin(liste) then raise ERREUR; end if;
  66.       if liste.precourant = null then
  67.          p := liste.premier;
  68.          liste.precourant := liste.premier.s;
  69.       else p:= liste.precourant.s;
  70.            liste.precourant.s := liste.precourant.s.s;
  71.       end if;
  72.       liste.n := liste.n - 1;
  73.       liberer(p.v);
  74.       liberer(p);
  75.    end;
  76.  
  77. function longueur_image(liste : in LISTES) return INTEGER is
  78.   i : INTEGER := 2;                      -- les deux parenthèses
  79. begin
  80. if  liste.premier /= NULL then
  81.   while not en_fin(liste) loop
  82.     i := i + (liste.precourant.s.v.all'length);
  83.     i := i+2;    -- la virgule et l'espace
  84.     avancer(liste);   
  85.   end loop;
  86. end if;
  87.     return i;
  88. end;
  89.  
  90. function image(liste : LISTES) return string is
  91.    i : INTEGER := 2;                      -- la  parenthèse+1
  92.    s : string(1..longueur_image(liste));
  93. begin
  94.    s(1):='(';
  95.    if liste.premier = NULL then
  96. return "()";
  97. else
  98.   while not en_fin(liste) loop
  99.    while liste.precourant.s.v /= null loop
  100.    s(i..(i+liste.precourant.s.v.all'length)) := liste.precourant.s.v.all;
  101.    i:=i+(liste.precourant.s.v.all'length);
  102.    end loop;
  103.    s(i..i+2):=", ";
  104.    i := i+2;  -- la virgule et l'espace
  105.    avancer(liste);   
  106.    end loop;
  107. s(i):=')';
  108.   return s;
  109. end if;
  110. end;
  111. procedure extraire (X : in PELEMS;d: out PELEMS) is
  112. begin
  113. d:=X;
  114. while d.s /= NULL loop
  115.    while d.v.all>d.s.v.all loop
  116.       d:=d.s;
  117.       end loop;
  118. end loop;
  119. end;
  120. end STRLISTE;

Reply

Marsh Posté le 02-09-2002 à 23:38:03    

Je t'avoue que je ne suis plus vraiment dans l'Ada...
Mais à mon avis, l'idée pour commencer à debuger dans ta fonction image, est de voir si tu peux modifier liste avec une commande à la con.
Si c'est ça, c'est p-e une histoire de in/out qui couille sur liste  :??:

Reply

Marsh Posté le 02-09-2002 à 23:56:07    

hehe bien joue man :)
g remplace par ca :
 
function image(list : LISTES) return string is
   liste : LISTES := list;
 
et ca compile nickel

Reply

Marsh Posté le 03-09-2002 à 00:02:12    

ok c cool, c ce que je pensais...
mais je ne savais plus si fallait un .all ou pas ??

Reply

Marsh Posté le 03-09-2002 à 00:04:26    

swich a écrit a écrit :

ouaip c de l'ada 95
 




 
ça aurait été bien de le mettre dans la section ADA et de l'indiquer dans le premier post :p
Bon vais le faire moi-même...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-09-2002 à 00:04:26   

Reply

Marsh Posté le 03-09-2002 à 00:51:23    

ben non pq des que je met qqchose ds la section ada, y'a jamais de reponse, dc la dsl mais ct important

Reply

Marsh Posté le 03-09-2002 à 09:58:40    

si tu le mets dans la section ADA il apparaît dans la sous-section ADA et dans la section principale.
Si tu ne le mets dans aucune sous-section il n'apparaît que dans la section principale... donc tu as tout intérêt à utiliser ces sous-sections pour si jamais y a un gars qui vient juste voir les topics ADA.
Et si personne y répond c'est peut-être qu'il y a très peu de gens ici qui pourraient le faire ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-09-2002 à 10:40:30    

y a aussi le fait que tu réponds pas aux questions dans tes post : tu écris ton problème et tu te casses !

Reply

Marsh Posté le 03-09-2002 à 11:00:43    

swich a écrit a écrit :

ben non pq des que je met qqchose ds la section ada, y'a jamais de reponse, dc la dsl mais ct important
 




 
J'ai juste une question qui me trote... Tu peux me rappeler le sens du .all pour un type liste ?  :??:  Merci :hello:

Reply

Marsh Posté le 03-09-2002 à 13:23:59    

swich a écrit a écrit :

hehe bien joue man :)
g remplace par ca :
 
function image(list : LISTES) return string is
   liste : LISTES := list;
 
et ca compile nickel




C'est pas très malin de faire ça...
Globalement, dans une fonction ("image" ) qui promet de ne pas modifier "list", tu essaies d'appeler une procédure ("avancer" ) qui va la modifier.
Résultat, tu es obligé de faire une copie locale de ta liste ! :ouch:  
Dans le genre efficace, on fait mieux... :sarcastic:
Ou alors, dans le cas présent (si l'opérateur "=" n'est pas redéfini sur ton type LISTES), c'est pire : cette copie locale introduit probablement un bug, car a priori, si "avancer" attend un paramètre en in/out, c'est qu'il modifie cet objet...  
 
Tu ferais mieux de réléchir un peu plus attentivement à qui doit modifier quoi, et écrire (enfin, modifier) ton code en conséquence...  :heink:


Message édité par BifaceMcLeOD le 03-09-2002 à 13:27:05
Reply

Marsh Posté le 03-09-2002 à 13:28:04    

ouaip ben en fait le prob c tout bete, c qu'il peut pas modifier liste pq il est en mode in, donc y fo faire une copie

Reply

Marsh Posté le 03-09-2002 à 13:32:54    

chicha a écrit a écrit :

 
 
J'ai juste une question qui me trote... Tu peux me rappeler le sens du .all pour un type liste ?  :??:  Merci :hello:  




Pas pour un type liste, pour un type accès (bref, un pointeur). Cela permet de manipuler l'agrégat pointé dans son ensemble (la valeur de type record, si tu préfères).
 
En toute logique, pour accéder à n'importe quel des champs d'un agrégat pointé, il faudrait aussi utiliser " .all ". Exemple, "elem" est de type "access ELEMS" :

Code :
  1. elem.all.v


On "ouvre le pointeur pour accéder à l'agrégat pointé, avant d' "ouvrir" l'agrégat pour accéder à l'un de ses champs. Mais dans ce cas précis, Ada accepte que le " .all " soit implicite, et l'on peut écrire :

Code :
  1. elem.v


Reply

Marsh Posté le 03-09-2002 à 13:39:16    

swich a écrit a écrit :

ouaip ben en fait le prob c tout bete, c qu'il peut pas modifier liste pq il est en mode in, donc y fo faire une copie




Non, le problème, c'est que tu utilises une procédure qui modifie "liste" dans une fonction qui ne la modifie pas. Alors soit "image" doit bien appeler "avancer", mais dans ce cas, le prototype d'"avancer" n'est pas correct, ou alors c'est "avancer" qui est correct, et dans ce cas c'est "image" qui ne doit pas appeler "avancer". Mais dupliquer les objets en mémoire parce que le compilateur interdit l'accès direct aux variables est une très mauvaise manière de résoudre les problèmes. Imagine que ta liste nécessite plusieurs dizaines ou centaines de mégaoctets en mémoire. Je ne te raconte pas l'état de ta machine au simple appel d'"image" (facile : sur les rotules...  :D )

Reply

Marsh Posté le 03-09-2002 à 17:44:14    

ouai suis d'accord, vu comme ca..

Reply

Marsh Posté le 04-09-2002 à 10:11:21    

Ca s'appelle la programmation par interfaces.
Ca paraît un peu rigide comme raisonnement, mais quand on bosse à plusieurs, c'est la manière la plus efficace de bosser que je connaisse (on peut atteindre des rendements de folie en termes de production de code sans bug)... à condition évidemment de respecter le contrat défini par les interfaces qu'on s'était donné au préalable.

Reply

Sujets relatifs:

Leave a Replay

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