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 :

argument programme --> **argv


Sujet :

C

  1. #1
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut argument programme --> **argv
    Bonjours,

    voilà, je vous explique mon probleme :
    Je veux lancer un script Perl depuis un programme C, et donc j'ai le code suivant :

    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
     
    #include <EXTERN.h>
    #include <perl.h>
     
     
    static PerlInterpreter *my_perl;
     
    int main (/* int argc, char **argv, char **env */)
    {
        char *args[] = { NULL };
        int arg = 1;
     
        char *embedding[] = { "prog.pl" };
     
        my_perl = perl_alloc();
        perl_construct(my_perl);
    	// l'erreur est au niveau de perl_parse.
        perl_parse(my_perl, NULL, arg, embedding, NULL);
    	perl_call_argv("prog", G_VOID | G_NOARGS, args);
        perl_destruct(my_perl);
        perl_free(my_perl);
    }
    Le truc est le suivant : la fonction perl_call_argv appelle une sous routine "prog" qui est situé dans le fichier "prog.pl" (classe perl). Il faut donc spécifié le fichier qui contient "prog.pl". Ce qui normalement est fait en passant la chaine "prog.pl" en argument quand on éxécute le prog.
    C'est la fonction "perl_parse" qui s'en occuppe sous la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     perl_parse(my_perl, NULL, argc, argv, NULL);
    avec bien sur l'entete du main suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int main( int argc, char **argv, char **env)
    Seulement, plutot que de le passer en paramètre à la ligne de commande, je voudrais entrer en dur dans le code C, le nom du fichier ou se trouve la sub routine (prog dans proG.pl si vous me suivez )
    J'ai donc fait les modifications suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *embedding[] = { "prog.c"};
    int arg = 1;
    ...
     
    perl_parse( NULL, arg, embedding, NULL);
    ...
    Ce qui donne le source que j'ai mis tout en haut.

    J'en viens donc au coueur du probleme : pour la compilation et les link, pas de probleme mais osque j'éxéute le prog le message suivant s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    L'instrcution à "0x78012ba1" emploie l'adresse mémoire "0x00000001". La mémoire ne peut pas être read.
    Grrrr méchante machine !!

    Si qqun sait d'où ca peut venir et m'aider je lui en serait tres reconnaissant.

    @+

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    Pourquoi compliquer la chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *embedding[] = { "prog.pl" };
    ?

    Fais donc plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char embedding[] = "prog.pl" ;
    Et, comme c'est une chaine qui a priori ne doit pas bouger, je ferais plutot ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char *embedding = "prog.pl";
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Le pb c'est que le type du troisièeme paramètre de "perl_parse" est char **.

    J'ai modifié ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *embedding[] = { "prog.pl", NULL};
    Et il ne me met plus l'erreur. Par contre, il n'éxécute pas le script shell...

  4. #4
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    euh, le script Perl, excusez moi

  5. #5
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Bon ben en fait j'ai trouvé (ouf!)

    Il suffisait de modifier ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *embedding[] = { "", "prog.pl" };

    Merci.
    @+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    A priori perl_parse utilise argv donc le premier paramètre est argv[1] et pas argv[0]. Ton embedding devrait donc être :
    char *embedding[] = { "", "prog.pl"};
    - Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
    - Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
    JC Vandamme.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par kij
    Bon ben en fait j'ai trouvé (ouf!)
    Bon .. j'ai répondu trop tard
    - Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
    - Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
    JC Vandamme.

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

Discussions similaires

  1. Arguments programme avec pipe
    Par pepsi33 dans le forum C
    Réponses: 0
    Dernier message: 05/07/2010, 19h20
  2. modifier arguments programme
    Par sone47 dans le forum C
    Réponses: 3
    Dernier message: 25/07/2007, 11h55
  3. Comment passer un argument a un programme et le recuperer
    Par Geant Vert dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/02/2006, 16h32
  4. [Debutant ] Test des arguments du programme
    Par peaceinpal dans le forum C
    Réponses: 2
    Dernier message: 09/10/2005, 13h20
  5. [Apis]parser les arguments d'un programme Java
    Par sacofan dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/08/2005, 14h32

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