Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1278 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1122964
theredled
● REC
Posté le 17-06-2005 à 11:41:06  profilanswer
 

: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....

mood
Publicité
Posté le 17-06-2005 à 11:41:06  profilanswer
 

n°1122996
Tarabiscot​e
Posté le 17-06-2005 à 12:12:12  profilanswer
 

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.

n°1123056
Taz
bisounours-codeur
Posté le 17-06-2005 à 13:12:27  profilanswer
 

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

n°1123081
Tarabiscot​e
Posté le 17-06-2005 à 13:46:09  profilanswer
 

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.

n°1123167
Taz
bisounours-codeur
Posté le 17-06-2005 à 14:41:08  profilanswer
 

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]

n°1123287
Tarabiscot​e
Posté le 17-06-2005 à 15:24:53  profilanswer
 

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
n°1123511
Taz
bisounours-codeur
Posté le 17-06-2005 à 17:15:43  profilanswer
 

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

n°1123563
theredled
● REC
Posté le 17-06-2005 à 18:23:09  profilanswer
 

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...

n°1123958
el muchach​o
Comfortably Numb
Posté le 18-06-2005 à 14:16:23  profilanswer
 

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++.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Pourcentage dans un tableautableau associatif java
css: firefox ajoute la taille de la scollbar à un divsupprimer un element de tableau en variable de session
Probléme de Tableau HTML [ Colspawn Rospawn]Inserer une image HTML qui ne doit pas dépasser une certaine taille...
Compatibilité taille de cellule entre IE6 et MozillaCréation de clip dynamique
Pb pour figé un tableau 
Plus de sujets relatifs à : Création dynamique d'un tableau de taille non fixée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR