tableau a 2 dimensions!!!!!

tableau a 2 dimensions!!!!! - C++ - Programmation

Marsh Posté le 03-04-2007 à 15:14:35    

salut,
j'ai un petit problème. j'ai un tableau de 2 dimensions je voudrai lui affecté des valeurs en double[3], mais ça plante pourqoui????
 
VolumeGradient[i][0]=Gradient[0];
VolumeGradient[i][1]=Gradient[1];
VolumeGradient[i][2]=Gradient[2];
 
et c'est comme ça que j'affecte mon tableau et ça plante ???????????
merci pour vos aides

Reply

Marsh Posté le 03-04-2007 à 15:14:35   

Reply

Marsh Posté le 03-04-2007 à 15:15:47    

Ca alors et ton tableau est de quel type ??????????????????
Et pourquoi t'utilises pas  des std::vector ??????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


---------------
Töp of the plöp
Reply

Marsh Posté le 03-04-2007 à 15:28:18    

double **VolumeGradient;
VolumeGradient=new double [NbredesPoints];
for(int i=0; i<NbredesPoints;i++)
VolumeGradient[i]=new double [3];
 
c'est comme ça que je déclare le tableau VolumeGradient et que je l'alloue.
pour Gradient c'est un double Gradient[3], tout simplement

Reply

Marsh Posté le 03-04-2007 à 15:30:49    

- ouvres un livre de c++
ou
- utilises des std::vector


---------------
Töp of the plöp
Reply

Marsh Posté le 03-04-2007 à 15:38:01    

le problème ne vient pas que je ne sais pas utiliser le C++ mais c'est un problème de calcul je pense ou bien d'affectation je ne sais pas, mais j'aimerai entrer dans des std::vector et des trucs comme ça, parce que premiérement je ne l'ai jamais utiliser et 2ément la déclaration est bonne comme ça.

Reply

Marsh Posté le 03-04-2007 à 15:41:00    

non


---------------
Töp of the plöp
Reply

Marsh Posté le 03-04-2007 à 15:49:30    

pourquoi non ?????? si on peut faire la déclaration d'un tableau à 2 dimensions de cette manière même si elle est trop fiable mais on pourrai la faire comme même, vous voulez m'aider à fair erésourdre ce problème ou pas???
je veux vous mettre le code là ou ça plante et j'espère que vous trouverez la faille. c'est là ou je vous ai mais la fléche.
[cpp]if(W=1)//Ha(p)=H(p) implique non-feature vertices, donc Va(p)=gradient de volume
   {
    -->VolumeGradient[i][0]=Gradient[0];
    VolumeGradient[i][1]=Gradient[1];
    VolumeGradient[i][2]=Gradient[2];
   }
   else
   {
    VolumeGradient[i][0]=signum*Eha[i][0];//calcul de Va
    VolumeGradient[i][1]=signum*Eha[i][1];
    VolumeGradient[i][2]=signum*Eha[i][2];
   }

Reply

Marsh Posté le 03-04-2007 à 15:55:01    

tab[x][y] c'est pas un tableau à 2 dimensions, c'est un tableau à 1 dimension de tableaux à 1 dimension.
 
rien n'implique ici par exemple que max(y) sera identique pour chaque valeur de x.
 
un tableau à 2 dimensions, c'est ça : tab[x, y] <- après, cette syntaxe n'est pas supportée par tous les langages, et occupe bien plus de mémoire si tu n'as pas l'intension de remplir toutes les "cases". par contre, l'adressage d'une valeur est bien plus rapide, puisqu'on travail avec des offset de taille fixe.


Message édité par MagicBuzz le 03-04-2007 à 15:55:49
Reply

Marsh Posté le 03-04-2007 à 15:59:37    

hamoudasafira1 a écrit :

double **VolumeGradient;
VolumeGradient=new double [NbredesPoints];


Règle ton compilateur parce que ca c'est une erreur.
 
Pour la suite les types sont mauvais;
J'imagine que tu veux faire un tableau à trois dimensions de vecteurs3d. Or là tu *tentes* de faire un tableau à deux dimensions de doubles.
 
Regarde comment on gère les tableaux, regarde comment on gère les std::vector, vas boire une bière et reprend ton bordel.


---------------
Töp of the plöp
Reply

Marsh Posté le 03-04-2007 à 15:59:51    

hamoudasafira1 a écrit :

double **VolumeGradient;
VolumeGradient=new double [NbredesPoints];
for(int i=0; i<NbredesPoints;i++)
VolumeGradient[i]=new double [3];
 
