[C] Un petit pb de realloc et de malloc :

Un petit pb de realloc et de malloc : [C] - Programmation

Marsh Posté le 21-01-2002 à 19:03:52    

Actuellement, j'ai :  
 
-------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int ** Tab;
 
 
int ** creer_tableau(int ** Tab , int Lignes , int Colonnes)
{
Tab = realloc( Tab , Lignes * sizeof(int *));
Tab[Lignes - 1] = malloc(Colonnes * sizeof(int));
}
 
 
main ()
{  
int i = 0;
creer_tableau(Tab, 1 , 3);      // créé en théorie un tableau 1 ligne , 3 colonnes  
 
//init
    for ( i=1 ; i < 3 ; i++ )
    {
    Tab[0][i] = 0;
    }
 
//fin init
 
printf("%d/n", Tab[0][2]);
 
}
 
 
-------------------
Apparemment, je n'arrive pas à initialiser tout cela, quelqu'un aurait-il une idée ?


---------------
Wigga with Attitude.
Reply

Marsh Posté le 21-01-2002 à 19:03:52   

Reply

Marsh Posté le 21-01-2002 à 19:06:23    

deja je remarque qu'il y a un risque de confusion dans creer_tableau avec la variable Tab


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 21-01-2002 à 19:10:41    

Merci de ta réponse :)  
 
J'ai tout changé mais ca ne vient pas de là :(


---------------
Wigga with Attitude.
Reply

Marsh Posté le 21-01-2002 à 19:14:16    

Code :
  1. int ** creer_tableau(int ** Tab , int Lignes , int Colonnes)
  2. {
  3. Tab = realloc( Tab , Lignes * sizeof(int *));
  4. Tab[Lignes - 1] = malloc(Colonnes * sizeof(int));
  5. }


 
Quelle est ta valeur de retour?
=> ton tableau est bien alloue
mais la valeur n'est jamais retournee.
 
Je propose que tu fasses un return Tab;
a la fin de ta fonction.
 
LEGREG

Reply

Marsh Posté le 21-01-2002 à 19:23:08    

Rien n'y fait  
 
Merci qd meme LEGREG


---------------
Wigga with Attitude.
Reply

Marsh Posté le 21-01-2002 à 20:26:11    

Pourquoi un realloc? Car vu ton programme tu n'en as pas du tout besoin.
As-tu essayé de caster les retours de malloc/realloc?
Pourquoi n'alloues-tu pas le reste de ton tableau par une boucle pour un code plus propre (tu ne peux utiliser que la dernière ligne de ton tableau), bien que ça ne devrait pas poser de problèmes dans ton cas ici?
 
Voilà j'arrête pour les questions. :D

 

[edtdd]--Message édité par Krueger--[/edtdd]


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 21-01-2002 à 20:54:30    

Krueger a écrit a écrit :

Pourquoi un realloc? Car vu ton programme tu n'en as pas du tout besoin.
As-tu essayé de caster les retours de malloc/realloc?
Pourquoi n'alloues-tu pas le reste de ton tableau par une boucle pour un code plus propre (tu ne peux utiliser que la dernière ligne de ton tableau), bien que ça ne devrait pas poser de problèmes dans ton cas ici?




 
Cet algo fait partie integrante d'un autre plus complexe . Ceci dit, j'ai dû isoler, par souci de clarté la partie qui ne fonctionnait pas . Comme j'ai besoin d'un tableau dynamique sur une seule dimansion, je ne peux me passer des realloc et malloc .

 

[edtdd]--Message édité par thadawg--[/edtdd]


---------------
Wigga with Attitude.
Reply

Marsh Posté le 21-01-2002 à 21:01:45    

thadawg a écrit a écrit :

 
Tab = realloc( Tab , Lignes * sizeof(int *));
Tab[Lignes - 1] = malloc(Colonnes * sizeof(int));




 
il ne faut utiliser le realloc
que sur un tableau deja initialise
par malloc ou relloc.
 
par ailleurs le realloc ne fait pas vraiment ce  
que tu veux. l'idee c'est d'avoir un nouveau bloc
de memoire avec les memes donnees (au moins dans les
premiers elements).
De plus ton malloc n'alloue que ta derniere ligne..
(et comment tu fais quand il y a plus qu'une ligne??)
bref ton programme ne fait pas grand chose de bon a l'heure actuelle.
exemple de code qui initialise un tableau de tableau
a 4 * 3 elements:
 

Code :
  1. int i;
  2. int **tab = malloc(sizeof(int*)*4);
  3. for (i=0; i<3; ++i) {
  4.   tab[i] = malloc(sizeof(int)*3);
  5. }


et il faut le liberer avant de le reallouer:

Code :
  1. for (i=0; i<3; ++i) {
  2.   free tab[i];
  3. };
  4. free tab;


LEGREG

 

[edtdd]--Message édité par legreg--[/edtdd]

Reply

Marsh Posté le 21-01-2002 à 21:16:44    

legreg a écrit a écrit :

 

Code :
  1. int i;
  2. int **tab = malloc(sizeof(int*)*4);
  3. for (i=0; i<3; ++i) {
  4.   tab[i] = malloc(sizeof(int)*3);
  5. }


et il faut le liberer avant de le reallouer:

Code :
  1. for (i=0; i<3; ++i) {
  2.   free tab[i];
  3. };
  4. free tab;


LEGREG  
 
 




 
merci de ton aide et de ta patience legreg .  
 
En fait, je n'ai pas au depart connaissance de la taille finale de mon tableau, du moins, je ne connais que le nombre de colonnes : 4 .
 
Je veux que, apres manipulation de chaine de caracteres, je puisse commander l'ajout d'une ligne a ce tableau. Chose que je comtais faire par : "creer_tableau (tableau, Lignes++, 4)"

 

[edtdd]--Message édité par thadawg--[/edtdd]


---------------
Wigga with Attitude.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed