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

C Discussion :

executer une chaine de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut executer une chaine de caractères
    Bonjour!

    J'aimerais savoir si il y a une fonction en c qui traduit une chaine de caractère en commande :

    J'ai trouvé l'équivalent en scilab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    La fonction evstr() permet de convertir une chaîne de caractères en une expression : -->c='sqrt(3)/2'
    c = sqrt(3)/2 -->d=evstr(c)
    d = .8660254
    N'y a t'il pas l'équivalent en C ?

  2. #2
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Salut,

    Ce que tu cherches est un interpréteur de commandes, il n'y a rien dans l'API qui te permette de faire ça directement.
    Par contre, il y a beaucoup d'interpréteurs dispo sur le net. Si tu cherches seulement à interpréter/évaluer des expressions mathématiques, tu peux essayer avec libmatheval.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut
    NOn ça ne peut pas m'aider :/
    Mon problème plus exactement est le suivant :
    à partir de programmes.c toujours définit de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*fonction.c*/
    void fonction(structure_crée_par_moi p, int n){...}
    Je suis censée proposer à l'utilisateur d'executer cette fonction (à partir d'un programme contenant le main). On doit le faire dynamiquement pour que si on rajoute une nouvelle fonction de ce type, le menu se mette à jour automatiquement.
    Pour ce faire, j'arrive à lire les noms des fonctions dans le dossier, les proposer à l'utilisateur, puis insérer dans une chaine de caractère son choix (var = fonction(p, n)) mais j'aimerais l'executer...

    Y a t'il un moyen ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    Tout d'abord il faut que tes fonctions soit compiler. Par conséquent dans ton fichier de fonction tu dois avoir des executables. Ensuite pour les exécuter il te faut faire un execvp (ou consort http://linux.die.net/man/3/execvp).

    En fait, si j'ai bien compris tu veux faire un gestionnaire de plugin en C ?

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut
    oui la compilation est déjà faite.

    Si je tape dans mon main "fonction(p, n);" la fonction se lance bien, le problème est la traduction de la chaine de caractère en commande c :

    J'ai déjà essayé les execllp, vp etc. mais ça n'a pas marché (ça retourne toujours "-1" et ne lance pas le programme).
    Du coup j'avais regardé sur internet, et il m'a semblé que execlp ne lance que des scripts shell non ?
    Pour moi ce n'est pas faisable parce que les paramètres sont des chaines de caractères or moi je veux transmettre d'autres types...
    Je pense que j'ai très mal compris ces fonction "exec", le problème est que sur internet je n'ai trouvé que des exemples avec des commandes shell (par exemple ls -l)

    J'avais testé :
    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
    21
    22
    url = getwd(NULL); //affiche bien l'url jusqu'au bon dossier
    	if(choice>=0 && choice<=cptBis){
    		printf("CHOIX : %s\n", tabChoix[choice]); //c'est ici qu'est stocké la chaine "fonction.c"
    		totPath = (char*)malloc((strlen(url)+strlen(tabChoix[choice]))*sizeof(char));
    		for(i=0;i<strlen(url)+strlen(tabChoix[choice]+1);i++){
    			if(i<strlen(url)) totPath[i]=url[i];
    			   else if(i==strlen(url)) totPath[i] = '/';
    					   else totPath[i]=tabChoix[choice][i-strlen(url)-1];
    		}
    		printf("ecriture du path : %s\n", totPath); // ecrit tout le chemin : "~/.../programme.c"
    		tabChoix[choice][strlen(tabChoix[choice])-2]='\0';
    		printf("prog : %s\n", tabChoix[choice]); //enleve le ".c" 
    /*ici j'ai donc : 
    totpath =~/.../programme.c
    tabChoix[choice] = programme
    arg1 correspond à une structure crée par moi
    arg2 un entier
    */
    		if(execl(totpath, tabChoix[choice], arg1, arg2, NULL)==-1){	
    			puts("erreur execlp");
    		}
    	}
    ça m'affiche toujours le message d'erreur :/
    Pouvez vous me dire où je me trompe ?

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Il y a une façon de faire que j'ai quelquefois utilisée, c'est un vrai interpréteur de commande, assez rudimentaire mais efficace. En premier lieu, les données d'une fonction, c'est à dire son nom et son pointeur. Il faut ensuite un tableau de ces structures contenant les données de ces fonctions (nom et pointeur). tu remplaces bien sûr les "dummy" par les nom de tes fonctions.

    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
    21
    22
    typedef struct
    {
        unsigned char Name[16];
        int ( *Run ) ( void );
    }CommandStruct;
     
     
    int dummy(void)
    {
        return 0;
    }
     
    CommandStruct COMMANDS[] =
    {
        {"add", dummy},
        {"sub", dummy},
        {"mul", dummy},
        {"div", dummy},
        {"", NULL}/* pour detecter la fin des commandes */
    };
     
    char user_buf[80];
    Il te faut aussi la saisie de l'utilisateur, on va dire que tu vas te débrouiller pour la stocker dans user_buf. prenons une exemple de ce que l'on pourrait trouver dans ce buffer:
    Il faut maintenant (et c'eszt peut-être la partie la plus délicate) un parser qui extrait les mots un à un, appelons-le
    Tu appelles getWord et tu récupères le premier mot, "add". Il n'y a plus qu'à balayer la liste de structures et comparer avec strcmp. Si tu trouves une correspondance avec un nom, tu as du même coup le pointeur de fonction à utiliser. Dans ta fonction add, tu appelles 2 fois getWord pour récupérer "33" et "45". Après les avoir transformé de chaines vers entiers ou flottants, tu fais ton addition et tu affiches ou tu stockes. Bon courage.

    A+

    Pfeuh

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. [WD16] Executer formule contenu dans une chaine de caractère
    Par J0r_x dans le forum WinDev
    Réponses: 1
    Dernier message: 02/11/2011, 14h39
  3. Réponses: 2
    Dernier message: 14/12/2007, 01h11
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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