Boucle infini [ADA]

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

Boucle infini [ADA]

par Rockleader » 30 Mar 2013, 18:47

Salut, je n'arrive pas à voir d'où vient l'erreur dans cette simple boucle


Code: Tout sélectionner
==============================================
Partie déclarative

 couleur2:string:="defaut"; -- on donne une valeur de défaut à la chaîne pour boucler.
(A noter qu'en ADA lorsqu'on déclare une chaine de caractère on doit soit lui donner une valeur soit lui imposer une longueur dès le début).
=============================================
Partie algorithmique

While ((couleur2  /= "noir") or (couleur2 /= "blanc")) loop
   put("Quel pions voulez vous utiliser ? (noir/blanc)");
   get_line(couleur2,lg_eff); --on demande la couleur et on entre la longueur de la chaîne dans lg_eff
      end loop;


Au moment d'entré la chaîne de caractère, j'entre noir ou blanc...et ça continue de boucler pour une raison que j'ignore.

Une idée de la raison de tout cela ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 30 Mar 2013, 18:54

Rockleader a écrit:Salut, je n'arrive pas à voir d'où vient l'erreur dans cette simple boucle


Code: Tout sélectionner
==============================================
Partie déclarative

 couleur2:string:="defaut"; -- on donne une valeur de défaut à la chaîne pour boucler.
(A noter qu'en ADA lorsqu'on déclare une chaine de caractère on doit soit lui donner une valeur soit lui imposer une longueur dès le début).
=============================================
Partie algorithmique

While ((couleur2  /= "noir") or (couleur2 /= "blanc")) loop
   put("Quel pions voulez vous utiliser ? (noir/blanc)");
   get_line(couleur2,lg_eff); --on demande la couleur et on entre la longueur de la chaîne dans lg_eff
      end loop;


Au moment d'entré la chaîne de caractère, j'entre noir ou blanc...et ça continue de boucler pour une raison que j'ignore.

Une idée de la raison de tout cela ?

A mon avis, que ce soit noir ou blanc, ça continue indéfiniment. Essayez-donc 'and'.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 30 Mar 2013, 19:28

Tu veux dire un and à la place du or ?

C'est pas très logique quand même.

Je vais voir ce que ça donne.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 30 Mar 2013, 19:42

Rockleader a écrit:Tu veux dire un and à la place du or ?

C'est pas très logique quand même.

Je vais voir ce que ça donne.

Bon, on a rentré un truc.
Si c'est ni noir ni blanc on continue à lire.
J'ai supposé que /= veut dire 'différent' en ADA.
L'instruction veut dire "si c'est pas noir_ou_blanc" alors on lit
En algèbre de Boole, not (X ou Y) s'écrit (not X and not Y).

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 30 Mar 2013, 20:06

Dlzlogic a écrit:Bon, on a rentré un truc.
Si c'est ni noir ni blanc on continue à lire.
J'ai supposé que /= veut dire 'différent' en ADA.
L'instruction veut dire "si c'est pas noir_ou_blanc" alors on lit
En algèbre de Boole, not (X ou Y) s'écrit (not X and not Y).



Effectivement tu as bien supposé pour le différent de, non égal.


Toutefois: en remplaçant mon or par le and, j'ai obtenu le même résultat, à savoir une boucle infini.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 30 Mar 2013, 20:22

Rockleader a écrit:Effectivement tu as bien supposé pour le différent de, non égal.


Toutefois: en remplaçant mon or par le and, j'ai obtenu le même résultat, à savoir une boucle infini.

Je connais pas la syntaxe de l'ADA
La syntaxe
While (contition vraie) loop

end loop
est bien celle là ?
Au moment du test de la condition, que vaut couleur2 ?
Autrement dit, de quel type est couleur ?
Ce qui me gène un peu, c'est qu'on teste couleur2 avant de le lire.
Autre cose que je ne sais pas c'est si le mot clé loop fait partie du while ou non. Autrement dit est-ce cette logique
while (condition) loop

end (while + loop)
ou celle-là
wlile (condition)
{
loop

end loop
}
Je penche plutôt pour la seconde, auquel cas, la condition n'est testée qu'une seule fois.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 30 Mar 2013, 21:01

While (condition1 et/ou condition 2) loop (boucle)

Traitement


end loop (fin de la boucle).

loop fait bien partie de la structure de la boucle.



Au moment du test de la condition, que vaut couleur2 ?

==> Il vaut la chaine de caractère "default", j'ai mis ça mais j'aurais pu mettre toute autre chose c'était façon d'initialiser la variable pour pouvoir boucler.


Autrement dit, de quel type est couleur ?

==> TU veux surement parler de couleur2 ? Auquel cas il s'agit d'une chaine de caractère noté string.


Ce qui me gène un peu, c'est qu'on teste couleur2 avant de le lire

==> Non puisqu'on lui affecte une valeur par défaut dans la partie déclarative.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 30 Mar 2013, 21:24

slt,

que fait
Code: Tout sélectionner
   get_line(couleur2,lg_eff); --on demande la couleur et on entre la longueur de la chaîne dans lg_eff


et que vaut couleur2 apres?
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 30 Mar 2013, 21:51

Cela demande une chaîne de caractère dont la longueur sera stocké dans lg_eff et la chaine elle même sera stocké dans couleur2

Donc couleur 2 vaudra la chaîne que l'on aura entré. EN occurrence, blanc ou noir.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 30 Mar 2013, 21:57

Code: Tout sélectionner
 Donc couleur 2 vaudra la chaîne que l'on aura entré. EN occurrence, blanc ou noir.

en es-tu sur? (ca veut dire prouves le)
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 31 Mar 2013, 01:44

J'ai voulu essayer en faisant un affichage de couleur2; mais rien ne marche.

J'ai tenté

put_line(couleur2,lg_eff); Mais je n'ai aucun affichage en résultat.

De même avec

for i in 1..lg_eff loop

put(couleur2(i));

end loop;


Que je passe par la chaine entière ou le tableau de caractère constituant la chaîne, rien ne s'affiche.


Je ne vois vraiment pas de solution.


Je pense que dans un premier temps je vais faire un premier jet passant outre ce sous programme...mais j'aimerais tout de même comprendre ce qu'il se passe.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 31 Mar 2013, 02:00

en tout cas on ne pourra certainement pas t'aider tant que tu continueras à livrer tes bouts de code incomplets.

Comme je te vois venir de loin, on te demande pas de faire un copier de tout ton code, on te demande de donner un code minimaliste qui reproduit le problème.
Parce que là, on sait toujours pas c'est quoi lg_eff. Certes tu dis que c'est la taille de la chaine, mais pe que ta chaine a changé entre temps.
Tu mets un for pour afficher ta chaine, mais on connait même pas son initialisation, ca se fait elle est vide...
Ton put_line on sait pas ou tu l'écris, avant la demande input de l'utilisateur, ou apres, ou ptet même apres la loop :marteau:

bref,...comme d'hab :/
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 31 Mar 2013, 11:16

Code: Tout sélectionner
lg_eff:Natural;
      couleur2:string:="defaut";


 While ((couleur2 /= "noir") and (couleur2/="blanc")) loop
   put("Quel pions voulez vous utiliser ? (noir/blanc)");
         get_line(couleur2,lg_eff);
         for i in 1..lg_eff loop
            put(couleur2(i));
         end loop;
      end loop;


lg_eff prend la longueur de la chaîne de caractères qui elle sera stockée dans couleur2.
Ne me demande pas pourquoi, c'est une fonction de base d'ADA, je serais donc incapable de te dire comment elle a été écrite.

Bon, le 'i' de la boucle for n'a pas besoin d'être déclaré, c'est une spécification propre à la boucle for; il parcoura donc l'intervalle de 1 à lg_eff en s’incrémentant de 1 à chaque fois. lg_eff qui aura donc bien une valeur, celle de la taille effective de la chaîne entré.


Une chaîne de caractère cache un tableau de caractère d'où le faut que j'ai tenté avec une boucle for en précisant l'indice de couleur2. Mais comme je l'ai dis rien ne s'affiche.



De même avec un put_line qui lui est censé pouvoir m'afficher directement la chaîne si je lui précise la taille de celle-ci en paramètre.

Code: Tout sélectionner
lg_eff:Natural;
      couleur2:string:="defaut";


 While ((couleur2 /= "noir") and (couleur2/="blanc")) loop
   put("Quel pions voulez vous utiliser ? (noir/blanc)");
         get_line(couleur2,lg_eff);
         put_line(couleur2,lg_eff);
 end loop;
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 31 Mar 2013, 14:54

Rockleader a écrit:
Code: Tout sélectionner
lg_eff:Natural;
      couleur2:string:="defaut";


 While ((couleur2 /= "noir") and (couleur2/="blanc")) loop
   put("Quel pions voulez vous utiliser ? (noir/blanc)");
         get_line(couleur2,lg_eff);
         for i in 1..lg_eff loop
            put(couleur2(i));
         end loop;
      end loop;


