Redimensionner un tableau de pointeurs

Redimensionner un tableau de pointeurs - C - Programmation

Marsh Posté le 15-01-2004 à 15:07:30    

Alors en fait j'utilise un tableau de pointeurs que je redimensionne selon mes besoins ( tjs en l'agrandissant ), au début il a une taille de 6 puis je l'augmente de 3 en 3 mais mon problème est que les 6 premières cases marchent mais ensuite ça plante... voilà le code de redimension, est ce que j'oublie qqchose?
 

Code :
  1. if( *nbm == *tailleL )
  2. {
  3. liste = ( char** ) malloc ( *tailleL + 3 );
  4. *tailleL = *tailleL + 3;
  5. }
  6. liste[*nbm] = strdup(mot);
  7. *nbm = *nbm + 1;


 
nbm c le nbr de mots rentrés dans le tableau, tailleL c la taille actuelle. Je me demande en fait si il ne manque pas un free là dedans

Reply

Marsh Posté le 15-01-2004 à 15:07:30   

Reply

Marsh Posté le 15-01-2004 à 15:10:15    

je comprends rien à ton truc !  
pourquoi tu déréférences nbm si c'est une simple variable ? (ie pas un pointeur)


Message édité par Harkonnen le 15-01-2004 à 15:10:36

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-01-2004 à 15:13:35    

si en fait c dans une fct... c pour ça... en gros si tu préfères
ça donne ça si c t dans le main...
 

Code :
  1. if( nbm == tailleL )
  2. {
  3.     liste = ( char** ) malloc ( tailleL + 3 );
  4.     tailleL = tailleL + 3;
  5. }
  6.   liste[nbm] = strdup(mot);
  7.   nbm = nbm + 1;

Reply

Marsh Posté le 15-01-2004 à 15:21:23    

ouais ... euh ... je crois voir que tu vas perdre tous les pointeurs de ta liste existante, en plus d'avoir une fuite de mémoire par la non-libération de la mémoire de l'ancienne suite
 

Code :
  1. liste[nbm] = strdup(mot); 
  2.     nbm = nbm + 1;


 
puis j'ai pas trop compris ...
 
documente toi sur realloc si jme souviens bien pour éviter la fuite de mémoire

Reply

Marsh Posté le 15-01-2004 à 15:24:27    

donc fo que je recopie le tableau de pointeurs avant je pense...

Reply

Marsh Posté le 15-01-2004 à 15:28:22    

pas la peine, Blackgoddess a raison, l'utilisation de realloc() te permet de redimensionner un tableau sans perdre son contenu
 
http://www.opennc.org/onlinepubs/7 [...] alloc.html


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-01-2004 à 15:29:47    

merci

Reply

Marsh Posté le 15-01-2004 à 15:30:10    

man realloc

Reply

Marsh Posté le 15-01-2004 à 15:34:18    

question idiote... qqun connait le code source de cette fct? car com on la pa vu en cours je vais éviter d'y faire appel directemetn

Reply

Marsh Posté le 15-01-2004 à 16:05:14    

une bonne implémentation est trop liée à l'implémentation de l'allocateur mémoire, c'est un peu au dessus de ton niveau.
 
une implémentation triviale et indépendante est un malloc + memcpy + free

Reply

Marsh Posté le 15-01-2004 à 16:05:14   

Reply

Marsh Posté le 15-01-2004 à 16:37:55    

ah oui... euh... bon je vais me débrouiller pour faire une copie dans un tableau temporaire avant de faire un free, de réallouer et de recopier. merci

Reply

Marsh Posté le 15-01-2004 à 16:45:33    

pourquoi tu veux pas utiliser realloc ?

Reply

Marsh Posté le 15-01-2004 à 16:49:32    

parceque je pense que mes profs sont des gens rigides qui n'aiment pas que l'on utilise des trucs quand on l'a pas vu en cours... oui je trouve ça con... mais je peux pas y changer grand chose... g déjà essayé et je me suis fait traiter d'enfoiré lol

Reply

Marsh Posté le 15-01-2004 à 16:57:14    

iut paris V par hasard ? [:al zheimer]

Reply

Marsh Posté le 15-01-2004 à 16:57:23    

c'est nimporte quoi. voir malloc et free sans realloc, c'est débile

Reply

Marsh Posté le 15-01-2004 à 16:58:34    

LOL oui... et c Meunier qui mène les insultes ;) je vois que c connu...
 
oui taz suis d'accord !

Reply

Marsh Posté le 15-01-2004 à 17:04:06    

je crois que le pire pour moi c'est que vous vous laissiez faire

Reply

Marsh Posté le 15-01-2004 à 17:05:51    

je suis sympa c'est la fonction vu en td qui sert a grossir le tableau dynamique ;)
 

Code :
  1. machinchose ** grossir (struct machinchose **Tab, int *taille)
  2. {
  3. machinchose **tmp;
  4. int i,nb;
  5. nb= *taille;
  6. *taille +=3;
  7. tmp = (machinchose **) malloc (*taille * sizeof (machinchose*));
  8. for (i=0;i<nb;i++) tmp[i] = Tab[i];
  9. free (Tab);
  10. return (tmp);
  11. }


Message édité par e-v-tooms le 15-01-2004 à 17:41:43
Reply

Marsh Posté le 15-01-2004 à 17:07:25    

lol bah bien sûr, menons la rebellion contre le côté obscur ;)
 
