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

  FORUM HardWare.fr
  Programmation
  C

  tableau 3d ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tableau 3d ?

n°1559658
in_your_ph​ion
Posté le 13-05-2007 à 18:34:22  profilanswer
 

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:

mood
Publicité
Posté le 13-05-2007 à 18:34:22  profilanswer
 

n°1559662
Joel F
Real men use unique_ptr
Posté le 13-05-2007 à 18:34:54  profilanswer
 

oui

n°1560200
Sve@r
Posté le 14-05-2007 à 15:42:59  profilanswer
 

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.
n°1560447
matafan
Posté le 15-05-2007 à 07:36:23  profilanswer
 

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
n°1612667
in_your_ph​ion
Posté le 18-09-2007 à 16:41:35  profilanswer
 

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
n°1612716
MagicBuzz
Posté le 18-09-2007 à 17:46:45  profilanswer
 

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

n°1612719
Elmoricq
Modérateur
Posté le 18-09-2007 à 17:53:06  profilanswer
 

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
n°1612751
Joel F
Real men use unique_ptr
Posté le 18-09-2007 à 20:00:18  profilanswer
 

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

n°1612783
ffomnislas​h
Posté le 18-09-2007 à 21:18:49  profilanswer
 

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.

n°1612880
Taz
bisounours-codeur
Posté le 19-09-2007 à 10:46:35  profilanswer
 

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.

mood
Publicité
Posté le 19-09-2007 à 10:46:35  profilanswer
 

n°1612921
Joel F
Real men use unique_ptr
Posté le 19-09-2007 à 11:31:47  profilanswer
 

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

n°1613422
in_your_ph​ion
Posté le 20-09-2007 à 12:57:33  profilanswer
 

merci pour vos réponses  :jap:

n°1614071
Sve@r
Posté le 22-09-2007 à 10:10:40  profilanswer
 

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.
n°1614334
matafan
Posté le 24-09-2007 à 08:15:44  profilanswer
 

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

n°1616876
jxano
Le 'x' est muet
Posté le 29-09-2007 à 09:48:24  profilanswer
 

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


n°1616891
matafan
Posté le 29-09-2007 à 11:14:03  profilanswer
 

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.
 

n°1616893
ixemul
Nan mais sans blague ! ⚡
Posté le 29-09-2007 à 11:20:54  profilanswer
 

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
n°1616905
dave_teteh​i
cat /dev/urandom &gt; /dev/fb0
Posté le 29-09-2007 à 12:40:14  profilanswer
 

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
n°1616938
Elmoricq
Modérateur
Posté le 29-09-2007 à 14:17:37  profilanswer
 

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
n°1616956
dave_teteh​i
cat /dev/urandom &gt; /dev/fb0
Posté le 29-09-2007 à 16:25:29  profilanswer
 

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.

n°1617265
Taz
bisounours-codeur
Posté le 01-10-2007 à 10:32:36  profilanswer
 

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)

n°1732405
coriandrin​e
Posté le 15-05-2008 à 20:30:48  profilanswer
 

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 .

n°1732406
Joel F
Real men use unique_ptr
Posté le 15-05-2008 à 20:32:23  profilanswer
 

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

n°1732408
coriandrin​e
Posté le 15-05-2008 à 20:34:36  profilanswer
 

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

n°1732411
Joel F
Real men use unique_ptr
Posté le 15-05-2008 à 20:45:37  profilanswer
 

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

n°1732418
coriandrin​e
Posté le 15-05-2008 à 20:59:12  profilanswer
 

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

n°1732424
Sve@r
Posté le 15-05-2008 à 21:37:23  profilanswer
 

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.
n°1732434
coriandrin​e
Posté le 15-05-2008 à 21:56:37  profilanswer
 

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?

mood
Publicité
Posté le   profilanswer
 


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

  tableau 3d ?

 

Sujets relatifs
[C]Passer un tableau de structures en paramètres[html / css] gerer la largeur des cellules dans un tableau
variable a la place d'un indice dans un tableau en jsTrier un tableau à double dimension ?
Remplir une cellule de tableau avec un div[C#] Recherche dans un tableau
[JSP] créer tableau dynamique en servletinsertion dans un tableau
Pb pour désérialiser un double tableaualignement vertical cellules html [tableau]
Plus de sujets relatifs à : tableau 3d ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)