Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1530 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Php et Ocaml

 

 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Php et Ocaml

n°1018575
goodspirit
Posté le 19-03-2005 à 19:21:53  profilanswer
 

Salut
Pour un projet de TIPe, je cherche a communiqué entre PHP et OCaml : je m'explique :
Je voudrais que l'utilisateur entre des entrées, que Caml résoud le problème et que php affiche le résultat sur une page html.
J'ai pensé a ce que le fichier php créé (ou modifie plus exactement) mon fichier test.ml, puis qu'il lance la complation grace a la commande exec(ocamlc -o test.ml ...). J'obtiendrais ainsi un fichier executable. Il me faut alors lire les informations qui sortent de ce ficier executable par php et les traitées... Je voulaus éssayé par exec aussi, mais je n'y arrive pas (cf sujet [php] 66467).
 
Existe t-il une manière plsu simlpe de communiqué entre php et OCaml ou quelqu'un peut-il m'aiguiller sur une alternative a ma tentative?
Merci d'avance ...

mood
Publicité
Posté le 19-03-2005 à 19:21:53  profilanswer
 

n°1018941
el muchach​o
Comfortably Numb
Posté le 20-03-2005 à 13:31:22  profilanswer
 

Je ne vois pas l'interet de compiler ton prog ocaml a la volee. Tu compiles une bonne fois pour toutes et tu appelles l'exe genere via PHP avec les parametres qui vont bien. C'est pas plus complique que ca.

n°1020058
goodspirit
Posté le 21-03-2005 à 19:08:59  profilanswer
 

mais je ne sais pas comment envoyé des paramétres a un programme caml d"ja compilé. Peux-tu m'expliqué stp?
Sinon, j'ai quand même du mal à récupéré le retour avec php

n°1020343
goodspirit
Posté le 21-03-2005 à 22:40:46  profilanswer
 

Je réussi a ratrappé le retour, mais comment peut-on envoyé des paramètres en entrée d'un fichier déja compilé stp? (ca m'éviterais pas mal de ligne de code ;) ...

n°1020359
Pillow
'cos the trees won't talk
Posté le 21-03-2005 à 22:57:03  profilanswer
 

goodspirit a écrit :

Je réussi a ratrappé le retour, mais comment peut-on envoyé des paramètres en entrée d'un fichier déja compilé stp? (ca m'éviterais pas mal de ligne de code ;) ...

Soit tu passes tes paramètres en arguments quand tu appelles ton programme [:petrus75], soit tu utilises des sockets [:spamafote]  

n°1020492
goodspirit
Posté le 21-03-2005 à 23:42:37  profilanswer
 

oui, ca j'avais bien compris mais ma question consistait surtout a savoir comment les arguments sont-ils récupérer par le programme Caml (comment faire mon programme caml et que passer en argument pour qu'il l'utilise?) (Désolé, je suis moins bon en Caml qu'en php et j'ai conscience que ce post traite maintenant plus de Caml que de php)

n°1020541
Pillow
'cos the trees won't talk
Posté le 22-03-2005 à 00:18:10  profilanswer
 

goodspirit a écrit :

oui, ca j'avais bien compris mais ma question consistait surtout a savoir comment les arguments sont-ils récupérer par le programme Caml (comment faire mon programme caml et que passer en argument pour qu'il l'utilise?) (Désolé, je suis moins bon en Caml qu'en php et j'ai conscience que ce post traite maintenant plus de Caml que de php)


(ça tombe très bien, je ne connais rien du tout au php [:petrus75] )
 
Les arguments sont dans Sys.argv. C'est une array (de string), donc tu peux avoir le nombre d'arguments avec

Code :
  1. Array.length Sys.argv;;

Pour récupérer le premier argument:

Code :
  1. Sys.argv.(1);;

