et le compilateur (g++) me donne l'erreur que j'ai mise en sujet.
Est-ce que le code suivant, qui compile sans erreur, est équivalent à ce
que je veux faire ?
Pourquoi faire simple quand on peut faire compliquer, n'est pas ? Comme dit Fabien, std::vector est ton ami.
Quant à l'erreur, il aurait été plus simple si tu avais indiqué quelle ligne provoquait l'erreur, mais à jouer aux devinettes (« but just a guess », an anglais -- je ne trouve rien de mieux en français, à cette heure du soir) : la première expression new me semble louche. La syntaxe de new ne permet que deux variants (sans les placement et d'autres) : new new-type-id new ( type-id ) Or, new-type-id ne permet qu'une expression assez limitée des types, sans parenthèses. C-à-d que ta ligne se parse :
tab = (new (double (*)[3])) [n] ;
Le [n] n'apppartient pas à l'expression new. Et bien que l'expression à droite de l'affectation est tout à fait légale, le type qu'il en donne (le résultat d'avoir appliqué l'operateurr [] sur le résultat de l'expression new) n'est pas compatible avec le type à gauche de l'affectation.
Si tu y tiens, tab=new (double((*[n])[3])) ; doit faire l'affaire. Mais je n'aimerais pas !a avoir à maintenir de tel code.
et le compilateur (g++) me donne l'erreur que j'ai mise en sujet. Est-ce que le code suivant, qui compile sans erreur, est équivalent à ce que je veux faire ?
Pourquoi faire simple quand on peut faire compliquer, n'est
pas ? Comme dit Fabien, std::vector est ton ami.
Quant à l'erreur, il aurait été plus simple si tu avais indiqué
quelle ligne provoquait l'erreur, mais à jouer aux devinettes
(« but just a guess », an anglais -- je ne trouve rien de mieux
en français, à cette heure du soir) : la première expression new
me semble louche. La syntaxe de new ne permet que deux
variants (sans les placement et d'autres) :
new new-type-id
new ( type-id )
Or, new-type-id ne permet qu'une expression assez limitée des
types, sans parenthèses. C-à-d que ta ligne se parse :
tab = (new (double (*)[3])) [n] ;
Le [n] n'apppartient pas à l'expression new. Et bien que l'expression
à
droite de l'affectation est tout à fait légale, le type qu'il en
donne (le résultat d'avoir appliqué l'operateurr [] sur le
résultat de l'expression new) n'est pas compatible avec le type
à gauche de l'affectation.
Si tu y tiens,
tab=new (double((*[n])[3])) ;
doit faire l'affaire. Mais je n'aimerais pas !a avoir à
maintenir de tel code.
et le compilateur (g++) me donne l'erreur que j'ai mise en
sujet. Est-ce que le code suivant, qui compile sans erreur,
est équivalent à ce que je veux faire ?
Pourquoi faire simple quand on peut faire compliquer, n'est pas ? Comme dit Fabien, std::vector est ton ami.
Quant à l'erreur, il aurait été plus simple si tu avais indiqué quelle ligne provoquait l'erreur, mais à jouer aux devinettes (« but just a guess », an anglais -- je ne trouve rien de mieux en français, à cette heure du soir) : la première expression new me semble louche. La syntaxe de new ne permet que deux variants (sans les placement et d'autres) : new new-type-id new ( type-id ) Or, new-type-id ne permet qu'une expression assez limitée des types, sans parenthèses. C-à-d que ta ligne se parse :
tab = (new (double (*)[3])) [n] ;
Le [n] n'apppartient pas à l'expression new. Et bien que l'expression à droite de l'affectation est tout à fait légale, le type qu'il en donne (le résultat d'avoir appliqué l'operateurr [] sur le résultat de l'expression new) n'est pas compatible avec le type à gauche de l'affectation.
Si tu y tiens, tab=new (double((*[n])[3])) ; doit faire l'affaire. Mais je n'aimerais pas !a avoir à maintenir de tel code.
et le compilateur (g++) me donne l'erreur que j'ai mise en sujet. Est-ce que le code suivant, qui compile sans erreur, est équivalent à ce que je veux faire ?
On Wed, 22 Jul 2009 10:47:13 +0200, (Pascal J. Bourguignon):
En fait, ici j'ai l'impression que Lucas veut non pas des vecteurs,
Possible. Je n'ai jamais parlé de vecteurs.
mais des tableaux multidimentionnel, ou peut être seulement des matrices.
Un tableau de T à une dimension s'écrit vector<T>. Un tableau de T à deux dimensions s'écrit vector< vector<T> >. Un tableau de T à trois dimensions s'écrit vector< vector< vector<T> > >. etc.
Une matrice au sens mathématique est généralement une encapsulation d'un vector< vector<T> >.
On Wed, 22 Jul 2009 10:47:13 +0200, pjb@informatimago.com (Pascal J.
Bourguignon):
En fait, ici j'ai l'impression que Lucas veut non pas des vecteurs,
Possible. Je n'ai jamais parlé de vecteurs.
mais des tableaux multidimentionnel, ou peut être seulement des
matrices.
Un tableau de T à une dimension s'écrit vector<T>.
Un tableau de T à deux dimensions s'écrit vector< vector<T> >.
Un tableau de T à trois dimensions s'écrit
vector< vector< vector<T> > >.
etc.
Une matrice au sens mathématique est généralement une encapsulation
d'un vector< vector<T> >.
On Wed, 22 Jul 2009 10:47:13 +0200, (Pascal J. Bourguignon):
En fait, ici j'ai l'impression que Lucas veut non pas des vecteurs,
Possible. Je n'ai jamais parlé de vecteurs.
mais des tableaux multidimentionnel, ou peut être seulement des matrices.
Un tableau de T à une dimension s'écrit vector<T>. Un tableau de T à deux dimensions s'écrit vector< vector<T> >. Un tableau de T à trois dimensions s'écrit vector< vector< vector<T> > >. etc.
Une matrice au sens mathématique est généralement une encapsulation d'un vector< vector<T> >.
Lucas Levrel
Le 21 juillet 2009, James Kanze a écrit :
Quant à l'erreur, il aurait été plus simple si tu avais indiqué quelle ligne provoquait l'erreur,
Ah oui, désolé ! C'est cette ligne qui coince : tab=new (double(*)[3])[n];
C-à-d que ta ligne se parse :
tab = (new (double (*)[3])) [n] ;
Le [n] n'apppartient pas à l'expression new.
OK. Pour me fixer les idées, quand on fait : toto = new double[n]; c'est bien parsé comme new (double[n]) et non pas (new double)[n] ?
Si tu y tiens, tab=new (double((*[n])[3])) ; doit faire l'affaire. Mais je n'aimerais pas !a avoir à maintenir de tel code.
Effectivement. Ça crée bien un tableau de n objets de type double(*)[3] ?
Merci pour tes explications. -- LL
Le 21 juillet 2009, James Kanze a écrit :
Quant à l'erreur, il aurait été plus simple si tu avais indiqué
quelle ligne provoquait l'erreur,
Ah oui, désolé ! C'est cette ligne qui coince :
tab=new (double(*)[3])[n];
C-à-d que ta ligne se parse :
tab = (new (double (*)[3])) [n] ;
Le [n] n'apppartient pas à l'expression new.
OK. Pour me fixer les idées, quand on fait :
toto = new double[n];
c'est bien parsé comme new (double[n]) et non pas (new double)[n] ?
Si tu y tiens,
tab=new (double((*[n])[3])) ;
doit faire l'affaire. Mais je n'aimerais pas !a avoir à
maintenir de tel code.
Effectivement. Ça crée bien un tableau de n objets de type double(*)[3] ?
Quant à l'erreur, il aurait été plus simple si tu avais indiqué quelle ligne provoquait l'erreur,
Ah oui, désolé ! C'est cette ligne qui coince : tab=new (double(*)[3])[n];
C-à-d que ta ligne se parse :
tab = (new (double (*)[3])) [n] ;
Le [n] n'apppartient pas à l'expression new.
OK. Pour me fixer les idées, quand on fait : toto = new double[n]; c'est bien parsé comme new (double[n]) et non pas (new double)[n] ?
Si tu y tiens, tab=new (double((*[n])[3])) ; doit faire l'affaire. Mais je n'aimerais pas !a avoir à maintenir de tel code.
Effectivement. Ça crée bien un tableau de n objets de type double(*)[3] ?
Merci pour tes explications. -- LL
Lucas Levrel
Merci pour votre aide !
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits. Sinon j'aurais fait : double ***tab; tab=new (double **)[n]; for(int i=0;i<n;i++){ tab[i]=new (double *)[t]; for(int j=0;j<t;j++) tab[i][j]=new double[3]; } mais (sauf erreur dans mes tests) new double[3] consomme 4*64 bits.
De plus, ça m'arrange que les doubles soient contigus par paquets de t*3, pour faire une écriture non formatée comme : file_out.write((char*)tab[i],t*3*sizeof(double));
Tout ça m'a conduit à l'idée de faire des new double[t][3] et un tableau de n pointeurs vers ceux-ci.
Mais, si ça existe, je suis preneur d'une façon de faire plus lisible et pas significativement plus gourmande en mémoire. Comme l'a deviné Pascal, les dimensions n et t sont constantes.
-- LL
Merci pour votre aide !
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très
grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits. Sinon
j'aurais fait :
double ***tab;
tab=new (double **)[n];
for(int i=0;i<n;i++){
tab[i]=new (double *)[t];
for(int j=0;j<t;j++) tab[i][j]=new double[3];
}
mais (sauf erreur dans mes tests) new double[3] consomme 4*64 bits.
De plus, ça m'arrange que les doubles soient contigus par paquets de t*3,
pour faire une écriture non formatée comme :
file_out.write((char*)tab[i],t*3*sizeof(double));
Tout ça m'a conduit à l'idée de faire des new double[t][3] et un tableau
de n pointeurs vers ceux-ci.
Mais, si ça existe, je suis preneur d'une façon de faire plus lisible et
pas significativement plus gourmande en mémoire. Comme l'a deviné Pascal,
les dimensions n et t sont constantes.
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits. Sinon j'aurais fait : double ***tab; tab=new (double **)[n]; for(int i=0;i<n;i++){ tab[i]=new (double *)[t]; for(int j=0;j<t;j++) tab[i][j]=new double[3]; } mais (sauf erreur dans mes tests) new double[3] consomme 4*64 bits.
De plus, ça m'arrange que les doubles soient contigus par paquets de t*3, pour faire une écriture non formatée comme : file_out.write((char*)tab[i],t*3*sizeof(double));
Tout ça m'a conduit à l'idée de faire des new double[t][3] et un tableau de n pointeurs vers ceux-ci.
Mais, si ça existe, je suis preneur d'une façon de faire plus lisible et pas significativement plus gourmande en mémoire. Comme l'a deviné Pascal, les dimensions n et t sont constantes.
-- LL
Fabien LE LEZ
On Wed, 22 Jul 2009 13:17:10 +0200, Lucas Levrel :
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits
std::vector<> répond à la demande. Il suffit de l'encapsuler dans une classe qui va bien :
On Wed, 22 Jul 2009 10:47:13 +0200, (Pascal J. Bourguignon):
En fait, ici j'ai l'impression que Lucas veut non pas des vecteurs,
Possible. Je n'ai jamais parlé de vecteurs.
Mais tu as parlé de std::vector, ce qui en français se dit "vecteur".
mais des tableaux multidimentionnel, ou peut être seulement des matrices.
Un tableau de T à une dimension s'écrit vector<T>. Un tableau de T à deux dimensions s'écrit vector< vector<T> >. Un tableau de T à trois dimensions s'écrit vector< vector< vector<T> > >.
Non.
-- __Pascal Bourguignon__
Fabien LE LEZ <gramster@gramster.com> writes:
On Wed, 22 Jul 2009 10:47:13 +0200, pjb@informatimago.com (Pascal J.
Bourguignon):
En fait, ici j'ai l'impression que Lucas veut non pas des vecteurs,
Possible. Je n'ai jamais parlé de vecteurs.
Mais tu as parlé de std::vector, ce qui en français se dit "vecteur".
mais des tableaux multidimentionnel, ou peut être seulement des
matrices.
Un tableau de T à une dimension s'écrit vector<T>.
Un tableau de T à deux dimensions s'écrit vector< vector<T> >.
Un tableau de T à trois dimensions s'écrit
vector< vector< vector<T> > >.
On Wed, 22 Jul 2009 10:47:13 +0200, (Pascal J. Bourguignon):
En fait, ici j'ai l'impression que Lucas veut non pas des vecteurs,
Possible. Je n'ai jamais parlé de vecteurs.
Mais tu as parlé de std::vector, ce qui en français se dit "vecteur".
mais des tableaux multidimentionnel, ou peut être seulement des matrices.
Un tableau de T à une dimension s'écrit vector<T>. Un tableau de T à deux dimensions s'écrit vector< vector<T> >. Un tableau de T à trois dimensions s'écrit vector< vector< vector<T> > >.
Non.
-- __Pascal Bourguignon__
pjb
Fabien LE LEZ writes:
On Wed, 22 Jul 2009 13:17:10 +0200, Lucas Levrel :
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits
std::vector<> répond à la demande. Il suffit de l'encapsuler dans une classe qui va bien :
Faire des vecteurs de vecteurs pose des gros problèmes de gestion de mémoire et de temps d'accès aux éléments.
Mieux vaut faire comme le je démontrais, et comme le font tous les compilateurs de tous les autres languages qui eux supportent les tableaux multidimensionnels, (ce n'est pas "rocket-science" pourtant), une seule allocation, et un indexage direct.
-- __Pascal Bourguignon__
Fabien LE LEZ <gramster@gramster.com> writes:
On Wed, 22 Jul 2009 13:17:10 +0200, Lucas Levrel :
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très
grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits
std::vector<> répond à la demande. Il suffit de l'encapsuler dans une
classe qui va bien :
Faire des vecteurs de vecteurs pose des gros problèmes de gestion de
mémoire et de temps d'accès aux éléments.
Mieux vaut faire comme le je démontrais, et comme le font tous les
compilateurs de tous les autres languages qui eux supportent les
tableaux multidimensionnels, (ce n'est pas "rocket-science" pourtant),
une seule allocation, et un indexage direct.
On Wed, 22 Jul 2009 13:17:10 +0200, Lucas Levrel :
En fait je veux un tableau à 3 dimensions n*t*3, et comme n et t sont très grands, je ne veux pas qu'il occupe beaucoup plus que n*t*3*64 bits
std::vector<> répond à la demande. Il suffit de l'encapsuler dans une classe qui va bien :
Faire des vecteurs de vecteurs pose des gros problèmes de gestion de mémoire et de temps d'accès aux éléments.
Mieux vaut faire comme le je démontrais, et comme le font tous les compilateurs de tous les autres languages qui eux supportent les tableaux multidimensionnels, (ce n'est pas "rocket-science" pourtant), une seule allocation, et un indexage direct.