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 :

realloc dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut realloc dans une fonction
    bonjour.
    mon probleme c'est que je charge des donnees depuis un fichier et que la taille du pointeur je l'ai qu'en regardant dans le fichier, j'aimerai faire une fonction comme celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int loadmap(char path[i][j],char *map) //svp ne pas commenter i et j
    {
       for(int k=1;k<i;k++)
       {
         lire_octetxxxdans_le fichier_pour_obtenir_taille;
         taille =x;
         map = realloc(map,sizeof(char)*(x*k));
         remplire_map;
         if (erreur)
         return 0;
      }
      return 1;
    }
    je rentre pas dans les detailles mon code marche deja correctement quand je mets le tout dans main. ma question est de savoir si je peux sans risque faire comme ecrit plus haut. car j'ai entendu dire que malloc ou ses derive dans une fonction c'est pas bien. donc ce que j'ai ecris plus haut est il faissable oui ou non ? si non de devrait-je faire car j'aimerai avoir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char *map=malloc(sizeof(char));
     
    if(loadmap(char path,map))
    do
    {
       rotation_map(map,angle);
       affiche_map(ecran,map);  //routine opengl;
       calcule_realite(temps,map); 
       memorise_nouvellemap(map);
       est_ce_fini();
    }while(!finish);
    free(map);
    comme vous le voyez l'allocation est a l'exterieur mais la taille est modifier a l'interrieur et le free aussi est a l'exterieur, j'ai pas encore tape ce code car la fonction loadmap n'existe pas. ai-je le droit de faire ca sans risque?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    car j'ai entendu dire que malloc ou ses derive dans une fonction c'est pas bien.
    Ce n'est pas que c'est pas bien, mais l'utilisation de malloc pose le problème de faire le free au bon moment, sans l'oublier et une seule fois. C'est pourquoi, si on le peut, on essaye d'associer le malloc et le free associé dans une même fonction (comme dans ton deuxième code). Mais, ce n'est pas général et il y a bien des cas où ce n'est pas logique ni possible de procéder ainsi.

    Dans ton ébauche de la fonction loadmap, prend des précautions indispensables sur l'utilisation de realloc :
    - le realloc peut échouer
    - et surtout, le realloc peut changer l'adresse du bloc alloué; donc la fonction doit renvoyer d'une façon ou d'une autre l'adresse du bloc alloué par le realloc.

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    en d'autre terme le faite d'avoir fait un malloc hors de la fonction n'arrange pas trop le cas?
    les reallocs successifs peuvent effectivement changer l'adresse du debut de bloc mais je pensais que justement le map=realloc permettait d'obtenir la nouvelle adresse?!

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Oui, mais il faut retransmettre cette nouvelle valeur à la fonction appelante, sinon elle va continuer à travailler sur l'ancienne adresse devenue illégale -> plantage

  5. #5
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    retransmetre? je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      map=loadmap(path,map);
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      char *loadmap(char path[][],char *map)
      {
        .....
       map=realloc(.....);
        .....
       return map;
      }
    ce code est 'il ce qu'il faut faire?

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Par exemple.
    La difficulté est maintenant de prendre aussi en compte le cas où la reallocation a échouée.

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

Discussions similaires

  1. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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