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 :

Changer l'execution du programme depuis le main


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Par défaut Changer l'execution du programme depuis le main
    Bonjour,

    Je viens de terminer un bout de code que je lance dans un terminal linux (debian je crois) grâce aux 2 commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc monProg.c
    ./a.out
    Il m'est demandé de modifié le main de mon programme de manière à exécuter non plus avec ./a.out mais quelque chose du genre:

    ./sauve nom_fichier.xls N

    J'ai compris que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void main (int argc, char *argv[]){ return 0;}
    permet de passer des arguments au main, mais je ne comprends pas comment changer l'appel de ./a.out en ./sauve

    Quelqu'un pourrait m'expliquer?

  2. #2
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2013
    Messages : 11
    Par défaut
    Ce que tu pourrais faire serais de compiler comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o executable ton_programme.c
    ce qui va va creer un "executable" du nom excutable a partir de ton_programme.c
    et tu le lance comme ça :
    c'est ce que je fais pour compiler sur mint et qui devrais marcher pour toi

    j'espère que c'est ce que tu voulais

  3. #3
    Membre très actif
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Par défaut
    C'est exactement ça! Merci!

  4. #4
    Membre très actif
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Par défaut
    Je ne parviens pas à compiler...

    J'ai rajouté dans le main de quoi récuperer les argument du main, a savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char NomFichier[1]= argv[0];
    Aff(argv[1],FICHIER);
    et ça plante. initialisation invalide et "passing argument 1 of 'Aff' makes integer from ponter without a cast [enable by default]

    Une manip m'échappe...

  5. #5
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2013
    Messages : 11
    Par défaut
    pourquoi tu veut récupérer les arguments du main ?
    je crois qu'ils ne servent qu'au compilateur (pas sur)

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Apparemment Aff() attend un entier comme premier argument et pas un pointeur.

  7. #7
    Membre très actif
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Par défaut
    Oui la fonction attend un entier. Mon problème est de lui transmettre!

    Voici mon main:
    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
    23
    24
    25
    26
    27
    28
    29
     
    int main(int argc, char *argv [])
     
    {
       // Declaration
      char NomFichier[30];
      unsigned int nb, N=&argv[1];
     
      NomFichier=&argv[0];
     
      // Pointeur de réf
      FILE * FICHIER;
     
      /*Ouverture du nouveau fichier en ecriture*/
      FICHIER = fopen(NomFichier, "w");
     
      //Programme
      Aff(N,FICHIER);
      /*Fermeture du fichier ouvert en ecriture*/
      fclose (FICHIER);
     
      nb=afficheLignesParLignes("nombre.txt");
      printf ("%d\n",nb);
     
      litFichierChampsParChamps("nombre.txt");
     
      return 0;
     
    }
    Je voudrais écrire dans la console:
    gcc -o sauve sauve.c
    ./sauve nombre.txt 45

    L'entier attendu par aff est ici 45.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ymerej5312 Voir le message
    pourquoi tu veut récupérer les arguments du main ?
    je crois qu'ils ne servent qu'au compilateur (pas sur)
    Non non, ils sont totalement utilisables à l'intérieur du programme ! C'est juste l'intérêt : on peut ainsi passer des paramètres au programme. Tu peux lire ça : http://c.developpez.com/faq/?page=environnement

  9. #9
    Membre très actif
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Par défaut
    Merci!

    Du coup je dois rajouter un 3eme argument
    ?

    Quel est l'interet d'un 3eme argument puisque le 2eme semble faire la meme chose...

    argv[0] représente le "nom du programme" et argv[1] à argv[argc - 1] les paramètres passés au programme
    argv[0] dans mon cas, c'est sauve.c?
    Du coup, le nom du fichier a lire est pointé par dans argv[1] et l'entier pointé par argv[2}?

    Et pour lire les valeurs pointée, j'écris &argv[1] et&argv[2]?

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par B65AcR Voir le message
    Quel est l'interet d'un 3eme argument puisque le 2eme semble faire la meme chose...
    Ben parce que ce ne sont pas la même chose
    Le premier paramètre du main() (int argc) contient le nombre d'arguments que tu as appelé en lançant le programme. Typiquement si tu appeles "./monProg toto titi tata" il y a 3 arguments "toto", "titi" et "tata" plus le nom du programme lui-même donc argc contiendra 4.

    Le second (char *argv[]) est un tableau de chaines. Ce sont les arguments eux-mêmes. Dans l'exemple précédent, argv[0] contiendra "./monProg", argv[1] contiendra "toto", argv[2] contiendra "titi" et argv[3] contiendra "tata". Et arvg[4] (qu'on peut aussi référencer par argv[argc]) contiendra le pointeur NULL (permet de savoir où s'arrêter quand on veut les traiter dans une boucle).

    Le troisième (char *envp[]) étant défini comme le second contiendra des éléments de même nature => des chaines. Sauf que ces chaines ne sont pas les arguments mais les variables d'environnement avec leurs valeurs. Typiquement si tu écris (sous Unix) export MYNAME=Billou ou si tu vas configurer les variables d'environnement de Windows (Panneau de configuration => Tous les Panneaux de configuration => Système => "Paramètres sytèmes avancés" puis bouton "Variables d'envionnement") et que tu exécutes ensuite ton programme alors tu auras une des valeurs envp[x] qui contiendra "MYNAME=Billou".
    Et là aussi pour savoir où s'arrêter tu auras quelque part envp[y]=NULL.

    Donc ce 3° parmètre ne fait absolument pas la même chose que le second

    Citation Envoyé par B65AcR Voir le message
    argv[0] dans mon cas, c'est sauve.c?
    argv[0] contient l'adresse de la chaine qui, elle contient les caractères "./sauve.c" (la chaine exacte utilisée lors de l'appel du programme)...

    Citation Envoyé par B65AcR Voir le message
    Du coup, le nom du fichier a lire est pointé par dans argv[1] et l'entier pointé par argv[2]
    Oui, mais argv[2] contiendra "45" sous forme de chaine (c'est à dire {'4', '5', '\0'}) ce qui n'est pas tout à fait la même chose que la valeur numérique "45"...

    Citation Envoyé par B65AcR Voir le message
    Et pour lire les valeurs pointée, j'écris &argv[1] et&argv[2]?
    Ta phrase ne veut rien dire car on ne lit jamais une valeur. Soit on l'affiche à l'écran, soit on l'utilise dans une expression (int i=2; int j=3; int k=i+j). Le terme "lire" est plutôt utilisé dans le sens "récupérer une information depuis un flux"...
    Donc écrire &argv[2] pourra fonctionner comme ne pas fonctionner selon le but et le contexte dans lequel tu l'écris...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. executer un programme depuis le C sous linux
    Par e_gaillard37 dans le forum C
    Réponses: 2
    Dernier message: 12/01/2008, 20h16
  2. executer un .exe depuis un programme
    Par celine18 dans le forum NetBeans
    Réponses: 4
    Dernier message: 25/08/2006, 14h56
  3. Réponses: 5
    Dernier message: 20/02/2006, 14h11
  4. [Système] Executer un programme externe depuis un scripte php
    Par Scorpion Rouge dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2006, 11h59
  5. sql server: execution d'un programme depuis un trigger
    Par constantin dans le forum Développement
    Réponses: 3
    Dernier message: 04/10/2005, 19h20

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