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 :

[Compilation] multiple definition ..first defined here !?


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut [Compilation] multiple definition ..first defined here !?
    Bonsoir,

    J'ai un message d'erreur à la compilation (sous linux) de mon programme que je ne comprends pas.
    Je voudrai un peu d'aide.

    Voici le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Building target: EquationChaleurInC
    Invoking: GCC C++ Linker
    g++ -lm  -o"EquationChaleurInC"  ./equationsDiffPartiel.o ./pgm.o ./tools.o   -lm
    ./pgm.o:(.rodata+0x0): multiple definition of `N_MAX'
    ./equationsDiffPartiel.o:(.rodata+0x0): first defined here
    ./pgm.o:(.rodata+0x4): multiple definition of `OMEGA'
    ./equationsDiffPartiel.o:(.rodata+0x4): first defined here
    ./pgm.o:(.rodata+0x8): multiple definition of `SIGMA'
    ./equationsDiffPartiel.o:(.rodata+0x8): first defined here
    ./pgm.o:(.rodata+0xc): multiple definition of `t_MAX'
    ./equationsDiffPartiel.o:(.rodata+0xc): first defined here
    collect2: ld returned 1 exit status
    make: *** [EquationChaleurInC] Erreur 1
    1) je ne comprend pas pourquoi j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiple definition of ...
    , après vérifiécation, la définiton de ces constantes est fait une fois dans mon equationsDiffPartiel.h et son utilisé de equationDiffPartiel.c ;

    Ensuite

    2) Je comprend pas la significatin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ld returned 1 exit status
    , je pensais avoir oublié de rajouter une librairie (math.h avec -lm) à la compilation mais apparement le problème est ailleurs.

    Merci.

    ps : je rajoute les codes ou pas ?!


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    // File : equationDifPartiel.h
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h> 
     
    #include "tools.h"
     
    #ifndef _EQUATIONS_TOOLS_H
    #define	_EQUATIONS_TOOLS_H
     
    //#define N_MAX    = 1000;
     
    #ifdef	__cplusplus
    //#error This source file is not C++ but rather C. Please use a C-compiler
    extern "C"{
    #endif
        /* Macros     */
        /* Types      */
        /* Structure  */
        /* Constantes */
     
        const int N_MAX    = 1000;
     
        const float OMEGA  = 20;
     
        const float SIGMA  = 1;
     
        const float t_MAX  = 1;
     
        /* Fonctions */
     
        void equation_chaleur();
        //void equation_poisson();
        //void equation_convdiff();
     
    #ifdef	__cplusplus
    }
    #endif
     
    #endif	/* _EQUATIONS_TOOLS_H */
    /*
    --------------------------------------------------------------------------------------------------------------------------------------------------
    Autre fichier
    ---------------------------------------------------------------------------------------------------------------------------------------------------
    */
    // File : equationDifPartiel.c
     
    #include "equationsDiffPartiel.h"
     
     
    void equation_chaleur()
    /*
     * On resolution Equation de la chaleur
     */
    {    
     
        int N, ktmax, nb_points, i0, i, kt;
     
        double  delta_t, h, xi, lambda;
     
        float v[N_MAX]; // U(n)
        float u[N_MAX]; // U(n+1)
     
        //Pre-process - Saisie des input
        printf("Donnez le nombre de points de maille : \n");
        scanf("%d", &nb_points);
        //printf("\n%d\n",nb_points);
     
        printf("Donnez le pas de temps : \n");
        scanf("%le", &delta_t);// /!\ à la précision %le = double, %f = flottant 
        //printf("\n%le\n",delta_t);
     
        /*
         * N  = nb de points internes; les points xi sont numerotes de 0 à N + 1
         *x0 = 0, x1 = h, x2 = 2*h, ..., xi = ih, ..., xN + 1 ou h est le pas
         *d'espace defini par h = 1 / (N+1)
         */
        N = nb_points - 2;
        h = 1./(N+1);
     
        // Nb max d'itérations en temps pour atteindre tmax
        ktmax = (int) (t_MAX /delta_t);
     
     
        // Critere de stabilite de Von Neumann lambda < 1/2
        lambda = delta_t * SIGMA / h*h;
     
     
     
        // Initialisation de la solution en chaque point
        for (  i = 0; i < N+1; i++){
            v[i] = 0;
        }
     
        /*
         *Indice i0 represente le point milieu (si Nbpoints est impair) dont on
         *ecrira la solution U(xi,t) dans le fichier `output pour les temps
         *discrets t = t0, t1, t2, ..., tktmax ( i0 pourrait eter bien sur l'indice
         *correspondant a n'importe quel autre point du maillage
         */
        i0 = ((N + 1)/2);
     
     
        ecrireResultat("file_result", "w+", 1, v[i0]) ;
        //Process - Boucle de calcul - Partie critique de la simulation
       for( kt = 0 ; kt < ktmax  ; kt++){ // intération en temps
     
     
            for( i = 1 ; i <= N ; i++){ // itération sur le nbr de points interne
     
                xi = i*h; // coordonnée du i-ème point de discrétisation
     
     
                /*
                 * Schema aux difference finies discretisant l'EDP consideree
                 * Notation : u(i) = solution au tn+1
                 * et v(i) = solution au tn
                 */
     
                u[i]  = v[i]    * (1 - 2  * delta_t*SIGMA / h*h)    +
                        v[i - 1]* delta_t * SIGMA/h*h               +
                        v[i + 1]* delta_t * SIGMA/h*h               +
                        delta_t * xi      * cos(OMEGA * (kt - 1) * delta_t);
     
                /*
                 * Ecriture du U(xi0, t) dans le fichier `output' pour les temps de
                 * discretisation t = t1, t2, ..., ktmax
                 */
                if ( i0 == i){ // c'est le point milieu
                    //fprintf(file_out, "%f %le\n",  kt * delta_t, u[i]);
                    ecrireResultat("file_result", "a", kt*delta_t, u[i]);
                }
     
            } // fin de la boucle en espace, sur les points intérieurs
     
            u[0]      = 0;          // condition aux limites en 0
            u[N + 1]  = sin(OMEGA*kt*delta_t)/ OMEGA; // condition aux limites en 1
     
           // On switch la solution au temps tn+1 avec celle au temps tn
            for(i = 0 ; i <= N + 1; i++){
                v[i] = u[i];
     
            }
     
        }// fin boucle iteration en temps
     
     
    // Message de fin de programme	
     
        printf("\n****Ok, FIN!****\n");
     
    } // fin du programme
     
    /*
    ----------------------------------------------------------------------------------------------------------------------------------------------------
    Autre fichier
    -----------------------------------------------------------------------------------------------------------------------------------------------------
    */
     
     
    /*
     * FILE    : pgm.c
     * INFO    :
     * TODO    : 
     * FIXME   :
     * AUTHOR  :
     * PURPOSE :
     * CREATED : on 27 février 2008, 23:13
     */
     
    #include "equationsDiffPartiel.h"
     
     
    /*
     * Application de resolution d'equation en 1D
     */
     
     
    int main(int argc, char** argv) {
     
        equation_chaleur();
     
     
        return (EXIT_SUCCESS);
    }
     
     
     
    //
    Dernière modification par Invité ; 24/03/2008 à 08h56. Motif: Restons correcte dans le commentaire, un peu de respect non mais !!! ; coquille ds le titre

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    As tu pensé à tes define aux debut de fichiers ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef __EQUATIONSDIFFPARTIEL_H__
    #define __EQUATIONSDIFFPARTIEL_H__
     
    // .. ton fichier
     
    #endif

  3. #3
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Je viens de les voirs ... je te conseille de les mettres en tout début de fichier, avant même tes include ..

    Notement avant ton tool.h qui n'a peut etre pas les protection de multi-inclusion

  4. #4
    Invité
    Invité(e)
    Par défaut ¡ const ! pourquoi me fais tu çà ?
    Rebon,

    Alors j'ai suivis ton conseil, cette structure du code semble plus logique (à l'avenir je ferai ainsi);
    Malheureusement mon problème reste entier. J'ai toujours ce même message d'erreur.

    Du coups j'ai déplacé mes constantes déclarées par du *.h vers *.c correspondant et j'ai plus de problèmes;

    Je voudrai comprendre pourquoi je peux pas définir (déclarer) de constantes dans le header?

    Merci.

  5. #5
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Je te conseille d'une part, de mettre tes constantes sous forme de macro define :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define N_MAX 1000   
    #define OMEGA 20    
    #define SIGMA  1    
    #define t_MAX  1
    Cela te permet de gérer ces constante à la compilation de ton code et non au runtime. Gain de mémoire .. et d'embêtement ...

    Si ces constantes doivent changer (je me rend compte de l'ironie de la phrase .. ), utilise effectivement des variables comme tu les as déclaré ..

    Si tu veux utiliser quand même des variables, il faut que tu mettes la déclaration dans le header, et la definition dans le code builder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // .h
    const int N_MAX;
     
    //.cpp
    const int N_MAX = 1000;

  6. #6
    Invité
    Invité(e)
    Par défaut Ooof !
    Merci, pour tes conseils.

  7. #7
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par sysyphe Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef _EQUATIONS_TOOLS_H
    #define	_EQUATIONS_TOOLS_H
    Les identificateurs commençant par un underscore et une majuscule sont réservés, il ne faut pas les utiliser.

    Citation Envoyé par raptor70 Voir le message
    As tu pensé à tes define aux debut de fichiers ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef __EQUATIONSDIFFPARTIEL_H__
    #define __EQUATIONSDIFFPARTIEL_H__
     
    // .. ton fichier
     
    #endif
    C'est un comportement indéfini d'utiliser deux underscores à la suite dans un identificateur.

  8. #8
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    Je te conseille d'une part, de mettre tes constantes sous forme de macro define :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define N_MAX 1000   
    #define OMEGA 20    
    #define SIGMA  1    
    #define t_MAX  1
    Cela te permet de gérer ces constante à la compilation de ton code et non au runtime. Gain de mémoire .. et d'embêtement ...
    Ça fait certainement une grosse différence sur la RAM consommée.

    Citation Envoyé par raptor70 Voir le message
    Si tu veux utiliser quand même des variables, il faut que tu mettes la déclaration dans le header, et la definition dans le code builder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // .h
    const int N_MAX;
    Est-ce qu'en C ça compile, "const int N_MAX;"?

  9. #9
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par corrector Voir le message
    Est-ce qu'en C ça compile, "const int N_MAX;"?
    Normallement oui ... du moment que la définition est compilé ..

    Si il n'y a pas la définition ( const int N_MAX = 100; ) , il y aura un probléme au linkage ..

    C'est le même principe que pour la declaration / definition de fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // .h
    int ma_fonction();
    int N_MAX;
     
    //.cpp
    int ma_fonction()
    {
        return 0;
    }
     
    int N_MAX = 10;
    par contre, le "const" peut, peut etre poser un problème ...

  10. #10
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    C'est le même principe que pour la declaration / definition de fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // .h
    int ma_fonction();
    int N_MAX;
    Tu veux dire que ceci est seulement une déclaration (pas une définition) de N_MAX? Tu plaisantes?

  11. #11
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par corrector Voir le message
    Tu veux dire que ceci est seulement une déclaration (pas une définition) de N_MAX? Tu plaisantes?
    Si je me trompe, dis le moi ... mais il me semble bien..

  12. #12
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    Si je me trompe, dis le moi ... mais il me semble bien..
    Bien sûr, "int g;" est la définition d'une variable globale!

    (Pas bien réveillé aujourd'hui?)

  13. #13
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par corrector Voir le message
    Bien sûr, "int g;" est la définition d'une variable globale!

    (Pas bien réveillé aujourd'hui?)
    C'est de l'ironie ?? Je comprends plus vraiment ce que tu essaye de dire ...

    Pour toi, c'est correct ou pas ?

  14. #14
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    Pour toi, c'est correct ou pas ?
    est la définition d'une variable globale gi de type int (jusqu'à là c'est correct).

  15. #15
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    C'est de l'ironie ?? Je comprends plus vraiment ce que tu essaye de dire ...

    Pour toi, c'est correct ou pas ?
    Tu devrais utiliser "extern int N_MAX;" à mon avis. Il y a quand même un truc bizarre : avec "int a;" dans un fichier et "int a = 1;" dans un autre le compilateur ne bronche pas.

  16. #16
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut déclarations/définitions de variables globales
    Citation Envoyé par dapounet Voir le message
    Tu devrais utiliser "extern int N_MAX;" à mon avis.
    Oui.

    Citation Envoyé par dapounet Voir le message
    Il y a quand même un truc bizarre : avec "int a;" dans un fichier et "int a = 1;" dans un autre le compilateur ne bronche pas.
    Même dans le même fichier...

    Le C est décidément un langage très étrange...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sysyphe Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // File : equationDifPartiel.h
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
    #include "tools.h"
    <...>
    Ton code ne compile pas.
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    In file included from main.c:11:
    equationsDiffPartiel.h:7:19: tools.h: No such file or directory
    In file included from main.c:11:
    equationsDiffPartiel.h:33: warning: function declaration isn't a prototype
    main.c:19: warning: unused parameter 'argc'
    main.c:19: warning: unused parameter 'argv'
    Process terminated with status 1 (0 minutes, 3 seconds)
    1 errors, 3 warnings
    Qu'y a-t-il dans "tools.h" ?

    Il manque probablement ecrireResultat().

    Pour les problèmes de définition multiples, c'est parce que tu définis des variables dans un header. Comme il est inclus 2 fois dans 2 .c différents, il y a doublon et le linker ne sait lequel choisir. Comme se sont des constantes utilisées uniquement dans le .c, je conseille de placer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define N_MAX   1000
    #define OMEGA   20.f
    #define SIGMA   1.f
    #define t_MAX   1.f
    dans equationDifPartiel.c

    Je ne sais pas quelle est la précision requise par les calculs de ton application, mais en principe, on utilise pas le type float pour autre chose que du stockage de masse quand on a des problèmes de place. Pour les calculs, on utilise au minimum le type double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define N_MAX   1000
    #define OMEGA   20.
    #define SIGMA   1.
    #define t_MAX   1.
    et tout le reste...

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ton code ne compile pas.

    Qu'y a-t-il dans "tools.h" ?

    Il manque probablement ecrireResultat().
    En fait je pensais pas utile de rajouter "tool.h", mais il y a en effet la fonction ecrireResultat() de déclarée.
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pour les problèmes de définition multiples, c'est parce que tu définis des variables dans un header. Comme il est inclus 2 fois dans 2 .c différents, il y a doublon et le linker ne sait lequel choisir. Comme se sont des constantes utilisées uniquement dans le .c, je conseille de placer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define N_MAX   1000
    #define OMEGA   20.f
    #define SIGMA   1.f
    #define t_MAX   1.f
    dans equationDifPartiel.c
    Comme on l'a conseillé :
    Citation Envoyé par raptor70 Voir le message
    Si ces constantes doivent changer (je me rend compte de l'ironie de la phrase .. ), utilise effectivement des variables comme tu les as déclaré ..

    Si tu veux utiliser quand même des variables, il faut que tu mettes la déclaration dans le header, et la definition dans le code builder :
    [CODE]
    // .h
    const int N_MAX;

    //.cpp
    const int N_MAX = 1000;
    Ce sont des constantes que j'aurai a définir à chaque fois que je lance le programme(Des constantes amenée a changer) ; Elles seront définitivement figées si j'utilise , non?!
    Du coup j'ai essayé avec en déclaration dans le equationDifPartiel.c et je les définis quand je lance l'application. Ca devrait est correcte, non?

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je ne sais pas quelle est la précision requise par les calculs de ton application, mais en principe, on utilise pas le type float pour autre chose que du stockage de masse quand on a des problèmes de place. Pour les calculs, on utilise au minimum le type double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define N_MAX   1000
    #define OMEGA   20.
    #define SIGMA   1.
    #define t_MAX   1.
    J'avais pas fait attention à la précision, je vais corriger.

    Merci pour ces précieuses remarques.

    ps : Je reposte ma nouvelle version oui, non ?! Il y a surment d'autres erreurs.
    Dernière modification par Emmanuel Delahaye ; 24/03/2008 à 11h32. Motif: dépollution

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sysyphe Voir le message
    ps : Je reposte ma nouvelle version ?
    Oui, complète, cette fois...

  20. #20
    Invité
    Invité(e)
    Par défaut Après correction, la suite ...
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Oui, complète, cette fois...
    Bonsoir, après les conseils, j'ai fais ceci ; Je suis là pour apprendre donc ouvert à tous autres conseils (critiques);

    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
     
     
    /*
     * File    : tools.h
     * TODO    : Remplacer i_pts et result par des ``double*" ou tableaux
     * Fixme   :
     * Author  : 
     * Created : 2008-03-24-2207
     */
     
     
    #ifndef _TOOLS_H_
    #define _TOOLS_H_
     
    #include <stdio.h>
    #include <stdlib.h>
    //#include <time.h>
     
    int ecrireResultat(char* nomfichier, char* operation, double i_pts , double result);
     
    #endif /*_TOOLS_H_*/
    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
     
     
    /*
     * File    : tools.c
     * Author  : 
     * TODO    :
     * Fixme   :
     * Purpose : boite a outil
     * Created : 2008-03-22-2342
     */
     
     
    #include "tools.h"
     
     //saisie_parametres();
     
     
    int ecrireResultat(char* file_name, char* operation, double i_pts , double result)
    /*
    	On ecrit les resultats du calcul dans un fichier
    */
    {
     
    	FILE *file;
    	file = fopen(file_name, operation); // Ouverture en lecture et ecriture
     
    	if (!file)  return 1;	// On n'ecrit rien si les droits en ecrite son refuse
     
        fprintf(file,"%e %e\n", i_pts, result);
        fclose(file);
     
        return 0;
     
    } //

    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
    42
    43
    44
     
     
    /*
     * File    : equationdiffpartiel.h
     * Author  : 
     * Todo    :
     * Fixme   :
     * Created : 2008-03-24-2207
     */
     
    #ifndef _EQUATIONSDIFFPARTIEL_H_
    #define	_EQUATIONSDIFFPARTIEL_H_
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h> //ld => -lm
     
    #include "tools.h"
     
     
     
        /* Macros     */
        /* Types      */
        /* Structure  */
        /* Constantes */
     
    //    #define N_MAX    = 1000;    
    //    const int N_MAX    = 1000;
    //   
    //    const float OMEGA  = 20;
    //    
    //    const float SIGMA  = 1;
    //    
    //    const float t_MAX  = 1;
    //    
        /* Fonctions */
     
        void equation_chaleur();
        //void equation_poisson();
        //void equation_convdiff();
     
     
     
    #endif	/* _EQUATIONSDIFFPARTIEL_H_*/
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
     
    /*
     * File    : equationdiffpartiel.c
     * Todo     : Mettre les parties communes dans le ``main()"
     * Fixme   :
     * Author   : 
     * Purpose : On definit les schemas des equations differentielles 
     * Created  : 2008-03-24-2207
     */
     
     
    #include "equationsDiffPartiel.h"
     
     
    void equation_chaleur()
    /*
     * Resolution Equation de la chaleur 1D
     */
    {    
     
    	 	const int N_MAX     = 1000;
     
    	 	const double OMEGA  = 20;
     
    	    const double SIGMA  = 1;
     
    	    const double t_MAX  = 1;
     
     
        int N, ktmax, nb_points, i0, i, kt;
     
        double  delta_t, h, xi, lambda;
     
        double v[N_MAX]; // U(n)
        double u[N_MAX]; // U(n+1)
     
        //Pre-process - Saisie des input
        printf("Donnez le nombre de points de maille : \n");
        scanf("%d", &nb_points);
     
     
        printf("Donnez le pas de temps : \n");
        scanf("%le", &delta_t);// /!\ à la précision %le = double, %f = flottant 
     
     
        /*
         * N  = nb de points internes; les points xi sont numerotes de 0 à N + 1
         *x0 = 0, x1 = h, x2 = 2*h, ..., xi = ih, ..., xN + 1 ou h est le pas
         *d'espace defini par h = 1 / (N+1)
         */
        N = nb_points - 2;
        h = 1./(N+1);
     
        // Nb max d'itérations en temps pour atteindre tmax
        ktmax = (int) (t_MAX /delta_t);
     
     
        // Critere de stabilite de Von Neumann lambda < 1/2
        lambda = delta_t * SIGMA / h*h;
     
     
     
        // Initialisation de la solution en chaque point
        for (  i = 0; i < N+1; i++){
            v[i] = 0;
        }
     
        /*
         *Indice i0 represente le point milieu (si Nbpoints est impair) dont on
         *ecrira la solution U(xi,t) dans le fichier `output pour les temps
         *discrets t = t0, t1, t2, ..., tktmax ( i0 pourrait eter bien sur l'indice
         *correspondant a n'importe quel autre point du maillage
         */
        i0 = ((N + 1)/2);
     
     
        ecrireResultat("file_result", "w+", 1., v[i0]) ;
        //Process - Boucle de calcul - Partie critique de la simulation
       for( kt = 0 ; kt < ktmax  ; kt++){ // intération en temps
     
     
            for( i = 1 ; i <= N ; i++){ // itération sur le nbr de points interne
     
                xi = i*h; // coordonnée du i-ème point de discrétisation
     
     
                /*
                 * Schema aux difference finies discretisant l'EDP consideree
                 * Notation : u(i) = solution au tn+1
                 * et v(i) = solution au tn
                 */
     
                u[i]  = v[i]    * (1 - 2  * delta_t*SIGMA / h*h)    +
                        v[i - 1]* delta_t * SIGMA/h*h               +
                        v[i + 1]* delta_t * SIGMA/h*h               +
                        delta_t * xi      * cos(OMEGA * (kt - 1) * delta_t);
     
                /*
                 * Ecriture du U(xi0, t) dans le fichier `output' pour les temps de
                 * discretisation t = t1, t2, ..., ktmax
                 */
                if ( i0 == i){ // c'est le point milieu
     
                    ecrireResultat("file_results", "a", kt*delta_t, u[i]);
                }
     
            } // fin de la boucle en espace, sur les points intérieurs
     
            u[0]      = 0;          // condition aux limites en 0
            u[N + 1]  = sin(OMEGA*kt*delta_t)/ OMEGA; // condition aux limites en 1
     
           // On switch la solution au temps tn+1 avec celle au temps tn
            for(i = 0 ; i <= N + 1; i++){
                v[i] = u[i];
     
            }
     
        }// fin boucle iteration en temps
     
     
    // Message de fin de programme	
     
        printf("\n****Ok, FIN!****\n");
     
    } // fin du programme
    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
     
    /*
     * FILE    : pgm.c
     * INFO    :
     * TODO    : 
     * FIXME   :
     * AUTHOR  : 
     * PURPOSE : Programme principal, point d'entre de l'application
     * CREATED : 2008-03-24-2207
     */
     
    #include "equationsDiffPartiel.h"
     
     
    /*
     * Variables
     */
     
     
    int main(int argc, char** argv) {
     
        equation_chaleur();
     
     
        return (EXIT_SUCCESS);
    }
    Je pense que tout y est, voilà.

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

Discussions similaires

  1. Erreur de compilation "multiple definition of"
    Par cereal dans le forum Débuter
    Réponses: 3
    Dernier message: 22/02/2010, 17h29
  2. problême de compilation: multiple definition
    Par Plomeg dans le forum C++
    Réponses: 2
    Dernier message: 22/11/2006, 09h17
  3. [Makefile] Compilation multiple
    Par rod59 dans le forum Systèmes de compilation
    Réponses: 4
    Dernier message: 12/11/2005, 16h57
  4. [LG]Interfaces et multiples définitions
    Par fatt dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2004, 22h41
  5. multiple definition
    Par scorbo dans le forum C
    Réponses: 5
    Dernier message: 10/09/2003, 13h16

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