(c'est la même chose que Array.get Sys.argv 1)
 
Tu peux bien sûr faire un open Array;; au début si tu ne veux pas te taper le "Array.bidule" et utiliser directement "bidule" :o  
 
Je ne sais pas trop quel est ton niveau, donc un petit exemple bien détaillé:

Code :
  1. open Array;;
  2. open Sys;;
  3. (* pour l'exemple, je vais considérer que tu passes en argument deux entiers *)
  4. (* traiter prend deux strings contenant un nombre en argument et retourne une
  5. * string contenant le résultat *)
  6. let traiter x y =
  7.     let a = int_of_string x in
  8.     let b = int_of_string y in
  9.     (* ici tu fais ton gros calcul très compliqué *)
  10.     let resultat = a + b in
  11.     string_of_int resultat
  12. ;;
  13. (* on n'a plus qu'à récupérer les arguments *)
  14. if length argv > 2
  15.    (* et à afficher le résultat après l'avoir calculé *)
  16.    then print_endline (traiter argv.(1) argv.(2));;


Bien sûr, tu n'es pas obligé d'utiliser une demi douzaine d'identifiants pour rien, tu peux vérifier que les arguments passés à "traiter" sont corrects (int_of_string lève une exception si ce n'est pas le cas, tu peux l'attraper avec try...with), tu peux passer toutes tes variables en un seul argument (en utilisant des guillemets) puis parser à coup de Scanf.sscanf [:petrus75], etc...
 
Et là normalement:

$ ./le_nom_du_programme 12 15
27


 
Si veux apprendre un peu l'ocaml, tu peux en trouver la référence sur le site du langage, et parcourir ce bouquin.

n°1021657
goodspirit
Posté le 23-03-2005 à 00:57:06  profilanswer
 

Merci beaucoup, ta réponse est très précise et claire, c'est parfait. Je vais testé ca dès que possible et te dire quoi. Merci...

n°1021663
goodspirit
Posté le 23-03-2005 à 01:09:26  profilanswer
 

ok, ca marche, j'arrive a récupéré mes arguments.
Cependant, j'ai pas compris ce passage de ta réponse : existerait-il une méthode simple pour récupéré plusieurs arguments (j'ai 48 entiers a passer en arguments mais je peux utiliser Sys.argv.(1);; ... Sys.argv.(48);; puisque l'ordre et rigoureux et je n'ai à les utiliser qu'une seule fois dans le programme.

Pillow a écrit :

(ça tombe très bien, je ne connais rien du tout au php [:petrus75] )
Bien sûr, tu n'es pas obligé d'utiliser une demi douzaine d'identifiants pour rien, tu peux vérifier que les arguments passés à "traiter" sont corrects (int_of_string lève une exception si ce n'est pas le cas, tu peux l'attraper avec try...with), tu peux passer toutes tes variables en un seul argument (en utilisant des guillemets) puis parser à coup de Scanf.sscanf [:petrus75], etc...


En tout cas, merci beaucoup, ca me simplifie pas mal le travail...

n°1021669
Pillow
'cos the trees won't talk
Posté le 23-03-2005 à 03:03:47  profilanswer
 

goodspirit a écrit :

ok, ca marche, j'arrive a récupéré mes arguments.
Cependant, j'ai pas compris ce passage de ta réponse : existerait-il une méthode simple pour récupéré plusieurs arguments (j'ai 48 entiers a passer en arguments mais je peux utiliser Sys.argv.(1);; ... Sys.argv.(48);; puisque l'ordre et rigoureux et je n'ai à les utiliser qu'une seule fois dans le programme.
 
En tout cas, merci beaucoup, ca me simplifie pas mal le travail...

Ce que je disais, c'est que tu pourrais par exemple appeller ton programme comme ça :

Code :
  1. mon_programe "8 6"


Et ensuite récupérer les données comme ça:

Code :
  1. let mes_donnees = Scanf.sscanf Sys.argv.(1) "%i %i" (fun a b c-> [a; b]);;
  2. (* mes_donnees est dorénavant la liste [8; 6]

L'intérêt? Il n'y en a pas. Je voulais juste montrer qu'il y a d'autres possibilités [:petrus75]  
 
Je voulais aussi souligner que si par malheur un de tes arguments n'est pas un entier, l'application s'arrêtera. Dans ton cas il y a probablement très peu de chances que ça se produise et ce ne serait certainement pas vraiment grave, mais si on voulait être complet on traiterait le cas. Comme ça:  

Code :
  1. try
  2.     (* tout les exceptions levées dans ce bloc pourront être traitées avec le
  3.     * with *)
  4.     let a = int_of_string x in
  5.     let b = int_of_string y in
  6.     print_int (a + b);
  7.     print_newline ()
  8. with (* Ici on rattape les exceptions en utilisant le filtrage *)
  9.   _ -> print_endline "Oulalah il y a une erreur!!"

L'underscore (_) signifiant qu'on rattrape toutes les exceptions, mais je suppose que tu savais déjà ça. Bien sûr on peux faire tout ce qu'on veut quand on rattrape une exception, et on peut faire un traitement séparé pour chaque exception:

Code :
  1. with
  2.   Failure "int_of_string" -> print_endline "La chaine n'était pas un entier"
  3.   | Invalid_argument _ -> (
  4.       print_string "argument invalide! Pour la peine je vais écrire 25 000 000";
  5.       print_endline " fois \"foo\" à l'écran et je lève une exception.  ";
  6.       ecrire_foo 25000000;
  7.       raise (Failure "Attrape moi si tu peux!" )
  8.   )

Bref, je crois que j'ai un peu digressé :whistle:  
 
 
J'imagine que tu sais déjà ça, mais au cas où : pour transformer tes 48 arguments en entiers, l'idéal serait de faire un tableau et une boucle:

Code :
  1. let donnees = Array.make 48 0;; (* un tableau de 48 éléments, qui valent tous 0 *)
  2. for i=1 to 48
  3. do
  4.     donnees.(i-1) <- int_of_string Sys.argv.(i);
  5. done;;

Ensuite tu peux bien sûr utiliser les données à coup de donnees.(0), donnees.(1), etc.
A la rigueur si ton traitement est simple (par exemple, faire l'addition de tous les paramètres) tu peux te passer de cette étape.
 
 
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Php et Ocaml

 

Sujets relatifs
CSS et PHP[PHP] Chargement page
[ Pocket PC ] gestion des code barre et PHP ?[Help] intreface en PHP sur mon FTP
[PHP + bd mysql] Supprimer le champ de ma table[PHP] envoie fichier pb
[topic unik] [PHP] Existe t-il une fonction qui....?PHP : vérifier si des caractères sont alphanumériques
[C & HTML] Du C de l'HTML et p-e du Php, j'ai besoin d'aide...inclusion conditionnelle en PHP?
Plus de sujets relatifs à : Php et Ocaml


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR