Bien le bonjour...
Je voulais savoir s'il était possible et si oui comment, d'avoir de l'allocation mémoire dynamique pour stocker des tableaux multidimmensionnels. Vraisemblablement, les opérateurs new[ ] et delete [ ] ne fonctionnent que pour des tableaux à une dimension.
Merci!
-- LastMan
N'oubliez pas de linker : http://www.NoSoftwarePatents.com(...)
# Rien ne vaut un exemple ...
Posté par Florent C. . Évalué à 5.
const int TAILLE_Y = 100;
unsigned int i = 0;
int** tab2d = NULL;
tab2d = new int* [TAILLE_X];
if (tab2d==NULL) return -1;
for (i=0; i<TAILLE_X; i++) {
tab2d[i] = new int [TAILLE_Y];
if (tab2d[i]==NULL) {
// delete tous les précédents
return -1;
}
}
Et voilà :)
Et bien suûr on peut faire la même chose en C, il suffit de remplacer l'utilisation de new et delete par malloc() et free();
[^] # Re: Rien ne vaut un exemple ...
Posté par Obsidian . Évalué à 3.
Cela se comprend dans le sens où la réservation d'un espace mémoire est différente de l'initialisation d'un objet en particulier. L'ennui ici, c'est que l'on est pas du tout sûr que le tableau multidimensionnel ainsi créé soit en un seul morceau en mémoire. En même temps, ce n'est de toutes façons pas quelque chose que l'on peut garantir puisque les opérateurs de déréférencement (*) et d'indexation ([x]) peuvent être redéfinis.
Ceci m'amène donc à quelques questions, moi aussi.
. Est-il possible d'initialiser un objet dans une zone de mémoire déjà définie (à priori non puisque qu'on devrait définir cette zone mémoire à l'aide d'un "new Object"). Je crois que même un (Object *)this->Object() créera une nouvelle instance plutôt que d'initialiser celle pointée par this.
. Est-ce qu'il existe en C++ l'équivalent de realloc() ? Parce que là, par contre, c'est vraiment pénible d'avoir à faire soi-même le transfert. En plus, cela implique un déplacement de pointeur et une cohabitation temporaire de deux segments de mémoire même lorsque ce n'est pas nécessaire (ex: troncature du segment initial).
[^] # Re: Rien ne vaut un exemple ...
Posté par Guillaume Knispel . Évalué à 3.
Bien sûr que non ! Les calculs d'adresse par indexation de tableau se font avec multiplication de l'index par la taille de l'element, la multidimension etant simplement traité comme un vecteur de vecteur. Une taille dynamique impliquerait donc une multiplication par une taille dynamique, or la manière dont C/C++ stocke les tableau et gère l'équivalence sémantique avec l'adresse empeche de stocker les dimensions... Donc pas de tableau dynamique multidimensionel possible.
. Est-il possible d'initialiser un objet dans une zone de mémoire déjà définie (à priori non puisque qu'on devrait définir cette zone mémoire à l'aide d'un "new Object"). Je crois que même un (Object *)this->Object() créera une nouvelle instance plutôt que d'initialiser celle pointée par this.
Ouai, il suffit de surdéfinir l'opérateur new.
Est-ce qu'il existe en C++ l'équivalent de realloc() ? Parce que là, par contre, c'est vraiment pénible d'avoir à faire soi-même le transfert. En plus, cela implique un déplacement de pointeur et une cohabitation temporaire de deux segments de mémoire même lorsque ce n'est pas nécessaire (ex: troncature du segment initial).
Non. De plus je ne vois pas ce que tu veux dire en parlant de segments ? Le modèle le plus courrament rencontré est plat.
[^] # Re: Rien ne vaut un exemple ...
Posté par Obsidian . Évalué à 2.
C'est ce que j'explique dans le paragraphe suivant.
Non. De plus je ne vois pas ce que tu veux dire en parlant de segments ?
Je parlais de segments de mémoire dans le sens général du terme, pas en faisant référence au mode réel du 80x86. Ce qui me chagrine avec le new,delete du C++, c'est qu'à moins d'avoir loupé quelque chose, il n'est pas possible de faire l'équivalent d'un realloc().
Cela veut dire que même lorsque tu veux par exemple ne serait-ce que réduire la taille d'un bloc de mémoire allloué, tu es obligé d'en redéclarer un à coté et de consommer (temporairement) encore plus de mémoire, et que tu es dans tous les cas obligé de changer de pointeur. En outre, il te faut faire la copie du bloc mémoire par tes propres soins.
[^] # Re: Rien ne vaut un exemple ...
Posté par Guillaume Ceccarelli . Évalué à 2.
Merci !
# Je ne comprends pas
Posté par reno . Évalué à 3.
Ok, new t[10][20] ne marche pas mais faire new t[10*20], ce n'est quand même pas extremement compliqué.. new ou malloc d'ailleur.
[^] # Re: Je ne comprends pas
Posté par Guillaume Ceccarelli . Évalué à 1.
[^] # Re: Je ne comprends pas
Posté par calandoa . Évalué à 2.
# Encore un jeune Padawan...
Posté par tuan kuranes (site web personnel) . Évalué à 6.
Les tableaux dynamiques se font avec des std::vector ou avec des std::list.
Redimensionnables, bloc de memoire continu (pour vector en tout cas), vitesses incomparables, algo deja fait (sort, find, find_if, for each), possibilites de debugging automatique accrues, code portable...
Bref, faire du C++ sans la STL de nos jours est un crime.
(sauf si on est oblige de se coltiner un vieux compilos, pour de l'embarque ou des plates-formes exotiques.)
Il FAUT lire "effective STL" pour maitriser tous ca.
(pour le c++, il FAUT lire "effective c++")
Sinon en attendant de te procurer ces bouquins (existe-t-il une version en francais, qq connait le titre ?), tu peux lire ce superbe PDF sur le C++, fait par un type du comite de standardisation du C++, c'est le meilleur cours existant sur le web sur le c++.
on y apprend le c++ actuel, et avec une explication de toutes les erreurs et des optimisations possibles.
A LIRE :
http://www.rz.rwth-aachen.de/computing/events/2002/hpc++/HPC++1.18-(...)
(Meme pour ceux qui pensent maitriser le C++, une lecture qui en apprendra beaucoup.)
[^] # Re: Encore un jeune Padawan...
Posté par tuan kuranes (site web personnel) . Évalué à 2.
[^] # Re: Encore un jeune Padawan...
Posté par Guillaume Ceccarelli . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.