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 :

Problème avec realloc


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 Problème avec realloc
    Bonjour,

    J'ai une erreur à cette ligne : error: invalid operands to binary *

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestRealloc = (char *)realloc( TestRealloc, (*LongueurNouvelleChaine+1)*sizeof(char) );
    Je ne comprends pas pourquoi il braille ici !

    et aussi à cette ligne : error: array subscript is not an integer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*NouvelleChaine)[*LongueurNouvelleChaine] = Chaine[i];
    Pourtant LongueurNouvelleChaine est bien de type int.

    On dit qu'il faut initialiser les pointeurs à null puis les tester ensuite.
    Il faut tester uniquement si on a fait une allocation mémoire pour vérifier le retour de l'allocation ?


    Voici le code en entier :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int LongueurChaine( char *Chaine );
    void SupprimerOccurenceDansChaine( char *Chaine, int LongueurChaine, char **NouvelleChaine, int **LongueurNouvelleChaine, char Occurrence );
     
    int main()
    {
        char *Chaine="bonjour";
        printf("\n\n Longueur de \"%s\" = %d", Chaine, LongueurChaine( Chaine ) );
     
        int  *NouvelleLongueur;
        char *NouvelleChaine  ;
     
        SupprimerOccurenceDansChaine( Chaine, LongueurChaine( Chaine ), &NouvelleChaine, &NouvelleLongueur, 'b' );
     
        int i;
        for ( i=0 ; i<*NouvelleLongueur ; i++ )
            {
                printf("%c", NouvelleChaine[i]);
            }
     
        free(Chaine);
        free(NouvelleLongueur);
        free(NouvelleChaine);
        return 0;
    }
     
    int LongueurChaine( char *Chaine )
    {
        int Longueur = 0;
     
        while ( *Chaine != '\0' )
              {
                  Longueur++;
                  Chaine++;
              }
     
        return Longueur;
    }
     
    void SupprimerOccurenceDansChaine( char *Chaine, int LongueurChaine, char **NouvelleChaine, int **LongueurNouvelleChaine, char Occurrence )
    {
        *NouvelleChaine         = NULL;
        *LongueurNouvelleChaine = NULL;
     
        *LongueurNouvelleChaine = (int *)malloc( sizeof( int ) );
        *LongueurNouvelleChaine = 0;
     
        char *TestRealloc = NULL;
     
        if ( Chaine != NULL && NouvelleChaine != NULL && LongueurNouvelleChaine != NULL )
           {
               int i;
               for ( i=0 ; i<LongueurChaine ; i++ )
                   {
                       if ( Chaine[i] != Occurrence )
                          {
                              TestRealloc = (char *)realloc( TestRealloc, (*LongueurNouvelleChaine+1)*sizeof(char) );
     
                              if ( TestRealloc != NULL )
                                 {
                                      *NouvelleChaine                           = TestRealloc;
                                     (*NouvelleChaine)[*LongueurNouvelleChaine] = Chaine[i];
                                      *LongueurNouvelleChaine                   = *LongueurNouvelleChaine + 1;
                                 }
     
                            else {
                                     *NouvelleChaine         = NULL;
                                     *LongueurNouvelleChaine = 0;
                                 }
                          }
                   }
           }
     
        else printf("ERREUR");
     
        free(TestRealloc);
    }

  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
    LongueurNouvelleChaine est un pointeur de pointeur mais toi tu l'utilises en tant que pointeur seul, du coup ça ne va pas =)
    Tu voulais peut-être mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *TestRealloc = (char *)realloc( TestRealloc, (**LongueurNouvelleChaine+1)*sizeof(char) );
    (*NouvelleChaine)[**LongueurNouvelleChaine] = Chaine[i];

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Euh, juste une question.

    Apparement, comme l'indique son nom, NouvelleLongueurChaine est fait pour stocker la longueur de la nouvelle chaine. Ce sera donc un int. Si tu veux le modifier, il faut, effectivement, le passer en pointeur. Or, dans le main, cette variable est déjà un pointeur !

    Pourquoi passer un pointeur par pointeur ??

  4. #4
    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
    Citation Envoyé par SofEvans Voir le message
    Euh, juste une question.

    Apparement, comme l'indique son nom, NouvelleLongueurChaine est fait pour stocker la longueur de la nouvelle chaine. Ce sera donc un int. Si tu veux le modifier, il faut, effectivement, le passer en pointeur. Or, dans le main, cette variable est déjà un pointeur !

    Pourquoi passer un pointeur par pointeur ??
    Tout comme NouvelleChaine, comme je fais son allocation dans la fonction et que je modifié son contenu, je suis bien obligé de passer par adresse un pointeur d'où la necessité d'un double pointeur ? ou alors je n'ai pas compris. Il y a plus simple je l'accorde mais c'est pour m'entraîner, tester différente situations, apparemment j'en ai besoin.

  5. #5
    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
    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
    void SupprimerOccurenceDansChaine( char *Chaine, int LongueurChaine, char **NouvelleChaine, int **LongueurNouvelleChaine, char Occurrence )
    {
        *NouvelleChaine         = NULL;
        *LongueurNouvelleChaine = NULL;
     
        *LongueurNouvelleChaine = (int *)malloc( sizeof( int ) );
        (*LongueurNouvelleChaine)[0] = 0;
     
        char *TestRealloc = NULL;
        printf("\n 1");
        if ( Chaine != NULL && NouvelleChaine != NULL && LongueurNouvelleChaine != NULL )
           {
               printf("2");
               int i;
               for ( i=0 ; i<LongueurChaine ; i++ )
                   {
                       if ( Chaine[i] != Occurrence )
                          {
     
                              printf("\n Lg = %d", (*LongueurNouvelleChaine)[0]);
                              TestRealloc = (char *)realloc( TestRealloc, (**LongueurNouvelleChaine+1)*sizeof(char) );
     
                              if ( TestRealloc != NULL )
                                 {
     
                                      *NouvelleChaine                            = TestRealloc;
                                     (*NouvelleChaine)[**LongueurNouvelleChaine] = Chaine[i];
                                       printf("\%c",(*NouvelleChaine)[**LongueurNouvelleChaine]);
                                     (*LongueurNouvelleChaine)[0]                = (*LongueurNouvelleChaine)[0] + 1;
                                 }
     
                            else {
     
                                     *NouvelleChaine         = NULL;
                                     *LongueurNouvelleChaine = 0;
                                 }
                          }
                   }
           }
     
        else printf("ERREUR");
     
        free(TestRealloc);
    }
    En ecrivant comme ça, cette fois les affectations sont correctes et dans la fonctions se passe ce qu'il doit se passer. Cependant arrivé dans le main badaboum cela m'affiche n'importe quoi ! Auriez vous une idée ? merci.

    Je viens de m'apercevoir que cela vient de

    une fois enlevé, ça affiche dans le main. Du coup je ne comprends pas pourquoi le free sur le TestRealloc libère aussi NouvelleChaine. A ce stade, la boucle est pourtant terminée et NouvelleChaine a bien reçu les valeurs.
    Ca marche sans le free, cependant, j'aimerais comprendre pourquoi il fait foirer l'execution sachant que j'aimerais bien le libérer quand même xD.

    Merci d'avance

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Je suis en train de regarder ton code :

    int LongueurChaine(char *Chaine) est-il censer renvoyer le nombre de case allouer a la chaine de caractere ? En fait, c'est la fonction strlen, non ?

    Voici ce que je te propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int LongueurChaine(char *Chaine)
    {
        int Longueur;
        for (Longueur=0 ; Chaine[Longueur] != '\0' ; Longueur++); 
     
        return Longueur;
    }
    Je continue a regarder ton code

    EDIT : Autant pour moi, j'avais mal imaginé la chose. Donc c'est bien return Longueur, j'ai editer mon message pour effecer ma betise ...

  7. #7
    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
    Merci, en effet...

    Apparement, le programme ne passe pas le test realloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestRealloc = (char *)realloc( TestRealloc, (**LongueurNouvelleChaine+1)*sizeof(char) );
    Mais là j'avoue ne pas m'en sortir. 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
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int LongueurChaine( char *Chaine );
    void SupprimerOccurenceDansChaine( char *Chaine, int LongueurChaine, char **NouvelleChaine, int **LongueurNouvelleChaine, char Occurrence );
     
    int main()
    {
        char *Chaine="bonjour";
        printf("\n\n Longueur de \"%s\" = %d", Chaine, LongueurChaine( Chaine ) );
     
        int  *NouvelleLongueur;
        char *NouvelleChaine  ;
     
        SupprimerOccurenceDansChaine( Chaine, LongueurChaine( Chaine ), &NouvelleChaine, &NouvelleLongueur, 'b' );
     
        int i;
        for ( i=0 ; i<*NouvelleLongueur ; i++ )
            {
                printf("%c", NouvelleChaine[i]);
            }
     
        free(Chaine);
        free(NouvelleLongueur);
        free(NouvelleChaine);
        return 0;
    }
     
    int LongueurChaine( char *Chaine )
    {
        int Longueur = 0;
     
        while ( *Chaine != '\0' )
              {
                  Longueur++;
                  Chaine++;
              }
     
        return Longueur;
    }
     
    void SupprimerOccurenceDansChaine( char *Chaine, int LongueurChaine, char **NouvelleChaine, int **LongueurNouvelleChaine, char Occurrence )
    {
        *NouvelleChaine         = NULL;
        *LongueurNouvelleChaine = NULL;
     
        *LongueurNouvelleChaine = (int *)malloc( sizeof( int ) );
        *LongueurNouvelleChaine = 0;
     
        char *TestRealloc = NULL;
        printf("\n 1");
        if ( Chaine != NULL && NouvelleChaine != NULL && LongueurNouvelleChaine != NULL )
           {
               printf("2");
               int i;
               for ( i=0 ; i<LongueurChaine ; i++ )
                   {
                       if ( Chaine[i] != Occurrence )
                          {
                              printf("3");
                              TestRealloc = (char *)realloc( TestRealloc, (**LongueurNouvelleChaine+1)*sizeof(char) );
                              printf("3 bis");
                              if ( TestRealloc != NULL )
                                 {
                                     printf("4");
                                      *NouvelleChaine                           = TestRealloc;
                                     (*NouvelleChaine)[**LongueurNouvelleChaine] = Chaine[i];
                                      **LongueurNouvelleChaine                   = **LongueurNouvelleChaine + 1;
                                 }
     
                            else {
                                    printf("5");
                                     *NouvelleChaine         = NULL;
                                     *LongueurNouvelleChaine = 0;
                                 }
                          }
                   }
           }
     
        else printf("ERREUR");
     
        free(TestRealloc);
    }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2008, 03h59
  2. Problème avec realloc et struct
    Par _SamSoft_ dans le forum Bibliothèque standard
    Réponses: 38
    Dernier message: 27/12/2007, 10h13
  3. Re-problème avec realloc() (désolé)
    Par Yabo dans le forum C
    Réponses: 8
    Dernier message: 30/07/2003, 22h07
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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