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 :

Type unit, type string, match with


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Type unit, type string, match with
    Bonjour à tous !
    Je dois réaliser un projet en Ocaml mias j'ai une erreur que je n'arrive pas à résoudre. Voici la fonction qui comporte cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    let programme = 
      print_string "du texte du texte du texte\n";
      if !Sys.interactive then () else 
        begin 
          Graphics.open_graph "";
          Graphics.resize_window ( !xsize / !preview) ( !ysize / !preview);
          while true do
    	let s = Graphics.wait_next_event[Key_pressed] in
    	  if s.keypressed then match s.key with
    	    |'f'-> string_of_expr !expression_en_cours
    	    |'g'-> if (!colour == true) then (genere_preview_en_couleurs !preview (!xsize,!ysize)) else (genere_preview_en_gris !preview (!xsize,!ysize))
    	    | 's' -> if (!colour == true)
    	      then(sauvegarde_postscript_en_couleurs !expression_en_cours (!expression_rouge,!expression_vert,!expression_bleu) (!xsize,!ysize) !fich)
    	      else(sauvegarde_postscript_en_gris !expression_en_cours (!xsize,!ysize) !fich)
    	    |_->()
    	    |'q' -> raise exit
    	    
          done
        end
    et voila, lors de l'évaluation de cette fonction ou meme de la compilation, j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                                        Characters 845-979:
    This expression has type unit but is here used with type string
    donc sur la ligne en italique dans mon code.
    Pourtant, quand je lance la commande seule dans la boucle interactive, ca fonctionne parfaitement !
    string_of_expr est une fonction que j'ai écrite et expression_en_cours est une variable globale en "ref".

    Il faut aussi dire que quand j'inverse l'ordre des lignes dans la match with, c'est toujours a partir de la 2eme condition que l'erreur interevient, c'est surement une erreur dans le match with mais je ne vois pas laquelle .......

    PS: désolé pour le sujet mais je n'ai vraiment pas su comment décrire ca ...

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Si ça peut aider :

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    |_->()
     |'q' -> raise exit
    lis les commentaires en rouge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    |_-> () (* () est de type unit alors que tout le reste est de type string *)
     | 'q' -> (* ne sera jamais évalué car on a le cas _  avant *)
    Maintenant dans
    le | est de trop car c'est le premier cas.

    Pourquoi écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!colour == true) then
    quand on preut écrire directement
    ?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci de ton aide mais il y a toujours la même erreur...
    J'ai pourtant trouvé le même genre de programme principal (surveillant le clavier), il est écrit exactement de la même manière mais chez moi ca ne marche pas ...

    Si quelqu'un a vraiment envie de m'aider je peux envoyer mon programme en entier.

  4. #4
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    le | est de trop car c'est le premier cas.
    On peut le mettre aussi, par soucis d'uniformité, ce n'est pas gênant.
    quand on preut écrire directement
    Cela n'a pas de sens de dire : si vrai = vrai, ou si faux = vrai, et ce dans n'importe quel langage de programmation. Donc les if(x == true) sont à proscrire.

    Le problème vient du fait qu'à un moment, tu renvoies une chaîne de caractère, et le reste du temps unit (notamment sur la première ligne), ce qui fait que le système de types n'accepte pas l'expression car il ne peut pas déterminer le type de programme. Il faut en effet toujours retourner des valeurs de même type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    let programme = 
      print_string "du texte du texte du texte\n";
      if !Sys.interactive then () else retourne unit : la fonction doit donc retourner une valeur de type unit
        begin 
          Graphics.open_graph "";
          Graphics.resize_window ( !xsize / !preview) ( !ysize / !preview);
          while true do
    	let s = Graphics.wait_next_event[Key_pressed] in
    	  if s.keypressed then match s.key with
    	    |'f'-> string_of_expr !expression_en_cours retourne une string, alors que le système attend une valeur de type unit. Invalide !
    	    |'g'-> if (!colour == true) then (genere_preview_en_couleurs !preview (!xsize,!ysize)) else (genere_preview_en_gris !preview (!xsize,!ysize))
    	    | 's' -> if (!colour == true)
    	      then(sauvegarde_postscript_en_couleurs !expression_en_cours (!expression_rouge,!expression_vert,!expression_bleu) (!xsize,!ysize) !fich)
    	      else(sauvegarde_postscript_en_gris !expression_en_cours (!xsize,!ysize) !fich)
    	    |_->()Ceci doit être le dernier cas !
    	    |'q' -> raise exit
    	    
          done
        end
    Il faut donc t'arranger pour retourner toujours une valeur du même type.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Ok, merci de ton aide, j'ai déjà un petit peu avancé maintenant que je comprends concrétement le message d'erreur. J'ai juste ajouté un print_string mais c'est pas toujours facile de trouver les bons types (surtout unit->unit but unit )

    Edit: Ok c'est bon, j'ai modifié une des fonctions appelée (supprimé un petit close_graph) et ca marche.
    Maintenant, un dernier problème avant de mettre résolu: quand je lance le programme compilé, le texte qui doit s'afficher avant toute chose ne s'affiche qu'une fois le programme terminé (quand on ferme la fenêtre)

  6. #6
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Si cela réponds à ton problème, n'oublies pas : .
    Si tu as un autre problème, postes un nouveau sujet.

    Bon courage.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  7. #7
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    et accessoirement, n'utilise pas ==, c'est du Caml pas du C : l'égalité structurelle c'est un simple = en Caml. L'égalité == est en revanche l'égalité physique, ou celle des pointeurs si tu veux. Prends l'habitude de n'utiliser qu'= quand c'est réellement ce que tu veux (comme ici) ca t'évitera d'utiliser ensuite == par habitude avec des structures plus compliquées que des simples booleens et d'avoir des erreurs a la con.
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  8. #8
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Ok c'est bon, j'ai modifié une des fonctions appelée (supprimé un petit close_graph) et ca marche.
    Maintenant, un dernier problème avant de mettre résolu: quand je lance le programme compilé, le texte qui doit s'afficher avant toute chose ne s'affiche qu'une fois le programme terminé (quand on ferme la fenêtre)
    ajoute :
    après la ligne print_string "du texte...."; que tu remplaces par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print_endline "du texte du texte du texte";
    C'est mieux que print_string avec un \n à la fin de la chaîne.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci à tous, je vous citerai dans le readme Mn générateur de wallpaper fonctionne, si ca vous interesses je peux vous envoyer le code.
    Encore un trés grand merci et les fautes comme le | dès le premier match ou le == c'était pour essayer autre chose vu que ça ne marchait pas. je sais, c'est pas une excuse

    Merci encore et à bientôt pour de nouvelles aventures! ! ! heehaa

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/06/2012, 09h13
  2. reinterpret_cast<type>, static_cast<type> ou (type)?
    Par méphistopheles dans le forum Débuter
    Réponses: 6
    Dernier message: 24/03/2009, 11h12
  3. Réponses: 3
    Dernier message: 06/07/2008, 20h51
  4. [info] passer d'un type primitif a String
    Par soad dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2005, 13h19
  5. [LG]Convertir le type double en string
    Par @tom@ dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2004, 19h20

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