[C] realloc sur un tableau 2 dimensions
Résolu/Fermé
Papi_72
Messages postés
3
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 février 2008
-
5 févr. 2008 à 01:37
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 mars 2009 à 16:33
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 mars 2009 à 16:33
A voir également:
- Realloc tableau en c
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
9 réponses
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
5 févr. 2008 à 10:20
5 févr. 2008 à 10:20
Bonjour,
Une chose me turlupine un peu.
Tu as des lignes de colonnes contenants 3 floats, donc pourquoi ré-allouer les colonnes ?
Au final il faudra une deuxième variable pour la taille, désallouer si la nouvelle est plus petite, allouer si elle est plus grande que l'ancienne..
Ou alors (si je n'ai pas perçu ton intérêt)
Ca marche comme cela ?
M.
Une chose me turlupine un peu.
Tu as des lignes de colonnes contenants 3 floats, donc pourquoi ré-allouer les colonnes ?
float **tab; int i; tab = (float**)malloc( 1*sizeof(float*) ); for (i=0 ; i<1 ; i++) { tab[i] = (float*)malloc( 3*sizeof(float) ); } tab = (float**)realloc( tab, N*sizeof(float*) ); // allouer les nouvelles colonnes. for (i=1 ; i<N ; i++) { tab[i] = (float*)malloc( 3*sizeof(float) ); }
Au final il faudra une deuxième variable pour la taille, désallouer si la nouvelle est plus petite, allouer si elle est plus grande que l'ancienne..
Ou alors (si je n'ai pas perçu ton intérêt)
float **tab; int i; tab = (float**)malloc( 1*sizeof(float*) ); for (i=0 ; i<1 ; i++) { tab[i] = (float*)malloc( 3*sizeof(float) ); } tab = (float**)realloc( tab, N*sizeof(float*) ); for (i=0 ; i<N ; i++) { tab[i] = (float*)realloc( tab + i, 3*sizeof(float) ); // On ré-alloue bien ici la colonne et non tab et bien des colonnes de 3 float et non 1. }
Ca marche comme cela ?
M.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
5 févr. 2008 à 02:07
5 févr. 2008 à 02:07
Essaie ça :
tab[i] = (float*)realloc( tab[i], 1*sizeof(float) );
Qu'est-ce qui te fait dire que ça ne marche pas ?
tab[i] = (float*)realloc( tab[i], 1*sizeof(float) );
Qu'est-ce qui te fait dire que ça ne marche pas ?
Papi_72
Messages postés
3
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 février 2008
5 févr. 2008 à 02:27
5 févr. 2008 à 02:27
Merci fiddy mais le code que tu m'a donné ne fonctionne pas non plus, j'arrive à compiler mais lorsque je lance l'executable, il plante aussi tot.
Si je fais un grand tableau avec malloc et que je supprime le realloc, mon programme fonctionne, le problème vient donc de mon realloc mais ou ?
Merci
Si je fais un grand tableau avec malloc et que je supprime le realloc, mon programme fonctionne, le problème vient donc de mon realloc mais ou ?
Merci
Papi_72
Messages postés
3
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 février 2008
5 févr. 2008 à 13:21
5 févr. 2008 à 13:21
Merci Mahmah,
la première solution que tu propose fonctionne très bien.
Merci a vous de m'avoir déboqué.
la première solution que tu propose fonctionne très bien.
Merci a vous de m'avoir déboqué.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour
Ce n'est pas une réponse mais plutôt une question. Si je considère la seconde proposition de Fiddy; comment dois-je m'y prendre pour ré-allouer un tableau à trois dimension que j'avais alloué de cette façon:
Merci du coup de main.
Ce n'est pas une réponse mais plutôt une question. Si je considère la seconde proposition de Fiddy; comment dois-je m'y prendre pour ré-allouer un tableau à trois dimension que j'avais alloué de cette façon:
int nbSource=20; char ***listeSource=NULL; listeSource = malloc (nbSource * sizeof *listeSource); for (i=0;i<nbSource;i++) listeSource[i]=malloc(2*nbMot * sizeof *listeSource[i]); for (i=0;i<nbSource;i++) for (j=0;j<2*nbMot;j++) listeSource[i][j]=malloc(lgMot+1 * sizeof *listeSource[i][j]);
Merci du coup de main.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
30 mars 2009 à 11:42
30 mars 2009 à 11:42
Salut,
Petite remarque sur ton code :
listeSource[i][j]=malloc(lgMot+1 * sizeof *listeSource[i][j]);
Tu as oublié les parenthèses autour de lgMot + 1. Mais bon, comme sizeof char = 1, tu retombes sur tes pattes ;-)).
Sinon pour realloc, tout dépend de la dimension que tu souhaites réallouer.
Cdlt
Petite remarque sur ton code :
listeSource[i][j]=malloc(lgMot+1 * sizeof *listeSource[i][j]);
Tu as oublié les parenthèses autour de lgMot + 1. Mais bon, comme sizeof char = 1, tu retombes sur tes pattes ;-)).
Sinon pour realloc, tout dépend de la dimension que tu souhaites réallouer.
for (i=0;i<nbSource;i++) for (j=0;j<2*nbMot;j++) listeSource[i][j]=realloc(listeSource[i][j],nouvelleTaille);
Cdlt
Merci pour ta réponse et pour la remarque sur la parenthèse oubliée.
En réalité l'espace pour la deuxième et la troisième dimension ne varieront pas. Pour être plus explicite, j'effectue une opération en boucle qui me retourne un tableau de caractères sur 2 dimensions (n*p). comme j'ai besoin de sauver les résultats successifs j'ai dû utiliser 3 dimensions. La première dimension me sert donc à identifier les étapes successives. Je suppose que j'aurais 20 étapes au départ (nbSource=20) mais il peut arriver que je dépasse ça, d'où un besoin de réallouer.
Je veux donc allouer pour la 21ème étape de la place pour enregistrer mon tableau n*p. Je me dis alors que je me serais retrouvé avec des instrictions du genre :
Merci de me relever mes erreurs.
En réalité l'espace pour la deuxième et la troisième dimension ne varieront pas. Pour être plus explicite, j'effectue une opération en boucle qui me retourne un tableau de caractères sur 2 dimensions (n*p). comme j'ai besoin de sauver les résultats successifs j'ai dû utiliser 3 dimensions. La première dimension me sert donc à identifier les étapes successives. Je suppose que j'aurais 20 étapes au départ (nbSource=20) mais il peut arriver que je dépasse ça, d'où un besoin de réallouer.
Je veux donc allouer pour la 21ème étape de la place pour enregistrer mon tableau n*p. Je me dis alors que je me serais retrouvé avec des instrictions du genre :
nbSource++; listeSource = realloc (listeSource, nbSource * sizeof *listeSource); for (i=0;i<nbSource;i++) listeSource[i]=realloc(listeSource[i],2*nbMot * sizeof *listeSource[i]); for (i=0;i<nbSource;i++) for (j=0;j<2*nbMot;j++) listeSource[i][j]=realloc(listeSource[i][j],(lgMot+1) * sizeof *listeSource[i][j]);
Merci de me relever mes erreurs.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
30 mars 2009 à 13:58
30 mars 2009 à 13:58
Le principe est bon.
Mais l'utilisation n'est pas rigoureuse. Lors de la dernière itération tu vas utiliser realloc sur une partie non initialisée par malloc ou calloc et comme le pointeur n'est pas NULL, cela risque de bugguer. De plus, tu as juste besoin de réallouer les parties utilies, et non tout le tableau.
Ce qui donnerait :
N'oublie pas de vérifier aussi la valeur de retour de l'allocation. Si pour une raison quelconque elle renvoyait NULL t'aurais du mal à comprendre certains segfaults.
Mais l'utilisation n'est pas rigoureuse. Lors de la dernière itération tu vas utiliser realloc sur une partie non initialisée par malloc ou calloc et comme le pointeur n'est pas NULL, cela risque de bugguer. De plus, tu as juste besoin de réallouer les parties utilies, et non tout le tableau.
Ce qui donnerait :
nbSource++; listeSource = realloc (listeSource, nbSource * sizeof *listeSource); listeSource[nbSource]=malloc(2*nbMot * sizeof *listeSource[i]); for (j=0;j<2*nbMot;j++) listeSource[nbSource][j]=malloc( (lgMot+1) * sizeof *listeSource[nbSource][j]);
N'oublie pas de vérifier aussi la valeur de retour de l'allocation. Si pour une raison quelconque elle renvoyait NULL t'aurais du mal à comprendre certains segfaults.
Merci fiddy.
Ta solution est bonne sauf qu'il y a un petit bug. Lorsqu'on a réalloué nbSource à listeSource, l'indice à prendre en compte est nbSource-1 (puisque ça part de 0. Le code devient alors :
Ta solution est bonne sauf qu'il y a un petit bug. Lorsqu'on a réalloué nbSource à listeSource, l'indice à prendre en compte est nbSource-1 (puisque ça part de 0. Le code devient alors :
nbSource++; listeSource = realloc (listeSource, nbSource * sizeof *listeSource); listeSource[nbSource-1]=malloc(2*nbMot * sizeof *listeSource[i]); for (j=0;j<2*nbMot;j++) listeSource[nbSource-1][j]=malloc( (lgMot+1) * sizeof *listeSource[nbSource-1][j]);
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
30 mars 2009 à 16:33
30 mars 2009 à 16:33
Oui très juste.
C'est l'inconvénient du live. ^^
C'est l'inconvénient du live. ^^