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 :

Probleme tableau dynamique


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Probleme tableau dynamique
    Bonjour je dois ecrire un code qui a partir d'un fichier texte repertorie les mots dans un tableau, mais voila le programme plante a la fin lorsque je veux afficher tout les mots dans la derniere boucle, je ne vois vraiment pas pourquoi
    merci d'avance

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define DELIMITERS    " \r\n\t!@#$%^&*()_+={}|\\:\"'?¿/.,<>’¡;º×÷‘"
     
    main()
    {
         int nbrLignes = 0;
         FILE * fichier = NULL;
         char * buffer = (char *) calloc(10 ,sizeof(char));
         char temp[10] = "";
     
         if((fichier = fopen("test.txt", "w")) != NULL )
         {
            fputs("le@test;a\nreussi!",fichier);
            fclose(fichier);
         }
     
         if((fichier = fopen("test.txt", "r")) != NULL)
         {
             /* Chargement du fichier en memoire */
             while(fgets(temp, 10, fichier) != NULL)
             {
                nbrLignes++;
                buffer = (char *) realloc(buffer, 10 * nbrLignes * sizeof(char));
                strcat(buffer, temp);
             }
             int nbrMots = 0;
             char ** T_MOTS = (char **) malloc(sizeof(char*));
     
             /* Decoupage de la chaine en mots */
             printf("%s\n",buffer);
             char * token = strtok(buffer, DELIMITERS);
             while(token != NULL)
             {
                  nbrMots++;
                  T_MOTS = (char **) realloc(T_MOTS, nbrMots * sizeof(char *));
                  T_MOTS[nbrMots] = (char *) malloc(28 * sizeof(char));
                  strcpy(T_MOTS[nbrMots],token);
                  printf("%s\n",T_MOTS[nbrMots]);
                  token = strtok(NULL, DELIMITERS);
             }
             int i;
              for(i = 0 ;i < nbrMots - 1;i ++)
                {
                    printf("%s\n",T_MOTS[i]);;
                }
             fclose(fichier);
         }
         return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    En ignorant le problème de performance, tu utilises mal realloc: Il faut stocker le résultat dans une variable temporaire.
    De plus:
    • On ne caste pas le retour de malloc()/realloc() en C.
    • Les versions du C antérieures à C99 n'autorisent les déclarations de variables qu'en début de bloc.
      • Ces deux choses me laissent à penser que tu compiles en C++ au lieu d'en C.
    • La fonction main() retourne un int. Toujours.
    • Traditionnellement, on réserve les majuscules aux constantes et defines. T_MOTS n'est pas un bon nom pour une variable.
    • T_MOTS[nbrMots] est une place invalide: puisque tu as alloué de la place pour nbrMots pointeurs, tu n'as droit qu'aux indexes de 0 à nbrMots-1.
    • Tout le code dans le main(), ce n'est pas très propre...

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup Médinoc je vais corriger tout cela, il ya neanmoins quelques points que je n'ai pas bien saisie :

    • On ne caste pas le retour de malloc()/realloc() en C.
      que veux tu dire par caster ?
    • Les versions du C antérieures à C99 n'autorisent les déclarations de variables qu'en début de bloc.

      Ces deux choses me laissent à penser que tu compiles en C++ au lieu d'en C.
      j'utilise Code Blocks et dans les options de compilation il y'a : compilateur C : gcc

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    1. Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      float a = 2.5;
      int b;
      /* Ceci est un cast */
      b = (int)a;
    2. Vérifie que ton fichier possède bien l'extension ".c". Tu peux aussi ajouter ce code en tête de ton fichier, pour t'assurer d'avoir une erreur si tu compiles en C++:
      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      #ifdef __cplusplus
      #error Attempt to compile a C file using a C++ compiler
      #endif

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup encore une fois, j'ai copié le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef __cplusplus
    #error Attempt to compile a C file using a C++ compiler
    #endif
    et Code::Blocks s'arrette a "#error Attempt to compile a C file using a C++ compiler" lors de la compilation pourtant dans les options du compilateur il y'a C compiler : mingw32-gcc.exe
    Quelles options dois je changer ?

    autre detail encore, je dois indexer les mots par ordre alphabetique dans des listes, j'ai ecris une fonction qui le fait mais pour l'instant elle ne gere pas les mots commançant par des caracteres accentués, je voulais savoir si il existerait pas une fonction C qui les traite (ramplace ex: ê -> e, ü -> u) ou dois je utiliser une boucle switch ou bien une grille de traduction ?
    merci d'avance

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Je ne connais pas assez les options de code::blocks, mais commence par t'assurer que le fichier possède bien l'extension .c.

    Le coup des accents est compliqué. Je crois qu'il faut choisir une certaine locale avec la fonction setlocale() (sachant que les noms de locale ne sont pas standard :-/ ), puis utililser la fonction strcoll() au lieu de strcmp(), si je me souviens bien...

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    oui oui j'ai bien verifié pour l'extension, je vais chercher encore a propos des options et des fonctions strcoll() et setlocale().
    je met le sujet en resolu.
    merci pour tout.

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

Discussions similaires

  1. Tableau dynamique probleme
    Par G4uthier dans le forum C
    Réponses: 5
    Dernier message: 01/06/2009, 15h47
  2. Probleme tableau dynamique 2D
    Par Guillotin dans le forum Débuter
    Réponses: 3
    Dernier message: 04/02/2009, 15h27
  3. Réponses: 9
    Dernier message: 23/12/2007, 19h51
  4. probleme dans tableau dynamique
    Par zulad dans le forum C#
    Réponses: 3
    Dernier message: 27/07/2007, 21h05
  5. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00

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