tableau 3d ?

tableau 3d ? - C - Programmation

Marsh Posté le 13-05-2007 à 18:34:22    

bonjour,
 
j'aimerai savoir si  
 

Code :
  1. int *tab[10][10];


 
est bien un tableau de 10 lignes par 10 colonnes, dont chacune contient un pointeur d'entier ?
 
 
merci  :jap:

Reply

Marsh Posté le 13-05-2007 à 18:34:22   

Reply

Marsh Posté le 13-05-2007 à 18:34:54    

oui

Reply

Marsh Posté le 14-05-2007 à 15:42:59    

in_your_phion a écrit :

j'aimerai savoir si  

Code :
  1. int *tab[10][10];


 
est bien un tableau de 10 lignes par 10 colonnes, dont chacune contient un pointeur d'entier ?


Ptet que tu verras mieux si tu l'écris comme ceci:

Code :
  1. int* tab[10][10];

 ;)
 
En revanche, le titre du topic est faux car tu nous montres ici un tableau en 2d et non en 3d !!! :p


Message édité par Sve@r le 14-05-2007 à 15:44:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-05-2007 à 07:36:23    

Par collet le * après le type, c'est trompeur si on a plusieurs déclarations sur la même ligne :

Code :
  1. int* a[10][10], b[10][10]; /* b est un tableau d'int */;

Message cité 1 fois
Message édité par matafan le 15-05-2007 à 07:36:47
Reply

Marsh Posté le 18-09-2007 à 16:41:35    

up,

 

j'aimerais savoir s'il est possibe de déclarer un tableau 3d uniquement avec des malloc...peut on faire ( un tableau 10x10x10, par exemple) :

 
Code :
  1. int*** t = malloc(sizeof(int**) * 10 ); //première dimension
  2. for (i=0;i<10;i++) {
  3.    t[i] = malloc(sizeof(int *)*10 ); //deuxième dimension
  4.    for (j=0;j<10;j++)
  5.      t[i][j] = malloc(sizeof(int )*10 ); // 3 dimension
  6. }
  7. //et on accède au tableau par :
  8. t[0][1][3] = 3;
 

y'a bon ? [:aelenia]

 


merci d'avance :)

 

Message cité 1 fois
Message édité par in_your_phion le 18-09-2007 à 16:42:04
Reply

Marsh Posté le 18-09-2007 à 17:46:45    

Je comprendrai jamais pkoi en C on ne peut pas utiliser la notation tab[x, y, z]
C'est pourtant tellement plus lisible :spamafote:

Reply

Marsh Posté le 18-09-2007 à 17:53:06    

in_your_phion a écrit :

up,

 

j'aimerais savoir s'il est possibe de déclarer un tableau 3d uniquement avec des malloc...peut on faire ( un tableau 10x10x10, par exemple) :


Oui. C'est moche et il y a surement moyen de faire autrement, mais oui, c'est possible. Tu peux faire des n-tableaux avec 0 < n < plein.

 
in_your_phion a écrit :

Code :
  1. int*** t = malloc(sizeof(int**) * 10 ); //première dimension
  2. for (i=0;i<10;i++) {
  3.    t[i] = malloc(sizeof(int *)*10 ); //deuxième dimension
  4.    for (j=0;j<10;j++)
  5.      t[i][j] = malloc(sizeof(int )*10 ); // 3 dimension
  6. }
  7. //et on accède au tableau par :
  8. t[0][1][3] = 3;


 

Vérifie toujours le retour de malloc(), on ne sait jamais. Et oui, ça me semble pas mal là, comme ça, en 5s.

 


MagicBuzz a écrit :

Je comprendrai jamais pkoi en C on ne peut pas utiliser la notation tab[x, y, z]
C'est pourtant tellement plus lisible :spamafote:

 

T'as pas autre chose à faire qu'à venir sur les topics C pour dire que tu comprends pas pourquoi c'est comme ça ? [:petrus dei]


Message édité par Elmoricq le 18-09-2007 à 17:53:52
Reply

Marsh Posté le 18-09-2007 à 20:00:18    

Je comprendrai jamais pkoi MagicBuzz vient nous casser la rondelle sur les topics C.
C'est pourtant tellement plus chiant :spamafote:

Reply

Marsh Posté le 18-09-2007 à 21:18:49    

sinon pour allouer un tableau a 1 ou plus dimensions, c'est plus propre d'allouer toute les cases d'un coups puis d'affecter les adresses dans les cases.

Reply

Marsh Posté le 19-09-2007 à 10:46:35    

Joel F a écrit :

Je comprendrai jamais pkoi MagicBuzz vient nous casser la rondelle sur les topics C.
C'est pourtant tellement plus chiant :spamafote:


parce que nous faire des belles phrases genre "tiens j'aimerais bien que 'programmation' s'écrive '@¤µ' parce que c'est plus lisible" crée certainement de la valeur ajoutée.

Reply

Marsh Posté le 19-09-2007 à 10:46:35   

Reply

Marsh Posté le 19-09-2007 à 11:31:47    

Taz a écrit :


parce que nous faire des belles phrases genre "tiens j'aimerais bien que 'programmation' s'écrive '@¤µ' parce que c'est plus lisible" crée certainement de la valeur ajoutée.


 
 [:absolutelykaveh] voila l'info manquante. Merci Taz

Reply

Marsh Posté le 20-09-2007 à 12:57:33    

merci pour vos réponses  :jap:

Reply

Marsh Posté le 22-09-2007 à 10:10:40    

MagicBuzz a écrit :

Je comprendrai jamais pkoi en C on ne peut pas utiliser la notation tab[x, y, z]


Parce que la notation "element[x]" est directement traduite par le compilo en "*(element + x)" et que pour faire une traduction de ce genre, c'est plus facile de faire un algo du type
tant que "element" se termine par "[x]"
faire
    remplacer "element" par "*(element + x)"
fin faire
 
Que de s'amuser à aller disséquer ce qu'il y a entre les crochets pour savoir combien on a de dimensions (enfin je pense)
 
Maitenant tu peux toujours utiliser la notation "z[y[x[tab]]]" si tu veux  [:ddr555]


Message édité par Sve@r le 22-09-2007 à 10:54:26

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-09-2007 à 08:15:44    

Et puis la virgule, c'est déjà un opérateur.

Reply

Marsh Posté le 29-09-2007 à 09:48:24    

Il faut tester les sorties des mallocs d'une part, mais on devrait aussi leur donner un type pour que tout soit parfait :

Code :
  1. int*** t = (int***) malloc(sizeof(int**) * 10 ); //première dimension
  2. if (t==NULL) { printf ("Erreur\n" ); exit (-1); }
  3. for (i=0;i<10;i++) {
  4.    t[i] = (int**) malloc(sizeof(int *)*10 ); //deuxième dimension
  5.    if (t[i]==NULL) { printf ("Erreur\n" ); exit (-1); }
  6.    for (j=0;j<10;j++) {
  7.      t[i][j] = (int*) malloc(sizeof(int )*10 ); // 3 dimension
  8.      if (t[i][j]==NULL) { printf ("Erreur\n" ); exit (-1); }
  9.    }
  10. }
  11. //et on accède au tableau par :
  12. t[0][1][3] = 3;


 
Pour un tableau de ce genre, je préfère de très loin déclarer comme ceci :

Code :
  1. int t[10][10][10];


 
Le gros intérêt des mallocs, c'est qu'on n'est pas obligé d'allouer la même taille de tableau partout :

Code :
  1. int*** t = (int***) malloc(sizeof(int**) * 10 ); //première dimension
  2. if (t==NULL) { printf ("Erreur\n" ); exit (-1); }
  3. for (i=0;i<10;i++) {
  4.    t[i] = (int**) malloc(sizeof(int *)*(10-i) ); //deuxième dimension
  5.    if (t[i]==NULL) { printf ("Erreur\n" ); exit (-1); }
  6.    for (j=0;j<(10-i);j++) {
  7.      t[i][j] = (int*) malloc(sizeof(int )*(10-i-j) ); // 3 dimension
  8.      if (t[i][j]==NULL) { printf ("Erreur\n" ); exit (-1); }
  9.    }
  10. }


Reply

Marsh Posté le 29-09-2007 à 11:14:03    

jxano a écrit :

Il faut tester les sorties des mallocs d'une part, mais on devrait aussi leur donner un type pour que tout soit parfait


Non, on ne cast jamais le retour des malloc. La raison a déja été donnée cent fois sur ce forum.
 

Reply

Marsh Posté le 29-09-2007 à 11:20:54    

matafan a écrit :

Par collet le * après le type, c'est trompeur si on a plusieurs déclarations sur la même ligne :

