Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1185 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Allocation dynamique d'un tableau à 2 dimensions

 



 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Allocation dynamique d'un tableau à 2 dimensions

n°749237
Carol Poul​in
Posté le 02-06-2004 à 18:12:15  profilanswer
 

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. }


mood
Publicité
Posté le 02-06-2004 à 18:12:15  profilanswer
 

n°749256
didier1809
${citation_perso}
Posté le 02-06-2004 à 18:24:29  profilanswer
 

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

---------------
.
n°749260
Taz
bisounours-codeur
Posté le 02-06-2004 à 18:26:02  profilanswer
 

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

n°749286
Rits75
to?be:!be
Posté le 02-06-2004 à 18:53:26  profilanswer
 

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
n°749319
Carol Poul​in
Posté le 02-06-2004 à 19:12:24  profilanswer
 

on fait quoi allors?

n°749332
thermoclin​e
Geek intelligent
Posté le 02-06-2004 à 19:15:50  profilanswer
 


 

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


n°749413
Carol Poul​in
Posté le 02-06-2004 à 19:53:31  profilanswer
 

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. }

n°749418
didier1809
${citation_perso}
Posté le 02-06-2004 à 19:56:37  profilanswer
 

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  


---------------
.
n°749431
Taz
bisounours-codeur
Posté le 02-06-2004 à 20:05:05  profilanswer
 

pourquoi t'écrias pas j++ ?

n°749440
Carol Poul​in
Posté le 02-06-2004 à 20:14:58  profilanswer
 

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. }

mood
Publicité
Posté le 02-06-2004 à 20:14:58  profilanswer
 

n°749442
Taz
bisounours-codeur
Posté le 02-06-2004 à 20:16:55  profilanswer
 

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

n°749489
Carol Poul​in
Posté le 02-06-2004 à 20:36:08  profilanswer
 

Je vois, merci

n°749529
leneuf22
Posté le 02-06-2004 à 21:02:00  profilanswer
 

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
n°749685
Rits75
to?be:!be
Posté le 02-06-2004 à 22:56:48  profilanswer
 

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 ;)

n°749689
vivelec
Posté le 02-06-2004 à 23:01:29  profilanswer
 

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.

n°749718
Joel F
Real men use unique_ptr
Posté le 02-06-2004 à 23:31:12  profilanswer
 

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 ?

n°749734
vivelec
Posté le 02-06-2004 à 23:42:30  profilanswer
 

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é.

n°749737
Joel F
Real men use unique_ptr
Posté le 02-06-2004 à 23:43:45  profilanswer
 

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 ??

n°749762
vivelec
Posté le 02-06-2004 à 23:59:21  profilanswer
 

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.

n°749766
Joel F
Real men use unique_ptr
Posté le 03-06-2004 à 00:03:25  profilanswer
 

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

n°749770
vivelec
Posté le 03-06-2004 à 00:05:20  profilanswer
 

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.

n°749772
schnapsman​n
Zaford Beeblefect
Posté le 03-06-2004 à 00:05:58  profilanswer
 

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

n°749784
schnapsman​n
Zaford Beeblefect
Posté le 03-06-2004 à 00:10:15  profilanswer
 

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
n°749791
Taz
bisounours-codeur
Posté le 03-06-2004 à 00:16:57  profilanswer
 

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.

n°749816
vivelec
Posté le 03-06-2004 à 00:33:31  profilanswer
 

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 !

n°749820
vivelec
Posté le 03-06-2004 à 00:34:30  profilanswer
 

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 ?

n°749825
schnapsman​n
Zaford Beeblefect
Posté le 03-06-2004 à 00:36:18  profilanswer
 

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]

n°749826
Taz
bisounours-codeur
Posté le 03-06-2004 à 00:36:41  profilanswer
 

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 ?

n°749885
el muchach​o
Comfortably Numb
Posté le 03-06-2004 à 01:01:17  profilanswer
 

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];

n°749890
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:04:16  profilanswer
 

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

n°749894
el muchach​o
Comfortably Numb
Posté le 03-06-2004 à 01:06:39  profilanswer
 

OK, j'avions point vu.

n°749906
vivelec
Posté le 03-06-2004 à 01:15:28  profilanswer
 

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()

n°749908
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:16:54  profilanswer
 

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
n°749910
vivelec
Posté le 03-06-2004 à 01:18:13  profilanswer
 

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.

n°749918
el muchach​o
Comfortably Numb
Posté le 03-06-2004 à 01:24:41  profilanswer
 

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
n°749920
vivelec
Posté le 03-06-2004 à 01:26:32  profilanswer
 

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.

n°749922
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:27:51  profilanswer
 

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

n°749924
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:28:08  profilanswer
 

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

n°749925
vivelec
Posté le 03-06-2004 à 01:28:15  profilanswer
 

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().

n°749928
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:30:05  profilanswer
 

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

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Allocation dynamique d'un tableau à 2 dimensions

 

Sujets relatifs
Remplacer un tableau par des div... Height 100% ??[C] définition d'une structure dynamique
[Perl] Regular expression "dynamique"conversion adresse de tableau de pointeurs
Parcourir un tableau à colonnes variablesproblème de menu dynamique
sauver un tableau de short dans un format d'imageefacer les caractere d'un tableau de char
Problème de tableau dynamiquephp et allocation dynamique de tableau a 2 dimensions
Plus de sujets relatifs à : Allocation dynamique d'un tableau à 2 dimensions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR