matrice statique et dynamique - C - Programmation
Marsh Posté le 30-01-2007 à 21:39:43
Il faut faire une conversion de cast explicite :
p = (int **) a;
Le compilateur te met un warning parce que tu pourrais faire une connerie du genre "free(p);" dans la suite de ton programme. Là, tu lui montre que tu sais ce que tu fais.
Marsh Posté le 30-01-2007 à 21:53:00
oki
maintenant voilà le problème qui se pose
en statique quand je fais ensuite printf ("%d", **p); le programme plante alors que ça ne plante pas en dynamique
statique
Code :
|
Code :
|
Marsh Posté le 30-01-2007 à 21:59:05
Si tu comptes bien de 0 à 2 inclu il y a trois nombres, pas 2, donc ton a = malloc(2 * sizeof(int *)) est un peu faiblard. En plus tu ne vérifies pas le retour de malloc ce qui n'est jamais une bonne chose.
Marsh Posté le 30-01-2007 à 22:07:52
Trap D a écrit : Si tu comptes bien de 0 à 2 inclu . En plus tu ne vérifies pas le retour de malloc ce qui n'est jamais une bonne chose. |
le 2 n'est pas inclu
sinon j'ai juste pas mis de if (a == NULL) et if (a[i] == NULL) afin de montrer juste le strict minimum pour voir ce qui tourne pas, mais d'habitude je le mets tjs (ainsi que le free)
Marsh Posté le 30-01-2007 à 22:07:56
dave_tetehi a écrit : Il faut faire une conversion de cast explicite : Le compilateur te met un warning parce que tu pourrais faire une connerie du genre "free(p);" dans la suite de ton programme. Là, tu lui montre que tu sais ce que tu fais. |
en aucun cas 'a' ne peut être casté en (int **), c'est pas un tableau de pointeurs vers des tableaux d'entiers, c'est un tableau de tableaux d'entier.
Marsh Posté le 30-01-2007 à 22:30:26
Ah bon. Quelle différence y'a t-il entre un tableau de pointeur, et un tableau de tableau ? Je ne comprend pas pourquoi on ne peut pas faire ça. gcc -Wall -pedantic ne bronche pas.
Marsh Posté le 30-01-2007 à 22:33:04
dave_tetehi a écrit : Ah bon. Quelle différence y'a t-il entre un tableau de pointeur, et un tableau de tableau ? Je ne comprend pas pourquoi on ne peut pas faire ça. gcc -Wall -pedantic ne bronche pas. |
Dessine la mémoire tu va bien voir la différence ... (ou alors ouvre un bouquin de C...)
Marsh Posté le 30-01-2007 à 22:43:48
Je me trompe surement, mais le tableau statique est alloué dans le segment data, peut importe le nombre de dimension, l'allocation est faite de manière continue, nen ? desolé, si je suis dur d'oreille, mais je comprend tjs pas.
Marsh Posté le 30-01-2007 à 22:56:06
Excuse moi d'insister mais quand je vois
Code :
|
Je me dis qu'il y a un problème et que ça peut fonctionner quelques fois, mais ça risque tout de même de planter un jour.
Marsh Posté le 30-01-2007 à 23:47:40
0x90 a écrit : Dessine la mémoire tu va bien voir la différence ... (ou alors ouvre un bouquin de C...) |
Effectivement je me suis bien planté, je pense que ce genre de chose est beaucoup plus propre :
Code :
|
Marsh Posté le 30-01-2007 à 23:48:58
Trap D a écrit : Excuse moi d'insister mais quand je vois
Je me dis qu'il y a un problème et que ça peut fonctionner quelques fois, mais ça risque tout de même de planter un jour. |
oui tu as raison, juste une erreur d'innatention, je corrige ça tout de suite, merci
Marsh Posté le 30-01-2007 à 23:52:51
0x90 a écrit : |
je vois ce que tu veux dire, mais je n'arrive pas à visualiser la différence au niveau mémoire, tu aurais un lien qui explique tout ça
Marsh Posté le 31-01-2007 à 00:23:48
dave_tetehi a écrit : Effectivement je me suis bien planté, je pense que ce genre de chose est beaucoup plus propre :
|
Mais c'est quoi ce cast de la mort qui tue ? Tu ne sais pas écrire du C correct ?
Marsh Posté le 31-01-2007 à 00:25:19
exhortae a écrit : je vois ce que tu veux dire, mais je n'arrive pas à visualiser la différence au niveau mémoire, tu aurais un lien qui explique tout ça |
Dessine ce qui se passe avec les pointeurs. C'est à toi de le faire, personne ne peut le faire a ta place. Et désolé si tu grilles trois neurones en faisant ça, mais c'est indispensable...
Marsh Posté le 03-02-2007 à 05:15:48
Emmanuel Delahaye a écrit : Dessine ce qui se passe avec les pointeurs. C'est à toi de le faire, personne ne peut le faire a ta place. Et désolé si tu grilles trois neurones en faisant ça, mais c'est indispensable... |
Voilà comment je vois ça, si quelqu'un pourrais me dire si c'est bon je pourrais expliquer ensuite comment je vois la chose.
Merci
PS : ça ma coûté mes 6 derniers neuronnes
Marsh Posté le 03-02-2007 à 13:22:01
exhortae a écrit : Bonsoir |
Va ici http://forum.hardware.fr/hfr/Progr [...] 0049_1.htm relire mon post du 9 janvier dernier. Il s'agit de la même question !!!!
La partie importante qui ne t'as probablement pas sautée aux yeux est celle-ci "Le pb du débutant, c'est qu'il a tendance à croire que [] <=> * donc [][] <=> **
L'équivalence n'est vrai que pour une seule dimension. Pourquoi ? parce que la mémoire n'est définie, en mémoire, que sur une seule dimension. Les cases mémoires sont alignées sur une seule et immense ligne."
exhortae a écrit : Voilà comment je vois ça, si quelqu'un pourrais me dire si c'est bon je pourrais expliquer ensuite comment je vois la chose. |
Un tableau de tableaux style "int tab[2][3]={{1, 2, 3}, {4, 5, 6}}" se présente ainsi
Citation : |
Un tableau de pointeurs, style "int **tab" (avec les malloc qui vont bien) se présente ainsi
Citation : |
Marsh Posté le 05-02-2007 à 08:51:09
Sve@r a écrit : Va ici http://forum.hardware.fr/hfr/Progr [...] 0049_1.htm
|
en faite ce que je n'arrive pas à comprendre quand je vois cette présentation c'est pourquoi quand je fais tab + 1, il part à l'adresse 0x100c (c'est à dire vers le 2ème tableau, au lieu d'aller à l'adresse 0x1004.
j'ai compris que pour le faire il faut faire
Code :
|
puis on peux faire *(p + 1) pour acceder à la case tab[0][1], mais je ne vois pas pourquoi tab + 1 ne serait pas égale à 0x1004.
sinon j'avais bien lu ta réponse dans le post du 9 janvier mais le problème c'est qu'en c il utilise tab[i][j] pour tab[..][..] ou **tab et ça ça me perturbe toujours un peu
merci.
Marsh Posté le 05-02-2007 à 22:13:46
exhortae a écrit : en faite ce que je n'arrive pas à comprendre quand je vois cette présentation c'est pourquoi quand je fais tab + 1, il part à l'adresse 0x100c (c'est à dire vers le 2ème tableau, au lieu d'aller à l'adresse 0x1004.
|
TU N'AS PAS LE DROIT DE COPIER tab DANS p => ce ne sont pas des variables de même type
En tout cas un type "int étoile" n'est pas un type "int étoile étoile". C'est d'ailleurs pour ça que tu fais un cast => parce que ton compilo râle !!!
Il s'ensuit qu'ensuite il essaye de s'en sortir avec ce qu'il peut et te donne un résultat un peu batard
Essaye d'ailleurs, juste pour voir, d'afficher "tab" avec "%p" et d'afficher aussi "*tab" avec "%p"...
exhortae a écrit : sinon j'avais bien lu ta réponse dans le post du 9 janvier mais le problème c'est qu'en c il utilise tab[i][j] pour tab[..][..] ou **tab et ça ça me perturbe toujours un peu |
Parce que tu cherches à assimiler [][] à "étoile étoile" alors que ce n'est pas le cas.
Marsh Posté le 05-02-2007 à 23:22:10
Sve@r a écrit : TU N'AS PAS LE DROIT DE COPIER tab DANS p => ce ne sont pas des variables de même type
En tout cas un type "int étoile" n'est pas un type "int étoile étoile". C'est d'ailleurs pour ça que tu fais un cast => parce que ton compilo râle !!! |
Dans ce cas là est-ce que je peux utiliser la formule suivante :
Code :
|
Sve@r a écrit : |
Elles ont la même valeur, je l'avais remarqué lors de mes expérimentations
par contre son explication reste un mystère pour moi, est-ce que ça veut dire que tab pointe sur tab
et là à bien y penser j'aurais plutôt utilisé
Code :
|
bref je suis perdu...
Marsh Posté le 06-02-2007 à 10:50:07
exhortae a écrit : par contre son explication reste un mystère pour moi, est-ce que ça veut dire que tab pointe sur tab |
Ca veut dire que si l'équivalence entre "int[]" et "int *" est vraie, l'équivalence entre "int[][]" et "int **" ne l'est pas. On peut éventuellement essayer de la faire dans un but très très illustratif mais seulement dans ce but là et non dans des termes d'égalité mathématique.
Donc si t'essayes de la faire, tu obtiendras des résultats incohérents avec ton raisonnement...
Marsh Posté le 06-02-2007 à 14:17:02
Sve@r a écrit : Ca veut dire que si l'équivalence entre "int[]" et "int *" est vraie, l'équivalence entre "int[][]" et "int **" ne l'est pas. On peut éventuellement essayer de la faire dans un but très très illustratif mais seulement dans ce but là et non dans des termes d'égalité mathématique. |
Syntaxiquement ça passe la plupart du temps, mais c'est pas exactement vrai, gaffe aux sizeofs
Marsh Posté le 07-02-2007 à 17:11:31
0x90 a écrit : Syntaxiquement ça passe la plupart du temps, mais c'est pas exactement vrai, gaffe aux sizeofs |
Ah ? On peut avoir des problèmes si on utilise de façon équivalente "tab[x]" et "*(tab + x)" ???
Marsh Posté le 30-01-2007 à 21:21:57
Bonsoir
Voilà je me retrouve confronté à un problème que je n'arrive pas à résoudre
le code suivant qui initialise et matrice sous cette forme
1 2 3
4 5 6
fonctionne que ce soit en statique ou en dynamique
statique
dynamique
ensuite je dois faire des opérations sur cette matrice pour celà j'affecte un (int**)p sur (int**)a
le problème c'est qu'en statique mon compilo me met un warning quand je fais p = a alors qu'il ne me le fait pas en dynamique, et ça j'arrive pas à comprendre pourquoi
merci
Message édité par exhortae le 30-01-2007 à 23:49:17