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. . . J'en ai assez d'être nulle. . . .


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut Compilation. . . J'en ai assez d'être nulle. . . .
    Bonjour,

    Je suis complètement à bout... je ne sais pas programmer et je ne le saurai jamais. Le problème c'est que je dois programmer........ J'ai envie de tout laisser tomber mais bon... je ne peux pas, je suis une esclave...


    Long résumé (désolée, je sais pas faire court) :

    Je reprend mon programme depuis le début pour le rendre clair et propre.

    Jusque là, une structure, un tableau dynamique du type de ma structure, trois fonctions (une qui ouvre un fichier, compte le nombre de lignes et referme le fichier; une qui ouvre un fichier lis les données et les écrit dans mon tableau de structure; et une qui fait une transformée de fourier à partir de mes données) et c'est tout. Rien de bien méchant. Ca compile très bien, ça me donne ce que je veux. Parfait quoi...
    Je passe à l'étape suivante : structuration de mon programme en créant des modules contenant mes fonctions. J'ai donc (pour l'instant) un fichier init.cpp avec son init.h et mon fichier principal. J'écris mon Makefile en faisant un copier coller de ce qui fonctionnait déjà avant et en remplaçant les noms des fichiers par les bons.


    J'ai donc trois fichiers :

    init.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1 #ifndef INIT_H
    2 #define INIT_H
    3
    4
    5 int lignes_fichier(string nom_fichier);
    6 int lecture_donnees(string nom_fichier, donnees *serie_temp);
     
    #endif
    Ceci dit, en passant, je ne sais même pas à quoi ça sert le #ifndef INIT_H et tout le tralala avec les #.... J'ai trouvé ça un peu partout quand j'ai cherché et donc je l'ai mis ya une heure pour voir si ça améliorait mon problème. (ça change rien... )

    init.cpp :
    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
    #include <string>
    #include <iostream>
    #include <fstream>
    #include "init.h"
     
    using namespace std;
    8 
    9 // Determine le nombre de lignes d'un fichier
    10
    11 int lignes_fichier(string nom_fichier)
    {
      // Je ne pense pas que ce soit la peine que je mette tout le détail
    // ouverture de mon fichier
    // comptage du nombre de lignes
    // fermeture de mon fichier
    }
     
    33
    34 // Lis les donnees dans un fichier et les ecrit dans un tableau de structure
    35
    36 int lecture_donnees(string nom_fichier, donnees *serie_temp) //&serie_temp
    {
    // Je ne pense pas que ce soit la peine que je mette tout le détail
    // Ouverture de mon fichier appelé nom_fichier
    // Je parcours mon fichier et je remplis serie_temp
    // Je ferme mon fichier
    }
    Et mon main.cpp (en réalité il s'appelle fond031007.cpp):
    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
    #include <iostream.h>
    #include <fstream.h>
    #include <math.h>
    #include <complex.h>
    #include <fftw3.h>
    #include <string>
     
    #include "init.h"
    #include "gsl_multimin.h"
     
     
    using namespace std;
     
     
    struct donnees
    {
      double temps;
      double sig;
    };
     
    // je n'ai pas encore déplacé cette fonction... je suis tellement nulle que j'ai réussi à bloquer avant..
    int TF(fftw_complex *Ttfdata, fftw_plan p, const long npts, const long Nout,
    	donnees *serie_temp, string fichier_sortie, donnees *tfdata);
     
     
     
    int main() 
    {
      string nom_fichier;
      cout<<"nom du fichier : "<<endl;
      cin>>nom_fichier;
     
    // nombre de lignes de mon fichier
      const long npts = lignes_fichier(nom_fichier);
      struct donnees *serie_temp = new donnees[npts];
     
    // lecture et ecriture de mon fichier
      lecture_donnees(nom_fichier,serie_temp);
     
     
     /* TRANSFORMEE DE FOURIER RAPIDE FFTW */
     
    // déclaration de tous les trucs que la TF a besoin
      const long Nout = long( npts / 2) + 1;
      donnees *tfdata = new donnees[Nout];
      fftw_complex *Ttfdata;
      fftw_plan p;
      string fichier_TF;
      cout<<"nom du fichier de sortie pour la TF des donnees: "<<endl;
      cin>>fichier_TF;
     
    // Et la TF...
      TF(Ttfdata, p, npts, Nout, serie_temp, fichier_TF, tfdata);
     
     
      delete [] serie_temp;
      delete [] tfdata;
     
    return 0;
    }
    int  TF(fftw_complex *Ttfdata, fftw_plan p, const long npts, const long Nout,
    	 donnees *serie_temp, string fichier_sortie, donnees *tfdata)
        {
            // Je vous fais grace des détails
        }


    Pour finir mon Makefile :
    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
    CPP = /usr/bin/g++
     
    OBJ= fond031007.o 
     
    CFLAGS = -O2 -Wno-deprecated -I/usr/local/include/gsl -lm -lgsl -lgslcblas -lfftw3
     
     
    all: fondOK
     
    fondOK: init.o fond031007.o 
    	$(CPP) $(CFLAGS) init.o fond031007.o -o fondOK
     
    fond031007.o: fond031007.cpp /usr/local/include/gsl/gsl_multimin.h 
    	$(CPP) $(CFLAGS) -c fond031007.cpp
     
    init.o: init.cpp init.h
    	$(CPP) $(CFLAGS) -c init.cpp


    Et maintenant mon problème...
    init.h:5: error: ‘string’ was not declared in this scope
    init.h:6: error: ‘string’ was not declared in this scope
    init.h:6: error: ‘donnees’ was not declared in this scope
    init.h:6: error: ‘serie_temp’ was not declared in this scope
    init.h:6: error: initializer expression list treated as compound expression
    init.cpp: In function ‘int lignes_fichier(std::string)’:
    init.cpp:11: error: ‘int lignes_fichier(std::string)’ redeclared as different kind of symbol
    init.h:5: error: previous declaration of ‘int lignes_fichier’
    init.cpp: At global scope:
    init.cpp:36: error: ‘donnees’ has not been declared
    init.cpp: In function ‘int lecture_donnees(std::string, int*)’:
    init.cpp:36: error: ‘int lecture_donnees(std::string, int*)’ redeclared as different kind of symbol
    init.h:6: error: previous declaration of ‘int lecture_donnees’
    init.cpp:51: error: request for member ‘temps’ in ‘*(((int*)(((unsigned int)cpt) * 4u)) + serie_temp)’, which is of non-class type ‘int’
    init.cpp:52: error: request for member ‘sig’ in ‘*(((int*)(((unsigned int)cpt) * 4u)) + serie_temp)’, which is of non-class type ‘int’
    make: *** [init.o] Error 1
    désolée si les lignes ne correspondent pas... J'ai mis des numéros aux bons endroits.
    L'erreur sur les lignes 51 et 52 sont dues au fait que ma structure ne doit pas être au bon endroit que qu'elle n'est pas vue par init.cpp

    Avez-vous une idée de pourquoi il me dit que "string" n'a pas été déclaré ? Je n'y comprends plus rien, je suis à bout de nerf....

    ... Je vous retrouve demain, je ne suis plus du tout efficace ce soir ( et j'ai pas internet chez moi... pour une fois, je suis contente car sinon je n'aurai pas pu m'empêcher de gâcher ma soirée à desespérer pour trouver une solution)

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Peulhaupe,

    Bonjour,

    Je suis complètement à bout... je ne sais pas programmer et je ne le saurai jamais. Le problème c'est que je dois programmer........ J'ai envie de tout laisser tomber mais bon... je ne peux pas, je suis une esclave...
    Attitude qui ne t'aidera pas à améliorer ton niveau Tout le monde est débutant est galère à un moment, faut juste l'accepter, retrousser les manches et s'attaquer au problème.

    Ceci dit, en passant, je ne sais même pas à quoi ça sert le #ifndef INIT_H et tout le tralala avec les #....
    Ce sont des gardes d'inclusions. En gros quand ton compilateur compile ton programme, il commence par faire une passe de preprocessing dans laquelle il traite toutes les instructions du preprocessor. En particulier il va regrouper les fichiers comportant des directives "#include" en un seul fichier. En gros si tu as un fichier A.h contenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int uneFonction();
     
    class MyClass {
    //... etc déclaration de la classe
    };
    et un fichier B.h contenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "A.h"
     
    A& uneAutreFonction();
     
    class B {
    //... etc déclaration de la classe
    };
    Après preprocessing, il ne restera qu'un seul fichier contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int uneFonction();
     
    class MyClass {
    //... etc déclaration de la classe
    };
     
    A& uneAutreFonction();
     
    class B {
    //... etc déclaration de la classe
    };
    Maintenant, si tu te retrouve dans un schéma du type :
    - B.h inclue A.h
    - C.h inclue A.h et B.h

    Le code contenu dans le fichier A.h va se retrouver deux fois dans le fichier généré. Les gardes d'inclusions permettent d'éviter cela, tu définis une variable de preprocessing a première fois que le fichier est parcouru, par la suite si cete variable est déjà définie, tout ce qui se trouve entre le #ifndef et #endif n'est pas inclus.

    Maintenant en ce qui concerne ton erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1 #ifndef INIT_H
    2 #define INIT_H
    3
    4
    5 int lignes_fichier(string nom_fichier);
    6 int lecture_donnees(string nom_fichier, donnees *serie_temp);
     
    #endif
    Tous les types que le compilo examine à un instant t doivent avoir été déclarés avant, que ce soit par une déclaration anticipée ou un #include.

    Dans ton cas, lorsque tu arrives sur la première fonction, le type string n'a encore été déclaré nulle part. Idem pour le type donnees.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef INIT_H
    #define INIT_H
     
    #include <string>
     
    class donnees; //ou #include "FichierContenantLaDeclarationDuTYpeDonnees"
    //Eviter les using namespace dans les headers
     
    int lignes_fichier(std::string nom_fichier);
    int lecture_donnees(string nom_fichier, donnees *serie_temp);
     
    #endif

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Par défaut
    (desole pour la double reponse, j'avais commence a ecrire longtemps avant la premiere reponse)

    Bonjour,

    Tout d'abord, repire et reprend ton calme. J'espere que la nuit t'a detendue.

    Le C++ peut parfois se montrer assez frustrant de part la verbosite de ses erreurs de compilations. Rassure toi, les erreurs que tu signales ne sont pas bien mechantes et nous allons tenter de te les corriger en t'expliquant pourquoi sans entrer dans les details qui ne semblent pas te passionner.

    Premierement, #ifndef INIT_H fait parti de ce qu'on appel la 'garde' de ton fichier init.h. Une 'garde' est composee d'un ensemble d'instructions permettant de proteger ton fichier .h contre la multi-inclusion. Cela signifie que ces lignes empechent ton fichier d'etre inclus plusieur fois lors de la compilation.
    Ce n'est pas bien grave si tu ne comprends pas ce que cela signifie, retient juste que mettre une 'garde' dans ses fichiers .h est une habitude de code saine voire indispensable.
    Une garde se definie ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifdnedf __MON_FICHIER_H__
    # define __MON_FICHIER_H__
     
    /* code du fichier .h */
     
    #endif /* __MON_FICHIER_H__ */
    La syntaxe que je te montre ici ne fera peut etre pas l'unanimite parmis les developpeurs qui parcourent ce forum mais elle a le merite d'etre claire et simple.

    En ce qui concerne les premieres lignes de la sortie de ta compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    init.h:5: error: ‘string’ was not declared in this scope
    init.h:6: error: ‘string’ was not declared in this scope
    init.h:6: error: ‘donnees’ was not declared in this scope
    init.h:6: error: ‘serie_temp’ was not declared in this scope
    init.h:6: error: initializer expression list treated as compound expression
    Le compilateur t'indique clairement la source de tes erreurs: init.h
    Etudions le contenu que tu nous as fournis:

    init.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1 #ifndef INIT_H
    2 #define INIT_H
    3
    4
    5 int lignes_fichier(string nom_fichier);
    6 int lecture_donnees(string nom_fichier, donnees *serie_temp);
    7
    8#endif
    Tu declares deux prototypes de fonctions (lignes 5 et 6) prenant toutes deux une variable de type 'string' en paramettre. Il faut savoir que le type 'string' n'est pas un type natif du C++. Il faut donc renseigner le compilateur sur la facon dont il doit comprendre ce type. Pour cela tu vas devoir ajouter la ligne '#include <string>' en haut de ton fichier init.h. Cependant la compilation echouera malgres tout: la classe 'string' fait partie du namespace 'std', ce qui signifie que tu dois egalement renseigner le compilateur sur la facon dont il doit atteindre cette classe. Tu peux utiliser deux methodes pour y parvenir:
    - Ajouter le namespace a ton type: 'string' s'ecrit alors 'std::string'
    - Ajouter le contenu du namespace 'std' a l'ensemble de ton fichier: 'using namespace std;'
    init.h devient donc:

    init.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    1 #ifndef INIT_H
    2 #define INIT_H
    3
    4 #include <string>
    5
    6 int lignes_fichier(std::string nom_fichier);
    7 int lecture_donnees(std::string nom_fichier, donnees *serie_temp);
    8
    9#endif
    ou plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1 #ifndef INIT_H
    2 #define INIT_H
    3
    4 #include <string>
    5 using namespace std;
    6
    7 int lignes_fichier(string nom_fichier);
    8 int lecture_donnees(string nom_fichier, donnees *serie_temp);
    9
    10 #endif
    Ensuite, le compilateur t'indique qu'il ne connait pas le type 'donnees' pour la declaration du pointeur 'donnees *serie_temp' (ligne 8). C'est normal puisque c'est un type que tu as definis toi-meme, a savoir une structure contenant deux doubles, et qu'au moment ou tu y fais appel ce type n'a jamais ete defini: Tu declares la structure dans ton fichier main.cpp apres l'include de ton fichier init.h.
    De plus, les structures sont a eviter autant que possible en C++. Tu devrais plutot declarer une classe a la place. Si tu ignores ce qu'est une classe, sache juste que tout ce que tu pouvais faire avec une struture reste globalement possible avec une classe. Supprime la structure 'donnees' de ton fichier main.cpp et ajoute la classe correspondante dans ton fichier init.h:

    init.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
     
    1  #ifndef INIT_H
    2  #define INIT_H
    3
    4  #include <string>
    5  using namespace std;
    6
    7  class donnees
    8  {
    9   double    temps;
    10  double    sig;
    11 };
    12
    13 int lignes_fichier(string nom_fichier);
    14 int lecture_donnees(string nom_fichier, donnees *serie_temp);
    15
    16 #endif
    Les deux dernieres ligne d'erreurs du groupe que nous etudions sont des effets de bord de l'abscence de declaration du type 'donnees'. Elle disparaitront a la correction de cette declaration.


    Voyons maintenant les lignes suivantes de la sortie de la compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    init.cpp: In function ‘int lignes_fichier(std::string)’:
    init.cpp:11: error: ‘int lignes_fichier(std::string)’ redeclared as different kind of symbol
    init.h:5: error: previous declaration of ‘int lignes_fichier’
    Le compilateur se comporte ici de facon bien legitime:
    Au debut de ton fichier init.cpp tu le renseignes cette fois sur le type 'string', a savoir qu'il est definit grace a l'include '#include <string>' et que tu 'utilises' son namespace.
    Hors, lors de la declaration de ta fonction 'lignes_fichier', le compilateur ne connaissait pas le type string. Il n'arrive donc pas a faire le rapprochement entre la fonction 'lignes_fichier' declaree dans ton fichier init.h et celle utilisee dans ton fichier init.cpp.
    Corrige donc ton init.h comme je te l'ai conseille au dessus et cette erreur disparaitra elle aussi par magie.


    Continuons a elucider les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    init.cpp: At global scope:
    init.cpp:36: error: ‘donnees’ has not been declared
    init.cpp: In function ‘int lecture_donnees(std::string, int*)’:
    init.cpp:36: error: ‘int lecture_donnees(std::string, int*)’ redeclared as different kind of symbol
    init.h:6: error: previous declaration of ‘int lecture_donnees’
    (Probleme desormais commun ):
    Lors de la definition de la fonction 'lecture_donnees' a la ligne 36 de ton fichier init.cpp, le compilateur ignore tout de l'existence du type 'donnees' et qu'il semble assumer comme un 'int' (a moins que tu ais redeclare cette fonction dans une partie du code que tu ne nous fournis pas, chose dont je doute). La solution est donc la meme que pour l'erreur precedente: Corrige ton fichier init.h de la facon dont je t'ai propose et cette erreur disparaitra.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    init.cpp:51: error: request for member ‘temps’ in ‘*(((int*)(((unsigned int)cpt) * 4u)) + serie_temp)’, which is of non-class type ‘int’
    init.cpp:52: error: request for member ‘sig’ in ‘*(((int*)(((unsigned int)cpt) * 4u)) + serie_temp)’, which is of non-class type ‘int’
    make: *** [init.o] Error 1
    Tu ne fournis pas le code correspondant a ces lignes mais d'apres ce que j'ai pu lire de ton code j'en deduis les choses suivantes les concernant:

    Tu fais appel aux champs 'temps' et 'sig' de ta structure 'donnee' dans ta function 'lecture_donnees' or, puisque le compilateur n'a jamais entendu parler de ton type 'donnees' et qu'il l'assume comme etant un int, il hallucine lorsque tu lui demandes d'atteindre un champs (Un int etant un type natif du C++ et non une classe).


    Voila, comme tu viens de le constater, moi aussi j'ai du mal a faire court mais je voulais m'assurer que tu comprennes bien les erreurs que tu as faite.
    Tu as pus te rendre compte qu'un simple probleme d'include manquant et de place de la declaration d'une structure a fait s'enchainer les erreurs en cascade.

    Si tu me permet quelques conseils:

    - Le compilateur a toujours raison (sauf dans des cas speciaux dont il n'est pas question ici).

    - Il vaut mieux utiliser des classes plutot que des structures en C++. On ne parle alors plus de 'fonctions' mais de 'methodes'.

    - Prend ton temps pour coder, la programmation n'est pas quelquechose d'aussi complique que tu peux croire, il faut de la patience et prendre le temps de lire les informations. Chaque ligne compte et l'ordre dans lequel elle sont ecrites encore plus.

    - Commence par declarer tout tes types de donnees et les prototypes de tes fonctions dans un .h et ensuite seulement cree le fichier .cpp correspondant dans lequel tu vas includer le fichier .h et implementer tes fonctions.
    Les erreurs auxquelles tu as ete confrontee ici sont des erreurs vraiment tres classiques et un peu de discipline et de methode permet de les eviter simplement.

    - Je pense que tu aurais pu trouver toi meme la cause de tes erreurs en y reflechissant calmement. Je peux comprendre que la programmation soit pour toi un supplice, mais tes excercices ne semblent utiliser que des syntaxes simples du C++ que tu peux apprendre et comprendre en seulement quelques heures. Ceci qui te fera gagner enormement de temps sur la correction des erreurs et te permettra de retourner a des choses qui t'interessent plus rapidement.


    Je te souhaite bon courage pour la suite et la reussite de tes exercices.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Citation Envoyé par Thornska
    La syntaxe que je te montre ici ne fera peut etre pas l'unanimite parmis les developpeurs qui parcourent ce forum mais elle a le merite d'etre claire et simple.
    Effectivement, les noms commençant par deux underscores sont réservés au langage C++.
    Certain sets of names and function signatures are always reserved to the implementation:
    Each name that contains a double underscore (__) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use. Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

    Citation Envoyé par Thornska
    Ajouter le contenu du namespace 'std' a l'ensemble de ton fichier: 'using namespace std;'
    Surtout pas dans un header.
    http://cpp.developpez.com/faq/cpp/?p...SPACE_no_using


    Citation Envoyé par Thornska
    De plus, les structures sont a eviter autant que possible en C++.
    Comme s'il fallait les fuire comme la peste... Non, il faut savoir bien les utiliser mais ils ne sont pas à éviter.
    http://cpp.developpez.com/faq/cpp/?p...e_class_struct
    Classes et structures sont donc presque équivalentes, cependant on adopte souvent cette convention : on utilise struct pour les structures type C (pas de fonction membre, d'héritage, de constructeurs, ...) et class pour tout le reste.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Par défaut
    J'ai ecrit en voulant rester simple et pratique, j'appuie cependant toutes les precisions apportees par Aoyou.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut


    Je dois avouer qu'hier j'ai craqué.... j'ai tellement de pression sur le dos, je vous avais dit que je suis une esclave (une thésarde quoi...) et donc ce ne sont malheureusement pas des exercices mais un programme destiné à être utilisé par mon équipe... Les données vont bientôt arriver (1er décembre) et je rame.. et plus je rame, plus j'angoisse et donc, plus je rame. (C'est super de faire ça quand on n'a jamais programmé de sa vie !! ... enfin j'avais quand même quelques bases les plus basiques que j'ai apprises il y a 4ans, en gros : les boucles for, while, les conditions, un peu de pointeurs, un peu de tableaux, les ouverture de fichiers et c'est a peu près tout, maintenant je connais en plus les stuctures, les vecteurs (un peu) et les "string" ! Non, je pense que j'ai quand même appris plus que ça. Et puis, je m'applique à faire un code propre et lisible)

    Citation Envoyé par Thornska
    - Je pense que tu aurais pu trouver toi meme la cause de tes erreurs en y reflechissant calmement. Je peux comprendre que la programmation soit pour toi un supplice, mais tes excercices ne semblent utiliser que des syntaxes simples du C++ que tu peux apprendre et comprendre en seulement quelques heures. Ceci qui te fera gagner enormement de temps sur la correction des erreurs et te permettra de retourner a des choses qui t'interessent plus rapidement.
    Oui, c'est vrai que j'aurai pu trouver moi-même mais en combien de temps ? Surtout que je n'ai aucun livre et personne autour de moi pour m'aider, donc dur dur. Mais bon, j'ai déjà beaucoup progressé depuis que j'ai commencé ce programme... si si, c'est vrai même si ça ne se voit pas Mais bon, ce n'est pas un supplice, c'est juste que je galère et qu'il n'y a personne dans mon équipe qui ne m'aide (alors que c'est leur rôle, c'est écrit dans la charte de ma thèse qu'ils ont signé...) Il faudrait que je leur demande de m'acheter un livre sur le C++, ça m'aiderait beaucoup je pense.


    Citation Envoyé par bolhrak
    Attitude qui ne t'aidera pas à améliorer ton niveau Tout le monde est débutant est galère à un moment, faut juste l'accepter, retrousser les manches et s'attaquer au problème.
    Ca c'est bien vrai... on va dire que c'est parce que c'était la fin de la journée Mais je dois avouer que c'est pas facile de débuter tout seul. Mais je vais y arriver (j'ai pas le choix ) et quand j'aurai réussi à finir ce programme, je pourrai être contente de moi.



    Pour ce qui est de l'erreur, effectivement, c'était assez simple. J'avais déjà essayé avec dans mon init.h et effectivement, ça n'avait pas marché... C'est là que j'ai craqué. Maintenant, je comprend mieux pourquoi ça ne marchait pas (je ne savais pas que string faisait partie de namespace std.)
    Pour ce qui est de ma structure donnees, je savais qu'elle n'était pas au bon endroit (dans le mauvais fichier) mais je n'avais pas eu le courage de la déplacer avant de partir. Ca faisait déjà quelques erreurs que je comprenais.
    Et merci pour l'explication des #ifndef INIT_H, j'aurai été quand même chercher la signification parce que c'est pas forcément conseillé de mettre des choses dont on ne sait pas à quoi ça sert. Je ferai quand même une recherche pour compléter vos explications (très très claires, j'ai tout compris ).

    Par contre, ma structure, je vais la garder, ya juste deux doubles dedans, pas de constructeur, pas de fonction membre et j'ai déjà eu beaucoup de mal à la mettre en place comme il faut avec un vecteur de structure . Je sais bien qu'il n'y a pas beaucoup de différences avec une classe, j'ai retenu que par défaut une structure est public et une classe private. Pour les autres différences, il faudra que je reconsulte la FAQ.

    Bon, naturellement, ça marche Je met le message en résolu.

    Et c'est reparti !

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Sur les aspects de partage en plusieurs fichiers du code, qui sont souvent traités succinctement dans la plupart des ouvrages je trouve, j'avais écrit un petit document (destiné à faire partie d'un plus grand si j'avais eu plus de temps et de motivation...) qui pourra peut-être t'aider. On peut le trouver .
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 100
    Par défaut
    Pour l'histoire d'avoir un bon bouquin de C++, y'a les pdf de developpez.com qui m'ont tout appris sur le C++

    Notamment PolyCpp.pdf disponible ici : http://cpp.developpez.com/cours/polyCpp/

    Sinon la liste exhaustive est la : http://cpp.developpez.com/cours/

    Pour des vrais bouquins physiques qui sont en papier, j'ai acheté C++ en action qui est pas mal du tout, mais c'est un outil de référence pour des problemes recurrents et "assez" simple, du genre : Comment qu'on fait pour interpreter une chaine en entier ou en float.
    Tout est presenté sous la forme de question réponse de ce style avec code. Le tout en code C++ standard et propre. Bref je l'aime bien, mais il n'a pas plus de but didactique que ca. (la critique de ce livre sur developpez.com : http://cpp.developpez.com/livres/?pa...ng#L2841774074)
    Mais comme dit, je ne pense pas que si on ne doit avoir qu'un livre en C++ ce serait celui la

    Bon courage pour la suite

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

Discussions similaires

  1. INDEX sur une colonne qui peut être NULL
    Par dorian53 dans le forum Requêtes
    Réponses: 15
    Dernier message: 29/11/2007, 17h13
  2. Many-to-one ne peut être null
    Par minimarch76 dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/09/2007, 11h27
  3. Comment insérer une date qui peut être nulle ?
    Par guidav dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/01/2007, 16h18
  4. Une Foreign Key peut-elle être null ?
    Par bassim dans le forum Firebird
    Réponses: 9
    Dernier message: 21/11/2006, 20h20
  5. [Access][SQL] Filtrer un champ text qui peut être NULL
    Par aumax1 dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/04/2006, 08h40

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