Reallouer de la memoire à une matrice

Résolu
cs_savoyard Messages postés 4 Date d'inscription samedi 20 novembre 2004 Statut Membre Dernière intervention 20 novembre 2004 - 20 nov. 2004 à 18:25
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 - 20 nov. 2004 à 22:50
j ai alloué de la memoire à une matrice commencant à a[1][1].
Je n 'arrive pas à réallouer de la memoire dans ce cas la il faut que ma matrice commence à a[0][0] mais je ne le veux pas. comment faire

10 réponses

cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
20 nov. 2004 à 22:50
double *dvector(int nl,int nh)
{
double *v;
v=(double *)malloc((unsigned)(nh-nl+1)*sizeof(double));
if(!v) return NULL;
v=v-nl;
return v;
}

ici v = v - nl, tu soustrais un entier à un pointeur, bon !!! tu obtiens un nouveau pointeur, admettont.

mais le plus grave c'est que ce nouveau pointeur tu le donnes a la fonction realloc et la c'est normal qu'il plante...
realloc attent un pointeur "valide" alloué par malloc ou calloc mais pas un pointeur modifié...
pense a liberer la memoire avec free et reflechi un peu a ce que tu fais.

Matt...
3
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
20 nov. 2004 à 19:28
je te propose ca comme solution
Je prend comme exemple une allocation pour une matrice a[2][2]

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
  int **a;
  int L=2, C=2, i, j;

  //Allocation de a[2][2]
  a = (int**)malloc(sizeof(int*) * L);

  for(j=0 ; j < L ; j++ )
  {
    a[j] = (int*)malloc(sizeof(int) * L);
  }

  //Reallocation on passe de a[2][2] à a[4][5]
  L = 4;
  C = 5;

  a = (int**)realloc(a, sizeof(int*) * L);
  for(i=0 ; i < L ; i++ )
    a[i] = (int*)realloc(a[i], sizeof(int) * C);

  for(j=0 ; j < L ; j++)
  {
    for(i=0 ; i < C ; i++)
    {
      a[j][i] = i+1;
    }
  }

  for(j=0 ; j < L ; j++)
  {
    for(i=0 ; i < C ; i++)
    {
      printf("%d\t", a[j][i]);
    }
    printf("\n");
  }

  getch();

  return 0;
}


Voial j'espere que cela t'aidera.

Bon Code

Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
0
cs_savoyard Messages postés 4 Date d'inscription samedi 20 novembre 2004 Statut Membre Dernière intervention 20 novembre 2004
20 nov. 2004 à 20:37
la reallocation est sympa mais le probleme est que je realloue de la memoire à partir de a[1][1] et non a[0][0] et cela engendre des pb de memoire. la fonction realloc réalloue par defaut à a[[0][0] comme proposé dans la premiere solution. Comment faire dans mon cas
0
cs_savoyard Messages postés 4 Date d'inscription samedi 20 novembre 2004 Statut Membre Dernière intervention 20 novembre 2004
20 nov. 2004 à 20:40
cette solution ne peut convenir. lorsque je parle de a[1][1] je fais reference au terme dans la matrice 2eme ligne 2 eme colonne. la fonction realloc realloue par defaut à partir de a[0][0], comment la modifier pour ne pas avoir de message d erreur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
20 nov. 2004 à 20:42
Rien ne t'empeche d'allouer dès le début un tableau de 1-1 et tu travail avec, tu change quand tu as envie.

Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
0
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
20 nov. 2004 à 20:46
Je vosi ton probleme en fait quand tu realloue un tableau toutes ce qu'il y avait avant est detruit.

Si c'est ca que tu vois ca ne peut pas etre possible.

Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
20 nov. 2004 à 21:44
Bonsoir,

un extrait du "Langage C" de K & R :

void *realloc(void *p, size_t size);
realloc change en size la taille de l'objet pointé par p. Si la nouvelle taille est plus petite que l'ancienne, seul le début du contenu de l'objet est conservé. Si la nouvelle taille est plus grande , le contenu de l'objet est conservé, et l'espace mémoire supplémentaire n'est pas initialisé. [..]
donc steph115, verifie tes dires avant de les publier...

Matt...
0
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
20 nov. 2004 à 21:50
Ohla Matt je n'ai jamasi dit ca

Je vosi ton probleme en fait quand tu realloue un tableau toutes ce qu'il y avait avant est detruit.
Si c'est ca que tu vois ca ne peut pas etre possible.

Je reexplique cette phrase : Quand tu fais un realloc ca ne change rien.
N'oublie pas apres que je marque Si c'est ca comme ca que tu vois la chose ca ne peut etre possible

Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
20 nov. 2004 à 22:00
Bonsoir,

S'il veut que les données soient perdues apres un realloc, un coup de memset et le tour est joué...

Matt...
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
20 nov. 2004 à 22:13
savoyard > poste sur le forum pour que tout le monde arrive a suivre.
Je n'ai pas trop compris ce que tu voulais en fait. Poste un bout de code concernant ton erreur et je comprendrai peut être mieux.

Merci,

Matt...
0
Rejoignez-nous