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 :

Le compilateur : quel scammer !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Le compilateur : quel scammer !
    Bonjour,

    Je voudrais porter plainte contre le compilateur parce qu'il fait des coups en douce. Ah bien oui ! il ne manque pas de compiler, laisse la joie se mettre à son aise pour en fait m'insulter avec un crash comme je les aime xD.

    Tout fonctionnait jusqu'à ce que je décide d'implémenter la fonction OCCURENCE_DANS_LIGNE. L'erreur doit je suppose donc venir de là bas !
    Malgré les tests sur les pointeurs pour lesquels certains membres se sont vaillamment battu pour que je m'habitue à les mettre et bien j'ai quand même le droit au crash ! Puisqu'il ne m'affiche pas les erreurs du test else, j'en conclue qu'il rentre dans la boucle et qu'il plante dedans.

    Étant donné que je fais mes premiers pas avec la fonction realloc, je suppose que l'erreur vient d'ici à cause d'une mauvaise manipulation mais laquelle ? That is the question à 100 francs !

    Voici le beau code qui ne se déroule pas correctement :

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include <windows.h>
     
    int         LIGNE_FICHIER( FILE *FICHIER                                                   );
    int        TAILLE_FICHIER( FILE *FICHIER                                                   );
    int     OCCURENCE_FICHIER( FILE *FICHIER, char CARACTERE                                   );
    void    MEMORISER_FICHIER( FILE *FICHIER, char *CHAINE                                     );
    void OCCURENCE_DANS_LIGNE( FILE *FICHIER, int **TAB_OCCURENCE, int *TAILLE, char CARACTERE );
     
    int main()
    {
        // OBTENIR LE NOMBRE DE LIGNES
        FILE *F0=fopen("prenoms.txt","r");
        FILE *F1=fopen("noms.txt"   ,"r");
        int ligne_nom    = LIGNE_FICHIER( F0 );
        int ligne_prenom = LIGNE_FICHIER( F1 );
        fclose(F1);
        fclose(F0);
     
        // OBTENIR LE NOMBRE DE CARACTERES
        fopen("prenoms.txt","r");
        fopen("noms.txt"   ,"r");
        int taille_nom    = TAILLE_FICHIER(F1);
        int taille_prenom = TAILLE_FICHIER(F0);
        fclose(F1);
        fclose(F0);
     
        // OCCURENCE D'UN CARACTERE
        fopen("prenoms.txt","r");
        fopen("noms.txt"   ,"r");
        int occurence_nom    = OCCURENCE_FICHIER(F1, '-');
        int occurence_prenom = OCCURENCE_FICHIER(F0, '-');
        fclose(F1);
        fclose(F0);
     
        // PLACER FICHIER EN MEMOIRE
        char *NOM    = malloc(   taille_nom*sizeof(char));
        char *PRENOM = malloc(taille_prenom*sizeof(char));
     
        fopen("prenoms.txt","r");
        fopen("noms.txt"   ,"r");
        MEMORISER_FICHIER( F0, PRENOM );
        MEMORISER_FICHIER( F1, NOM    );
        fclose(F1);
        fclose(F0);
     
        // OCCURENCE DANS LIGNE
        int *TAILLE_TAB_NOM       = malloc(sizeof(int));
        int *TAILLE_TAB_PRENOM    = malloc(sizeof(int));
        int *TAB_OCCURENCE_NOM    = NULL;
        int *TAB_OCCURENCE_PRENOM = NULL;
     
        fopen("prenoms.txt","r");
        fopen("noms.txt"   ,"r");
        OCCURENCE_DANS_LIGNE( F0, &TAB_OCCURENCE_PRENOM, TAILLE_TAB_PRENOM, '-' );
        OCCURENCE_DANS_LIGNE( F1, &TAB_OCCURENCE_NOM   , TAILLE_TAB_NOM   , '-' );
        fclose(F1);
        fclose(F0);
     
        printf("NOMS : %d TAILLE : %d OCCURENCE : %d \nPRENOMS :%d TAILLE : %d OCCURENCE : %d",ligne_nom, taille_nom, occurence_nom, ligne_prenom, taille_prenom, occurence_prenom);
        getchar();
     
    }
     
    int LIGNE_FICHIER( FILE *FICHIER )
    {
        int  NOMBRE_LIGNES = 0;
        char C                ;
     
        if( FICHIER != NULL )
          {
                   while( fscanf(FICHIER,"%c",&C) != EOF )
                        {
                            if (  C == '\n' )
                               {
                                   NOMBRE_LIGNES++;
                               }                    
                        }
     
                   return NOMBRE_LIGNES;
          }
     
      else printf("\n ERREUR DANS LA FONCTION LIGNE_FICHIER\n   + VERIFIEZ QUE LE FICHIER EXISTE");
    }
     
    int TAILLE_FICHIER( FILE *FICHIER )
    {
        int  TAILLE = 0;
        char C                ;
     
        if( FICHIER != NULL )
          {
                   while( fscanf(FICHIER,"%c",&C) != EOF )
                        {
                                   TAILLE++;                   
                        }
     
                   return TAILLE;
          }
     
      else printf("\n ERREUR DANS LA FONCTION TAILLE_FICHIER\n   + VERIFIEZ QUE LE FICHIER EXISTE");
    }
     
    int OCCURENCE_FICHIER( FILE *FICHIER, char CARACTERE )
    {
        int  OCCURENCES = 0;
        char C            ;
     
        if( FICHIER != NULL )
          {
                   while( fscanf(FICHIER,"%c",&C) != EOF )
                        {
                            if (  C == CARACTERE )
                               {
                                   OCCURENCES++;
                               }                    
                        }
     
                   return OCCURENCES;
          }
     
      else printf("\n ERREUR DANS LA FONCTION LIGNE_FICHIER\n   + VERIFIEZ QUE LE FICHIER EXISTE");
    }
     
    void MEMORISER_FICHIER( FILE *FICHIER, char *CHAINE )
    {
        if( FICHIER != NULL && CHAINE != NULL )
          {
                   int  i = 0;
                   char C    ;
     
                   while( fscanf(FICHIER,"%c",&C) != EOF )
                        {
                            CHAINE[i]=C;
                            i++;               
                        }
          }
     
      else printf("\n ERREUR DANS LA FONCTION MEMORISER_FICHIER\n   + VERIFIEZ QUE LE FICHIER EXISTE\n   +VERIFIEZ QUE LA CHAINE EST CORRECTEMENT REFERENCEE");
    }
     
    void OCCURENCE_DANS_LIGNE( FILE *FICHIER, int **TAB_OCCURENCE, int *TAILLE, char CARACTERE )
    {
        char  C                ;
        int   i             = 0;
        int   CONTROL       = 0;
        int   LIGNE         = 0;
        int   OCCURENCES    = 0;
     
        *TAILLE        = 1                              ;
        *TAB_OCCURENCE = malloc( (*TAILLE)*sizeof(int) );
     
        if( FICHIER != NULL && TAB_OCCURENCE !=NULL && TAILLE != NULL )
          {
                   while( fscanf(FICHIER,"%c",&C) != EOF )
                        {
                            if ( C == '\n' )
                               {
                                   LIGNE++;
                               }
     
                            if ( C == CARACTERE )
                               {
                                   if ( CONTROL == 0 )
                                      {
                                          *TAB_OCCURENCE[i]=LIGNE;
                                          i++;  
                                          CONTROL++;        
                                      }
     
                                 else {
                                          realloc(*TAB_OCCURENCE, ((*TAILLE)++)*sizeof(int));
                                          *TAB_OCCURENCE[i]=LIGNE;
                                          i++;
                                      }                 
                               }                    
                        }
          }
     
      else printf("\n ERREUR DANS LA FONCTION OCCURENCE_DANS_LIGNE\n   + VERIFIEZ QUE LE FICHIER EXISTE\n   + VERIFIEZ SI VOS POINTEURS SONT CORRECTEMENTS REFERENCES");
    }

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Il ne faut pas oublier la priorité des opérateurs
    Tu passes l'adresse d'un tableau, donc dans ta fonction OCCURENCE_DANS_LIGNE tu as un pointeur de tableau.
    Pour accéder aux variables de celui-ci il faut que tu mettes des parenthèses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*TAB_OCCURENCE)[i]=LIGNE;

  3. #3
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    En effet merci ça marche au taquet !
    Bon on va mettre ça sur le compte de la fatigue !
    C'est pas grave, qu'elle m'envoie la facture, mais chut quand même faut pas le répéter !


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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Et surtout, realloc() peut retourner une autre adresse que celle passée en paramètre, surtout lors d'un agrandissement.

    Inspire-toi plutôt de ceci:
    http://www.developpez.net/forums/d79...e/#post4562719
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Quel compilateur choisir pour l'assembleur ?
    Par forthx dans le forum Assembleur
    Réponses: 97
    Dernier message: 09/10/2018, 14h55
  2. Réponses: 9
    Dernier message: 19/02/2010, 14h05
  3. Réponses: 7
    Dernier message: 07/09/2007, 00h50
  4. Quel est le meilleur compilateur?
    Par doderic dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 09/02/2005, 23h24
  5. Quel compilateur choisir?
    Par xMatrix dans le forum Choisir un environnement de développement
    Réponses: 1
    Dernier message: 29/11/2003, 14h24

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