Le 02/06/2009 18:03, candide écrivit :Certes mais la directive
#define M
... peut être modifiée en
int m;
#define M m
en un instant,
du code initial suggère qu'on n'alloue pas à l'exécution.
Ah bon ? tu trouves qu'il est plus facile d'aller chercher
... = malloc(2500 * 345 * sizeof(truc) )
et de changer le 2500 par 3500, parce que les résultats du code
Navier-Stockes ne sont pas probants, ou parce que on peut se permettre
de passer plus de temps dans les calculs matriciels ?
Et de recommencer à l'envers lorsque les résultats ne s'améliorent pas...
Le 02/06/2009 18:03, candide écrivit :
Certes mais la directive
#define M
... peut être modifiée en
int m;
#define M m
en un instant,
du code initial suggère qu'on n'alloue pas à l'exécution.
Ah bon ? tu trouves qu'il est plus facile d'aller chercher
... = malloc(2500 * 345 * sizeof(truc) )
et de changer le 2500 par 3500, parce que les résultats du code
Navier-Stockes ne sont pas probants, ou parce que on peut se permettre
de passer plus de temps dans les calculs matriciels ?
Et de recommencer à l'envers lorsque les résultats ne s'améliorent pas...
Le 02/06/2009 18:03, candide écrivit :Certes mais la directive
#define M
... peut être modifiée en
int m;
#define M m
en un instant,
du code initial suggère qu'on n'alloue pas à l'exécution.
Ah bon ? tu trouves qu'il est plus facile d'aller chercher
... = malloc(2500 * 345 * sizeof(truc) )
et de changer le 2500 par 3500, parce que les résultats du code
Navier-Stockes ne sont pas probants, ou parce que on peut se permettre
de passer plus de temps dans les calculs matriciels ?
Et de recommencer à l'envers lorsque les résultats ne s'améliorent pas...
Jean-Claude Arbaut a écrit :Pour éviter de coder les dimensions en dur, ne peut-on pas faire
la chose suivante ? (en tout cas "gcc -ansi -Wall" ne crie pas)
double get(int n, int p, double t[n][p], int i, int j) {
return t[i][j];
}
:~$ gcc -W -Wall -stdÈ9 -pedantic -c fclc.c
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
L'allocation peut se faire avec
double (*t)[];
Tiens, j'imaginais pas qu'on pouvait déclarer un pointeur vers un tableau incomplet.
t = (double (*)[])calloc(n*p, sizeof(double));
Tu castes le retour de calloc() ?
Jean-Claude Arbaut a écrit :
Pour éviter de coder les dimensions en dur, ne peut-on pas faire
la chose suivante ? (en tout cas "gcc -ansi -Wall" ne crie pas)
double get(int n, int p, double t[n][p], int i, int j) {
return t[i][j];
}
candide@candide-desktop:~$ gcc -W -Wall -stdÈ9 -pedantic -c fclc.c
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
L'allocation peut se faire avec
double (*t)[];
Tiens, j'imaginais pas qu'on pouvait déclarer un pointeur vers un tableau incomplet.
t = (double (*)[])calloc(n*p, sizeof(double));
Tu castes le retour de calloc() ?
Jean-Claude Arbaut a écrit :Pour éviter de coder les dimensions en dur, ne peut-on pas faire
la chose suivante ? (en tout cas "gcc -ansi -Wall" ne crie pas)
double get(int n, int p, double t[n][p], int i, int j) {
return t[i][j];
}
:~$ gcc -W -Wall -stdÈ9 -pedantic -c fclc.c
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
L'allocation peut se faire avec
double (*t)[];
Tiens, j'imaginais pas qu'on pouvait déclarer un pointeur vers un tableau incomplet.
t = (double (*)[])calloc(n*p, sizeof(double));
Tu castes le retour de calloc() ?
Tiens, pour me simplifier la vie j'utilisais ça :
#define new(n,t) ((t *)calloc(n, sizeof(t)))
Tiens, pour me simplifier la vie j'utilisais ça :
#define new(n,t) ((t *)calloc(n, sizeof(t)))
Tiens, pour me simplifier la vie j'utilisais ça :
#define new(n,t) ((t *)calloc(n, sizeof(t)))
Jean-Claude Arbaut wrote:
Tiens, pour me simplifier la vie j'utilisais ça :
#define new(n,t) ((t *)calloc(n, sizeof(t)))
Comme quoi, il y a des claques qui se perdent !
Jean-Claude Arbaut wrote:
Tiens, pour me simplifier la vie j'utilisais ça :
#define new(n,t) ((t *)calloc(n, sizeof(t)))
Comme quoi, il y a des claques qui se perdent !
Jean-Claude Arbaut wrote:
Tiens, pour me simplifier la vie j'utilisais ça :
#define new(n,t) ((t *)calloc(n, sizeof(t)))
Comme quoi, il y a des claques qui se perdent !
Comprends pas ta réaction, j'ai rien contre les macro-constantes, bien au
contraire. Dans le code du PO, tout suggère que les choix de taille se font à la
compilation (typique d'un #define) et non à l'exécution,
et mise à part le problème d'allocation sur la pile,
Comprends pas ta réaction, j'ai rien contre les macro-constantes, bien au
contraire. Dans le code du PO, tout suggère que les choix de taille se font à la
compilation (typique d'un #define) et non à l'exécution,
et mise à part le problème d'allocation sur la pile,
Comprends pas ta réaction, j'ai rien contre les macro-constantes, bien au
contraire. Dans le code du PO, tout suggère que les choix de taille se font à la
compilation (typique d'un #define) et non à l'exécution,
et mise à part le problème d'allocation sur la pile,
Le 3 juin 2009, candide a écrit :Comprends pas ta réaction, j'ai rien contre les macro-constantes, bien au
contraire. Dans le code du PO, tout suggère que les choix de taille se font à la
compilation (typique d'un #define) et non à l'exécution,
Oui, c'est pour ça que je demandais pourquoi pas float t[M][N]. Dans le
cas général je connais les avantages de l'allocation dynamique, mais là ça
n'avait pas l'air d'être le cas.et mise à part le problème d'allocation sur la pile,
Là j'ai appris un truc ! Je ne savais pas du tout (ou j'avais oublié) que
ma suggestion et malloc n'utilisaient pas la même partie de la mémoire.
(Sans doute un inconvénient du C par l'exemple.) Qu'est-ce qui détermine
l'espace libre pour la pile ?
Le 3 juin 2009, candide a écrit :
Comprends pas ta réaction, j'ai rien contre les macro-constantes, bien au
contraire. Dans le code du PO, tout suggère que les choix de taille se font à la
compilation (typique d'un #define) et non à l'exécution,
Oui, c'est pour ça que je demandais pourquoi pas float t[M][N]. Dans le
cas général je connais les avantages de l'allocation dynamique, mais là ça
n'avait pas l'air d'être le cas.
et mise à part le problème d'allocation sur la pile,
Là j'ai appris un truc ! Je ne savais pas du tout (ou j'avais oublié) que
ma suggestion et malloc n'utilisaient pas la même partie de la mémoire.
(Sans doute un inconvénient du C par l'exemple.) Qu'est-ce qui détermine
l'espace libre pour la pile ?
Le 3 juin 2009, candide a écrit :Comprends pas ta réaction, j'ai rien contre les macro-constantes, bien au
contraire. Dans le code du PO, tout suggère que les choix de taille se font à la
compilation (typique d'un #define) et non à l'exécution,
Oui, c'est pour ça que je demandais pourquoi pas float t[M][N]. Dans le
cas général je connais les avantages de l'allocation dynamique, mais là ça
n'avait pas l'air d'être le cas.et mise à part le problème d'allocation sur la pile,
Là j'ai appris un truc ! Je ne savais pas du tout (ou j'avais oublié) que
ma suggestion et malloc n'utilisaient pas la même partie de la mémoire.
(Sans doute un inconvénient du C par l'exemple.) Qu'est-ce qui détermine
l'espace libre pour la pile ?
> > L'allocation peut se faire avec
> > double (*t)[];
On peut garder la dernière dimension incomplète. C'est pour ça
que je galère avec le tableau à trois dimensions: il y en a une
de trop, il veut pour celle-là une taille constante. Je suppose
que le coup a été prévu par le C99: si on peut déclarer des
fonctions à tableaux variables, il faut bien pouvoir
déclarer les arguments qu'on leur passe... j'espère :o)
> > L'allocation peut se faire avec
> > double (*t)[];
On peut garder la dernière dimension incomplète. C'est pour ça
que je galère avec le tableau à trois dimensions: il y en a une
de trop, il veut pour celle-là une taille constante. Je suppose
que le coup a été prévu par le C99: si on peut déclarer des
fonctions à tableaux variables, il faut bien pouvoir
déclarer les arguments qu'on leur passe... j'espère :o)
> > L'allocation peut se faire avec
> > double (*t)[];
On peut garder la dernière dimension incomplète. C'est pour ça
que je galère avec le tableau à trois dimensions: il y en a une
de trop, il veut pour celle-là une taille constante. Je suppose
que le coup a été prévu par le C99: si on peut déclarer des
fonctions à tableaux variables, il faut bien pouvoir
déclarer les arguments qu'on leur passe... j'espère :o)
Le 3 juin 2009, Jean-Claude Arbaut a écrit :L'allocation peut se faire avec
double (*t)[];
On peut garder la dernière dimension incomplète. C'est pour ça
que je galère avec le tableau à trois dimensions: il y en a une
de trop, il veut pour celle-là une taille constante. Je suppose
que le coup a été prévu par le C99: si on peut déclarer des
fonctions à tableaux variables, il faut bien pouvoir
déclarer les arguments qu'on leur passe... j'espère :o)
Pour faire strictement ce que tu sembles vouloir, je vois deux
possibilités à priori :
- double *t[][] : ne marche pas car comment faire de l'arithmétique sur le
pointeur en ne connaissant pas la taille de la dernière dimension ?
- double **t[] : marche mais c'est à toi de construire les *t[][x].
Comme je ne suis probablement pas très clair ;-), voilà ce que je fais
pour 4 dimensions par exemple (c'est du C++ mais probablement pas dur à
traduire en C) :
float ****table;
table=new float***[a];
for(int ia=0;ia<a;ia++){
table[ia]=new float**[b];
for(int ib=0;ib<b;ib++){
table[ia][ib]=new float*[c];
for(int ic=0;ic<c;ic++){
table[ia][ib][ic]=new float[d];
}
}
}
Bien sûr là les éléments ne sont pas forcément contigus en mémoire. On
doit pouvoir aussi faire malloc(sizeof(float)*a*b*c*d),
malloc(sizeof(float*)*a*b*c), etc., puis définir les pointeurs vers les
éléments adéquats.
Le 3 juin 2009, Jean-Claude Arbaut a écrit :
L'allocation peut se faire avec
double (*t)[];
On peut garder la dernière dimension incomplète. C'est pour ça
que je galère avec le tableau à trois dimensions: il y en a une
de trop, il veut pour celle-là une taille constante. Je suppose
que le coup a été prévu par le C99: si on peut déclarer des
fonctions à tableaux variables, il faut bien pouvoir
déclarer les arguments qu'on leur passe... j'espère :o)
Pour faire strictement ce que tu sembles vouloir, je vois deux
possibilités à priori :
- double *t[][] : ne marche pas car comment faire de l'arithmétique sur le
pointeur en ne connaissant pas la taille de la dernière dimension ?
- double **t[] : marche mais c'est à toi de construire les *t[][x].
Comme je ne suis probablement pas très clair ;-), voilà ce que je fais
pour 4 dimensions par exemple (c'est du C++ mais probablement pas dur à
traduire en C) :
float ****table;
table=new float***[a];
for(int ia=0;ia<a;ia++){
table[ia]=new float**[b];
for(int ib=0;ib<b;ib++){
table[ia][ib]=new float*[c];
for(int ic=0;ic<c;ic++){
table[ia][ib][ic]=new float[d];
}
}
}
Bien sûr là les éléments ne sont pas forcément contigus en mémoire. On
doit pouvoir aussi faire malloc(sizeof(float)*a*b*c*d),
malloc(sizeof(float*)*a*b*c), etc., puis définir les pointeurs vers les
éléments adéquats.
Le 3 juin 2009, Jean-Claude Arbaut a écrit :L'allocation peut se faire avec
double (*t)[];
On peut garder la dernière dimension incomplète. C'est pour ça
que je galère avec le tableau à trois dimensions: il y en a une
de trop, il veut pour celle-là une taille constante. Je suppose
que le coup a été prévu par le C99: si on peut déclarer des
fonctions à tableaux variables, il faut bien pouvoir
déclarer les arguments qu'on leur passe... j'espère :o)
Pour faire strictement ce que tu sembles vouloir, je vois deux
possibilités à priori :
- double *t[][] : ne marche pas car comment faire de l'arithmétique sur le
pointeur en ne connaissant pas la taille de la dernière dimension ?
- double **t[] : marche mais c'est à toi de construire les *t[][x].
Comme je ne suis probablement pas très clair ;-), voilà ce que je fais
pour 4 dimensions par exemple (c'est du C++ mais probablement pas dur à
traduire en C) :
float ****table;
table=new float***[a];
for(int ia=0;ia<a;ia++){
table[ia]=new float**[b];
for(int ib=0;ib<b;ib++){
table[ia][ib]=new float*[c];
for(int ic=0;ic<c;ic++){
table[ia][ib][ic]=new float[d];
}
}
}
Bien sûr là les éléments ne sont pas forcément contigus en mémoire. On
doit pouvoir aussi faire malloc(sizeof(float)*a*b*c*d),
malloc(sizeof(float*)*a*b*c), etc., puis définir les pointeurs vers les
éléments adéquats.
candide wrote:Jean-Claude Arbaut a écrit :Pour éviter de coder les dimensions en dur, ne peut-on pas faire
la chose suivante ? (en tout cas "gcc -ansi -Wall" ne crie pas)
double get(int n, int p, double t[n][p], int i, int j) {
return t[i][j];
}
:~$ gcc -W -Wall -stdÈ9 -pedantic -c fclc.c
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
C'est dans le nouveau standard: -stdÉ9 et ça passe ;-)
L'allocation peut se faire avec
double (*t)[];
Tiens, j'imaginais pas qu'on pouvait déclarer un pointeur vers un
tableau incomplet.
On peut garder la dernière dimension incomplète
candide wrote:
Jean-Claude Arbaut a écrit :
Pour éviter de coder les dimensions en dur, ne peut-on pas faire
la chose suivante ? (en tout cas "gcc -ansi -Wall" ne crie pas)
double get(int n, int p, double t[n][p], int i, int j) {
return t[i][j];
}
candide@candide-desktop:~$ gcc -W -Wall -stdÈ9 -pedantic -c fclc.c
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
C'est dans le nouveau standard: -stdÉ9 et ça passe ;-)
L'allocation peut se faire avec
double (*t)[];
Tiens, j'imaginais pas qu'on pouvait déclarer un pointeur vers un
tableau incomplet.
On peut garder la dernière dimension incomplète
candide wrote:Jean-Claude Arbaut a écrit :Pour éviter de coder les dimensions en dur, ne peut-on pas faire
la chose suivante ? (en tout cas "gcc -ansi -Wall" ne crie pas)
double get(int n, int p, double t[n][p], int i, int j) {
return t[i][j];
}
:~$ gcc -W -Wall -stdÈ9 -pedantic -c fclc.c
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
fclc.c:3: attention : ISO C90 forbids variable-size array «t»
C'est dans le nouveau standard: -stdÉ9 et ça passe ;-)
L'allocation peut se faire avec
double (*t)[];
Tiens, j'imaginais pas qu'on pouvait déclarer un pointeur vers un
tableau incomplet.
On peut garder la dernière dimension incomplète
Oui, je sais mais je croyais que gcc -ansi (cf. ce que tu écris ci-dessus)
référait au standard ansi de 1989 (ie C iso 90) ce qui n'est finalement pas le
cas. La logique des options de gcc resteront toujours un mystère pour moi.
En effet, il s'avère qu'il est bien légal de déclarer des pointeurs vers des
tableaux incomplets (en fait vers des types incomplets, au hasard void) :
§6.2.5
A pointer type may be derived from a function type, an object
type, or an incomplete type, called the referenced type.
mais je ne vois pas l'intérêt de ce genre de pointeur, en particulier on ne
dispose pas d'arithmétique des pointeurs.
Oui, je sais mais je croyais que gcc -ansi (cf. ce que tu écris ci-dessus)
référait au standard ansi de 1989 (ie C iso 90) ce qui n'est finalement pas le
cas. La logique des options de gcc resteront toujours un mystère pour moi.
En effet, il s'avère qu'il est bien légal de déclarer des pointeurs vers des
tableaux incomplets (en fait vers des types incomplets, au hasard void) :
§6.2.5
A pointer type may be derived from a function type, an object
type, or an incomplete type, called the referenced type.
mais je ne vois pas l'intérêt de ce genre de pointeur, en particulier on ne
dispose pas d'arithmétique des pointeurs.
Oui, je sais mais je croyais que gcc -ansi (cf. ce que tu écris ci-dessus)
référait au standard ansi de 1989 (ie C iso 90) ce qui n'est finalement pas le
cas. La logique des options de gcc resteront toujours un mystère pour moi.
En effet, il s'avère qu'il est bien légal de déclarer des pointeurs vers des
tableaux incomplets (en fait vers des types incomplets, au hasard void) :
§6.2.5
A pointer type may be derived from a function type, an object
type, or an incomplete type, called the referenced type.
mais je ne vois pas l'intérêt de ce genre de pointeur, en particulier on ne
dispose pas d'arithmétique des pointeurs.