IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[Caml Light] Subtilitées


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut [Caml Light] Subtilitées
    Bonsoir à tous,

    Je suis en train d'écrire un programme qui décompose une application de vecteurs en produit de cycles. Néanmoins, quelque chose m'échappe.

    En effet, en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    let decomp (v:int vect) = let v',r = copy_vect v,ref 0 in
    for k=1 to (vect_length v - 1) do 
    if v.(v'.(k-1)) <> v'.(!r) then
    v'.(k) <- v.(v'.(k-1))
    else v'.(k) <- v.(k-1) done;  
    v';;
    et en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let decomp (v:int vect) = let v',r = copy_vect v,ref 0 in
    for k=1 to (vect_length v - 1) do 
    if v.(v'.(k-1)) <> v'.(!r) then
    v'.(k) <- v.(v'.(k-1))
    else v'.(k) <- v.(k-1); r:=k done;  
    v';;
    Je n'obtiens pas le même résultat, et je ne comprend pas en quoi le changement de r fait varier l'instruction précédente...
    Si elle a un effet, comment puis je faire pour d'abord effectuer le changement dans le vecteur,
    c'est à dire

    puis après changer la valeur de r.

    Merci d'avance,

    Remmal.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Si ca peut aider, j'ai utilisé le vecteur [|1;2;4;3;0|] pour tester les deux codes.

    Avec le premier on obtient [|1; 2; 4; 0; 3|] qui est le bon résultat, et avec le seconde on obtient [|1; 2; 4; 0; 1|]... Ce qui me semble, comme dit plus haut, étrange,

    Remmal.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    C'est une erreur syntaxique liée à la priorité de "if .. then .. else" et de ";" :
    (if a then b else c; d) veut dire ((if a then b else c); d) et non pas (if a then b else (c; d)).

    Pour ne pas se tromper, il faut donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if blah
    then foo
    else bar;
    baz
    Dans ton cas (tu veux obtenir l'effet inverse) il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else (v'.(k) <- v.(k-1); r:=k)
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else begin
      v'.(k) <- v.(k-1);
      r:=k
    end
    Sinon l'instruction (r := k) est exécutée dans tous les cas (branche "then" comme branche "else").

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Ah super, merci beaucoup pour ces précisions !!

    Remmal.

  5. #5
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Je complèterai la remarque de bluestorm en précisant qu'une présentation et une indentation correcte de ton code te permet de voir ce genre de problème au premier coup d'oeil. Aussi, ne joue pas trop au sorcier avec les parenthèses ouvrantes et fermantes... Caml Light et OCaml n'ont pas la même façon de les traiter, et, de plus, la grammaire de Caml possède, de mémoire, une quarantaine de conflits. Tu deviendras donc chauve le jour où, dans un code de quelques pages, tu voudras trouver un bug causé par une de ces parenthèses mal placées. Il convient donc de protéger au maximum les expressions, comme ici...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    let decomp (v:int vect) =
        let (v', r) = ((copy_vect v), (ref 0)) in
     
        for k = 1 to ((vect_length v) - 1) do 
            if v.(v'.(k - 1)) <> v'.(!r) then
                v'.(k) <- v.(v'.(k - 1))
            else
                (v'.(k) <- v.(k - 1);
                r := k)
        done;  
     
    v'
    ;;
    Autre chose, si tu pouvais ne pas utiliser Caml Light, se serait beaucoup mieux !
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    L'utilisation de Caml Light est imposé par les programmes officiels, et surtout par notre professeur...

    En tout cas je tiens bien compte de tes remarques, je pense que pour l'instant je vais privilégier l'utilisation de "begin ... end" quitte à ce que cela soit un peu lourd, et quitte à les remplacer, une fois le programme testé, par des parenthèses.

    En tout cas grand merci pour vos réponses rapides et précises,

    Remmal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. programmation en caml light
    Par sicav dans le forum Caml
    Réponses: 36
    Dernier message: 20/04/2007, 22h27
  2. [Caml Light] Nombre de bits
    Par Nilss dans le forum Caml
    Réponses: 4
    Dernier message: 23/03/2007, 20h32
  3. [Caml Light] Librairie 'graphics" et Linux
    Par paf le chiot dans le forum Caml
    Réponses: 11
    Dernier message: 16/03/2007, 18h16
  4. Typage Caml light (je suis totalement perdu!)
    Par ficarre dans le forum Caml
    Réponses: 11
    Dernier message: 24/02/2007, 14h42
  5. Réponses: 3
    Dernier message: 07/12/2006, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo