tableau a 2 dimensions!!!!! - C++ - Programmation
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 ??????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
Marsh Posté le 03-04-2007 à 15:30:49
ReplyMarsh 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.
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];
}
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.
Marsh Posté le 03-04-2007 à 15:59:37
hamoudasafira1 a écrit : double **VolumeGradient; |
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.
Marsh Posté le 03-04-2007 à 15:59:51
hamoudasafira1 a écrit : double **VolumeGradient; |
superbement inefficace. Creuse toi la tête et fait tout ça en un seul new
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...
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] ?
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.
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???
Marsh Posté le 03-04-2007 à 16:25:23
parce queee !!!!!!!!!!!!!!!!!!
Défini une classe vecteur3d, fait ton tableau de la même manière, et affecte des vecteur3d, ca ira bcp mieux.
Marsh Posté le 03-04-2007 à 16:57:37
t'énerve pas tu me fais peur
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à
Marsh Posté le 03-04-2007 à 17:01:41
hamoudasafira1 a écrit : t'énerve pas tu me fais peur |
_darkalt3_ a écrit : - ouvres un livre de c++ |
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 ...
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
Marsh Posté le 04-04-2007 à 20:21:18
Joel F a écrit : paske vector<vector<double>> c'est suffisant, portable, standard et fiable |
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à?
Marsh Posté le 04-04-2007 à 22:07:10
ton probleme est ici :
Code :
|
Marsh Posté le 05-04-2007 à 09:44:48
ReplyMarsh Posté le 05-04-2007 à 10:43:12
GrosBocdel a écrit : |
aprés se servir correctement des trucs ca aide
vecteur[x] n'est pas défini si la taille du vecteur n'est pas précisée
donc
Code :
|
fonctionne, mais
Code :
|
ne marche pas pour des raisons évidentes
Marsh Posté le 05-04-2007 à 10:57:33
Joel F a écrit : paske vector<vector<double>> c'est suffisant, portable, standard et fiable |
mais objectivement pas très efficace. Puisqu'on a un langage qui permet de traiter ce genre de problème, autant le faire.
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 Mais bon, en première approximation ca suffit bien
Marsh Posté le 05-04-2007 à 18:47:34
Joel F a écrit : aprés se servir correctement des trucs ca aide
|
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.
Marsh Posté le 05-04-2007 à 20:32:23
tu dois te vautrer quelque part
Vu comment le vector est implenté, y a 0 raisons que cela arrive.
Marsh Posté le 11-04-2007 à 18:45:57
ReplyMarsh 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 là qq chose qui pourrait t'intéresser.
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 c'ets tellement beau que j'en pleur presque
Merci du lien en tout cas
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
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