lg_eff prend la longueur de la chaîne de caractères qui elle sera stockée dans couleur2.
Ne me demande pas pourquoi, c'est une fonction de base d'ADA, je serais donc incapable de te dire comment elle a été écrite.


Bonjour,
J'ai plutôt l'impression que lg_eff est la longueur maximum que doit lire la fonction.
La suite, j'ai pas regardé.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 31 Mar 2013, 19:02

Code: Tout sélectionner
with Ada.Text_IO;
use Ada.Text_IO;

procedure bob is
lg_eff:Natural;
couleur2:string:="defaut";
begin
 While ((couleur2 /= "noir") and (couleur2/="blanc")) loop
    put("Quel pions voulez vous utiliser ? (noir/blanc)");
            get_line(couleur2,lg_eff);
  put_line(couleur2);
    end loop;
end bob;

Code: Tout sélectionner
Quel pions voulez vous utiliser ? (noir/blanc)v
vefaut
Quel pions voulez vous utiliser ? (noir/blanc)


...
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 01 Avr 2013, 15:14

Désolé pour le retard dans la réponse j'étais pas chez moi.

Bon, il y a bien un soucis quelque part, puisqu'en recopiant exactement ton code fatal, j'obtiens encore une fois la même boucle infini...

Quel pions voulez vous utiliser ? (noir/blanc)v
Quel pions voulez vous utiliser ? (noir/blanc)d
Quel pions voulez vous utiliser ? (noir/blanc)noir
Quel pions voulez vous utiliser ? (noir/blanc)

etc etc...


Pourtant j'ai mis exactement comme toi.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 01 Avr 2013, 15:26

Rockleader a écrit:Désolé pour le retard dans la réponse j'étais pas chez moi.

Bon, il y a bien un soucis quelque part, puisqu'en recopiant exactement ton code fatal, j'obtiens encore une fois la même boucle infini...

Quel pions voulez vous utiliser ? (noir/blanc)v
Quel pions voulez vous utiliser ? (noir/blanc)d
Quel pions voulez vous utiliser ? (noir/blanc)noir
Quel pions voulez vous utiliser ? (noir/blanc)

etc etc...


Pourtant j'ai mis exactement comme toi.

Ben, c'est normal, puisque le code de fatal_erreur met en évidence qu'on obtient bien une boucle infini.
La raison est sans les messages précédents :
Que représente lg_eff ?
Que contient couleur2 dans le test de condition du while ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 01 Avr 2013, 15:43

Quel pions voulez vous utiliser ? (noir/blanc)v
Quel pions voulez vous utiliser ? (noir/blanc)d
Quel pions voulez vous utiliser ? (noir/blanc)noir
Quel pions voulez vous utiliser ? (noir/blanc)

ce n'est pas le même code.

peux-tu copier le code que tu utilises, ainsi que ta console.
Parce que tes v, d, noir, on sait pas si c'est ce que tu as saisi, ou ce que tu affiches apres la saisie.....
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 01 Avr 2013, 15:46

Dlzlogic a écrit:Ben, c'est normal, puisque le code de fatal_erreur met en évidence qu'on obtient bien une boucle infini.
La raison est sans les messages précédents :
Que représente lg_eff ?
Que contient couleur2 dans le test de condition du while ?



Je pensais que dans le message de Fatal lorsqu'il exécutait son programme, l'affichage lui donnait tout de même : vefaut en entrant v.

Alors que moi ça n'affichait réellement rien du tout si ce n'est la boucle infini.



En réalité je pense que j'ai du avoir des soucis lors de mes sauvegardes comme j'ai importé le travail depuis ma clefs usb...parce que j'ai changer ce qui devait être fait dans le programme principal, j'ai sauvegardé et compilé; et en lançant le programme je retombe sur le même sous programme qui plante en boucle...


Alors que je ne l’appelle même pas :hum:


Donc une de mes sauvegarde a surement déconné et du coup les suivantes ne doivent pas s'effectuer comme il le faut.


Bref, je recommence tout depuis le début ET la prochaine fois que je changerais d'ordi en cours de travail je mettrais simplement le code sur un bloc note...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 01 Avr 2013, 15:50

fatal_error a écrit:ce n'est pas le même code.

peux-tu copier le code que tu utilises, ainsi que ta console.
Parce que tes v, d, noir, on sait pas si c'est ce que tu as saisi, ou ce que tu affiches apres la saisie.....


Le code était un copier coller tout bête du tien.
ET c’est moi qui entrait les v,d,noir.

Le programme lui n'affichait rien. Si ce n'est la répétition de cette boucle...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite