1

lol je viens de me lancer dans l'utilisation des tableaux à 3 dim. C'est trop bien à gérer!!!
Sinon quelqu'un pourrai m'expliquer pourquoi dans la doc de TIGCC, il est dis que pour déclarer un tableau de taille déjà connue,
il vaudrai mieu faire des "calloc"???
parce que moi, pour déclarer par exemple un tableau map[10][10][10],
je fais: int map[10][10][10]={{{0}}};
est-ce que c'est correct?
parce que une fois le prog compilé, le tableau map ne prend pas : sizeof(int)*10*10*10 en plus des codes normaux.

edit par Ximoon: fix des indices/couleurs
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)

2

J'ai pas trop capté la question, juste deux trucs :

- Quand tu met des [10] dans ton code, c'est interpreté comme une balise couleur, donc elle disparait dans ton post. Edite mon post pour voir comment faire pour éviter ça, ou bien met des espaces avant et après les [ ].
- ptr = calloc(a,b) c'est la même chose que ptr = malloc(a * b); memset(ptr,0,a * b);
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

trop tard :]
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

4

lol je viens de me lancer dans l'utilisation des tableaux à 3 dim. C'est trop bien à gérer!!!
Sinon quelqu'un pourrai m'expliquer pourquoi dans la doc de TIGCC, il est dis que pour déclarer un tableau de taille déjà connue,
il vaudrai mieu faire des "calloc"???
parce que moi, pour déclarer par exemple un tableau map[ 10 ][ 10 ][ 10 ],
je fais: int map[ 10 ][ 10 ][ 10 ]={ { { 0 } } };
est-ce que c'est correct?
parce que une fois le prog compilé, le tableau map ne prend pas : sizeof(int)*10*10*10 en plus des codes normaux.
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)

5

ptr = calloc(a,b)
ben justement, je trouve que c'est plus long d'écrire ca que de mettre ptr = { { 0 } }
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)

6

Sauf que c'est pas comparable... Avec int map[10][10][10], tu déclares un tableau qui va sur la pile (qui ne contient que 16ko), alors qu'avec calloc tu l'alloues en RAM.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

Vertyos :
Sauf que c'est pas comparable... Avec int map[10][10][10], tu déclares un tableau qui va sur la pile (qui ne contient que 16ko), alors qu'avec calloc tu l'alloues en RAM.

Exactement, et si ta variable map est globale ça augmente de 1000 bytes ton prog ...

Si tu utilise calloc (ou malloc), tu dois libérer l'espace avant la fin de ton prog :

int *map = calloc(sizeof(int), 1000) ;
// ...
free(map);

8

oh d'accord!!! je vois
mais comment je fais pour déclarer : int map[ 3 ][ YMAX+1 ][ XMAX+1 ] en tant que variable globale???
j'ai essayé : int map = calloc(3*(YMAX+1)*(XMAX+1),sizeof(int));
mais apparemment c'est pas bon
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)

9

T'as besoin d'un pointeur :

int *map = calloc(3*(YMAX+1)*(XMAX+1),sizeof(int));

Mais là, t'as un tableau plat ... donc il faut que tu émules les dimensions :

map[1 * ((YMAX+1) *(XMAX+1)) + 7 * (YMAX+1) + 3] //accéder à l'item [1][7][3]


[edit]

Aussi, on peut indiquer les dimension du tableau au compilateur C - truc que Kevin t'avais donné pour tes sprites, je ne sais pas si tu t'en souviens - :

int (*map3D)[3][YMAX+1] = map; // On cast simplement ta map vers un tableau de 3 rangées et YMAX+1 colonnes.

map3D[1][7][3] //accéder à l'item [1][7][3]

10

oula c bizarre comme accès. bon ok alors j'ai fait la solution 3 de l'aide de tigcc.
sinon quand on fait fopen et après des fread, ca tombe dans la pile?
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)

11

DoomAngel :
oula c bizarre comme accès. bon ok alors j'ai fait la solution 3 de l'aide de tigcc.
sinon quand on fait fopen et après des fread, ca tombe dans la pile?

Non, ça n'a aucun lien. Quand tu fait fread, tu lis vers un emplacement mémoire. Celui-ci peut être sur la pile ou en RAM, ça ne change rien :

File *f = fopen("test", "rb");

int tab[10]; //tab est sur la pile

int *tab2 = malloc(10); //tab2 est en ram

fread(tab, 10, 1, f) ; // Lecture vers la pile, parce que tab est dans la pile

fread(tab2, 10, 1, f) ; // Lecture vers la RAM, parce que tab2 est dans la RAM


Tu devrais lire des tutos sur l'allocation mémoire en C, parce que c'est difficile de programmer efficacement dans ce langage sans en comprendre le concept ...

12

ok alors c'est parfait, je comprenais pas pourquoi j'avais pas besoin de faire des free.
mais j'ai un pote qui vient de m'expliquer le concept de la pile.
je croyai que c'était comme une pile électrique.... (ok rigolez lol)

J'ai eu comme un tilt quand j'ai fait le int map = {{{0}}}
parce que le prog est passé de 7000 et quelques à 19000. mais ca marchait bien...
sinon Wars Of Legend avance bien.
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)

13

DoomAngel :
ok alors c'est parfait, je comprenais pas pourquoi j'avais pas besoin de faire des free.
mais j'ai un pote qui vient de m'expliquer le concept de la pile.
je croyai que c'était comme une pile électrique.... (ok rigolez lol)

Il n'y a pas de problème. C'est pas très intuitif comme langage le C (mais c'est amusant à programmer quand on le connaît bien), alors c'est normal que ça prenne un certain avant de percer ses mystères.
DoomAngel :
J'ai eu comme un tilt quand j'ai fait le int map = {{{0}}}
parce que le prog est passé de 7000 et quelques à 19000. mais ca marchait bien...
sinon Wars Of Legend avance bien.

C'est pourquoi on recommande l'allocation dynamique wink