c'est comme ça que je déclare le tableau VolumeGradient et que je l'alloue.
pour Gradient c'est un double Gradient[3], tout simplement


superbement inefficace. Creuse toi la tête et fait tout ça en un seul new

Reply

Marsh Posté le 03-04-2007 à 15:59:51   

Reply

Marsh Posté le 03-04-2007 à 16:01:12    

pkoi tu veux absolument l'obliger à bosser avec une lib externe ? rien n'empêche de travailler en C++ sans utiliser la moindre lib...

Reply

Marsh Posté le 03-04-2007 à 16:02:05    

sinon, question stupide, C++ sait pas gérer de vrais tableaux à 2 dimensions ? new double[nbredespoints, 3] ?

Reply

Marsh Posté le 03-04-2007 à 16:05:38    

MagicBuzz a écrit :

pkoi tu veux absolument l'obliger à bosser avec une lib externe ? rien n'empêche de travailler en C++ sans utiliser la moindre lib...


Parce que stl c'est standard, livré avec et fait pour pas s'emmerder à gérer des tableaux, etc.
C'est un peu plus haut niveau, et préférable à mon sens.


---------------
Töp of the plöp
Reply

Marsh Posté le 03-04-2007 à 16:09:10    

je sais comment la faire en un seule new c'est de la faire comme ça:
TableFunction=new double [NbredesPoints][3];
mais ça n'empêche pas que je pourrai la faire de cette maniére ok, mais je la fais comme ça pour qu'il parcourir tous les points.
for(int i=0;i<Nbredespoints;i++)
 TableFunction=newdouble[3];
 
pour ça aussi l'allocation n'est pas trop efficace je sais mais ça marché avant et ça dois marché maintenant mais vous éloignez un peur du problème j'ai utilisé le debogueur pour parcourir tout le calcul il y pas de soucis sauf dans cette ligne là ou j'affecte le tableau?????? pourqoui???

Reply

Marsh Posté le 03-04-2007 à 16:25:23    

parce queee :fou: !!!!!!!!!!!!!!!!!!
 
Défini une classe vecteur3d, fait ton tableau de la même manière, et affecte des vecteur3d, ca ira bcp mieux.


---------------
Töp of the plöp
Reply

Marsh Posté le 03-04-2007 à 16:57:37    

t'énerve pas tu me fais peur  :p  
je crois savoir d'ou vient le problème.
on fait le tableau VolumeGradient est un membre de ma classe, et je l'ai mis comme paramétre dans ma méthode pour l'utiliser dans ma duexième méthode dans cet class, et ce qu'il faut pas faire puisque s'il est un membre de ma classe je n'aurai pas besoin de le mettre en paramétre voilà!!! je pense que ça vient de là

Reply

Marsh Posté le 03-04-2007 à 17:01:41    

hamoudasafira1 a écrit :

t'énerve pas tu me fais peur  :p
je crois savoir d'ou vient le problème.
on fait le tableau VolumeGradient est un membre de ma classe, et je l'ai mis comme paramétre dans ma méthode pour l'utiliser dans ma duexième méthode dans cet class, et ce qu'il faut pas faire puisque s'il est un membre de ma classe je n'aurai pas besoin de le mettre en paramétre voilà!!! je pense que ça vient de là

 

[:ciler]
[:totoz]

 
_darkalt3_ a écrit :

- ouvres un livre de c++


Message édité par _darkalt3_ le 03-04-2007 à 17:13:54

---------------
Töp of the plöp
Reply

Marsh Posté le 04-04-2007 à 14:47:00    

std::vector<std::tr::array<double, 3> >  
 
TableFunction=new double [NbredesPoints][3];
 
ça marche pas ça.
maintenant, si tu faisais un typedef double[3] ça donnerait quoi ...

Reply

Marsh Posté le 04-04-2007 à 19:52:43    

MagicBuzz a écrit :

sinon, question stupide, C++ sait pas gérer de vrais tableaux à 2 dimensions ? new double[nbredespoints, 3] ?


 
paske vector<vector<double>> c'est suffisant, portable, standard et fiable :o

Reply

Marsh Posté le 04-04-2007 à 20:21:18    

Joel F a écrit :

paske vector<vector<double>> c'est suffisant, portable, standard et fiable :o


 
Bah pourtant, j'ai déjà eu un problème où faire un vecteur[1].push_back(toto) a mis un sacré bordel dans vecteur[2]
Vous êtes certains que c'est sûr ce truc?
 
edit : situation où aucune taille prédéfinie n'a été pré réservée aux vecteurs.
re edit question : que fait-il de l'adresse de départ de vecteur[2] lorsque vecteur[1] doit passer par là?