Code :
  1. int* a[10][10], b[10][10]; /* b est un tableau d'int */;



 
Justement, c'est plus clean, on ne mélange pas les choux et les carottes ;)


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
Reply

Marsh Posté le 29-09-2007 à 12:40:14    

A noter que le support VLA (Variable Length Arrays) définit par la norme c99, autorise ce genre de déclaration (et donc, calcul les adresses à la volée):

 
Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i, j, k;
  5. int len;
  6. scanf("%d", &len);
  7. int t[len][len][len];
  8. const int lim = len*len*len;
  9. for(i=0; i < lim; i++)
  10.  t[0][0][i] = i;
  11. for(k=0; k < len; k++)
  12. {
  13.  for(j=0; j < len; j++)
  14.  {
  15.   for(i=0; i < len; i++)
  16.    printf("%d ", t[k][j][i]);
  17.   printf("\n" );
  18.  }
  19.  printf("\n" );
  20. }
  21. return 0;
  22. }
 

Disons qu'il en va de la responsabilité du programmeur, de ne pas faire n'importe quoi avec la pile.
Personnellement, je trouve cela plus simple qu'une serie d'appels à alloca(), je pense que la déclaration de tableaux à plusieurs dimensions (dans la pile) aurait pu être automatisée depuis longtemps et faire partit du langage de façon intrinsèque.

 

A noter également que le support pour gcc est seulement partiel:
http://gcc.gnu.org/gcc-4.2/c99status.html
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html


Message édité par dave_tetehi le 29-09-2007 à 12:43:17
Reply

Marsh Posté le 29-09-2007 à 14:17:37    

En parlant de responsabilité du programmeur, petÿ jeu [:dawa]

 

Que se passe-t-il si dans ton scanf() on saisit :

  • -1
  • 2.000.000 (ou 32767 si l'on s'en tient aux strictes normes du C)
  • "dawa, le smiley qui déchire"


[:opus dei]

 

Question subsidiaire : que se passe-t-il avec les VLA s'il n'y a pas assez de mémoire pour l'allocation ? [:opus dei]


Message édité par Elmoricq le 29-09-2007 à 14:18:25
Reply

Marsh Posté le 29-09-2007 à 16:25:29    

Citation :

Question subsidiaire : que se passe-t-il avec les VLA s'il n'y a pas assez de mémoire pour l'allocation ? [:opus dei]


L'allocation se fait dans la pile, comme la pile est moyennement extensible, la taille maximal d'allocation est la taille de la pile moins ce qui a déjà était alloué.
Pour connaitre les infos sur les processus et donc la taille de la pile: ulimite -a avec bash ou limit avec tcsh, dans la section stack size.
Sous Windows, je n'en ai pas la moindre idée...
On peut aussi consulter l'info pendant l'éxécution avec l'appel système getrlimit() avec la ressource RLIMIT_STACK ou mieux encore, quand il est disponible, consulter les dernières lignes du pseudo système de fichier /proc/self/maps.
Donc si on dépasse ou si il n'y a pas assez de mémoire, un signal SIGSEGV est envoyé. Si on l'intercepte et on agit en conséquence, on peut encore se rattraper, si on l'ignore est on continue à dépasser la limite, on finit par déclencher un Segmentation fault. La limite théorique (chez moi) est d'environ 8Mo.
Mais rien ne nous empêche de changer la taille de la pile avec l'appel système setrlimit(). A noter toutefois, qu'il nécessite la capacité CAP_SYS_RESSOURCE, et comme les capacités sont pour l'instant, relativement mal gérées sous linux (du moins pour l'héritage), il faut le mettre en Set-UID root. Donc c'est moche.
 

Citation :

Que se passe-t-il si dans ton scanf() on saisit :
    * -1
    * 2.000.000 (ou 32767 si l'on s'en tient aux strictes normes du C)
    * "dawa, le smiley qui déchire"


 
Je suis vraiment désolé, je ne comprend pas.
Le scanf() est artificiel, il permet juste d'éviter toutes optimisations fortuites de la part du compilateur.

Reply

Marsh Posté le 01-10-2007 à 10:32:36    

dave_tetehi a écrit :

Citation :

Question subsidiaire : que se passe-t-il avec les VLA s'il n'y a pas assez de mémoire pour l'allocation ? [:opus dei]


L'allocation se fait dans la pile, comme la pile est moyennement extensible, la taille maximal d'allocation est la taille de la pile moins ce qui a déjà était alloué.
Pour connaitre les infos sur les processus et donc la taille de la pile: ulimite -a avec bash ou limit avec tcsh, dans la section stack size.
Sous Windows, je n'en ai pas la moindre idée...
On peut aussi consulter l'info pendant l'éxécution avec l'appel système getrlimit() avec la ressource RLIMIT_STACK ou mieux encore, quand il est disponible, consulter les dernières lignes du pseudo système de fichier /proc/self/maps.
Donc si on dépasse ou si il n'y a pas assez de mémoire, un signal SIGSEGV est envoyé. Si on l'intercepte et on agit en conséquence, on peut encore se rattraper, si on l'ignore est on continue à dépasser la limite, on finit par déclencher un Segmentation fault. La limite théorique (chez moi) est d'environ 8Mo.
Mais rien ne nous empêche de changer la taille de la pile avec l'appel système setrlimit(). A noter toutefois, qu'il nécessite la capacité CAP_SYS_RESSOURCE, et comme les capacités sont pour l'instant, relativement mal gérées sous linux (du moins pour l'héritage), il faut le mettre en Set-UID root. Donc c'est moche.
 

Citation :

Que se passe-t-il si dans ton scanf() on saisit :
    * -1
    * 2.000.000 (ou 32767 si l'on s'en tient aux strictes normes du C)
    * "dawa, le smiley qui déchire"


 
Je suis vraiment désolé, je ne comprend pas.
Le scanf() est artificiel, il permet juste d'éviter toutes optimisations fortuites de la part du compilateur.

Houla stop la branlette intellectuel. Merci d'avoir donner le parfait exemple de mauvaise utilisation des VLA et de scanf, on en a pour notre argent.
 
(Si quelqu'un trouve un bon usage de scanf, je suis preneur)

Reply

Marsh Posté le 15-05-2008 à 20:30:48    

bonjour,
je suis débutante et je voudrais savoir comment définir un tableau de matrices, je m'explique: j'ai un ensemble de matrices(ce n'ai pas à moi de les construire) et je voudrais les mettre dans un tableau .

Reply

Marsh Posté le 15-05-2008 à 20:32:23    

tes matrices c'est quoi ? des structures ou bien ?

Reply

Marsh Posté le 15-05-2008 à 20:34:36    

non, c'est des matrices M[][]

Reply

Marsh Posté le 15-05-2008 à 20:45:37    

ah ok, des tableaux 2D quoi.
 
bah double tab_mat[][][] genre ca devrait suffire.
mais bon, un petit coup d'alloc. dynamique serait de meilleur aloi

Reply

Marsh Posté le 15-05-2008 à 20:59:12    

non, ce n'ai pas ce que je cherche, en fait j'ai un ensemble de matrices et je voudrais pouvoir les envoyer par deux ou par quatres par exemple sans savoir ce qu'elle contiennent, donc je veux les manipuler comme des objets, sauf que c'est des matrices

Reply

Marsh Posté le 15-05-2008 à 21:37:23    

coriandrine a écrit :

non, ce n'ai pas ce que je cherche, en fait j'ai un ensemble de matrices et je voudrais pouvoir les envoyer par deux ou par quatres par exemple sans savoir ce qu'elle contiennent, donc je veux les manipuler comme des objets, sauf que c'est des matrices


Ok. Commence par nous dire comment est fait ton ensemble de matrices. Est-ce un tableau de matrices, style
double tabMat[n][x][y]=... ???
 
Est-ce des matrices diverses style
double matA[x][y]=...
double matB[x][y]=...
double matC[x][y]=...
 
Ensuite, est-ce que le nb de matrices est connu à l'avance ou bien elles arrivent dans ton programme et il doit les gérer au fur et à mesure ???
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-05-2008 à 21:56:37    

en fait, suite à l'exécution d'un programme , je récupère des matrices normalement du type M[][]=... que je doit mettre dans un tableau et c'est ce tableau là que je doit manipuler, donc ce qui m'interesse surtout c'est l'ordre des matrice dans mon tableau, ie je voudrais envoyer les n premières matrices à un programme   disons prog1 puis les n suivantes à un autre programme disons prog2,  ainsi de suite, donc je n'ai aucune opération à faire sur les matrices elle même. tu vois?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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