non je pense qu'il faut se mettre dans le moule accepter le fait que l'on veuille d'abord savoir le faire nous même puis nous filer la fct qui le fait toute seule. Je pense que ça a du bon car perso g fait l'experience en MIAS du "utilisez ce que vous voulez" et celà dès le début et ça a été un bordel monstre!

Reply

Marsh Posté le 15-01-2004 à 17:08:01    

Merci E-v-tooms...
 
T à l'IUT là ou c des archives ?

Reply

Marsh Posté le 15-01-2004 à 17:08:50    

mais biensur ... quand on voit le code de ev, je préfère qu'il utilise n'importe qoi plutot que ça

Reply

Marsh Posté le 15-01-2004 à 17:09:55    

taz a écrit :

mais biensur ... quand on voit le code de ev, je préfère qu'il utilise n'importe qoi plutot que ça


 
mdr je le prends pas pour moi :sol: , c'est un prof qui nous a filé sa

Reply

Marsh Posté le 15-01-2004 à 17:13:27    

Moi, j'utiliserai realloc et je dirai "ben, le but, c'est aussi de nous familiariser a linux nan ? Alors, j'ai RTFM avec man realloc..."

Reply

Marsh Posté le 15-01-2004 à 17:16:46    

oula ! attention! Linux! ils vont te dire "on va fait travailler sur des postes NT200 avec VC++ dessus com compilateur C vous vous égarez! 0 allez hop!" tu les connais pas ces gens là ;)

Reply

Marsh Posté le 15-01-2004 à 17:37:10    

ah parce que sous NT/2000 avec VC++ realloc il connait pas peut-etre ?
 
(il sert a quoi nb ? un coup du utilise *taille et le coup d'apres nb ? sinon 'Gmots **tmp;' ca devrait pas etre 'machinchose ** tmp;' plutot ?)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 15-01-2004 à 17:42:23    

BlackGoddess a écrit :

ah parce que sous NT/2000 avec VC++ realloc il connait pas peut-etre ?
 
(il sert a quoi nb ? un coup du utilise *taille et le coup d'apres nb ? sinon 'Gmots **tmp;' ca devrait pas etre 'machinchose ** tmp;' plutot ?)


 
sisi c'est machin chose j'ai oublié de le changer :D
 
puis nb est necessaire, regarde: imaginons la taille a l'origine est de 6, tu lui ajoute 3 ce qui fait taille=9, mais quand tu recopies le tableau dans le tableau temporaire, il n'y a toujours que 6 elements a recopier


Message édité par e-v-tooms le 15-01-2004 à 17:46:11
Reply

Marsh Posté le 15-01-2004 à 18:13:08    

@BlackGoddess : si bien sur que realloc existe sous W2K mais l'explication de pkoi je peux pas l'utiliser est plus haut...

Reply

Marsh Posté le 15-01-2004 à 18:16:42    

realloc est ANSI

Reply

Marsh Posté le 15-01-2004 à 19:20:09    

e-v-tooms oui pardon j'avais mal lu


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-01-2004 à 04:36:47    

en meme temps s'il a un pb pour coder un realloc (meme "naif" )
c'est a craindre qu'il n'aura pas appris grand chose dans son cours de C.
Donc +1 pour qu'il recode un truc qui marche sans s'appuyer sur realloc.
 
LeGreg

Reply

Marsh Posté le 18-01-2004 à 15:51:35    

D'un autre coté, c'est une manie bien française (peut-être pas seulement française d'ailleurs) que de recoder - mal - des fonctions qui existent déjà dans les librairies standard. Je ne crois pas avoir jamais vu un projet où des fonctions qui se trouvent en standard dans la lib ANSi n'aient été recodées. Avec des bugs bien sûr.
 
Je me souviens d'un projet où 3 ingénieurs ont été assignés pendant 4 semaines à chercher un bug lié à la mémoire dans un système embarqué. Ils soupçonnaient un soft qui avait été acheté à une boîte asiatique sans accès au code source, et qui avait déjà démontré une fiabilité pas vraiment exemplaire par le passé. Donc ils pourrissaient assez copieusement leurs collègues asiatiques au téléphone, avant de finir par se rendre compte que le bug était tapi depuis des lustres dans un strcpy roulé sous les aisselles par la boîte française. La tronche qu'ils tiraient quand ils ont dû expliquer aux asiatiques que cette fois-ci, le bug était bien chez eux...
 
Dans un autre projet en C++, un type avait cru bon de définir TRUE à 0 et FALSE à 1. Du vrai sabotage.


Message édité par el muchacho le 18-01-2004 à 15:59:01
Reply

Marsh Posté le 18-01-2004 à 17:15:17    

mdr :D

Reply

Marsh Posté le 19-01-2004 à 00:04:03    

el muchacho a écrit :

D'un autre coté, c'est une manie bien française (peut-être pas seulement française d'ailleurs) que de recoder - mal - des fonctions qui existent déjà dans les librairies standard. Je ne crois pas avoir jamais vu un projet où des fonctions qui se trouvent en standard dans la lib ANSi n'aient été recodées. Avec des bugs bien sûr.


 
je te parle pas d'un projet industriel
mais d'un truc d'apprentissage.
dans ma scolarité j'ai du reprogrammer un mini shell.
Evidemment il était plus pourri que ceux qui existaient
mais le but cétait pas de renommer l'executable du shell et de le filer au prof.
 
A+
LeGreg

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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