Création dynamique d'un tableau de taille non fixée

Création dynamique d'un tableau de taille non fixée - C++ - Programmation

Marsh Posté le 17-06-2005 à 11:41:06    

:hello:  
 
Salut je cherche à faire un tableau de (pointeur vers une structure)s
Seulement je ne connais pas la taille nécessaire avant un certain moment dans le programme. Ce tableau serait donc dynamique.
 
 - Comment donc créer de façon dynamique un tableau et définir sa taille avec "new"?
 
 - Questions de curiosité : quelle est vraiment la taille d'un pointeur (vers une structure) ? 4 octets (32 bits) j'imagine ? Alors pourquoi définir un type à un pointeur ? dans un but purement limitatif pour éviter les erreurs ? autre ?
 
Merci....

Reply

Marsh Posté le 17-06-2005 à 11:41:06   

Reply

Marsh Posté le 17-06-2005 à 12:12:12    

s *ps = new s[taille];
 
La taille est généralement de 32 bits sur les machines récentes, mais rien ne le garanti en outre elle peut être de 64 bits sur les processeur 64 bits si ils utilisent le mode LP64.
 
Ensuite le type est indispensable dès que l'on veut effectuer une opération sur le pointeur (passé à l'élément suivant (on avance de combien d'octets ?), le déréférencé (on obtient un objet de quel type ?), ...) même en C, le type est indispensable pour effectuer ces opérations.
 
Bon je ne vais pas indiquer toutes les subtilités du C++, mais il faut savoir que par exemple après un dynamic_cast la valeur du pointeur est souvent modifiée.

Reply

Marsh Posté le 17-06-2005 à 13:12:27    

la taille est généralement sizeof(void*) et rien d'autres.
 
 
ton histoire de dynamic_cast ça rien à voir.
 
Maintenant, travaillons bien :
 
std::vector<MonType> v(taille); // et tu peux redimensionner plus tard

Reply

Marsh Posté le 17-06-2005 à 13:46:09    

Taz a écrit :

la taille est généralement sizeof(void*) et rien d'autres.


Je suis d'accord, mais je voulais juste montrer que ca renvoyait pas forcement 4 octets.
 

Taz a écrit :

ton histoire de dynamic_cast ça rien à voir.


C’est juste un autre exemple qui montre l'importance du type.
Il est évident que si on avait que des void* ca ne marcherait pas.
Le truc c'est si un objet A hérite d'un objet B.
Si on a un pointeur sur cet objet A que l'on cast en B, il faut bien que le pointeur pointe sur l'adresse de l'objet B contenu dans A et non plus sur A.
 
Or si on ne sait pas sur quoi on pointe, comment veux-tu que l'on sache que l'on ne pointe pas déjà sur B, et quel est le décalage à effectuer si ce n’est pas le cas ?
 

Taz a écrit :

Maintenant, travaillons bien :
 
std::vector<MonType> v(taille); // et tu peux redimensionner plus tard


+1, j'avoue avoir simplement répondu à la question, cela dit tout dépend de l'utilisation même si les vector sont souvent préférable.

Reply

Marsh Posté le 17-06-2005 à 14:41:08    

Tarabiscote a écrit :

Je suis d'accord, mais je voulais juste montrer que ca renvoyait pas forcement 4 octets.

sizeof peut te renvoyer 4, mais ça ne veut pas dire 4 octets.
 

Tarabiscote a écrit :


C’est juste un autre exemple qui montre l'importance du type.
Il est évident que si on avait que des void* ca ne marcherait pas.


void *b = new int;

Tarabiscote a écrit :


Le truc c'est si un objet A hérite d'un objet B.
Si on a un pointeur sur cet objet A que l'on cast en B, il faut bien que le pointeur pointe sur l'adresse de l'objet B contenu dans A et non plus sur A.


 
Or si on ne sait pas sur quoi on pointe, comment veux-tu que l'on sache que l'on ne pointe pas déjà sur B, et quel est le décalage à effectuer si ce n’est pas le cas ?[/quotemsg]aucun rapport ici. et dynamic_cast est cast d'instance, pas de collections d'instances. vraiment rien à voir ici.
 
 
+1, j'avoue avoir simplement répondu à la question, cela dit tout dépend de l'utilisation même si les vector sont souvent préférable.[/quotemsg]

Reply

Marsh Posté le 17-06-2005 à 15:24:53    

Ecoute, je ne veux pas polémiquer, je vais tout de même essayer d’être un peu plus clair :
1) quand je dis quelque chose au négatif, ça veut juste dire que ce n'est pas le cas et non pas que le contraire est vrai (ou une quelconque interprétation). (cf : ca renvoyait pas forcement 4 octets)
2) je n'ai pas dit qu'on ne pouvait jamais écrire void, le problème se pose à l'utilisation de ce sur quoi il pointe.
3) Pour le dynamic_cast, 5.2.7 (dans le draft que j'ai, désolé de ne pas avoir acheté la norme), l’exemple donné est exactement ce que je voulais dire :

struct B {};
struct D : B {};
void foo(D* dp)
{
B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}

Ce que je voulais dire c'est seulement que bp n'est pas toujours égal à dp (bien que ce soit un exemple un peu trop simpliste).
Voilà un exemple qui le montre avec gcc normalement (bien sûr le fait que l’adresse soit la même ou non dépend de l’implémentation) :

Code :
  1. #include <iostream>
  2. struct s{
  3.        int a;
  4.        };
  5. struct s1{
  6.        int a;
  7.        };
  8. struct s2 : s, s1{
  9.        int a;
  10.        };
  11.      
  12. using namespace std;
  13. int main (int argc, char *argv[])
  14. {
  15.   s2 *toto = new s2;
  16.   s1 *tata = dynamic_cast<s1*>(toto);
  17.   // j'affiche bêtement (fait en 20 secondes power)
  18.   cout << toto << " " << tata << endl;
  19.   // j’aime bien mettre des trucs
  20.   // qui ne sont pas utile mais que l’on peut mettre
  21.   return 0 ;
  22. }

J’espère ne pas avoir été trop long, mais j’essaye d’être le plus précis possible.
 
PS : Dans le dernier exemple remplace s2* par void* pour voir si les dynamic_cast n'ont pas besoin de connaître le type pointé.
 
PS2 : Ce n'est pas un cours, si c'est long c'est uniquement pour éviter que ce soit mal interpréter même si je sais que ça peut encore l'être.
 
PS3 : Je ne sais pas comment Taz sait que c'est HS sans le lire mais bon ...


Message édité par Tarabiscote le 17-06-2005 à 18:18:45
Reply

Marsh Posté le 17-06-2005 à 17:15:43    

mais t'es un vrai boolay, c'est pas à moi qu'il faut faire un cours ... t'es complètement HS ... je lis pas ta prose

Reply

Marsh Posté le 17-06-2005 à 18:23:09    

On se calme on est tous des amis du C++
 
Le problème c'est que je ne connais pas trop les std::vector je vais essayer de me documenter...

Reply

Marsh Posté le 18-06-2005 à 14:16:23    

theredled a écrit :


Le problème c'est que je ne connais pas trop les std::vector je vais essayer de me documenter...


 
Tu fais bien. :jap: Apprendre à utiliser la STL est prérequis absolument indispensable à toute programmation C++.

Reply

Sujets relatifs:

Leave a Replay

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