matrice multidimenssionnelle

matrice multidimenssionnelle - C++ - Programmation

Marsh Posté le 22-09-2014 à 11:26:03    

Bonjour à tous,
 
j'ai une fonction à plusieurs paramétrés f(k,t, y, w), je dois déclarer cette fonction comme une matrice à plusieurs paramètres (ou un tableau multidimensionnel).
est possible de l'écrire de la façon suivante en c++:

Code :
  1. double f[k][t][y][w];/cpp]
  2. et l'initialiser de la manière suivante:
  3. [cpp]f[0][0][0][0]=0;


 
merci de m'aider sur ce petit pb et m'orienter vers des liens qui peuvent m'aider.
 
merci d'avance pour vos réponses.


---------------
etudoc
Reply

Marsh Posté le 22-09-2014 à 11:26:03   

Reply

Marsh Posté le 22-09-2014 à 11:48:50    

en général, en C++, on évite les tableaux C.

 

Ce que tu veux faire est tout à fait possible, de la manière dont tu le décris, mais attention à la taille de tes données : tu risques de faire assez facilement exploser ta pile avec des tableaux de ce genre.

Message cité 1 fois
Message édité par theshockwave le 22-09-2014 à 11:49:13

---------------
last.fm
Reply

Marsh Posté le 22-09-2014 à 12:01:55    

theshockwave a écrit :

en général, en C++, on évite les tableaux C.
 
Ce que tu veux faire est tout à fait possible, de la manière dont tu le décris, mais attention à la taille de tes données : tu risques de faire assez facilement exploser ta pile avec des tableaux de ce genre.


 
 
merci pour ta réponse.
chaque paramètre de ma fonction est de taille 36!!
 
Ya t-il une autre manière de procéder?
 
on peut déclarer une matrice à 2 dimensions comme un vecteur de vecteur, est ce possible de déclarer ma fonction comme un vecteur de vecteur de vecteur de vecteur??!!
désolée si je dis des bêtises, car je suis débutante en C++!


---------------
etudoc
Reply

Marsh Posté le 22-09-2014 à 12:59:25    

ta mémoire peut être considérée de manière linéaire. Quand tu fais des tableaux de tableaux de tableaux, au final, tu restes avec une succession d'adresses utilisées et c'est une poignée de multiplications et d'additions pour trouver l'adresse qui correspond à tes coordonnées.
Tu pourrais tout à fait te contenter d'un vector<double> que tu redimensionnes à 36*36*36*36 et faire ce petit peu de maths par toi-même.
L'avantage de vector, c'est que tes données vont être allouées sur le tas, et non pas sur la pile.
 
Sinon, si ton compilateur n'est pas trop vieux, alors tu peux sans doute utiliser std::array pour faire le boulot. Tu auras toujours besoin de faire attention à la taille de ta pile, par contre.
 
Apparamment, tu n'es pas à l'aise avec la pile et le tas. Les variables que tu déclares dans le corps d'une fonction vont prendre de la mémoire sur la pile. Si tu veux utiliser le tas, tu dois passer par des mécanismes d'allocation dynamique manuellement (new et delete) ou automatiquement (std::unique_ptr avec std::make_unique, ou std::shared_ptr avec std::make_shared)


---------------
last.fm
Reply

Marsh Posté le 22-09-2014 à 13:09:57    

theshockwave a écrit :

ta mémoire peut être considérée de manière linéaire. Quand tu fais des tableaux de tableaux de tableaux, au final, tu restes avec une succession d'adresses utilisées et c'est une poignée de multiplications et d'additions pour trouver l'adresse qui correspond à tes coordonnées.
Tu pourrais tout à fait te contenter d'un vector<double> que tu redimensionnes à 36*36*36*36 et faire ce petit peu de maths par toi-même.
L'avantage de vector, c'est que tes données vont être allouées sur le tas, et non pas sur la pile.
 
Sinon, si ton compilateur n'est pas trop vieux, alors tu peux sans doute utiliser std::array pour faire le boulot. Tu auras toujours besoin de faire attention à la taille de ta pile, par contre.
 
Apparamment, tu n'es pas à l'aise avec la pile et le tas. Les variables que tu déclares dans le corps d'une fonction vont prendre de la mémoire sur la pile. Si tu veux utiliser le tas, tu dois passer par des mécanismes d'allocation dynamique manuellement (new et delete) ou automatiquement (std::unique_ptr avec std::make_unique, ou std::shared_ptr avec std::make_shared)


 
 
merci bcp pour toutes tes explications.


---------------
etudoc
Reply

Marsh Posté le 22-09-2014 à 14:33:52    

Quand c'est un tableau de valeurs numériques, il n'y a aucun mal a utiliser la pile pour un gros tableau multidimensionnel, a condition qu'il ne soit pas instancié à de multiple reprises.
Il faudrait en savoir un peu plus sur ton code et l'utilisation dudit tableau.
Par contre, tu risques de dépasser les limites mémoires par défaut de ton compilateur, mais vu la taille de ton tableau (15 a 20 Mo?) et celle des mémoires vives des bécanes modernes, il suffira juste d'augmenter la taille de la pile, ce qui se fait avec une option de ton compilateur.
 
Un des intérêts des tableaux à la C en C++, c'est qu'ils peuvent être de taille fixe, mais variable entre deux appels:

Code :
  1. #include <iostream>
  2. int test(int i, int j) {
  3.     int tableau[i][j];
  4.     for (auto k = 0; k < i; ++k) {
  5.         for (auto l = 0; l < j; ++l) {
  6.             tableau[k][l] = k + l;
  7.         }
  8.     }
  9.     for (auto k = 0; k < i; ++k) {
  10.         for (auto l = 0; l < j; ++l) {
  11.             std::cout << tableau[k][l];
  12.         }
  13.         std::cout << std::endl;
  14.     }
  15.     return 0;
  16. }
  17. int main ()
  18. {
  19.     test(2,2);
  20.     std::cout << std::endl;
  21.     test(2,3);
  22.     std::cout << std::endl;
  23.     test(3,2);
  24.     return 0;
  25. }


En sortie:
01
12
 
012
123
 
01
12
23
 
A+,

Message cité 1 fois
Message édité par gilou le 23-09-2014 à 12:41:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-09-2014 à 15:01:43    

 


Je crois que tu as confondu pile et tas dans ton message  [:petrus75]

 

Edit : c'est vil, d'éditer les quotes dans les messages des autres :p

Message cité 2 fois
Message édité par theshockwave le 22-09-2014 à 15:27:31

---------------
last.fm
Reply

Marsh Posté le 22-09-2014 à 15:14:16    

theshockwave a écrit :


 
 
Je crois que tu as confondu pile et tas dans ton message  [:petrus75]

Corrigé. Mentalement, j'utilise que stack et heap, et quand je pense stack, et que je veux franciser, 3 fois sur 4, je me fais avoir avec les voyelles: stack, son a, d'ou mon tas fautif (et heap, son i, d'ou un pile fautif luis aussi) :D
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-09-2014 à 12:40:31    

theshockwave a écrit :


 
 
Je crois que tu as confondu pile et tas dans ton message  [:petrus75]
 
Edit : c'est vil, d'éditer les quotes dans les messages des autres :p

Ah zut, c'est involontaire, je croyais l'avoir corrigé dans le mien :o  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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