TP6 Q3 sequence

Programmation Avancée

Modérateur : Douin

Répondre
pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

TP6 Q3 sequence

Message par pellier » 24 nov. 2016 13:44

Bonjour,

Je ne comprends pas bien le VisiteurInstToJava pour ce qui est de Sequence
c'est ce qui permet de mettre le point virgule entre deux séquence i1 et i2
Pour moi il y a 2 points virgules (un après i1 et un après i2)

Code : Tout sélectionner

i1;
i2;
Donc on devrait écrire :

Code : Tout sélectionner

public String visite(Sequence seq) {
      return seq.i1().accepter(this) + " ; " + seq.i2().accepter(this) + " ; ";
}
AVEC OU SANS ?

avec un deuxième point virgule : les tests Jnews sont stoppés ("tests interrompus")
si je l'enlève les tests ne s'interrompent pas (avec des erreurs tout de même) donc ça vient bien uniquement de ça.

sans le deuxième point virgule : le code java que j'obtiens en visitant avec VisiteurInstToJava n'est pas compilable.

Code : Tout sélectionner

 while((x > 1)){
        fact=(fact * x) ; 
        x=(x - 1)
    }
Dans un cas comme dans l'autre je suis bloqué !
est-ce que quelqu'un a une idée ?
Merci d'avance

David Bertrand
Messages : 34
Inscription : 20 oct. 2016 13:10

Re: TP6 Q3 sequence

Message par David Bertrand » 24 nov. 2016 15:16

Bonjour,

je galère aussi pas mal avec ces histoires de point virgule, mais avec les parenthèses également. Parfois ces éléments sont nécessaires, parfois optionnels, parfois contre-productifs.

Je pense que la raison en est que je ne prends pas le problème de la bonne manière. Tout ce que je fais ne contribue qu'à déplacer ou complexifier la situation ...
Je suis en train de faire une pause de quelques jours avant de tout recommencer avec la tête froide et un regard neuf ...

Mais je continue à suivre ce forum. N'hésite pas à nous tenir au courant si tu aperçois le bout du tunnel.

David

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 24 nov. 2016 16:37

Salut,

Pour les parenthèses je suppose que ça ne pose pas de problèmes d'en mettre trop

Code : Tout sélectionner

x==1 && y<7
équivaut à

Code : Tout sélectionner

( ( (x)==(1) ) && ( (y)<(7) ) )
en terme de calcul et de compilation java

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 24 nov. 2016 17:18

à partir de combien d'essais a-t-on accès aux sources des tests Jnews ? (j'en suis au huitième) les titres des tests sont un peu laconiques.
J'ai l'impression de passer plus de temps à comprendre ce qui est demandé qu'à résoudre des problèmes dans le code, c'est pas très productif.

Par exemple j'ai une erreur Jnews : test_CompilationExecutionDeFactoriel_5(question3) failed
alors que le test local testFactoriel est ok et qu'il fournie un code java compilable.
Qu'est-ce que la Jnews demande de plus ?

De même pour UneBouclePourAvecAfficher ExecutionDUneBouclePour CompilationDeSomme

tous les tests locaux fonctionnent y compris ceux que j'ai ajoutés et ceux fournis par d'autres sur ce forum

Douin
Messages : 218
Inscription : 18 mars 2009 15:46

Re: TP6 Q3 sequence

Message par Douin » 24 nov. 2016 18:28

Bonsoir,
Par exemple j'ai une erreur Jnews : test_CompilationExecutionDeFactoriel_5(question3) failed
alors que le test local testFactoriel est ok et qu'il fournie un code java compilable.
Qu'est-ce que la Jnews demande de plus ?
Compilable et exécutable comme le nom du test l'indique, vérifiez si cela ne viendrait pas l'assertion ou de l'exécution de votre code

Ci-dessous le test en question qui n'ajoute pas grand chose, à part la CompilationExecutionDeFactoriel_5

tenez nous informés

Bonne fin de tp
ps:curieux un ; de trop correspond à une instruction vide en java, curieux que cela ne se compile pas, l'erreur vient peut être de l'exécution


Code : Tout sélectionner

	private static int fact(int n){
    if(n==0) return 1;
    else return n*fact(n-1);
  }

