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

  FORUM HardWare.fr
  Programmation
  C++

  Tableau en static

 

 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tableau en static

n°1116381
stan walke​r
Yeahhhhhhhhhhh
Posté le 10-06-2005 à 23:53:42  profilanswer
 

Bonjour, j'aimerai savoir comment déclarer un tableau en static (dans un .h) puis l'initialiser et s'en servir dans la classe correspondante, En fait un début de réponse est donné dans le 2eme post de cette page : http://forum.hardware.fr/hardwaref [...] -42315.htm
 
Mais "static int []tab;" provoque une erreur de compilation.
 
 
Merci d'avance.
 
Florian

mood
Publicité
Posté le 10-06-2005 à 23:53:42  profilanswer
 

n°1116392
push
/dev/random
Posté le 11-06-2005 à 00:02:03  profilanswer
 

remplace le par static int tab[];

n°1116395
Taz
bisounours-codeur
Posté le 11-06-2005 à 00:03:14  profilanswer
 

n'importe quoi.
 
tu veux faire quoi ? une variable globale ?

n°1116408
push
/dev/random
Posté le 11-06-2005 à 00:12:14  profilanswer
 

:D  
 
moi au moin ça compile  :o  
bon ok =>[]

n°1116411
Taz
bisounours-codeur
Posté le 11-06-2005 à 00:14:00  profilanswer
 

non ça compile pas.

n°1116419
push
/dev/random
Posté le 11-06-2005 à 00:20:12  profilanswer
 

Taz a écrit :

non ça compile pas.


bein si ?

Code :
  1. #include <iostream>
  2. class Foo {
  3.    static int tab[];
  4.    public:
  5.       void get() const { std::cout << tab[0] << endl; }
  6. };
  7. int Foo::tab[]={5,5,53,6,8,7};
  8. int main()
  9. {
  10. Foo foo;
  11. foo.get();
  12. return 0;
  13. }

n°1116421
Taz
bisounours-codeur
Posté le 11-06-2005 à 00:22:29  profilanswer
 

ce qui n'est pas du TOUT la même chose !
 
edit: et c'est d'ailleurs une pratique douteuse vu que tu dispenses dans ton .h une déclaration imcomplète, rendant ton tableau peu pratique à utiliser (sizeof ou les templates ne fonctionnent pas). Voir inutilisable.
 
edit2: ne te laisse pas abuser parce que ton compilateur ferme sa gueule parce qu'au final il obtient la definition de tab.


Message édité par Taz le 11-06-2005 à 00:33:28
n°1116432
push
/dev/random
Posté le 11-06-2005 à 00:44:34  profilanswer
 

Taz a écrit :

ne te laisse pas abuser parce que ton compilateur ferme sa gueule parce qu'au final il obtient la definition de tab.


ça peut ne pas fonctionner ? parceque comme tu l'auras deviné j'ai testé le sizeof et le coup du template et pas de prob  :D

n°1116472
stan walke​r
Yeahhhhhhhhhhh
Posté le 11-06-2005 à 03:41:18  profilanswer
 

Bon merci à vous d'essayer, mais je suis toujours un peu en galère...
 
Taz => c'est pas vraiment une variable globale, c'est juste un tableau, privé à la classe, mais qui doit etre statique (donc appartenant à la classe et pas une instance en particulier)
 
Voilà un extrait de Param.h :
 

Code :
  1. class Param
  2. {
  3. public:
  4. static void init(void);
  5. static int access(int);
  6.         ......
  7. protected:
  8. static int parametre[50]; // le fameux tableau
  9. };


 
et mon Param.cpp :
 

Code :
  1. #include "Param.h"
  2. static void init(void)
  3. {
  4. for(int i=0;i<50;i++)
  5.                 param[i]=0;
  6. }
  7. static int access(int variable)
  8. {
  9. return parametre[variable];
  10. }


 
Bon ce ne sont que des extraits, mais en gros j'appelle tout d'abord Param::init(); puis j'accede au valeur par access... Mais j'ai une erreur de compilation : dans Param.cpp il me dit que parametre n'est pas déclaré  :??:  
 
Je suis plutot newb en C++ donc si vous pensez que c'est possible mais que c'est idiot de procéder comme ça n'hésitez pas à me le dire  :pfff:  
 
Voilà merci à ceux qui pourront faire avancer le Shmilblick...

n°1116474
Pillow
'cos the trees won't talk
Posté le 11-06-2005 à 04:34:18  profilanswer
 

Je préviens, je suis absolument nul en C++ (Taz, sois gentil avec moi s'il te plait :o )
 
Tu devrais déclarer tes fonctions comme ça:

Code :
  1. void Param::init(void)
  2. {
  3.      ....
  4. }


Et la variable static doit être initialisée en dehors de la classe. Il te faudrait donc un

Code :
  1. int Param::parametre[50];

en dehors de la déclaration de la classe.
 
 
Mais je pense qu'il y a de fortes chances que tu n'ais pas besoin de faire ça. Explique ce que tu veux faire avec ta classe ;)

mood
Publicité
Posté le 11-06-2005 à 04:34:18  profilanswer
 

n°1116495
Taz
bisounours-codeur
Posté le 11-06-2005 à 10:10:39  profilanswer
 

push a écrit :

ça peut ne pas fonctionner ? parceque comme tu l'auras deviné j'ai testé le sizeof et le coup du template et pas de prob  :D


je veux bien voir ça  :heink:

n°1116584
stan walke​r
Yeahhhhhhhhhhh
Posté le 11-06-2005 à 12:55:03  profilanswer
 

Pillow ca ne marche pas :(, déjà parce que je veux que mon tableau soit en protected, et si je met  

Code :
  1. int Param::parametre[50];


en dehors de la déclaration de la classe, il ne le sera pas, mais meme si je le met en dehors d'une classe, le compilo me dit logiquement que :
 
Param.h:21: error: `int Param::parametre[50]' is not a static member of `class
   Param'
 
 
En fait je veux faire comme pour une variable static, que l'on déclare dans le .h, et que l'on utilise dans le .cpp, tout simplement  (enfin pas si simple..., arf)

n°1116589
Taz
bisounours-codeur
Posté le 11-06-2005 à 13:02:21  profilanswer
 

ça veut rien dire ce que tu veux : tu veux une variable globale ou un variable de classe ?

n°1116592
stan walke​r
Yeahhhhhhhhhhh
Posté le 11-06-2005 à 13:18:18  profilanswer
 

Une variable de classe

n°1116596
Taz
bisounours-codeur
Posté le 11-06-2005 à 13:22:58  profilanswer
 

.hpp
class Foo
{
  static T v;
};
 
.cpp
T Foo::v; // et initialisation si nécessaire.
 

n°1116814
push
/dev/random
Posté le 11-06-2005 à 20:11:27  profilanswer
 

Taz a écrit :

je veux bien voir ça  :heink:


je sens que je vais dire une connerie  :o  
 

Code :
  1. #include <iostream>
  2. template <typename T>
  3. class Plop {
  4.    static T tab[];
  5.    public:
  6.    void toto() {
  7.       std::cout << tab[3] << std::endl << sizeof(tab) << std::endl;
  8.       }
  9. };
  10. int Plop<int>::tab[] = {1, 2, 3, 4};
  11. int main() {
  12. Plop<int> plop;
  13. plop.toto();
  14. return 0;
  15. }

n°1116839
Taz
bisounours-codeur
Posté le 11-06-2005 à 21:09:02  profilanswer
 

vas-y, maintenant bouge ta définion de tab dans un .cpp séparé comme tu ferais normalement ...
 
ici ça fonctionne avec ton compilo, parce qu'il se rattrape aux branches en cherchant la définition de Plop::tab dans le reste du fichier, ce qu'il ne devrait pas. Ça doit produire une erreur. D'ailleurs à bien y réfléchir, ici ça marche grace aux template. Lors de l'évaluation de Plop<int> dans main, le compilateur a déjà la définition de Plop<int>::tab. C'est fortuit.
 

Code :
  1. #include <iostream>
  2. #include <typeinfo>
  3. class Plop {
  4. public:
  5.    static int tab[];
  6.    void toto() {
  7.      std::cout << tab[3] << std::endl << sizeof(tab) << std::endl;
  8.    }
  9. };
  10. template<typename T>
  11. void dummy(T& )
  12. {
  13.   std::cout << typeid(Plop::tab).name << '\n';
  14. }
  15. // int Plop::tab[] = {1, 2, 3, 4};
  16. int main()
  17. {
  18.   Plop().toto();
  19.   dummy(Plop::tab);
  20.   return 0;
  21. }

essaie ça.

n°1116842
Taz
bisounours-codeur
Posté le 11-06-2005 à 21:14:56  profilanswer
 

en fait, ici static à le sens de privé, mais veut bien dire extern 'est défini ailleurs'. static int tab[]; est valide mais incomplet, et donc peu pratique à utiliser. les tableaux globaux, c'est chiant. en C ou C++, la solution utilisée, c'est alors de mettre un marqueur en fin de tableau pour pouvoir retrouver le nombre d'éléments


Message édité par Taz le 11-06-2005 à 21:18:43
n°1116859
push
/dev/random
Posté le 11-06-2005 à 22:02:07  profilanswer
 

[:petrus75]
 

Code :
  1. /* plop.h */
  2. template <typename T>
  3. class Plop {
  4.    public:
  5.      static T tab[];
  6.      void toto();
  7. };


 

Code :
  1. /* plop.cpp */
  2. #include <iostream>
  3. #include <typeinfo>
  4. #include "plop.h"
  5. template<typename T>
  6. void dummy(T& )
  7. {
  8.   std::cout << typeid(Plop<int>::tab).name() << '\n';
  9. }
  10. int Plop<int>::tab[] = {2, 3, 4};
  11. template <typename T>
  12. void Plop<T>::toto()
  13. {
  14.   std::cout << tab[2] << '\n' << sizeof(tab) << std::endl;
  15. }
  16. int main()
  17. {
  18. Plop<int>().toto();
  19. dummy(Plop<int>::tab);
  20. return 0;
  21. }

n°1116869
Taz
bisounours-codeur
Posté le 11-06-2005 à 22:12:23  profilanswer
 

t'as toujours pas compris ...  
 
ici entre les template et ton .h, c'est EXACTEMENT la même chose que précédement. Mais alors c'est textuellement pareil
 
fais un plop.h, un plop.cpp et un main.cpp dans le quel tu manipules Plop::tab.

n°1116880
push
/dev/random
Posté le 11-06-2005 à 22:18:38  profilanswer
 

error: `Plop<int>::tab' has incomplete type
error: invalid use of array with unspecified bounds
 
[:petrus75]

n°1116904
Taz
bisounours-codeur
Posté le 11-06-2005 à 23:30:32  profilanswer
 

tu vois :)

mood
Publicité
Posté le   profilanswer
 


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

  Tableau en static

 

Sujets relatifs
[VB6] tableau aléatoire [ résolu ][C++] Lecture d'une variable static d'une autre classe??
[PHP] Aide pour tri de tableau multi-dimensionnel[VB6] Se placer aléatoirement sur une cellule d'un tableau
Passer un tableau a un autre fichierCopie de tableau de structure de double dans un tableau char
Trier un tableau suivant une colonneCentrer un tableau verticlalement???
comment faire de beau tableau ?Declarer un tableau en static dans une classe
Plus de sujets relatifs à : Tableau en static


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