Message cité 1 fois
Message édité par GrosBocdel le 04-04-2007 à 20:25:38
Reply

Marsh Posté le 04-04-2007 à 22:07:10    

ton probleme est ici :
 

Code :
  1. double **VolumeGradient;
  2. VolumeGradient=new double* [NbredesPoints];
  3. for(int i=0; i<NbredesPoints;i++)
  4. VolumeGradient[i]=new double [3];


 

Reply

Marsh Posté le 05-04-2007 à 09:44:48    

Ouais mais faut laisser les tableaux aux gens qui font du C :o


---------------
Töp of the plöp
Reply

Marsh Posté le 05-04-2007 à 10:43:12    

GrosBocdel a écrit :


edit : situation où aucune taille prédéfinie n'a été pré réservée aux vecteurs.


 
aprés se servir correctement des trucs ca aide :o
 
vecteur[x] n'est pas défini si la taille du vecteur n'est pas précisée :o
 
donc
 

Code :
  1. vector<vector<double>> a;
  2. for(int i =0;i<4;i++)
  3. {
  4.   vector<double> b;
  5.   a.push_back(b);
  6. a[2].push_back(6.7575);


 
fonctionne, mais  
 

Code :
  1. vector<vector<double>> a;
  2. a[2].push_back(6.7575);


 
ne marche pas pour des raisons évidentes :o

Message cité 1 fois
Message édité par Joel F le 05-04-2007 à 10:43:46
Reply

Marsh Posté le 05-04-2007 à 10:57:33    

Joel F a écrit :

paske vector<vector<double>> c'est suffisant, portable, standard et fiable :o


mais objectivement pas très efficace. Puisqu'on a un langage qui permet de traiter ce genre de problème, autant le faire.

Reply

Marsh Posté le 05-04-2007 à 11:52:11    

Taz a écrit :

mais objectivement pas très efficace. Puisqu'on a un langage qui permet de traiter ce genre de problème, autant le faire.


 
on est d'accord :jap: Mais bon, en première approximation ca suffit bien :)

Reply

Marsh Posté le 05-04-2007 à 18:47:34    

Joel F a écrit :

aprés se servir correctement des trucs ca aide :o
 
vecteur[x] n'est pas défini si la taille du vecteur n'est pas précisée :o
 
donc
 

Code :
  1. vector<vector<double>> a;
  2. for(int i =0;i<4;i++)
  3. {
  4.   vector<double> b;
  5.   a.push_back(b);
  6. a[2].push_back(6.7575);


 
fonctionne, mais  
 

Code :
  1. vector<vector<double>> a;
  2. a[2].push_back(6.7575);


 
ne marche pas pour des raisons évidentes :o


 
Je ne te parle pas du vecteur extérieur, mais des vecteurs intérieurs.
Je te dis que si vecteur[0] dépasse une certaine taille à force de push_back que tu n'avais pas réservés d'avance, il peut arriver qu'il aille gentiment écraser les valeurs de vecteur[1] sans prévenir.
 

Reply

Marsh Posté le 05-04-2007 à 20:32:23    

tu dois te vautrer quelque part :o
Vu comment le vector est implenté, y a 0 raisons que cela arrive.

Reply

Marsh Posté le 11-04-2007 à 18:45:57    

tiens d'ailleurs, on fait un comment un new/new[] de tableau sans typedef ?

Reply

Marsh Posté le 11-04-2007 à 21:00:13    

Taz a écrit :

mais objectivement pas très efficace. Puisqu'on a un langage qui permet de traiter ce genre de problème, autant le faire.


Tiens, Joel F, si tu n'as pas encore vu, il y a qq chose qui pourrait t'intéresser.

Reply

Marsh Posté le 12-04-2007 à 17:51:01    

j'en avais entendu parler ^^ c'est sur mon backburner pour les mois qui viennent :)  
 
L'avantage est de passer par des representations plus souple que les templates :D  c'ets tellement beau que j'en pleur presque ;)
 
Merci du lien en tout cas :D

Reply

Marsh Posté le 13-04-2007 à 01:31:19    

Taz a écrit :

tiens d'ailleurs, on fait un comment un new/new[] de tableau sans typedef ?


 
Avec new, ça doit donner ça :
int (*f1)[10] = new ( int [1][10] ) ;
int (**f2)[10] = new ( int (*)[10] ) ;
int (***f3)[10] = new ( int (**)[10] ) ;
etc...
 
Par contre, avec new[], j'y arrive pas, là, de suite :/

Reply

Marsh Posté le 13-04-2007 à 11:26:12    

ouais ben moi aussi je sèche sur le new[]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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