public void test_CompilationExecutionDeFactoriel_5(){
	  Contexte m = new Memoire();
	  Variable x = new Variable(m,"x",5);
	  Variable fact = new Variable(m,"fact",1);
 
  	Instruction inst = 
  	  new Sequence(
  	    new TantQue(
          new Sup(x,new Constante(1)),
          new Sequence(
            new Affectation(fact,new Multiplication(fact,x)),
            new Affectation(x,new Soustraction(x,new Constante(1))))
        ),
        new Assertion(new Egal(fact,new Constante(fact(5)))));
 	  
    VisiteurExpression<String> ves = new VisiteurInfixe(m);
    VisiteurExpressionBooleenne<String> vbs = new VisiteurBoolToJava(ves);
    VisiteurInstruction<String> vs = new VisiteurInstToJava(ves,vbs,4);
    
    LocalClasseJava cj = new LocalClasseJava("X_Fact2", inst, vs);
    //System.out.println(cj.sourceComplet());
    try{
      cj.compilerEtExecuter();
    }catch(Exception e){
      //e.printStackTrace();
      fail(m + inst.accepter(new VisiteurInstToString(ves,vbs))  + e.getMessage() + " ??? ");
    }
	}     
	

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 25 nov. 2016 11:51

Bonjour,

merci pour cette réponse.

fact
Le test que vous fournissez donne le code suivant,
qui se compile, s'éxécute, et donne 120 comme valeur pour fact :
donc a priori pas de soucis.

Code : Tout sélectionner

public class X_Fact2{

  public static void main(String[] args)throws Exception{
    int fact=1;
    int x=5;
while((x > 1)){fact=(fact * x) ; x=(x - 1);} ; assert (fact == 120);
  }

}
Ce faisant nous sommes d'accord que dans votre test il faut remplacer LocalClasseJava par ClasseJava
et cj.compilerEtExecuter(); par System.out.println(cj.sourceComplet()); car ces 2 class n'existent pas dans notre version ?


point virgule seul = instruction vide oui
oui je m'étais fait la réflexion (sauf pour l'affectation dans la boucle for )
Dernière édition par pellier le 25 nov. 2016 12:48, édité 1 fois.

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 25 nov. 2016 12:24

Maintenant j'ai accès aux sources des tests :
1) test_CompilationDeSomme(question3) failed
2) test_CompilationExecutionDeFactoriel_5(question3) failed
3) test_CompilationExecutionDeMult_7_85(question3) failed
4) test_CompilationExecutionDUneBouclePour(question3) failed
5) test_CompilationDeMult(question3) failed
6) test_CompilationExecutionDeSomme_100(question3) failed
Une remarque : dans les tests
CompilationExecutionDeMult_7_85(question3)
et CompilationDeMult(question3)
nous n'avons pas accès aux valeurs des variables d'initialisation

Ces tests ne fonctionnent effectivement pas en local
sauf si j'ajoute le point virgule à la fin de la ligne assertion
mais avec ce point virgule les test JNEWS dépassent les délais.

Est-ce que ça ne viendrait pas de visite(Assertion) du visiteur java ?

Code : Tout sélectionner

public String visite(Assertion a) {
        return "assert " + a.cond().accepter(this.vb) + " : " + a.message() + ";";
    }

Douin
Messages : 218
Inscription : 18 mars 2009 15:46

Re: TP6 Q3 sequence

Message par Douin » 25 nov. 2016 12:25

Bonjour, il n'y a pas d'assertion dans votre code généré, cela semble être une différence


À suivre

David Bertrand
Messages : 34
Inscription : 20 oct. 2016 13:10

Re: TP6 Q3 sequence

Message par David Bertrand » 25 nov. 2016 12:44

Bonjour,

a.message() est inutile ici, et potentiellement dangereux (dans whileL on ne défini pas de valeur null, ni de chaine de caractères).
Or le constructeur de Assertion n'attend que la condition, this.message n'est pas initialisé ni affecté.

Ça ne coûte rien de tenter sans faire mention du message ...

David
Dernière édition par David Bertrand le 25 nov. 2016 12:50, édité 1 fois.

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 25 nov. 2016 12:47

@Douin :

Oui je me suis trompé dans le copier/coller.
Le code généré et testé est

Code : Tout sélectionner

public class X_Fact2{

  public static void main(String[] args)throws Exception{
    int fact=1;
    int x=5;
while((x > 1)){fact=(fact * x) ; x=(x - 1);} ; assert (fact == 120);
  }

}
Dernière édition par pellier le 25 nov. 2016 12:52, édité 1 fois.

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 25 nov. 2016 12:50

@David Bertrand

et j'ai supprimé e.message() pour avoir

Code : Tout sélectionner

return "assert " + a.cond().accepter(this.vb) + ";";
toujours délais dépassés

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP6 Q3 sequence

Message par pellier » 25 nov. 2016 13:02

Youhou ça fonctionne !
problème avec le else de Selection dans le visiteurJava.

Par contre else n'était utilisé dans aucun des tests qui donnaient des erreurs JNEWS donc je comprends pas trop mais bon…
Merci quand même pour vos conseils.

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité