Discussion:
première tentative à coder autre chose que des entrées-sorties de chaînes (autre message était de moi mais une erreur)
(trop ancien pour répondre)
Mehdi Saada
2017-11-29 11:29:37 UTC
Permalink
Je vous demanderai de temps en temps de l'aide quand je comprendrai pas le compilateur ou le manuel. Dans la vraie vie, je suis en deuxième année dd'histoire, et ayant testé la licence d'info, je suis pas près d'y retourner...

les specifications du paquetage:

generic
type Element_type is (<>);
type Indice_type is (<>);
type Tableau_type is array (Indice_type range <>) of Element_type;
package Tri_selection is
procedure tri (T: in out Tableau_type);
end Tri_selection;

$ gcc-6 -c tri_selection.ads
cannot generate code for file tri_selection.ads (package spec)
gnatmake: "tri_selection.ads" compilation error

je pensais que les spécifications pouvaient se compiler à part ?


Quant au corps, voilà le message:

***@debian:~/essai$ gnatmake tri_selection.adb
gcc-6 -c tri_selection.adb
tri_selection.adb:7:35: expected type "Indice_type" defined at tri_selection.ads:3
tri_selection.adb:7:35: found type "Element_type" defined at tri_selection.ads:2
tri_selection.adb:8:27: expected type "Indice_type" defined at tri_selection.ads:3
tri_selection.adb:8:27: found type "Element_type" defined at tri_selection.ads:2
tri_selection.adb:8:35: expected type "Indice_type" defined at tri_selection.ads:3
tri_selection.adb:8:35: found type "Element_type" defined at tri_selection.ads:2
tri_selection.adb:9:27: expected type "Indice_type" defined at tri_selection.ads:3
tri_selection.adb:9:27: found type "Element_type" defined at tri_selection.ads:2
tri_selection.adb:9:35: expected type "Indice_type" defined at tri_selection.ads:3
tri_selection.adb:9:35: found type "Element_type" defined at tri_selection.ads:2
tri_selection.adb:19:33: expected type "Element_type" defined at tri_selection.ads:2
tri_selection.adb:19:33: found type "Indice_type" defined at tri_selection.ads:3
gnatmake: "tri_selection.adb" compilation error

le code si jamais. J'ai corrigé les fautes de syntaxe bête (virgules au lieu de point-virgule, rien de plus), mais il reste les message plus haut.

