En fait, rien n'empêche de définir une classe (template) specifique
pour des tableaux multidimentionnel.
qu'ils ont appris à faire en C...
En fait, rien n'empêche de définir une classe (template) specifique
pour des tableaux multidimentionnel.
qu'ils ont appris à faire en C...
En fait, rien n'empêche de définir une classe (template) specifique
pour des tableaux multidimentionnel.
qu'ils ont appris à faire en C...
- Qu'est-ce que reinterpret_cast<> ? (Quelle différence par rapport au
cast « bête » ?)
- Qu'est-ce que reinterpret_cast<> ? (Quelle différence par rapport au
cast « bête » ?)
- Qu'est-ce que reinterpret_cast<> ? (Quelle différence par rapport au
cast « bête » ?)
- Au fait, dans cette classe que tu proposes, quel est l'avantage
d'utiliser un vector plutôt que T *data et
data=new T[taille1_*taille2_*taille3_] ?
- Au fait, dans cette classe que tu proposes, quel est l'avantage
d'utiliser un vector plutôt que T *data et
data=new T[taille1_*taille2_*taille3_] ?
- Au fait, dans cette classe que tu proposes, quel est l'avantage
d'utiliser un vector plutôt que T *data et
data=new T[taille1_*taille2_*taille3_] ?
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, p...@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> >.
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.
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.
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.
Lucas Levrel writes:
> 1)
> double **tab;
> tab=new (double *)[m];
> for(row=0;row<m;row++) tab[row]=new double[n];
> Puis accès à l'élément (i,j) par tab[i][j]
> 2)
> double *tab;
> tab=new double[m*n];
> int index(int row,int col){return row*n+col;};
> Puis accès à l'élément (i,j) par tab[index(i,j)]
> Par la méthode 1, l'accès se fait par deux déréférencements
> successifs. Par la méthode 2, il faut une multiplication,
> une addition, et un déréférencement. Si l'on étend ces
> méthodes au cas à D dimensions, la méthode 1 requiert D
> déréférencements, la méthode 2 (D-1) multiplications et
> additions, et un déréférencement. Qu'est-ce qui est le plus
> rapide ?
La seconde option est et sera de plus en plus la plus
rapide.http://www.cs.virginia.edu/papers/Hitting_Memory_Wall-wulf94.pdf
Lucas Levrel <lucas.lev...@univ-paris12.fr> writes:
> 1)
> double **tab;
> tab=new (double *)[m];
> for(row=0;row<m;row++) tab[row]=new double[n];
> Puis accès à l'élément (i,j) par tab[i][j]
> 2)
> double *tab;
> tab=new double[m*n];
> int index(int row,int col){return row*n+col;};
> Puis accès à l'élément (i,j) par tab[index(i,j)]
> Par la méthode 1, l'accès se fait par deux déréférencements
> successifs. Par la méthode 2, il faut une multiplication,
> une addition, et un déréférencement. Si l'on étend ces
> méthodes au cas à D dimensions, la méthode 1 requiert D
> déréférencements, la méthode 2 (D-1) multiplications et
> additions, et un déréférencement. Qu'est-ce qui est le plus
> rapide ?
La seconde option est et sera de plus en plus la plus
rapide.http://www.cs.virginia.edu/papers/Hitting_Memory_Wall-wulf94.pdf
Lucas Levrel writes:
> 1)
> double **tab;
> tab=new (double *)[m];
> for(row=0;row<m;row++) tab[row]=new double[n];
> Puis accès à l'élément (i,j) par tab[i][j]
> 2)
> double *tab;
> tab=new double[m*n];
> int index(int row,int col){return row*n+col;};
> Puis accès à l'élément (i,j) par tab[index(i,j)]
> Par la méthode 1, l'accès se fait par deux déréférencements
> successifs. Par la méthode 2, il faut une multiplication,
> une addition, et un déréférencement. Si l'on étend ces
> méthodes au cas à D dimensions, la méthode 1 requiert D
> déréférencements, la méthode 2 (D-1) multiplications et
> additions, et un déréférencement. Qu'est-ce qui est le plus
> rapide ?
La seconde option est et sera de plus en plus la plus
rapide.http://www.cs.virginia.edu/papers/Hitting_Memory_Wall-wulf94.pdf
On Wed, 22 Jul 2009 15:42:12 +0200, Lucas Levrel
:
>Merci ! Et pour mon instruction d'écriture, je fais simplement
>fileout.write((char*) &tab(i,0,0), 3*t*sizeof(double));
La fonction write() ne doit pas modifier le tableau, donc le type est
"char const*", pas "char*".
Note par ailleurs que toutes les données sont contiguës en mémoire. Tu
peux donc écrire :
fileout.write (reinterpret_cast<char const*>(&tab(0,0,0)),
n*3*t*sizeof(double));
>Qu'est-ce qui est le plus rapide ?
Faut mesurer. C'est la seule façon d'être sûr.
On Wed, 22 Jul 2009 15:42:12 +0200, Lucas Levrel
<lucas.lev...@univ-paris12.fr>:
>Merci ! Et pour mon instruction d'écriture, je fais simplement
>fileout.write((char*) &tab(i,0,0), 3*t*sizeof(double));
La fonction write() ne doit pas modifier le tableau, donc le type est
"char const*", pas "char*".
Note par ailleurs que toutes les données sont contiguës en mémoire. Tu
peux donc écrire :
fileout.write (reinterpret_cast<char const*>(&tab(0,0,0)),
n*3*t*sizeof(double));
>Qu'est-ce qui est le plus rapide ?
Faut mesurer. C'est la seule façon d'être sûr.
On Wed, 22 Jul 2009 15:42:12 +0200, Lucas Levrel
:
>Merci ! Et pour mon instruction d'écriture, je fais simplement
>fileout.write((char*) &tab(i,0,0), 3*t*sizeof(double));
La fonction write() ne doit pas modifier le tableau, donc le type est
"char const*", pas "char*".
Note par ailleurs que toutes les données sont contiguës en mémoire. Tu
peux donc écrire :
fileout.write (reinterpret_cast<char const*>(&tab(0,0,0)),
n*3*t*sizeof(double));
>Qu'est-ce qui est le plus rapide ?
Faut mesurer. C'est la seule façon d'être sûr.
Fabien LE LEZ writes:
En fait, rien n'empêche de définir une classe (template)
specifique pour des tableaux multidimentionnel. C'est juste
une question d'imagination, mais il semble bien que les
programmeurs C++ n'en soit pas capables, et se ramênent
toujours à des vecteurs de vecteurs qu'ils ont appris à faire
en C...
Fabien LE LEZ <grams...@gramster.com> writes:
En fait, rien n'empêche de définir une classe (template)
specifique pour des tableaux multidimentionnel. C'est juste
une question d'imagination, mais il semble bien que les
programmeurs C++ n'en soit pas capables, et se ramênent
toujours à des vecteurs de vecteurs qu'ils ont appris à faire
en C...
Fabien LE LEZ writes:
En fait, rien n'empêche de définir une classe (template)
specifique pour des tableaux multidimentionnel. C'est juste
une question d'imagination, mais il semble bien que les
programmeurs C++ n'en soit pas capables, et se ramênent
toujours à des vecteurs de vecteurs qu'ils ont appris à faire
en C...
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] ?
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] ?
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] ?
À condition de ne pas vouloir rélire les données plus tard, avec
un autre programme, ou sur une autre machine.
Et cette mesure ne vaudrait que sur cette machine, avec ce
compilateur, avec les options choisies pour cette compilation.
À condition de ne pas vouloir rélire les données plus tard, avec
un autre programme, ou sur une autre machine.
Et cette mesure ne vaudrait que sur cette machine, avec ce
compilateur, avec les options choisies pour cette compilation.
À condition de ne pas vouloir rélire les données plus tard, avec
un autre programme, ou sur une autre machine.
Et cette mesure ne vaudrait que sur cette machine, avec ce
compilateur, avec les options choisies pour cette compilation.