Allocation dynamique d'un tableau à 2 dimensions

Allocation dynamique d'un tableau à 2 dimensions - C - Programmation

Marsh Posté le 02-06-2004 à 18:12:15    

Je veut allouer dynamiquement avec un malloc () un tableau de k ligne et n colonne. Par la suite, je veux l'initialiser. Je ne sais pas si j'ai le droit de faire ça mais je n'ai pas d'erreur à la compilation. Cependant à l'exécution un erreur de violation d'accès. Alors comment allouer dynamiquement avec un malloc ce tableau à 2 dimensions?
voici mon code:

Code :
  1. int n = 3;
  2. int k = 2;
  3. int ** tab;
  4. int i;
  5. int j;
  6. tab = (int ** ) malloc (k * n * sizeof (int));
  7. for (i = 0; i < k; i = i + 1)
  8. {
  9.     for (j = 0; j < n; i = j + 1)
  10. {
  11.  tab[i][j] = i + j;
  12. }
  13. }
  14. free (tab);
  15. }


Reply

Marsh Posté le 02-06-2004 à 18:12:15   

Reply

Marsh Posté le 02-06-2004 à 18:24:29    

tu doit faire ca (je pense, et j'espere que je pense bien, sinon Taz me corrigera ;)):
 

Code :
  1. tab=(int **)calloc(k,sizeof(int));
  2.    for(i=0;i<n;i++)
  3.           tab[i]=(int *)calloc(n,sizeof(int));


Message édité par didier1809 le 02-06-2004 à 18:25:17

---------------
.
Reply

Marsh Posté le 02-06-2004 à 18:26:02    

pas possible. le compilateur ne connait pas les dimensions comme c'est le cas pour les tableaux

Reply

Marsh Posté le 02-06-2004 à 18:53:26    

Code :
  1. int n = 3;
  2. int k = 2;


 
bien sur qu'il connait les Dim....


Message édité par Rits75 le 02-06-2004 à 18:54:03
Reply

Marsh Posté le 02-06-2004 à 19:12:24    

on fait quoi allors?

Reply

Marsh Posté le 02-06-2004 à 19:15:50    


 

Code :
  1. int * tab;
  2. tab =  malloc (k * n * sizeof (int));
  3. *(tab + (i *j) + i)= i + j;


Reply

Marsh Posté le 02-06-2004 à 19:53:31    

Merci C'est bon et voila un autre code qui marche. Javais fait un erreur de débutant, j'ai faite une boucle avec for (j = 0; j < n; i = j + 1) soit i à la place de j. Tout fonctionne je suis au anges.
 
 

Code :
  1. int ** tab;
  2. int i;
  3. int j;
  4. tab = (int ** ) malloc (k * sizeof (int));
  5. for (i=0;i<k;i++)
  6. {
  7. tab[i]=(int *)malloc(n * sizeof(int));
  8. }
  9. for (i = 0; i < k; i = i + 1)
  10. {
  11.     for (j = 0; j < n; j = j + 1)
  12. {
  13.  tab[i][j] = i + j;
  14. }
  15. }
  16. free (tab);
  17. }

Reply

Marsh Posté le 02-06-2004 à 19:56:37    

thermocline a écrit :

Code :
  1. int * tab;
  2. tab =  malloc (k * n * sizeof (int));
  3. *(tab + (i *j) + i)= i + j;




 
c'est moins lisible que ma solution ca quand meme  :D  


---------------
.
Reply

Marsh Posté le 02-06-2004 à 20:05:05    

pourquoi t'écrias pas j++ ?

Reply

Marsh Posté le 02-06-2004 à 20:14:58    

Puisque tu n'en parle, j++ est une poste incrémentation et ++j est une pré incrémentation, mais quelle effet a ++j dans une boucle par exemple?

Code :
  1. for (j = 0; j < 5; ++j)
  2. {
  3. toto = j
  4. }

Reply

Marsh Posté le 02-06-2004 à 20:14:58   

Reply

Marsh Posté le 02-06-2004 à 20:16:55    

rien ça incrémente j et voilà.
 
i++;  et ++i; seront en C traduit simplement par la même instruction assembleur. il aura un changement avec un contexte comme a = i++; et a = ++i; qui là ne produiront pas le même code

Reply

Marsh Posté le 02-06-2004 à 20:36:08    

Je vois, merci

Reply

Marsh Posté le 02-06-2004 à 21:02:00    

Carol Poulin a écrit :

on fait quoi allors?


 
Un ptit coup de C99 peut-être ?

Code :
  1. int (*tab)[n] = malloc(k * n * sizeof(int));


 
Et là t'as un magnifique tableau prêt à l'emploi (cool le C99 hein ?)


Message édité par leneuf22 le 02-06-2004 à 21:06:50
Reply

Marsh Posté le 02-06-2004 à 22:56:48    

ca marche...mais ton programme fuit! ;)
le "free(tab)" ne libere pas toute la memoire de ton tableau(**tab)!!
comme tu boucles pour faire le malloc..boucle pour faire le free ;)

Reply

Marsh Posté le 02-06-2004 à 23:01:29    

leneuf22 a écrit :

Un ptit coup de C99 peut-être ?

Code :
  1. int (*tab)[n] = malloc(k * n * sizeof(int));


 
Et là t'as un magnifique tableau prêt à l'emploi (cool le C99 hein ?)


 
Mouais, mais pourquoi pas int tab [k][n] ?
Le malloc, faites-en ce que voulez, mais là, franchement, c'est pas utile.

Reply

Marsh Posté le 02-06-2004 à 23:31:12    

vivelec a écrit :

Mouais, mais pourquoi pas int tab [k][n] ?
Le malloc, faites-en ce que voulez, mais là, franchement, c'est pas utile.


 
t'as eu des problèmes avec malloc dans ta jeunesse ?
tu veut qu'onen parle ?

Reply

Marsh Posté le 02-06-2004 à 23:42:30    

Joel F a écrit :

t'as eu des problèmes avec malloc dans ta jeunesse ?
tu veut qu'onen parle ?


Moi, je veux bien qu'on en parle ... mais, malloc() est comme tout appel système : il doit être justifié.

Reply

Marsh Posté le 02-06-2004 à 23:43:45    

vivelec a écrit :

Moi, je veux bien qu'on en parle ... mais, malloc() est comme tout appel système : il doit être justifié.


 
est-ce que au moins, tu te rends compte de l'absurdité de tes propos ???
tu sais que depuis 1990 malloc est beaucoup plus safe hmm ??

Reply

Marsh Posté le 02-06-2004 à 23:59:21    

Joel F a écrit :

est-ce que au moins, tu te rends compte de l'absurdité de tes propos ???
tu sais que depuis 1990 malloc est beaucoup plus safe hmm ??


Oui justement, je te retourne la pareille.
Je te rapelle que AIX/SOLARIS/HP-UX/TRU64 n'ont pas le même noyeau.
Sinon cela ferait longtemps que les codes seraient portables sans cross-compilos.

Reply

Marsh Posté le 03-06-2004 à 00:03:25    

m'enfin bordel, le malloc ca fait lurette qu'ile st standardisé sur toutes plateformes.

Reply

Marsh Posté le 03-06-2004 à 00:05:20    

Joel F a écrit :

m'enfin bordel, le malloc ca fait lurette qu'ile st standardisé sur toutes plateformes.


Non justement.
Pour chaque Os, tu trouveras des limitations distinctes et des contre-indications persuasives.
Sinon, tous les codes seraient réentrants.

Reply

Marsh Posté le 03-06-2004 à 00:05:58    

vivelec a écrit :

Oui justement, je te retourne la pareille.
Je te rapelle que AIX/SOLARIS/HP-UX/TRU64 n'ont pas le même noyeau.
Sinon cela ferait longtemps que les codes seraient portables sans cross-compilos.


c'est quoi ce flan?
le C est un standard depuis longtemps (le fameux ansi C n'est ce pas [:cupra]), et le malloc fait partie du lot :o

Reply

Marsh Posté le 03-06-2004 à 00:10:15    

vivelec a écrit :

Non justement.
Pour chaque Os, tu trouveras des limitations distinctes et des contre-indications persuasives.
Sinon, tous les codes seraient réentrants.


n'importe quoi.
 
La réentrance d'appels concurrents à malloc n'est pas garantie par la norme, cela dit rien ne t'empeche de lire la doc de tes compilos pour utiliser des options du genre "-mt" pour éviter tout problème de plantage "aléatoire" dans un appel à malloc.


Message édité par schnapsmann le 03-06-2004 à 00:13:56
Reply

Marsh Posté le 03-06-2004 à 00:16:57    

leneuf22 a écrit :

Un ptit coup de C99 peut-être ?

Code :
  1. int (*tab)[n] = malloc(k * n * sizeof(int));


 
Et là t'as un magnifique tableau prêt à l'emploi (cool le C99 hein ?)

comme tu dis l'ami, cela étant, faudra pas trop bourer la pile si n est grand.

Reply

Marsh Posté le 03-06-2004 à 00:33:31    

schnapsmann a écrit :

c'est quoi ce flan?
le C est un standard depuis longtemps (le fameux ansi C n'est ce pas [:cupra]), et le malloc fait partie du lot :o


C'est quoi ce bordel ?
Encore un bizut d'universitaire ?
Sortez de votre linux, bordel !

Reply

Marsh Posté le 03-06-2004 à 00:34:30    

Taz a écrit :

comme tu dis l'ami, cela étant, faudra pas trop bourer la pile si n est grand.


Quelle est le rapport entre le malloc et la pile ?
Tu deviens à ton tour rétrograde ?

Reply

Marsh Posté le 03-06-2004 à 00:36:18    

vivelec a écrit :

Quelle est le rapport entre le malloc et la pile ?
Tu deviens à ton tour rétrograde ?


tu ne connais pas les "nouveautés" du c99 n'est ce pas? [:xam hot]

Reply

Marsh Posté le 03-06-2004 à 00:36:41    

vivelec a écrit :

C'est quoi ce bordel ?
Encore un bizut d'universitaire ?
Sortez de votre linux, bordel !

le C a été standardisé en 1983. bien essayé
 

vivelec a écrit :

Quelle est le rapport entre le malloc et la pile ?
Tu deviens à ton tour rétrograde ?

int * tab[N] ça te parait pas être sur la pile ?

Reply

Marsh Posté le 03-06-2004 à 01:01:17    

vivelec a écrit :

Mouais, mais pourquoi pas int tab [k][n] ?
Le malloc, faites-en ce que voulez, mais là, franchement, c'est pas utile.


 
Parce que sauf erreur, le compilo te jette immédiatement. Cette déclaration n'est valable que pour les tableaux statiques.
Je ne sais pas si dans l'exemple donné, n et k sont donnés à titre d'exemple, ou si c'est réellement la taille du tableau dans le programme final, auquel cas, c'est effectivement bcp plus simple de faire un
#define k 2
#define n 3
int tab[k][n];

Reply

Marsh Posté le 03-06-2004 à 01:04:16    

le titre c'est quand même "allocation dynamique" :)

Reply

Marsh Posté le 03-06-2004 à 01:06:39    

OK, j'avions point vu.

Reply

Marsh Posté le 03-06-2004 à 01:15:28    

el muchacho a écrit :

Parce que sauf erreur, le compilo te jette immédiatement. Cette déclaration n'est valable que pour les tableaux statiques.
Je ne sais pas si dans l'exemple donné, n et k sont donnés à titre d'exemple, ou si c'est réellement la taille du tableau dans le programme final, auquel cas, c'est effectivement bcp plus simple de faire un
#define k 2
#define n 3
int tab[k][n];


Oui, enfin, disons que l'idée reste la même.
Si tu connais k et n tu n'as pas besoins malloc()

Reply

Marsh Posté le 03-06-2004 à 01:16:54    

vivelec a écrit :

Si tu connais k et n à la compilation tu n'as pas besoins malloc()

ça dépend de n*k*sizeof(T)


Message édité par Taz le 03-06-2004 à 01:17:18
Reply

Marsh Posté le 03-06-2004 à 01:18:13    

Taz a écrit :

le C a été standardisé en 1983. bien essayé
 
 int * tab[N] ça te parait pas être sur la pile ?


Tout dépend de quelle pile on parle et si l'on est en multi-thread ou non.
Dans ce dernier cas, et hormis tout appel explicite, la taille max est généralement de 64 K. Mais c'est un autre sujet.

Reply

Marsh Posté le 03-06-2004 à 01:24:41    

vivelec a écrit :

Oui, enfin, disons que l'idée reste la même.
Si tu connais k et n tu n'as pas besoins malloc()


 
Correction : si tu connais k et n à la compilation, tu n'as pas besoin de malloc(). Sinon, tu n'as pas le choix.
 
Sur ce, bonne nuit à tous !


Message édité par el muchacho le 03-06-2004 à 01:25:33
Reply

Marsh Posté le 03-06-2004 à 01:26:32    

el muchacho a écrit :

Correction : si tu connais k et n à la compilation, tu n'as pas besoin de malloc(). Sinon, tu n'as pas le choix.


Exactement.
Ma remarque porte uniquement sur les allocations dont ont connaît l'espace avent la compilation.

Reply

Marsh Posté le 03-06-2004 à 01:27:51    

et ? dans tous les cas, limitation ou pas, ça reste une pile

Reply

Marsh Posté le 03-06-2004 à 01:28:08    

vivelec a écrit :

Exactement.
Ma remarque porte uniquement sur les allocations dont ont connaît l'espace avent la compilation.

t'es donc complètement hors-sujet

Reply

Marsh Posté le 03-06-2004 à 01:28:15    

vivelec a écrit :

Exactement.
Ma remarque porte uniquement sur les allocations dont ont connaît l'espace avent la compilation.


En français :  
Si l'on connaît n et k avant la compilation, on n'a pas besoin de malloc().

Reply

Marsh Posté le 03-06-2004 à 01:30:05    

et voilà ... et après, on se retrouve avec des débutants qui sortent des
 

Code :
  1. double mat[500][500];

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed