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

  1. #21
    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
    char *str_cpy( char *s1, char *s2 )
    {
        s1=NULL;
     
        char *RetourRealloc=(char *)realloc( s1, (LongueurChaine(s2)+1)*sizeof( char ) );
     
        if ( RetourRealloc != NULL )
           {
               s1 = RetourRealloc;
               int i;
               for ( i=0 ; i<=LongueurChaine(s2) ; i++ )
                   {
                       s1 = RetourRealloc;
                       s1[i] = s2[i];
                   }
           }
     
        else printf("erreur");
     
        return s1;
    }
    Ceci fonctionne mais est-ce correct (mise à part la gestion de l'erreur, je cherche des informations sur perror pour cela ) ? Ce qui m'ennuie c'est que je ne peux pas faire de free sur RetourRealloc sinon je libère aussi s1 puisqu'il pointe dessus.

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 413
    Par défaut
    s1 ne devrait pas être un paramètre.
    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.

  3. #23
    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
    Oui cela me perturbe aussi, mais c'est ce le prof demande à moins que je n'ai pas compris l'énoncé ce qui doit être probable. Je vais essayé de le réécrire autrement. Le but étant de recopier s2 dans s1 sachant que s1 a pu déjà être alloué.

    Grâce à votre FAQ j'ai trouvé les informations nécessaires sur perror. Voici ce que j'en ai fais.

    J'ai mis pour que ça plante et que je puisse faire fonctionner perror. Cela me dit invalid argument et le code erreur associé est 22.

    Merci

    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
    char *str_cpy( char *s1, char *s2 )
    {
        s1;
     
        char *RetourRealloc=(char *)realloc( s1, (LongueurChaine(s2)+1)*sizeof( char ) );
     
        if ( RetourRealloc != NULL )
           {
               s1 = RetourRealloc;
               int i;
               for ( i=0 ; i<=LongueurChaine(s2) ; i++ )
                   {
                       s1 = RetourRealloc;
                       s1[i] = s2[i];
                   }
           }
     
      else {
                perror("\n > Erreur d'allocation m\202moire dans la fonction str_cpy ");
                printf("\n > Code erreur associ\202 : %d", errno );
           }
     
     
        return s1;
    }
    Cela permet d'afficher l'erreur, maintenant si je veux pourvoir également reprendre à 0 l'opération sans interruption du programme jusqu'à la réussite, je pourrais faire un appel récursif ou c'est proscris ?

    Excusez moi de toutes ces questions car je vous sollicite beaucoup, c'est que je n'ai pas toutes ces informations dans mes cours et je n'ai pas acheté de livre ce qui ne va pas tarder.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 413
    Par défaut
    Es-tu donc incapable de déclarer une variable locale?
    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.

  5. #25
    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
    Je pense que oui. Je suppose que ceci est censé me mettre sur la voie pour résoudre le problème du free.

    EDIT : non c'est pour le paramètre s1, je n'ai rien dis. C'est qu'à la base j'avais un void comme retour. s1 était bien modifé dans la fonction mais arrivé dans le main ça m'affichait la valeur de s1 déclaré dans le main et pas celle issue de la modification dans la fonction.

    Voilà, j'espère que c'est mieux ainsi. Merci

    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
    char *str_cpy( char *s1 )
    {
     
        char *ChaineTemporaire=NULL;
     
        char *RetourRealloc=(char *)realloc( ChaineTemporaire, (LongueurChaine(s1)+1)*sizeof( char ) );
     
        if ( RetourRealloc != NULL && ChaineTemporaire == NULL )
           {
               ChaineTemporaire = RetourRealloc;
               int i;
               for ( i=0 ; i<=LongueurChaine(s1) ; i++ )
                   {
                       ChaineTemporaire[i] = s1[i];
                   }
           }
     
      else {
                perror("\n > Erreur d'allocation m\202moire dans la fonction str_cpy ");
                printf("\n > Code erreur associ\202 : %d", errno );
           }
     
        free(RetourRealloc);
        return s1;
    }

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 413
    Par défaut
    De toute façon, à cause du nom, je me suis mépris sur tes attentions.
    Je conseille ceci:
    Code C : 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
    char *my_strcpy(char *dest, char const *src)
    {
    	while( *src != '\0' )
    	{
    		*dest = *src;
    		dest++;
    		src++;
    	}
    	*dest = '\0';
    }
     
    char *str_realloc_cpy(
     char *s1,       /*[in/free/opt] Pointeur vers une chaîne allouée sur le tas, ou NULL.*/
     char const *s2  /*[in] Chaîne à écrire */
     )
    {
    	size_t cchNouvelleTaille = LongueurChaine(s2)+1;
    	size_t cbNouvelleTaille = cchNouvelleTaille * sizeof *s1;
     
    	/*Note: si ça ne compile pas sans le cast, c'est que tu compiles en C++.*/
    	char *RetourRealloc = realloc( s1, cbNouvelleTaille );
     
    	if ( RetourRealloc != NULL )
    	{
    		s1 = RetourRealloc;
    		my_strcpy(s1, s2);
    	}
    else
    	{
    		int err = errno;
    		perror("\n > Erreur d'allocation m\202moire dans la fonction str_realloc_cpy ");
    		printf("\n > Code erreur associ\202 : %d\n", err );
    	}
    	return NULL; /*On suit le même comportement que realloc()*/
    }
    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.

  7. #27
    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
    Ah oui pardon errno est une variable globale, comme conseillé il vaut mieux la sauvegarder dans une autre variable si elle modifiée entre temps.

    Merci encore.

    Par contre il y a quelque chose que je ne comprends pas dans votre fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *str_realloc_cpy(
     char *s1,       /*[in/free/opt] Pointeur vers une chaîne allouée sur le tas, ou NULL.*/
     char const *s2  /*[in] Chaîne à écrire */
     )
    Pourquoi renvoyez vous NULL, ce ne devrait pas plutôt être le retour de my_strcpy ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 413
    Par défaut
    Au passage, pour l'utilisation de realloc(), je conseille ceci:
    http://www.developpez.net/forums/d49...e/#post3001764
    (voir aussi le message juste après, avec les macros)
    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.

  9. #29
    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
    Ok, je mets ça dans mes historiques pour une prochaine fois car il est clair que si je rends ça au prof, je vais me faire engueuler car je n'ai ni le recul nécessaire ni les compétences pour écrire de telles fonctions actuellement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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