tableau 3d ? - C - Programmation
Marsh Posté le 14-05-2007 à 15:42:59
in_your_phion a écrit : j'aimerai savoir si
|
Ptet que tu verras mieux si tu l'écris comme ceci:
Code :
|
En revanche, le titre du topic est faux car tu nous montres ici un tableau en 2d et non en 3d !!!
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 :
|
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 :
|
y'a bon ?
merci d'avance
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
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 :
|
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] |
T'as pas autre chose à faire qu'à venir sur les topics C pour dire que tu comprends pas pourquoi c'est comme ça ?
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
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.
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. |
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.
Marsh Posté le 19-09-2007 à 11:31:47
Taz a écrit : |
voila l'info manquante. Merci Taz
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
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 :
|
Pour un tableau de ce genre, je préfère de très loin déclarer comme ceci :
Code :
|
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 :
|
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.
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 :
|
Justement, c'est plus clean, on ne mélange pas les choux et les carottes
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 :
|
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
Marsh Posté le 29-09-2007 à 14:17:37
En parlant de responsabilité du programmeur, petÿ jeu
Que se passe-t-il si dans ton scanf() on saisit :
Question subsidiaire : que se passe-t-il avec les VLA s'il n'y a pas assez de mémoire pour l'allocation ?
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 ? |
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 : |
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.
Marsh Posté le 01-10-2007 à 10:32:36
dave_tetehi a écrit :
|
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)
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 .
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
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
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 ???
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?
Marsh Posté le 13-05-2007 à 18:34:22
bonjour,
j'aimerai savoir si
est bien un tableau de 10 lignes par 10 colonnes, dont chacune contient un pointeur d'entier ?
merci