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 :

aider moi a comprendre svp


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 18
    Points
    18
    Par défaut aider moi a comprendre svp
    Bonjour a tous !

    voici un programme en plusieurs fichiers qui me fait une division

    voici main_divi.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
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    #include <stdlib.h>
    #include "main_divi.h"
    #include "divi.h"
     
    char *argv0;
     
    static void
    usage(void)
    {
    	fprintf(stderr, "Usage : %s réel réel\n", argv0);
    	exit(EXIT_FAILURE);
    }
     
    int
    main(int argc, char *argv[])
    {
    	argv0 = argv[0];
    	if(argc < 3 )
    	usage();
     
    	float f1 = atof(argv[1]);
    	float f2 = atof(argv[2]);
     
    	printf("%g / %g = %g\n", f1, f2, division(f1, f2));
     
    	return EXIT_SUCCESS;
    }
    main_divi.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef MAIN_DIVI_H
    #define MAIN_DIVI_H
     
    extern char *argv0;
     
    #endif /* MAIN_DIVI_H*/
    divi.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
    #include <stdio.h>
    #include <stdlib.h>
    #include <float.h>
    #include <math.h>   
    #include "divi.h"
    #include "main_divi.h"
     
    float
    division(float numerateur, float denominateur)
    {
    	if (fabs(denominateur) <= FLT_MIN)
    	{
    		fprintf(stderr, "%s: division par zéro\n", argv0);
    		exit(EXIT_FAILURE);
    	}
    	return numerateur/denominateur;
    }
    et divi.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef DIVI_H
    #define DIVI_H
     
    extern float division(float numerateur, float denominateur);
     
    #endif /*DIVI_H */
    a quoi sert la declaration char *argv0 dans le main_divi.c
    a quoi sert argv0 = argv[0]; dans le main_divi.c
    et la declaration : extern char *argv0; dans le main_divi.h

    de maniere generale je ne comprends pas ce char *argv0, est-ce un pointeur ?

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Oui, c'est un pointeur sur char. Dans ton programme, ce pointeur pointe vers le premier argument de la fonction main, qui est une chaine de caractères correspondant au nom de ton exécutable.
    * Lorsqu'il n'y a pas assez d'arguments, ta fonction usage indique la manière d'utiliser le programme.
    * Lorsqu'il y a une division par zéro, ta fonction division redirige un message sur la sortie d'erreurs standard, qui affiche quelque chose du style : "nomduprogramme : division par zéro", puis sort du programme avec un code de retour indiquant une erreur (EXIT_FAILURE).

    Par contre, cette méthode n'est pas propre, car la variable globale est injustifiée ici. Il est préférable de passer ce pointeur par argument aux fonctions.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    pourtant je tient ce code du livre la methodolgie de la programmation en c d'Achille Braquelaire. donc j'aurais pu donner un autre nom a mon pointeur ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    effectivement je peux changer le nom du pointeur

    Merci jeroman

    mais pourquoi est-il declarer en extern dans le fichier.h et au debut du main_divi.c, le pointeur est déclarer deuc fois non ?

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Ce n'est pas parce que c'est ecrit dans un livre que c'est vrai, malheureusement.

    Ici, la declaration de argv0 en tant que variable globale ne sert qu'a de l'affichage en cas de division par 0, pour eviter de passer le nom du programme en tant qu'argument. Il existe d'autres methodes, plus propres, qui donneraient le meme resultat.

    Sinon, pour repondre a ta question, oui, tu peux donner le nom que tu veux a cette variable - a condition bien sur de remplacer tous les appels par le nouveau nom.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par vivitron Voir le message
    mais pourquoi est-il declarer en extern dans le fichier.h et au debut du main_divi.c, le pointeur est déclarer deuc fois non ?
    Le fait de le declarer en extern permet de l'utiliser dans d'autres fichiers, alors que la declaration est dans le fichier main_divi.c
    Dans ton exemple, le fichier divi.c inclus le fichier "main_divi.h" qui lui indique que la definition de la variable est faite ailleurs, mais que cette variable existe et est donc utilisable.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    donc j'aurais pu donner un autre nom a mon pointeur ?
    Oui mais le problème n'est pas le nom mais le fait que ce soit une variable globale, c'est-à-dire accessible à toutes les fonctions.

    mais pourquoi est-il declarer en extern dans le fichier.h et au debut du main_divi.c, le pointeur est déclarer deuc fois non ?
    Le fait de la déclarer extern la rend visible/modifiable par tous les fichiers sources.
    Par défaut, une variable globale est déclarée static.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Merci à vous deux j'y vois deja plus clair

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    derniere question qui n'a rien a voir quel études avez vous suivi svp

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/04/2015, 23h23
  2. aider moi de comprendre la fonction trim
    Par saida89 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2008, 15h12
  3. aider moi SVP
    Par FRIBGANE dans le forum ASP
    Réponses: 3
    Dernier message: 19/10/2005, 16h29

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