|
|
|
|
Posté par
Le Hacker, le mercredi 6 février 2008 à 18:30:15merci de nous expliquer c'est quoi allouer ?
tu est dans quel language ? |
J'utilise le C++.
En C, pour creer un tableau dynamique, c'est a dire le creer au cours du programme en fonction d'une variable sans utiliser quelque chose du genre int tableau[a]; on utilise: nomdupointeur = malloc(bytes a allouer pour le tableau); en C++ on utilse nomdupointeur = new (type)[tailletableau]; Cependant, je ne sais pas comment allouer un tableau du gente int tableau[10][10]; c'est a dire a 2 dimensions. |
Salut,
Il y a plusieurs méthodes possibles pour un tableau dynamique. J'appelle, ni : nombre de lignes nc : nombre de colonnes. - La première méthode ne pas déclarer un tableau de deux dimensions !!! int* tableau; tableau = new int [ ni * nc]; Après tu accède à tableau[i][j] par tableau( i * nc + j) Cette méthode évite de déclarer un tableau dynamique de deux dimensions mais n'est pas toujours évidente avec les indices. Une solution est de se créer une fonction qui gère ca. - La deuxième méthode, celle qui créé vraiment un tableau dynamique de deux dimensions int ** tableau; tableau = new int* [ni]; for ( int i=0 ; i < ni ; i++) tableau[i] = new int [nc]; . . tableau[i][j]=...; . for ( int i=0 ; i < ni ; i++) delete tableau [i]; delete tableau; Voilà, Personnellement j'utilise la première méthode la plupart du temps parce que je suis toujours en train d'oublier la deuxième. Qu'elles sont les différences entre ces deux méthodes de déclarations ? La première déclare un pointeur vers un tableau de ni * nc int qui est contigu dans la mémoire. (Pas très pratique quand on a des tableaux énormes et que la mémoire ne dispose pas d'un tel emplacement en continu ) . La deuxième déclare un tableau de pointeur de longueur ni. Chaque pointeur de ce tableau pointe vers un tableau de int de taille nc. J'espère que ca pourra t'aider. Bonne programmation. En politique le choix est rarement entre le bien et le mal, mais entre le pire et le moindre mal. Debian GNU/Linux on IBM thinkpad A31 |
Merci beaucoup,
mon probleme est resolu. |
int* tableau;
tableau = new int [ ni * nc]; tableau( i * nc + j) // int ** tableau; tableau = new int* [ni]; for ( int i=0 ; i < ni ; i++) tableau[i] = new int [nc]; . . tableau[i][j]=...; . for ( int i=0 ; i < ni ; i++) delete tableau [i]; delete tableau; /*************************** Désolé, j'ai pas pu m'en empêcher: ****************************/ int *tableau; tableau = new int[nbLigne* nbColone]; . tableau[indexLigne * nbColone + indexColone]=...; . // int **tableau; tableau = new int*[nbLigne]; . tableau[indexLigne][indexColone]=...; . for (int indexLigne = 0; indexLigne < nbLigne; indexLigne++) { delete tableau[nbLigne]; } // tres important de mettre les acolades (evite les erreurs de lecture) delete tableau; //NB: le systeme de post retire les <espace> au debut des lignes |
Bonjour, je viens de tester vos codes : (kshx2,aGuy) , pour l'allocation ça va mais j'ai la nette impression que pour que la désallocation laisse des fuites de mémoires :
//ALLOUER tab = new CELL*[HEIGHT]; //Le constructeur de Cell écrit : std::cout<<"appel du constructeur de cell\n"; for(int j=0;j<HEIGHT;j++) tab[j] = new CELL[WIDTH]; //DESALLOUER MAP::~MAP() { for(int j=0;j<HEIGHT;j++) delete tab[j]; //Le destructeur de Cell écrit : std::cout<<"appel du constructeur de cell\n"; delete tab; } Donc ensuite je j'instancie une map, puis je la supprimme MAP *map = new MAP(3,3) // 3 et 3 correspondent à HEIGHT et WIDTH delete map; Dans la console j'ai bien 9 "appel du constructeur de cell"; Mais je n'ai que 3 "appel du destructeur de cell"; Ce qui me parait normal, vu qu'on ne fait pas delete tab[j][i] mais delete tab[j]; DONC fuite de mémoire ! probleme : delete tab[j][i]; me sort une erreur ! :'( |
Rebonjour ;
Après deux trois manips j'ai trouvé la solution : for(int j=0;j<HEIGHT;j++) delete [](tab[j]); // delete[] supprime un tableau Et voila le destructeur est appelé autant de fois que le constructeur, plus de fuites de mémoire ! Cordialement, Darksheep. |
| 24/05 06h49 | L'indexation linéaire et le reshape sous Matlab | MatLab |
| 20/07 15h01 | [Sécurité] IP statique (fixe) ou dynamique ? | Sécurité |
| 10/02 11h16 | Codes d'erreur de Windows | Windows |
| 15/01 02h30 | Le problème du cavalier d'Euler | Prolog |
| 05/02 15h33 | Unable to load dynamic library '/usr/lib/php4/20020429/mysql.so | PHP |
| 28/11 09h06 | Tableaux à 2 dimension | 4 |
| 13/06 20h01 | Tableaux a 2 dimensions en JAVA | 9 |
| 18/12 09h44 | [Java]Tableau à 2 dimensions | 0 |
| 30/12 00h59 | Les tableau a 2 dimensions en vb | 1 |
| 06/08 12h23 | Tableaux à 2 dimensions dans un formulaire ? | 0 |
![]() | SuperCopier 2 - SuperCopier est un gestionnaire de copie de fichiers libre pour Windows, proposant des fonctionnalités non couvertes par le... | Catégorie: Gestion de fichiers Licence: Freeware/gratuit |
![]() | Foobar 2000 - Foobar2000 est un lecteur audio avancé pour les plateformes Microsoft Windows. Son interface graphique est volontairement... | Catégorie: Lecteurs audio Licence: Freeware/gratuit |
![]() | Visual Basic Express 2005 - Le langage de programmation Visual Basic est historiquement dans les gènes de la société Microsoft. Avec plus de 30.000... | Catégorie: Visual Basic Licence: Freeware/gratuit |
![]() | PowerArchiver 2001 - Power Archiver est un équivalent gratuit de WinZip avec des fonctionnalités en plus, avec une version en français !! | Catégorie: Compression/Décompression Licence: Freeware/gratuit |
![]() | Dell Dimension XPS 730 | Catégorie: Ordinateur de bureau | 3,898.99 € Dell FR |
![]() | Dell Dimension 9200 Core | Catégorie: Ordinateur de bureau | |
![]() | Dell Dimension XPS 710 | Catégorie: Ordinateur de bureau | |
![]() | Dell Dimension XPS 720 | Catégorie: Ordinateur de bureau |