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 :

reallocation matrice et taille


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut reallocation matrice et taille
    Bon afin d'expliquer ce code je crée dynamiquement ma matrice opt dans le main puis dans une fonction stockersolution je redéfinis la taille de la matrice suivant la valeur de taille que je modifie suivant les conditions.
    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
    opt= (int**)malloc((taille)*sizeof(int*));
    for(i=0; i<taille; i++)opt[i]= (int*)malloc((nbNoeuds+2)*sizeof(int));
     
    void stockersolution(int *j,int fmax,noeud *sol,int **opt,int * taille)
    {
        int i=0,l=0,ancien=0,nouveau=0, valeur=0;
     
        if(fmax<best)
        {
            *taille=1; 
            opt= (int**)realloc(opt,(*taille)*sizeof(int*));
            for(i=0; i<*taille; i++)opt[i]=NULL;
            for(i=0; i<*taille; i++)opt[i]= (int*)realloc(opt[i],(nbNoeuds+2)*sizeof(int));
        }
        else{
     
            if(fmax=best){
                ancien =(*taille); 
                (*taille)++;
                opt= (int**)realloc(opt,*taille*sizeof(int*));
                for(i=ancien; i<*taille; i++)opt[i]=NULL;
                for(i=0; i<*taille; i++)opt[i]= (int*)realloc(opt[i],(nbNoeuds+2)*sizeof(int));
            }
        }
    }
    ceci ne marche pas et me renvoie l'assertion crtisvalidheappointer !!

  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
    Un realloc() peut changer la position mémoire de la zone allouée.
    Dans ce cas, la valeur de la variable locale opt est changée dans la fonction stockersolution(). Par contre, la valeur de opt n'a pas changé dans le programme qui a appellé la fonction, et cet opt contient maintenant un pointeur invalide.

    Un realloc() peut également échouer et dans ce cas, il renvoie NULL. Le schéma p = realloc(p,...) détruit alors l'adresse dans p et ne permet plus la récupération ou l'utilisation de la mémoire précédemment allouée.
    On doit utiliser un pointeur intermédiaire suivant le schéma suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      q = realloc(p...)
      if(q==NULL) 
      {
         // faire ce qu'il faut avec p en cas d'échec d'allocation 
      }
      else
      {
         p= q;
        ...
      }

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    Un realloc() peut également échouer et dans ce cas, il renvoie NULL. Le schéma p = realloc(p,...) détruit alors l'adresse dans p et ne permet plus la récupération ou l'utilisation de la mémoire précédemment allouée.
    Bonjour

    Fort heureusement on l'a encore dans la fonction appelante


    Désolé fathese, je n'ai pas pu m'empêcher de taquiner diogene avec une petite plaisanterie que les habitués du C comprendront mais qui ne t'es pas destiné.
    Sinon il a parfaitement raison. Ta fonction modifie quelque chose de local et la variable "opt" allouée en dehors de la fonction reste inchangée mais ne correspond à plus rien de valide.

    Il te faut rajouter une étoile de plus à ton paramètre "int **opt" et remplacer dans ta fonction tous les "opt" par "*opt" (avec des parenthèses si nécessaire). Et lors de son appel, remplacer "opt" par "&opt". Et aussi renforcer ton mécanisme de réallocation mais ça reste facultatif pour un simple TP (enfin ça dépend aussi de ton prof)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Matrice de taille quelconque à partir d'une interface graphique
    Par LMU2S dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 28/02/2008, 12h31
  2. [debutante] matrice de taille variable
    Par vanilla94 dans le forum Débuter
    Réponses: 1
    Dernier message: 26/02/2008, 15h07
  3. Réponses: 2
    Dernier message: 26/06/2007, 15h40
  4. Réponses: 4
    Dernier message: 06/06/2007, 13h32
  5. Soustraction des 2 matrice de taille differentes
    Par hanane78 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/05/2007, 14h15

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