package body Tri_selection is
temp : Element_type;
procedure tri (T: in out Tableau_type) is
procedure Swap (T: in out Tableau_type; A, B : in out Element_type) is
temp: Element_type;
begin
temp := T(A);
T(A) := T(B);
T(B) := T(A);
end Swap;
temp: Indice_type;
begin
for I in Tableau_type'Range loop
for J in I..Tableau_type'Last loop
if T(J) < T(Tableau_type'Last) then temp := J;
end if;
end loop;
Swap (T,temp,Tableau_type'Last);
end loop;
end tri;
end Tri_selection;
g***@hotmail.com
2017-11-29 16:02:44 UTC
Permalink
Tu y es presque. Est-ce que les génériques sont clairs pour toi ? Tu peux les voir comme des macros.

Element_type est ce que tu aimerais trier. Pour prendre une comparaison historique, ça pourrait être l'état trésorerie du royaume, voire qqch de plus compliqué comme l'inventaire en blé, orge et sel (la comparaison avec "<" deviendrait là plus difficile à définir...).

Index_type est l'indice d'un tableau. Imagine que ça représente une année. Ton tableau représentera la trésorerie sur plusieurs années:
1761 1.3 (millions de Louis d'or)
1762 1.4
1763 1.2
1764 0.9

Ce que le compilateur Ada te dit est que tu mets des Louis d'or à la place des années à différents points du programme.
_________________________
Gautier's Ada programming
http://gautiersblog.blogspot.com/search/label/Ada
NB: Pour une réponse directe, adresse e-mail valable par le lien ci-dessus
Mehdi Saada
2017-11-29 16:28:00 UTC
Permalink
J'ai compris, j'ai mis les mauvais types pour les arguments formels parfois, j'ai corrigé, ça a marché ! Que je suis content ! merci !
Mehdi Saada
2017-11-29 16:29:40 UTC
Permalink
J'ai compris, j'ai mis les mauvais types pour les arguments formels parfois, j'ai corrigé, ça a marché ! Que je suis content ! merci !
J'aime beaucoup le principe des génériques, j'essaierai dans mettre dès que je peux, de prévoir les cas les plus généraux pour chaque exo.
Mehdi Saada
2017-11-30 00:49:43 UTC
Permalink
Je sais que le tri par extraction est inefficace, mais j'ai zéro connaissance en algorithmique, alors j'ai pris celui que je pouvais comprendre le plus facilement. Je me trompais (tableau dérangé, pas rangé dans l'ordre). maintenant j'ai ça:

=> gnatmake tri_selection.adb
gcc -c tri_selection.adb
tri_selection.adb:14:34: expected type universal integer
tri_selection.adb:14:34: found type "Indice_type" defined at tri_selection.ads:3
gnatmake: "tri_selection.adb" compilation error

Pigé ce que dit gnat, mais pas pourquoi il le dit. Je me souviens avoir lu que T'Range était un raccourci vers T'First..T'Last, sauf que T était évalué une seule fois. Mais l'indice I de la boucle, est de même type T'First non ?Pourquoi me parler d'universal integer alors ?

for I in T'First..T'Last loop
for J in I+1..T'Last loop
if T(I) < T(J) then temp := J; end if;
end loop;
Swap (T,temp,I);
end loop;
Mehdi Saada
2017-11-30 00:55:36 UTC
Permalink
Je sais que le tri par extraction est inefficace, mais j'ai zéro connaissance en algorithmique, alors j'ai pris celui que je pouvais comprendre le plus facilement. Je me trompais (tableau dérangé, pas rangé dans l'ordre). maintenant j'ai ça:

=> gnatmake tri_selection.adb
gcc -c tri_selection.adb
tri_selection.adb:14:34: expected type universal integer
tri_selection.adb:14:34: found type "Indice_type" defined at tri_selection.ads:3
gnatmake: "tri_selection.adb" compilation error

Pigé ce que dit gnat, mais pas pourquoi il le dit. Je me souviens avoir lu que T'Range était un raccourci vers T'First..T'Last, sauf que T était évalué une seule fois. Mais l'indice I de la boucle, est de même type T'First non ?Pourquoi me parler d'universal integer alors ?

for I in T'First..T'Last loop
for J in I+1..T'Last loop
if T(I) < T(J) then temp := J; end if;
end loop;
Swap (T,temp,I);
end loop;
g***@hotmail.com
2017-11-30 08:01:47 UTC
Permalink
Est-ce que ce ne serait pas par hasard ici l'erreur ?
Post by Mehdi Saada
for J in I+1..T'Last loop
^^^

I est de type T (un scalaire quelconque) et " + 1" est une opération d'entiers.
Essaie T'Succ(I)
Mehdi Saada
2017-11-30 09:38:04 UTC
Permalink
C'est vrai que Indice_type n'est a priori un type numérique... c'est clair comme ça. J'aurais peut-être mieux compris si ça m'avait dit que le "1" était du mauvais type. Je crois que je vais arrêter de crier à l'erreur du compilateur... sinon quand ça m'arrivera vraiment, personne me croira ;-)
Mehdi Saada
2017-11-30 11:30:48 UTC
Permalink
J'ai l'habitude de voir tout de suite mes erreurs, alors ne pas pouvoir me débrouiller seul m'est quasiment insupportable...

Swap marche bien, c'est la boucle qui est fausse. Qu'est-ce je vois pas ?
temp : Indice_type;
for I in Indice_type'First..Indice_type'Pred(Indice_type'Last) loop
for J in Indice_type'Succ(I)..T'Last loop
if T(I) < T(J) then temp := J; end if;
end loop;
Swap (T,temp,I);
end loop;

ce que ça donne:

Saisir l'indice de VEC1 ( 5 .. 9) : 6
Valeur = 4

raised CONSTRAINT_ERROR : tri_selection.adb:7 invalid data

En outre, quand je saisis un indice autre que "5" pour la lecture: raised CONSTRAINT_ERROR : tri_selection.adb:7 invalid data

ligne coupable dans swap: T(A) := T(B);
Mehdi Saada
2017-11-30 12:12:09 UTC
Permalink
je vais comparer avec une implémentation du tri rapide sur le net...
Mehdi Saada
2017-11-30 17:25:08 UTC
Permalink
Je raccourcis mes messages: Pourquoi est-ce que l'implémentation suivante du tri par séléctio n foire-t-elle ? J'ai ajouté le test après la boucle intérieur, car au cas où celle-ci ne trouve aucune valeur supérieur, l'appel à Swap se faisait quand même, avec une valeur de temp de la dernière boucle, ce qui naturellement foutait le boxon.
procedure tri (T: in out Tableau_type) is
temp : Indice_type;
begin
for I in T'Range loop
temp := I;
for J in Indice_type'Succ(I)..T'Last loop
if T(I) < T(J) then temp := J; end if;
end loop;
if (temp /= I) then
Swap (T,temp,I);
end if;
end loop;
end tri;

Fout toujours le boxon mais autrement (?):

VEC1=( 5, 4, 3, 2, 1)
VEC2=( 1, 5, 4, 3, 2)
VEC1 trié :=( 5, 4, 3, 2, 1)
VEC2 trié :=( 2, 5, 4, 3, 1)

Voilà swap: peut difficilement être faux !
procedure Swap (T: in out Tableau_type; A, B : in Indice_type) is
temp2: Element_type;
begin
temp2 := T(A);
T(A) := T(B);
T(B) := temp2;
end Swap;

J'ai donné ma langue au chat après plusieurs heures de réflexion cumulé. Ai regardé l'implémentation de rosettacode, et n'ai rien compris, ou seulement vaguement le rapport avec la mienne. J'ai haïe l'algorithmique à chaque fois que j'y ai été confronté, même en licence de bio... Merci de votre aide les gars.
Niklas Holsti
2017-11-30 18:25:44 UTC
Permalink
Post by Mehdi Saada
Je raccourcis mes messages: Pourquoi est-ce que l'implémentation
suivante du tri par séléctio n foire-t-elle ? J'ai ajouté le test
après la boucle intérieur, car au cas où celle-ci ne trouve aucune
valeur supérieur, l'appel à Swap se faisait quand même, avec une
valeur de temp de la dernière boucle, ce qui naturellement foutait
le boxon.
procedure tri (T: in out Tableau_type) is
temp : Indice_type;
begin
for I in T'Range loop
temp := I;
for J in Indice_type'Succ(I)..T'Last loop
if T(I) < T(J) then temp := J; end if;
Essaie: if T(temp) < T(J) then temp := J; end if;
Post by Mehdi Saada
end loop;
Alors ici: T(temp) = max{ T(I .. T'Last) }
=> tri descendante.
Post by Mehdi Saada
if (temp /= I) then
Swap (T,temp,I);
end if;
end loop;
end tri;
--
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
. @ .
Jeffrey R. Carter
2017-11-30 19:11:35 UTC
Permalink
Post by Mehdi Saada
Je raccourcis mes messages: Pourquoi est-ce que l'implémentation suivante du tri par séléctio n foire-t-elle ? J'ai ajouté le test après la boucle intérieur, car au cas où celle-ci ne trouve aucune valeur supérieur, l'appel à Swap se faisait quand même, avec une valeur de temp de la dernière boucle, ce qui naturellement foutait le boxon.
procedure tri (T: in out Tableau_type) is
temp : Indice_type;
begin
for I in T'Range loop
temp := I;
for J in Indice_type'Succ(I)..T'Last loop
if T(I) < T(J) then temp := J; end if;
end loop;
if temp /= I then
Swap (T,temp,I);
end if;
end loop;
end tri;
T I Temp J T(I) T(J) T(I)<T(J) Swap
1 5 4 3 2 1 1 2 1 5 T -
2 3 4 T -
3 4 3 T -
4 5 2 T 5, 1
2 5 4 3 1 2 2 3 5 4 F -
...

for I in 2 .. 4, for J in I + 1 .. 5, T (I) > T (J)
--
Jeff Carter
"What's special about Agile is that it's a mix of the
best and the worst."
Bertrand Meyer
148
Mehdi Saada
2017-11-30 20:23:56 UTC
Permalink
Merci beaucoup... mais ce qui me choque le plus, c'est que dans ma tête, je ne vois toujours pas l'opération se dérouler... Vais bûcher sur le diagramme que vous m'avez gentiment écrit. Mal de tête en perspective. Je peux jongler avec des formules algébriques, mais visualiation spatiale et déroulement dans le temps (algo) me donnent mal au crane...
Mehdi Saada
2017-11-30 20:28:16 UTC
Permalink
Sinon, est-ce que l'assignation à I avant la boucle intérieur, et le test juste après étaient judicieux ? Il y a moyen de se passer de l'assignation temp = I ?
Loading...