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 :

pb pour forcer un typage avec caml-light


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut pb pour forcer un typage avec caml-light
    bonjour à tous,

    j'essaye de faire diverses programmations afin de calculer pi de diverses manières et de comparer les temps de réponses selon les algorithmes utilisés et les ordinateurs, seulment j'ai un soucis au niveau d'une fonction auxiliaire: je voudrais l'utiliser avec comme données de départ un floatant et un tableau d'entiers et qu'elle me rende un floatant, or le typage reconnu est
    je voulais forcer le typage en utilisant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let function (a::float) t = ............
    mais j'ai du me tromper d'outil car cela me rend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int_list -> int_vect -> int
    pourriez- vous alors me venir en aide, me dire si je me suis vraiment tromper, ou m'expliquer ce qui fait que cela ne marche pas?...


  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let function (a : float) ...

    pour ce qui est du type entier... il est inféré par le compilateur.

    tu as du utiliser :
    + et non +.
    1 et non 1.0


    enfin un truc du style

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    je n'arrive toujours pas à résoudre le pb
    ma fonction au départ est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let intermediaire a t = 
        let rec tronc k =
            if k = (vect_length t - 1) then a
            else match t.(k) with
        	 |0 -> a
    	 |_ -> tronc((a - t.(k))*10) (k+1)
        in tronc a 0
    ;;
    (je ne pense pas que détailler son utilité soit nécessaire pour trouver l'erreur de typage...non?)
    je l'ai donc repris en faisant attention:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let intermediaire a t =  (* ou encore let intermediaire (a:float) t *)
    	let rec tronc k =
    	if k = (vect_length t - 1) then a
    	else match t.(k) with
    		|0 -> a
    		|_ -> tronc((a -. float_of_int(t.(k)))*.10.) (k+1)
    	in tronc a 0
    ;;
    caml me renvoie alors dans les deux cas

    Cette expression est de type int -> float,
    mais est utilisée avec le type float -> int -> float.
    Où est-ce que je me suis encore trompée?

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    ben tu passes deux arguments à tronc, mais tu l'as définie comme prenant un seul argument ?


    ps: ceux sont des premiers tp de camllight ? t'es en sup ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    c une erreur de copie d'un fichier à l'autre, à force d'y bosser dessus je me mélange les pinceaux
    donc c'est bon mon pb est résolu, merci

    non je suis en spé
    c'est pour mes tipe, j'ai choisi le nombre pi, mais après y avoir travailler dessus, sur plusieurs programmations et idées différentes plusieurs jours de suite, je ne suis pas arrivée à repérer mon erreur dans cette fonction...et ça m'énervait un petit peu, c pour cela que j'ai demandé un peu d'aide....

    merci

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    spé ? MP option info ? quel lycée ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    en MP option info lycée claude fauriel à saint-etienne (42)

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par Moi_Emilie
    en MP option info lycée claude fauriel à saint-etienne (42)

    ok... connais pas

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    encore une question, et après j'arrète l'info jusqu'à demain, ma fonction s'appelle final, quand je veux la tracer caml me renvoie:

    final raises sys__Break

    j'avais jamais eu ça avant, ça correspond à quoi?

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Moi_Emilie
    [...]
    Où est-ce que je me suis encore trompée?
    Tu as deux problèmes.

    Le premier est que, comme l'a indiqué gorgonite, tu as une erreur dans le nombre d'argument.

    Le deuxième c'est que tu utilises ENCORE des entiers dans ton programme.

    tu veux que a soit un réel, mais tu utilises le - qui est une opération sur les entiers. Tu utilises aussi t comme un vecteur d'entiers puisque tu filtres en utilisant 0 qui est un entier.

    C'est 0. le réel correspondant à 0 entier

    Il faut faire attention à ces détails en caml, et il est vrai que c'est fatiguant.

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Moi_Emilie
    encore une question, et après j'arrète l'info jusqu'à demain, ma fonction s'appelle final, quand je veux la tracer caml me renvoie:

    final raises sys__Break

    j'avais jamais eu ça avant, ça correspond à quoi?
    Tu as généré une exception dans le module sys.
    Ceci signifie que tu as « interrompu » le programme (il ne s'est pas terminé de lui même si tu préfères).

    C'est une exception pas une erreur. Il faudrait voir ta fonction final.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Garulfo
    Tu utilises aussi t comme un vecteur d'entiers puisque tu filtres en utilisant 0 qui est un entier.

    C'est 0. le réel correspondant à 0 entier

    Justement c'est bien ce que je veux, ma fonction prend comme variables un float et un vecteur d'entiers, mon filtrage est donc correct, il est bien fait sur des entiers...

    Maintenant ce problème est résolu, mais j'en ai un autre, ma fonction final est composée de 6 sous fonctions (dont intermediaire)qui ont l'air d'être définies correctement puisque independemment elles fonctionnent, le typage renvoyé par caml pour ma fonction final est égalment correct mais quand je la teste avec une valeur simple, rien ne se passe. J'ai donc voulu voir ce qu'elle faisait en détail en utilisant la fonction
    trace"..."
    et il ne se passe strictement rien...
    j'ai alors repris toute ma programmation en la testant à la main par des exemples simples, et je ne voit pas ou ça cloche... ou c'est qu'il peut y avoir une erreur...
    je crois que je reprendrai tout ceci plus tard après mettre un peu reposée, je verrai peut-etre les choses plus clairement...

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Je remet le nez dedans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tronc((a -. float_of_int(t.(k)))*.10.) (k+1)
    Ça va pas ça non plus.
    tronc prend un réel et un vecteur d'entier en théorie, et là tu lui donnes un réel et un entier.
    Ce n'est pas normal donc je suppose ?

    Il faudrait que tu expliques ce que tu veux faire.
    Une difficulté intrasèque de l'informatique est que le code n'est explicite que pour celui ou celle qui le fait. D'où l'importance des explications et des commentaires (au moins 50% du code normalement)...

    Là... ça manque.
    intermediaire et tronc, ça n'est pas non plus des noms de fonctions explicites. Difficile donc de savoir ce qui ne va pas.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    j'essaye d'écrire un fonction qui me permet de calculer pi avec une convergence de 3n/5, autrement dit, après 3n/5 caculs j'obtient n décimales correctes, pour cela j'ai besoin d'une fonction intermédiaire qui me donne une bonne troncature du réel fourni (d'ou tronc) en fonction des décimales correctes déja trouvées et répertoriées dans un tableau.
    Là quand je fais ma reccurence j'ai bien
    mon réel ((a -. float_of_int(t.(k)))*.10.)
    et mon entier (k+1)

  15. #15
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    peux-tu remettre le code de la fonction qui pose problème ?

    ps: sans erreur cette fois-ci

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Moi_Emilie
    j'essaye d'écrire un fonction qui me permet de calculer pi avec une convergence de 3n/5, autrement dit, après 3n/5 caculs j'obtient n décimales correctes, pour cela j'ai besoin d'une fonction intermédiaire qui me donne une bonne troncature du réel fourni (d'ou tronc) en fonction des décimales correctes déja trouvées et répertoriées dans un tableau.
    Là quand je fais ma reccurence j'ai bien
    mon réel ((a -. float_of_int(t.(k)))*.10.)
    et mon entier (k+1)
    Ton erreur est situé dans l'intégration de ton programme (le rassemblement des modules ensembles). Vu qu'on a qu'un aperçu, il est impossible de t'en dire plus.

    Question : pourquoi avoir utilisé un tableau plutôt qu'une liste ? En programmation fonctionnelle, la liste est plus naturelle.

  17. #17
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par Garulfo
    Question : pourquoi avoir utilisé un tableau plutôt qu'une liste ? En programmation fonctionnelle, la liste est plus naturelle.

    d'autant plus que son parcours est fait récursivement...

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    effectivement, utiliser un tableau dans cette fonction intermediaire parait ne pas etre le mieux, seulement dans la programmation final, j'utilise un tableau que je rempli et modifie au fur et a mesure des calculs, j'ai donc besoin à tout moment de connaitre la nieme valeur de ce tableau. C'est pour cela que j'écri intermediaire en utilisant un vecteur, afin de ne travailler que sur un tableau et pas un tableau et une liste, cela m'evite une étape de plus

    je redonne donc la fonction intermediaire mais dans les messages précedents, j'avais précisé que ce n'était plus celle la qui me posait problème (merci de m'avoir aidée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    let intermediaire a t = 
        let rec tronc a k =
    	if k = (vect_length t - 1) then a
    	else match t.(k) with
    		|0 -> a
    		|_ -> tronc ((a -. float_of_int(t.(k)))*.10.) (k+1)
        in tronc a 0
    ;;
    en effet maintenant le typage de ma fonction finale est correcte, et pourtant ne me renvoie aucun résultat, je vais donc reprendre ma fonction a la main pour essayer de trouver l'erreur...

    j'hésite en effet a vous la donner car ce forum étant visité par beaucoup de personne, je ne veux pas que ce que j'ai écri en vue des oraux des concours dans la partie investissement personnelle des tipe soit réutilisé ou copié

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Moi_Emilie
    [...]j'hésite en effet a vous la donner car ce forum étant visité par beaucoup de personne, je ne veux pas que ce que j'ai écri en vue des oraux des concours dans la partie investissement personnelle des tipe soit réutilisé ou copié
    Je vais regarder ça ce soir... -_-

    Cependant tu comprendras que la contre-partie d'être sur un forum c'est de rendre publique ce qu'on fait. Sinon c'est tes profs que tu dois aller voir.

    Partage des connaissances ma chère... et non mentalité restreinte d'école prépa (j'ai connu ça) !! Tu verras tu n'en seras que plus décontractée par la suite

  20. #20
    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
    Citation Envoyé par Moi_Emilie
    encore une question, et après j'arrète l'info jusqu'à demain, ma fonction s'appelle final, quand je veux la tracer caml me renvoie:

    final raises sys__Break

    j'avais jamais eu ça avant, ça correspond à quoi?
    Moi non plus, jamais vu !

    Le sys__Break, ca me fait penser vaguement à l'appel système POSIX sbrk (system break) : c'est un appel système permettant d'allonger le segment de données d'un programme (en gros, avoir plus de mémoire). Ca ne ressemble pas, mais faire de l'allocation dynamique de mémoire... c'est pas simple car le programme démarre avec une quantité figée et limitée de ressources. Caml fait automatiquement appel aux fonctions dédiées pour demander de la mémoire au système ou en redonner (et oui... à l'inverse de malloc !).

    Ce qui me choque et me fait penser que ce que je viens de raconter n'est pas la cause du sys__Break, c'est qu'Objective Caml utilise normalement l'appel POSIX mmap pour gérer la mémoire (si le système le fournit). Peut-être Caml Light utilise-t-il sbrk ? Tiens, c'est intéressant, je jetterai un petit coup d'oeil si je m'en souviens, à l'occasion !

    Peut-être qu'il faudrait en informer l'équipe de développement... mais comme c'est du Caml Light, je ne sais pas s'ils vont s'y intéresser.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème avec caml-light
    Par kazuma dans le forum Caml
    Réponses: 4
    Dernier message: 27/05/2013, 02h08
  2. Images avec caml-light
    Par trodurcamllight dans le forum Caml
    Réponses: 3
    Dernier message: 11/01/2013, 15h36
  3. Problème d'Event avec Caml Light
    Par Soshius dans le forum Caml
    Réponses: 4
    Dernier message: 25/11/2009, 11h37
  4. typage en Caml Light
    Par Bool1988 dans le forum Caml
    Réponses: 4
    Dernier message: 30/08/2007, 17h14

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