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 :

Protée des commandes préprocesseur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut Protée des commandes préprocesseur
    Bonjour à tous.

    Je m'excuse pour cette question probablement TRES simpliste, mais je viens tout juste de débuter en C.

    J'ai personellement l'habitude de programmer en php et en java, et la programation C me déroute un peu actuellement. (les structures et les fonctions vs java)

    Ma question porte sur les #includes et les #define du prépross. Quelles portée ont ils ? je veux dire : si je fais "#define A 5" dans un fichier A, et #include A dans un fichier B, la variable A aura-t-elle toujours la valeur 5 ?
    les "VRAIES" variables C déclarées dans mon fichier A seront-elles toujours existantes dans B ?

    Bref, comme je l'ai dis, je suis habitué à programmer en PHP. la fonction #include de C est-elle similaire à celle de PHP ou alors complètement différente ?

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Tu ne peux pas faire l'inclusion de define avec la directive #include

    Normalement tu crées un fichier d'entête dans lequel tu définis tes constantes

    entete.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef H_ENTETE
    #define H_ENTETE
    #define A 5
    #endif
    Ensuite tu inclus entete.h partout où tu utilises les constantes défini dans ce fichier

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "entete.h"
    <..>
    int a = A;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    donc si je comprends bien, l'include ne sert qu'à importer des fonctions (un peu comme en Java). c'est bien ça ?

    Est-ce que cela importe aussi les structures ? ou elles doivent être déclarées dans chaque fichier les utilisant ?

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Dans un .h tu peux retrouver différents éléments en fait ce sont les prototypes et déclarations de structure, fonction constantes, macro,....

    projet.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct MaGrosseStruct {
       //les champs
    };
     
    //prototypes de fonction
    int test(void); 
    void titre(const char*title);
     
    <...>
    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "projet.h"
     
    <...>
    MaGrosseStruct gs={0};
    test();
    <..>
    Nous ne voyons pas d'autres explications

  5. #5
    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
    La directive include provoque à l'endroit où elle est située la lecture du fichier désigné et tout se passe comme si le contenu de ce fichier était effectivement inséré à cette place. Si le fichier inclus comporte un directive define, elle sera donc prise en compte dans le fichier qui fait l'inclusion

    si je fais "#define A 5" dans un fichier A, et #include A dans un fichier B, la variable A aura-t-elle toujours la valeur 5 ?
    A n'est pas une variable. define procède simplement par remplacement de texte : A sera remplacé par 5

    les "VRAIES" variables C déclarées dans mon fichier A seront-elles toujours existantes dans B ?
    Non. Parce que les fichiers inclus sont des fichier header (.h) (on n'inclut pas en général de fichier .c bien que cela soit possible) qui contiennent les définitions de type, les prototypes des fonctions et parfois des define mais ne doivent pas contenir de définitions de variables (sous peine de problèmes). Celles-ci figurent dans les .c. Si elles doivent être utilisées par d'autres unités de compilation, on les mentionnera en extern dans le .h

    Est-ce que cela importe aussi les structures ? ou elles doivent être déclarées dans chaque fichier les utilisant ?
    Il n'y a rien de particulier pour les structures: Elles ont le même traitement que les autres types et variables.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nethervoid21
    donc si je comprends bien, l'include ne sert qu'à importer des fonctions (un peu comme en Java). c'est bien ça ?

    Est-ce que cela importe aussi les structures ? ou elles doivent être déclarées dans chaque fichier les utilisant ?
    A lire d'urgence de A à Z. Pose des questions si tu ne comprends pas :

    http://emmanuel-delahaye.developpez.com/codage.htm

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    OK. merci. très intéressant.

    J'ai un peu modifé mon code et j'ai encore un pb de "portée"

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #define PRECISION 10
     
    enum Signe{Negatif, Null, Positif};
     
    struct Nombre {
    	enum Signe signe;
    	int Pos1;     /*Case du tableau digits qui contient le chiffre 10^0*/
    	char digits[PRECISION];
    } ;
     
    ......
     
     
    /* Créé une variable Nombre dont la valeur est celle du plus grand des deux Nombres passés en paramêtre.  (max(x, y)) */
    struct Nombre max(struct Nombre N1, struct Nombre N2) {
    	if (N1.signe != N2.signe) {
    		if (N1.signe < N2.signe) {
    			return N2;
    		} else {
    			return N1;
    		}
    	} else if (N1.signe == Null) {
    		return N1;
    	} else if (N1.signe == Negatif) {
    		struct Nombre N = min(VAbs(N1), VAbs(N2));
    		N = Oppose(N);
    		return N;
    	} else {
    		struct Nombre N;
    /*=A=FAIRE===A=FAIRE===A=FAIRE===A FAIRE===A=FAIRE===A=FAIRE*/
    		return N;
    	}
    }
     
     
    /* Créé une variable Nombre dont la valeur est celle du plus petit des deux Nombres passés en paramêtre.  (min(x, y))*/
    struct Nombre min(struct Nombre N1, struct Nombre N2) {
    	struct Nombre N = equals(max(N1, N2), N1) ? N2 : N1;
    	return N;
    }*/
    et dans la fonction max, le compilateur me dit que la fonction min n'existe pas. mais si je mais la fonction min avant, il me dira que la fonction max n'existe pas.... Je tourne un peu en rond là.....

  8. #8
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Oui puisque tu l'as définis en dessous et que tu ne donnes pas le prototype avant de l'utiliser.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nethervoid21
    J'ai un peu modifé mon code et j'ai encore un pb de "portée"
    <...>et dans la fonction max, le compilateur me dit que la fonction min n'existe pas. mais si je mais la fonction min avant, il me dira que la fonction max n'existe pas.... Je tourne un peu en rond là.....
    Ce problème a une solution (l'usage d'un prototype séparé placé avant l'appel, en fait au début du code), mais il met en évidence un problème sous-jacent qui peux devenir grave dans certaines circonstances : l'appel récursif croisé de fonctions :

    a() appelle b() qui appelle a() qui appelle b() etc. Ca pourrait très bien ne jamais s'arrêter cette histoire. Alors soit c'est un bug de conception, soit c'est voulu et il faut être très prudent pour qu'il n'y ait pas d'appels croisés infinis.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    le prototype ? (désolé, j'ai dit débutant.....)

    Sinon, mon raisonement est celui-ci :
    Clacul du MAX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    si (signe de A != signe de B )
    alors {
        max = celui qui est positif
    } sinon si (A est null) 
    alors { /*Rapel : je considère que null est un signe au même titre que + et -*/
        max = A /* puisqu'ils sont de même signe alors ils sont tous les = à 0*/
    } sinon si (signe de A est Négatif) 
    alors {
        max = - min(|A|, |B|);                        /*A>B => -A<-B*/
    } sinon {
        /* on calcule lequel est le plus grand */
    }
    Calcul du MIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si A = max(A,B) alors min = B sinon min = A

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    c'est on j'ai trouvé pour le prtotype... c'est un peu comme en Delphi donc à ce niveau là !

    Merci à tous !

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nethervoid21
    c'est on j'ai trouvé pour le prtotype... c'est un peu comme en Delphi donc à ce niveau là !
    Si tu penses à 'forward', oui.

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

Discussions similaires

  1. Transmettre des commandes à un process lancé par ksh
    Par jojolepabo dans le forum Linux
    Réponses: 3
    Dernier message: 19/10/2005, 16h05
  2. Réponses: 2
    Dernier message: 02/11/2004, 06h52
  3. Réponses: 3
    Dernier message: 24/05/2004, 16h20
  4. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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