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 :

Programmation graphique (OcamL)


Sujet :

Caml

  1. #1
    Invité
    Invité(e)
    Par défaut Programmation graphique (OcamL)
    Bonjour,

    il s'agit encore une fois d'un programme que je souhaiterais faire tourner pour mon TIPE.

    Celui-ci consiste à programmer un flux de voitures sur une route droite, sans entrée ni sortie.
    Je représente ainsi la route par une matrice.

    J'ai déjà commencé, et bien avancé la 1ère partie du travail, c'est-à-dire le programme qui à partir d'une certaine matrice, remplie de valeurs (voulant dire "case occupée" ou "case voiture" ou "case camion", ce genre de choses), renvoie une autre matrice, qui correspond à l'avancée de tous les véhicules.

    Ce qui me reste à faire, et me bloque, car nous n'avons pas eu de cours là-dessus, est la programmation de la représentation graphique des différentes matrices.
    C'est-à-dire représenter la matrice, avec les cases de différentes couleurs, et en appuyant sur une touche, afficher la matrice qui suit.

    Je vous remercie d'avance, soit des indications, soit des liens, possible que j'ai pu rater un post qui traitait justement du même sujet, je m'en excuse d'avance

    Cordialement,
    Nicolas.

  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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par mton062 Voir le message
    J'ai déjà commencé, et bien avancé la 1ère partie du travail, c'est-à-dire le programme qui à partir d'une certaine matrice, remplie de valeurs (voulant dire "case occupée" ou "case voiture" ou "case camion", ce genre de choses), renvoie une autre matrice, qui correspond à l'avancée de tous les véhicules.

    pourquoi ne pas faire le traitement sur la matrice ?
    des enregistrements avec des champs mutables te feraient sans doute gagner pas mal de perfs

    Citation Envoyé par mton062 Voir le message
    Ce qui me reste à faire, et me bloque, car nous n'avons pas eu de cours là-dessus, est la programmation de la représentation graphique des différentes matrices.
    normalement, tout prof de prépa essaie de présenter sommairement le module Graphics
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ahh, merci pour l'idée des enregistrements !
    Il est vrai que nous n'avons pas trop fait de programme à l'aide de ceux-ci, mais je vais me renseigner activement sur la question.

    Quant au module Graphics, vu le prof qu'on a eu, ça a été présenté très très sommairement !!
    On va dire que je saurais écrire Graphics.cma,
    mais après c'est le grand vide
    Dernière modification par gorgonite ; 29/05/2008 à 19h15.

  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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Invité
    Invité(e)
    Par défaut
    Comme par hasard, les statistiques comparatives aux concours entre Info et SI est assez en faveur de la SI pour notre lycée ^^
    Un seul prof d'informatique

    M'enfin on peut toujours se débrouiller, avec un peu de temps.


    EDIT gorgonite : fallait me répondre par MP... de très loin, certains auraient pu parler de diffamation, ou ton prof aurait pu te chercher des noises

  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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    <mode troll>
    forcemment avec un lycée pareil... tout dans le nom, rien dans le prof
    </mode>


    je n'ai jamais connu de MP info venant de ce lycée... c'est peut-être un signe
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  7. #7
    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 mton062
    On va dire que je saurais écrire Graphics.cma,
    mais après c'est le grand vide
    Les profs d'info en prépa sont là pour enseigner les

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let e = 3 in e + 2
    ou encore, plus osé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let rec fact n = if n = 0 then 1 else n * (fact ( n - 1))
    ou, soyons fous, des programmes en O(n^(n*exp(n)^(N_IMPORTE_QUOI_A_LA_QUARANTIEME_PUISSANCE)))...

    Malheureusement, les quelques vrais profs n'ont pas la liberté d'enseigner ce qui devrait être enseigné : ils ont pour consigne de s'en tenir au programme... et vu le gros crétin au ministère qui fait pression depuis des années et des années, on n'est pas sorti de l'auberge !

    De façon plus générale, pour apprendre à programmer, il n'y a qu'une seule façon, et c'est la seule bonne : apprendre tout seul et passer des nuits entières sur des problèmes que l'on trouvera, avec de l'expérience, triviaux. Ni plus ni MOINSSSSE (comme on dit ici à Toulouse).
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Mais en quoi exactement les enregistrements sont-ils plus simples dans ce programme-là ?
    Je vais regarder un peu ce que ça change, mais ne maîtrisant pas tellement les enregistrements... quoiqu'en regardant des cours sur internet, ça ne m'a pas l'air très compliqué d'accès

  9. #9
    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
    Les enregistrements ("articles" pour les puristes) sont des n-uplets doont les champs sont nommés : pour accéder à un élément, on peut utiliser son nom de champ, tout de même plus pratique que la solution classique où il faut filtrer à la main avant d'espérer récupérer quelque chose.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  10. #10
    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
    Ce dont il parlait dans ton cas précis, c'est pas d'une différence de simplicité mais d'une différence de rapidité : au lieu de recréer tout un tableau plein de nouveaux objets, tu peux essayer de modifier chaque objet pour contenir la nouvelle valeur.

    Quand on peut faire ça, c'est en effet plus rapide. Le problème c'est que c'est plus sensible aux bugs, et surtout que dans la plupart des cas tu ne peux pas, parce que tu as besoin de l'état précédent de tous les agents quand tu "mets à jour le système" (et donc si tu commences à en modifier une partie, ceux de la fin n'ont plus accès à l'état précédent, et sont donc modifiés incorrectement).

    Bref, c'est une décision à prendre, mais je te conseille plutôt pour ma part de rester à quelque chose de simple et avec le moins de modifications possibles pour l'instant, quitte à changer ensuite si tu constates des problèmes de performances.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Et bien merci pour les différentes indications, je vais rester finalement comme j'avais fait au départ, pour éviter de remodifier tous les programmes

    Autre question :
    J'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let matApres = ref (Matrix.make m+6 n False)
    (m et n étant donnés).

    Si après, je veux modifier les cases de matApres une à une, qu'est-ce que je dois utiliser ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     !matApres.[i].[j] := valeur
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     matApres.[i].[j] <- valeur
    ou tout simplement aucune des 2 ? ^_^

  12. #12
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par mton062 Voir le message
    je vais rester finalement comme j'avais fait au départ, pour éviter de remodifier tous les programmes
    cela signifie que n'a pas fait assez modulaire


    Citation Envoyé par mton062 Voir le message
    Autre question :
    J'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let matApres = ref (Matrix.make m+6 n False)
    (m et n étant donnés).

    Si après, je veux modifier les cases de matApres une à une, qu'est-ce que je dois utiliser ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     !matApres.[i].[j] := valeur
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     matApres.[i].[j] <- valeur
    ou tout simplement aucune des 2 ? ^_^
    dès le départ tu as faux... inutile de faire une référence matrice

    et je crois bien que la syntaxe est plutot celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matApres.(i).(j) <- valeur
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ah oui, je crée juste ma matrice, et remplace ses cases au fur et à mesure...
    Oui c'est vrai ! Merciiii

  14. #14
    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
    dès le départ tu as faux... inutile de faire une référence matrice
    Euh, il y a plusieurs manières de faire (par exemple avec un tableau modulaire de taille 2, du genre une référence tour_courant et map.(!tour_courant mod 2).(x).(y), et .((!tour_courant + 1) mod 2) pour l'état précédent), mais l'idée d'une référence sur une matrice ne me paraît pas idiote :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let old_map = ref (Array.make_matrix ...)
    let cur_map = ref (Array.make_matrix ...)
     
    let () = for iteration = ... do
      (* son code avec !cur_map.(x).(y) <- ... *)
      old_map := !cur_map
    done
    Ça me paraît pas spécialement mauvais comme manière de faire, en tout cas conceptuellement c'est pas une mauvaise idée.

    On peut même carrément échanger old_map et cur_map à la fin, pour avoir une matrice (old_map, déjà utilisée mais on regarde pas les valeurs) déjà allouée dans old_map.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bon, moi qui pensait que mon tout premier programme marcherait forcément, je suis bien déçu ^^

    Celui-ci a uniquement pour but de compter le nombre d'apparitions d'un certain élément dans un tableau.

    Ca donne pour moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let nbre elem tab =
      let nb = ref 0 and i = ref 0 in
        while !i <= Array.length tab do 
          (if tab.[!i] = elem then incr nb;
           incr i)
        done;
      nb
    ;;
    Le problème est apparemment au niveau de tab.[!i] ... soit disant que j'utilise l'expression tab comme un string.

    Je pense que le problème est simple à régler, et si ça se trouve, il y a déjà un programme du genre dans le répertoire CamL

  16. #16
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Salut,

    D'une part tes bornes sont mauvaises, tu risques un segfault (tu tentes d'accéder à l'élément après le dernier élément du tableau), et puis c'est pas des crochets qu'il faut mettre, mais des parenthèses pour les tableaux : tab.(i).

    Une version plus fonctionnelle et plus simple, moins sujette aux bugs de ta fonction :

    Code Caml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let nbre elem tab = Array.fold_left
        (fun nb x -> if x = elem then nb+1 else nb) 0 tab

  17. #17
    Invité
    Invité(e)
    Par défaut
    Merci Hanlee

    Pourrais-je juste savoir ce que signifie le Array.fold_left ?

  18. #18
    alex_pi
    Invité(e)
    Par défaut
    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
     
    # let count elt tab =
      Array.fold_left (fun count e -> if e = elt then count +1 else count) 0 tab;;
     
    val count : 'a -> 'a array -> int = <fun>
     
     
    # let a = [|1;2;3;4;5;1;1;2|];;
     
    val a : int array = [|1; 2; 3; 4; 5; 1; 1; 2|]
     
     
    # count 1 a;;
    - : int = 3
    # count 3 a;;
    - : int = 1
    Ah, le fonctionnel !


    (EDIT] : grrr, je me suis fait doubler !

  19. #19
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    De manière informelle, à partir d'une graine (ici 0), tu manges les éléments de ton conteneur un par un, pour fabriquer un nouvel élément à chaque fois.

    Imagine que tu as un tableau qui contient les valeurs [a;b;c;d;e] de type A, une fonction binaire de B -> A -> B, qu'on notera +, un élément neutre noté nil.

    Alors fold_left du tableau avec + et l'élément neutre nil retourne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nil + a + b + c + d + e
    par associativité à gauche, c'est à dire plus exactement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((((nil + a) + b) + c) + d) + e)
    fold_right c'est la même chose, mais avec une associativité à droite.

    @alex_pi : et bam!

  20. #20
    Invité
    Invité(e)
    Par défaut
    Ca ressemble un peu au principe de la récursivité pour les listes...
    Enfin je note ça à mes connaissances, j'espère savoir le réutiliser

    Bon imaginons que je veuille créer un programme qui somme tous les éléments d'un tableau, ça donnerait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let sommeTab tab = Array.fold_left (ou right)
       (fun nb x -> ..........................) 0 tab
    ;;
    En fait là je vois pas trop quoi mettre à la place des pointillés.
    Je n'ai pas besoin de ce programme, mais au moins pour comprendre l'utilisation de cet arrayfoldleft ^^

Discussions similaires

  1. [GraphDev] Langage de programmation graphique
    Par shaman99 dans le forum Autres langages
    Réponses: 2
    Dernier message: 18/05/2006, 01h22
  2. Programmation graphique en mode 12h
    Par tchingoo dans le forum Assembleur
    Réponses: 1
    Dernier message: 16/06/2005, 22h45
  3. Programmation graphique ... SDL ??
    Par Franck.H dans le forum C
    Réponses: 9
    Dernier message: 29/04/2004, 20h51
  4. Réponses: 3
    Dernier message: 15/03/2004, 00h55
  5. Programmation Graphique VESA
    Par rulianf dans le forum C
    Réponses: 5
    Dernier message: 30/06/2003, 20h31

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