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

  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 : 37
    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 827
    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 827
    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]

  11. #11
    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
    Ah! là j'ai bien compris tes explications! Merci!
    Il me reste à trouver la solution

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par B65AcR Voir le message
    Citation Envoyé par B65AcR Voir le message
    Oui la fonction attend un entier. Mon problème est de lui transmettre!
    Il me reste à trouver la solution
    La solution à '"comment transmettre la chaine 45 à une fonction qui attend un entier ?" Ben suffit de passer par strtol() ou strtoul() ou atoi() (cette dernière étant plus simple mais moins complète que les deux autres)...
    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]

  13. #13
    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 la première fois que je lis le nom de ces fonctions!!! Merci!

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par B65AcR Voir le message

    C'est la première fois que je lis le nom de ces fonctions!!!
    Pas compliqué non plus de là "réinventer"
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int myatoi(char *c)
    {
        int res;
     
        for (res=0; *c != '\0'; c++)
            res=res * 10 + (*c) - '0';
     
        return res;
    }
    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]

  15. #15
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res=res * 10 + (*c) - '0';
    ?? Tu additionnes des entiers avec des char? *c pointe vers un caractere non?
    A quoi sert -'0' ?

    Au final, voici mon main avec les passages d'arguments. J'ai utilisé strtol pour convertir la chaine en entier.
    Un bon exemple didactique ici:
    http://itee.uq.edu.au/~comp2303/Lesl...MPLES/strtol.c


    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
    int main(int argc, char *argv [])
     
    {
      // Declaration
      unsigned int nb,N;
     
      // Pointeur de réf
      FILE * FICHIER;
     
      /*Ouverture du nouveau fichier en ecriture*/
      FICHIER = fopen(argv [1], "w");
     
      // Recup du nombre entré dans la chaine de caractere
      N=strtol(argv[2],NULL,10);
     
      //Programme
      Aff(N,FICHIER);
      /*Fermeture du fichier ouvert en ecriture*/
      fclose (FICHIER);
    return 0;
     
    }

  16. #16
    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
    Tu additionnes des entiers avec des char? *c pointe vers un caractere non?
    char, comme son nom ne l'indique pas, est un type entier comme short, int , long,... Sa particularité est qu'il ne peut représenter que de petits entiers et, selon le compilateur utilisé, des entiers signed ou unsigned. Son nom vient de ce qu'il est utilisé aussi pour permettre de stocker tout caractère du jeu de caractères de base (et en C ces caractères sont donc des entiers : '0' par exemple est un int)

    A quoi sert -'0' ?
    Sur les différents jeux de caractères utilisés couramment, les int '0', '1',...'9' sont consécutifs. Par conséquent chiffre-'0', où chiffre vaut '0' ou '1' ou...'9' permet d'obtenir la valeur numérique représentée par le code chiffre.
    Ainsi si chiffre vaut '5', chiffre-'0' vaut 5

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Citation Envoyé par diogene Voir le message
    Sur les différents jeu de caractères utilisés couramment, les int '0', '1',...'9' sont consécutifs.
    D'ailleurs, il me semble que c'est l'une des rares choses que la norme C exige quant au jeu de caractères utilisé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par B65AcR Voir le message
    ?? Tu additionnes des entiers avec des char? *c pointe vers un caractere non?
    Petite vérité à retenir toute ta vie de prog: en C, tout est nombre.
    Un caractère n'est qu'une valeur numérique (pour le moment référencée dans la table ascii mais ça change vers l'utf-8)

    Citation Envoyé par B65AcR Voir le message
    A quoi sert -'0' ?
    Diogène l'a très bien expliqué. Mais si tu veux plus de précision, étant donné que le caractère '5' vaut 53 en valeur ascii, et que '0' vaut 48, alors '5' - '0' vaudra... 5. Et ça restera valable tant que le codage des chiffres sera consécutifs en partant de '0'.
    De même, printf("%c", 'a' + 1) donnera 'b'.

    Citation Envoyé par B65AcR Voir le message
    Au final, voici mon main avec les passages d'arguments...
    Evite les noms de variables en majuscules. Tu peux mettre des majuscules dans le nom (int nbCar) mais tout en majuscules c'est réservé aux macros (et en plus c'est difficilement lisible...)
    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]

  19. #19
    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 : 37
    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
    tout en majuscules c'est réservé aux macros
    Voire aux constantes.

    Petite vérité à retenir toute ta vie de prog: en C, tout est nombre.

  20. #20
    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
    Bravo Messieurs, supers réponses!

    Je suis des cours à distance, et le formateur n'a pas le temps d'expliquer en détail le pourquoi du comment comme vous le faites.

    Je savais que les char sont en fait des entiers. Je n'avais pas saisi comment utiliser leur valeur entière. Façon de procéder fort utile!

    Ce forum est vraiment super bien tenu, encore bravo!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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