Salut. Gros problème en C
avec les tableaux à plusieurs entrée :
#include <math.h>
#include <stdio.h>
#define maxt 12
#define maxh 50
Void main(int narg, char ** argv)
{
char tabl[maxt][maxh][1][1024]; // tableaux de chaînes
1024 à triple entrée
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Salut. Gros problème en C
avec les tableaux à plusieurs entrée :
#include <math.h>
#include <stdio.h>
#define maxt 12
#define maxh 50
Void main(int narg, char ** argv)
{
char tabl[maxt][maxh][1][1024]; // tableaux de chaînes
1024 à triple entrée
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Salut. Gros problème en C
avec les tableaux à plusieurs entrée :
#include <math.h>
#include <stdio.h>
#define maxt 12
#define maxh 50
Void main(int narg, char ** argv)
{
char tabl[maxt][maxh][1][1024]; // tableaux de chaînes
1024 à triple entrée
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Mirandole wrote:
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
Évidemment, en C++, le tout serait beaucoup plus simple avec
std::vector et std::string. Aussi, ça marchera à peu près
partout -- il y a des systèmes où une declaration comme la
tienne provoquera un débordement de la pile.
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
Pourquoi fmod ? Le résultat ici doit être le même qu'avec i % 3.
Sauf que je ne suis pas sûr qu'avec toutes les conversions, et
la division flottante, tu n'y introduis pas une risque d'erreur.
(Je ne le crois pas dans ce cas-ci, mais en général, il vaut
mieux éviter le flottant quand on peut.)sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
Mirandole wrote:
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
Évidemment, en C++, le tout serait beaucoup plus simple avec
std::vector et std::string. Aussi, ça marchera à peu près
partout -- il y a des systèmes où une declaration comme la
tienne provoquera un débordement de la pile.
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
Pourquoi fmod ? Le résultat ici doit être le même qu'avec i % 3.
Sauf que je ne suis pas sûr qu'avec toutes les conversions, et
la division flottante, tu n'y introduis pas une risque d'erreur.
(Je ne le crois pas dans ce cas-ci, mais en général, il vaut
mieux éviter le flottant quand on peut.)
sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
Mirandole wrote:
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
Évidemment, en C++, le tout serait beaucoup plus simple avec
std::vector et std::string. Aussi, ça marchera à peu près
partout -- il y a des systèmes où une declaration comme la
tienne provoquera un débordement de la pile.
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
Pourquoi fmod ? Le résultat ici doit être le même qu'avec i % 3.
Sauf que je ne suis pas sûr qu'avec toutes les conversions, et
la division flottante, tu n'y introduis pas une risque d'erreur.
(Je ne le crois pas dans ce cas-ci, mais en général, il vaut
mieux éviter le flottant quand on peut.)sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
on peut comprendre que c'était simplement là son bug (confusion entre la
taille et l'indice max.; erreur courante par exemple pour quelqu'un
qui viendra du VB où les array sont 1 based).
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
en C, comme en C++, tabl[k][j][1] est résolu en:
&((char*) tabl)[1 * 1024 + j * 1024 * 1 + k * 1024 * 12 * 1]
si "indéfini" veut dire "non prévisible, non reproductif, non
déterministe", alors non, c'est défini! ça ne donne pas le bon élément
et ça provoque une exception quand on déborde du bloc total.
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
on peut comprendre que c'était simplement là son bug (confusion entre la
taille et l'indice max.; erreur courante par exemple pour quelqu'un
qui viendra du VB où les array sont 1 based).
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
en C, comme en C++, tabl[k][j][1] est résolu en:
&((char*) tabl)[1 * 1024 + j * 1024 * 1 + k * 1024 * 12 * 1]
si "indéfini" veut dire "non prévisible, non reproductif, non
déterministe", alors non, c'est défini! ça ne donne pas le bon élément
et ça provoque une exception quand on déborde du bloc total.
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
on peut comprendre que c'était simplement là son bug (confusion entre la
taille et l'indice max.; erreur courante par exemple pour quelqu'un
qui viendra du VB où les array sont 1 based).
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
en C, comme en C++, tabl[k][j][1] est résolu en:
&((char*) tabl)[1 * 1024 + j * 1024 * 1 + k * 1024 * 12 * 1]
si "indéfini" veut dire "non prévisible, non reproductif, non
déterministe", alors non, c'est défini! ça ne donne pas le bon élément
et ça provoque une exception quand on déborde du bloc total.
kanze wrote on 20/03/2006 11:10:Mirandole wrote:
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
on peut comprendre que c'était simplement là son bug
(confusion entre la taille et l'indice max.; erreur courante
par exemple pour quelqu'un qui viendra du VB où les array sont
1 based).
Évidemment, en C++, le tout serait beaucoup plus simple avec
std::vector et std::string. Aussi, ça marchera à peu près
partout -- il y a des systèmes où une declaration comme la
tienne provoquera un débordement de la pile.
comme tu dirais, cela dépend du point de vue et de
l'application,
si l'appli traite de données brutes (taille non variante, lue
en bloc, etc) un multi-array de dimension fixe est plus
simple;
bon maintenant un tableau de chaines (recettes de
cuisine, chansons, ?...) de 1024 carac. croisés en 50
sous-dialectes de 12 langues !?! ça doit être étonnement
spécifique.
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
Pourquoi fmod ? Le résultat ici doit être le même qu'avec i % 3.
Sauf que je ne suis pas sûr qu'avec toutes les conversions, et
la division flottante, tu n'y introduis pas une risque d'erreur.
les 2 arguments sont entiers, s'il a bcp de chance peut être
que la librairie bypass la conversion en flottant,
ici c'est de toute façon nuisible et inutile -- surement une
autre méconnaissance des opérateurs C/C++ (dont %).(Je ne le crois pas dans ce cas-ci, mais en général, il vaut
mieux éviter le flottant quand on peut.)sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
en C, comme en C++, tabl[k][j][1] est résolu en:
&((char*) tabl)[1 * 1024 + j * 1024 * 1 + k * 1024 * 12 * 1]
si "indéfini" veut dire "non prévisible, non reproductif, non
déterministe", alors non, c'est défini!
ça ne donne pas le bon élément et ça provoque une exception
quand on déborde du bloc total.
kanze wrote on 20/03/2006 11:10:
Mirandole wrote:
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
on peut comprendre que c'était simplement là son bug
(confusion entre la taille et l'indice max.; erreur courante
par exemple pour quelqu'un qui viendra du VB où les array sont
1 based).
Évidemment, en C++, le tout serait beaucoup plus simple avec
std::vector et std::string. Aussi, ça marchera à peu près
partout -- il y a des systèmes où une declaration comme la
tienne provoquera un débordement de la pile.
comme tu dirais, cela dépend du point de vue et de
l'application,
si l'appli traite de données brutes (taille non variante, lue
en bloc, etc) un multi-array de dimension fixe est plus
simple;
bon maintenant un tableau de chaines (recettes de
cuisine, chansons, ?...) de 1024 carac. croisés en 50
sous-dialectes de 12 langues !?! ça doit être étonnement
spécifique.
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
Pourquoi fmod ? Le résultat ici doit être le même qu'avec i % 3.
Sauf que je ne suis pas sûr qu'avec toutes les conversions, et
la division flottante, tu n'y introduis pas une risque d'erreur.
les 2 arguments sont entiers, s'il a bcp de chance peut être
que la librairie bypass la conversion en flottant,
ici c'est de toute façon nuisible et inutile -- surement une
autre méconnaissance des opérateurs C/C++ (dont %).
(Je ne le crois pas dans ce cas-ci, mais en général, il vaut
mieux éviter le flottant quand on peut.)
sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
en C, comme en C++, tabl[k][j][1] est résolu en:
&((char*) tabl)[1 * 1024 + j * 1024 * 1 + k * 1024 * 12 * 1]
si "indéfini" veut dire "non prévisible, non reproductif, non
déterministe", alors non, c'est défini!
ça ne donne pas le bon élément et ça provoque une exception
quand on déborde du bloc total.
kanze wrote on 20/03/2006 11:10:Mirandole wrote:
Mais surtout, je ne comprends pas l'intérêt de la troisième
dimension. Une dimension de 1, c'est un scalaire. [...]
on peut comprendre que c'était simplement là son bug
(confusion entre la taille et l'indice max.; erreur courante
par exemple pour quelqu'un qui viendra du VB où les array sont
1 based).
Évidemment, en C++, le tout serait beaucoup plus simple avec
std::vector et std::string. Aussi, ça marchera à peu près
partout -- il y a des systèmes où une declaration comme la
tienne provoquera un débordement de la pile.
comme tu dirais, cela dépend du point de vue et de
l'application,
si l'appli traite de données brutes (taille non variante, lue
en bloc, etc) un multi-array de dimension fixe est plus
simple;
bon maintenant un tableau de chaines (recettes de
cuisine, chansons, ?...) de 1024 carac. croisés en 50
sous-dialectes de 12 langues !?! ça doit être étonnement
spécifique.
unsigned int i, k, j;
for (i=0;i<9;i++){
k=i/3;
j=fmod(i,3);
Pourquoi fmod ? Le résultat ici doit être le même qu'avec i % 3.
Sauf que je ne suis pas sûr qu'avec toutes les conversions, et
la division flottante, tu n'y introduis pas une risque d'erreur.
les 2 arguments sont entiers, s'il a bcp de chance peut être
que la librairie bypass la conversion en flottant,
ici c'est de toute façon nuisible et inutile -- surement une
autre méconnaissance des opérateurs C/C++ (dont %).(Je ne le crois pas dans ce cas-ci, mais en général, il vaut
mieux éviter le flottant quand on peut.)sprintf(tabl[k][j][0],"bla%d",i);
sprintf(tabl[k][j][1],"bla%d",i); // la même chose
Pas vraiment. Que ce soit du C ou du C++, cette ligne donne un
comportement indéfini. Il n'y a pas de tabl[k][j][1].
en C, comme en C++, tabl[k][j][1] est résolu en:
&((char*) tabl)[1 * 1024 + j * 1024 * 1 + k * 1024 * 12 * 1]
si "indéfini" veut dire "non prévisible, non reproductif, non
déterministe", alors non, c'est défini!
ça ne donne pas le bon élément et ça provoque une exception
quand on déborde du bloc total.