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 :

Mauvais élève en C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Par défaut Mauvais élève en C++
    Bonjour,

    Je suis nouveau sur ce site, un peu moins en programmation mais presque, mais j'ai appris sur le tas, en m'inspirant des gens qui m'entourent (qui ne sont pas programmeurs à la base).
    En me promenant sur le site, je me rends compte que je fais plein de trucs sales en C++ (#define, char*, FILE*, tableaux multidim, fichier monobloc...).

    Il y a tellement de trucs à changer en même temps que je suis perdu, et c'est là que j'ai besoin de vous!

    J'ai essayé de concentrer ces problèmes en coupant dans un programme que j'utilise et en le simplifiant. C'est un programme qui lit des tableau dans des fichiers (dans sa version complete pouvant lire différents types de fichiers) et mettant les données dans un tableau de format générique.

    Voilà le code:

    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
     
    #include <fstream>
    #include <stdio.h>
    #include <iostream>
     
    using namespace std;
     
    #define NbAntMax 2		// Nombre de signaux
    #define NbChTimeMax 10001	// Nombre de canaux temporel max absolu
    #define NbChTimeAA 1000		// Nombre max AA (normalement il y a des signaux BB, avec une autre longueur)
    #define NbTypesSignaux 5	// Temps, NS, EW, vertical, autre parametre
     
    // Tableau destines a contenir les signaux
    float signalsAA[NbAntMax][NbTypesSignaux][NbChTimeMax];
     
    // Declaration des fonction de lecture des fichiers
    void Read1FileAA(char* AAdir,char* AAfile,float signals[NbAntMax][NbTypesSignaux][NbChTimeMax],int ant);
    void ReadAllFilesAA(char* AAdir,char* AAfile[NbAntMax],float signals[NbAntMax][NbTypesSignaux][NbChTimeMax]);
     
    // Chemin des fichiers de donnees AA
    char* dirAA="./dataAA/";
    char* fileAA[NbAntMax]={"file1","file2"};
     
    int main()
    {
      ReadAllFilesAA(dirAA,fileAA,signalsAA);
      printf("Last value: %3f\n",signalsAA[1][3][999]);
      return 0;
    }
     
     
    // ReadAllFileAA: Lit les trois composantes du champ de tous les fichiers AA
    void ReadAllFilesAA(char* AAdir,char* AAfile[NbAntMax],float signals[NbAntMax][NbTypesSignaux][NbChTimeMax])
    {
      for(int i=0;i<NbAntMax;i++) {
        Read1FileAA(AAdir,AAfile[i],signals,i);
      }
    }
     
    // Read1FileAA: Lit les trois composantes du champ d un fichier AA a une position
    void Read1FileAA(char* AAdir,char* AAfile,float signals[NbAntMax][NbTypesSignaux][NbChTimeMax],int ant)
    {
      int ii=ant;
     
      char AAdirfile[100];
      sprintf(AAdirfile,"%s%s.dat",AAdir,AAfile);
     
      FILE *fAnt;
      if((fAnt = fopen(AAdirfile,"r"))==NULL) {printf("Cant open AA file: %s\n",AAdirfile);}
     
      for(int jj=0;jj<2012;jj++) {
        fscanf(fAnt,"%f",&signals[ii][0][jj]);	// Time
        fscanf(fAnt,"%f",&signals[ii][1][jj]);	// ns
        fscanf(fAnt,"%f",&signals[ii][2][jj]);	// ew
        fscanf(fAnt,"%f",&signals[ii][3][jj]);	// vert
        signals[ii][4][jj]=999;			// nothing, utilise avec les signaux BB...
      }
    }
    Je vous laisse admirer le style

    Vous pouvez m'aider à améliorer ça, histoire de repartir sur de bonnes bases?

    Pour commencer, j'ai essayé hier de mettre les fonctions de lectures dans un fichier .cxx séparé, plus un header (appelé après les #define), mais à la compilation j'ai un message
    undefined reference to ReadAllFilesAA.



    PS: En fichier joint, le code plus les données pour que ça tourne
    PS2: J'ai déjà écrit des milliers de lignes de C++(?) avec ce style
    Fichiers attachés Fichiers attachés

  2. #2
    screetch
    Invité(e)
    Par défaut
    Deja ce n'est pas du C++ c'est du C ca ^^

    ensuite je vais manger, je profite juste de cela pour augmenter de maniere artificielle mon nombre de posts.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Par défaut
    si t as ecrit des milliers de lignes en C alors que tu croyais faire du C++, chapeau bas !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Par défaut
    Dans les parties zapées, il y avait pas mal d'utilisations d'objets ROOT, que j'utilise assez intensivement par ailleurs.
    Mais c'est vrai qu'a part ça, j'écris surtout du C. Comme je galère régulièrement (avec les appels de tableau multidims dans les fonctions par exemple) comme ça, et que je pense que ce serait plus simple avec des objets(c'est pour aller dans ce sens que je veux mettre les fonctions dans un fichier séparé), et plein d'autres raisons, que je veux passer au C++.

    edit: C'est vrai que j'aurrais pu faire un effort pour mettre un cout à la place du printf, ça je sais faire (mais j'ai moins l'habitude)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Salut,
    effectivement c'est spécial pour du c++ ^^

    "Il y a tellement de truc a changer, c'est la que j'ai besoin de vous" : Les gens qui sont sur le forum sont pas la non plus pour te donner un cour particulier :p
    Tu es sur un super site avec plein de tutos, tu devrais trouver pas mal de renseignements pour arriver a tes fins.
    Sinon il y a aussi les librairies... Non je parles des batiments avec des gens qui vendent des livres ^^

  6. #6
    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
    Déjà, tu peux
    • enlever <stdio.h>
    • remplacer #define var value par static const int var = value;
    • bannir char * et n'utiliser que des strings
    • remplacer printf par cout
    • plus besoin de sprintf : concaténer les strings (string AAdirfile = AAdir + AAfile + ".dat"
    • Ne pas utiliser FILE mais les fstream
    • Plus de scanf avec les fstream (préférer fAnt >> signals[ii][0][jj] >> ...)
    • Ne pas oublier de fermer le fichier une fois que tu as terminé avec
    • Mettre les fonctions de lecture dans un fichier à part (réessaie, ça doit marcher, sûrement une erreur dans ta ligne de commande). En faire une classe ?
    • Le tableau multidimensionnel, bof pourquoi pas, tu peux-etre définir une classe qui correspondrait à une ligne du tableau et utiliser un vecteur à la place, c'est toi qui voit ce que tu veux faire.
    • Regarder un livre de C++.


    Bon bah voilà, ça te fait déjà un paquets de choses à faire pour passer en C++.

    N'hésite pas à nous dire comment se passe ta reconversion.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Par défaut
    Merci pour vos réponses.

    aoyou a dit:
    • enlever <stdio.h>
    • remplacer printf par cout
    • Ne pas oublier de fermer le fichier une fois que tu as terminé avec
    • Mettre les fonctions de lecture dans un fichier à part (réessaie, ça doit marcher, sûrement une erreur dans ta ligne de commande). En faire une classe ?
    Les trois premiers points sont fait, et je vais m'attaquer aux autres après avoir reglé le 4ème: quand je divise le code, je n'arrive plus a compiler. J'ai les fichiers:

    lecture2.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
     
    #include <fstream>
    #include <iostream>
     
    using namespace std;
     
    #define NbAntMax 2		// Nombre de signaux
    #define NbChTimeMax 10001	// Nombre de canaux temporel max absolu
    #define NbChTimeAA 1000		// Nombre max AA (normalement il y a des signaux BB, avec une autre longueur)
    #define NbTypesSignaux 5	// Temps, NS, EW, vertical, autre parametre
     
    #include "fonctions.h"
     
    // Tableau destines a contenir les signaux
    float signalsAA[NbAntMax][NbTypesSignaux][NbChTimeMax];
     
     
    // Chemin des fichiers de donnees AA
    char* dirAA="./dataAA/";
    char* fileAA[NbAntMax]={"file1","file2"};
     
    int main()
    {
      ReadAllFilesAA(dirAA,fileAA,signalsAA);
      cout<<"Last value: "<<signalsAA[1][3][999]<<endl;
      return 0;
    }
    fonctions.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef FONCTIONS_H
    #define FONCTIONS_H
     
     // Declaration des fonction de lecture des fichiers
    void Read1FileAA(char* AAdir,char* AAfile,float signals[NbAntMax][NbTypesSignaux][NbChTimeMax],int ant);
    void ReadAllFilesAA(char* AAdir,char* AAfile[NbAntMax],float signals[NbAntMax][NbTypesSignaux][NbChTimeMax]);
     
    #endif
    et fonctions.cxx:
    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
     
    #include <fstream>
    #include <iostream>
     
    using namespace std;
     
    #include "fonctions.h"
     
    // ReadAllFileAA: Lit les trois composantes du champ de tous les fichiers AA
    void ReadAllFilesAA(char* AAdir,char* AAfile[NbAntMax],float signals[NbAntMax][NbTypesSignaux][NbChTimeMax])
    {
      for(int i=0;i<NbAntMax;i++) {
        Read1FileAA(AAdir,AAfile[i],signals,i);
      }
    }
     
    // Read1FileAA: Lit les trois composantes du champ d un fichier AA a une position
    void Read1FileAA(char* AAdir,char* AAfile,float signals[NbAntMax][NbTypesSignaux][NbChTimeMax],int ant)
    {
      int ii=ant;
     
      char AAdirfile[100];
      sprintf(AAdirfile,"%s%s.dat",AAdir,AAfile);
     
      FILE *fAnt;
      if((fAnt = fopen(AAdirfile,"r"))==NULL) {printf("Cant open AA file: %s\n",AAdirfile);}
     
      for(int jj=0;jj<2012;jj++) {
        fscanf(fAnt,"%f",&signals[ii][0][jj]);	// Time
        fscanf(fAnt,"%f",&signals[ii][1][jj]);	// ns
        fscanf(fAnt,"%f",&signals[ii][2][jj]);	// ew
        fscanf(fAnt,"%f",&signals[ii][3][jj]);	// vert
        signals[ii][4][jj]=999;			// nothing, utilise avec les signaux BB...
      }
      fclose(fAnt);
    }
    mais quand je compile avec
    g++ lecture2.C -o LECT
    , j'obtiens le message d'erreur
    /tmp/ccBkVWLD.o(.text+0x12c): In function `main':
    : undefined reference to `ReadAllFilesAA(char*, char**, float (*) [5][10001])'
    collect2: ld returned 1 exit status
    Qu'est ce qui ne va pas?

    Merci pour votre temps (j'ai passé toute la journée d'hier à essayer de résoudre ce point tout seul sur ce site et d'autres, sans succès)

    Keld.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2010, 20h27
  2. Mauvais indicateur de connection
    Par calvin dans le forum Hibernate
    Réponses: 15
    Dernier message: 24/05/2004, 12h03
  3. [Tomcat][JSP] Mauvais fonctionnement
    Par gandalf_le_blanc dans le forum Tomcat et TomEE
    Réponses: 47
    Dernier message: 26/04/2004, 13h07
  4. Mauvais noms de colonnes lors d'une requête
    Par nmathon dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/04/2004, 07h27
  5. mauvais code
    Par moumou dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 17/04/2003, 15h56

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