Création dynamique d'un tableau de taille non fixée - C++ - Programmation
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.
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
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. |
Cest 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 nest pas le cas ?
Taz a écrit : Maintenant, travaillons bien : |
+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.
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 : |
void *b = new int;
Tarabiscote a écrit : |
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 nest 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]
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), lexemple donné est exactement ce que je voulais dire :
struct B {}; |
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 ladresse soit la même ou non dépend de limplémentation) :
Code :
|
Jespère ne pas avoir été trop long, mais jessaye 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 ...
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
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...
Marsh Posté le 18-06-2005 à 14:16:23
theredled a écrit : |
Tu fais bien. Apprendre à utiliser la STL est prérequis absolument indispensable à toute programmation C++.
Marsh Posté le 17-06-2005 à 11:41:06
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....