différence entre un char p[][] et un char * p[] ? - C - Programmation
Marsh Posté le 06-04-2004 à 13:40:12
non
[2][3] tu as tout contigu en mémoire {{ , , }, { , , }}
avec un tableau de pointeur, seuls tes pointeurs se contigus, ce qui est pointé se trouve n'importe ou
Marsh Posté le 06-04-2004 à 13:44:18
mais dans la manipulation de l'un commme de l'autre je peux utiliser la forme p[][], alors j'ai du mal à saisir dans le code de tantot avec qsort pourquoi j'ai du modifier quelque chose dans mon strcmp
Marsh Posté le 06-04-2004 à 13:48:04
parce que l'un est contigu, l'autre nécessite un dereferencement
Marsh Posté le 06-04-2004 à 13:50:05
sans vouloir abuser taz, tu pourrais me dire plus clairement se que tu veux dire par contigu et dereferencement
Marsh Posté le 06-04-2004 à 14:12:11
Code :
|
Code :
|
qsort à besoin de 4 arguments, 1 void *, le nombre d'éléments, la taille d'un de ces éléments et une fonction de comparaison qui prendra 2 void* en arguments.
et strcmp lui prend 2 char* en argument et renvoit un entier.
pas d'incohérence dans se que je dis jusqu'ici ?
Marsh Posté le 06-04-2004 à 14:17:34
ben ça c'est la documentation ... d'autres platitudes à dire ?
Marsh Posté le 06-04-2004 à 14:22:35
platitude.. lol
enfait se que je ne saisi pas c'est l'écriture
strncmp(*(char**)a, *(char**)b); dans le cas du tris d'un tableau de pointeur.
et strncmp((char*)a, (char*)b); dans le cas du tris d'un [][]
Marsh Posté le 06-04-2004 à 14:26:40
déjà y a pas de n
déjà on elève pas les const comme ça
après, c'est juste une histoire de types
Marsh Posté le 06-04-2004 à 14:36:43
oups oui pour le n,
je pensse que le problème c'est que j'interprète mal *(char**)a ou meme (char*)a
c'est serait pas un typage par hasard parcequ'a la base a était un void* ?
Marsh Posté le 06-04-2004 à 14:55:02
mmm ok...
donc...
dans le premier cas a est un pointeur de pointeur de char et strcmp compare se qu'il pointe donc un pointeur de char.
et dans le second cas a est un pointeur de char et strcmp compare ce pointeur de char donc c logique...
(correction)
Marsh Posté le 06-04-2004 à 14:58:40
se qui me ramène au problème de base *(char **) a ce n'est pas la meme chose que (char *)a et je vois pas la diff pff
Marsh Posté le 06-04-2004 à 15:00:05
ben parce que le void* permet une certain généricité, en gros ça pointe vers n'importe quoi : à toi de savoir ce que c'est vraiment et comment t'en servir
Marsh Posté le 06-04-2004 à 15:33:10
si a est un char ** et que je fais une comparaison sur *a
ou que a soit un char * et que je face la comparaison sur a
je vois pas de différence, ya quelque chose qui m'échappe la.
Marsh Posté le 06-04-2004 à 15:42:41
si tu le dis
mais pq c'est 2 écritures differentes dans le cas du p[][] et *p[]
Marsh Posté le 06-04-2004 à 15:46:10
parce que c'est pas la même chose ... tu le fais exprès ou quoi?
Marsh Posté le 06-04-2004 à 15:54:02
non même pas
"parce que l'un est contigu, l'autre nécessite un dereferencement"
j'ai aucune idée de se que ca peut signifier et encore moin de l'effet que ca à sur mes écritures dans mon strcmp.
merci de ta patience sinon
Marsh Posté le 06-04-2004 à 15:56:33
le français sinon ?
Taz a écrit : bon allez, qui me colle la définition d'un tableau? |
t'es aussi visé, une petite recherche ...
Taz a écrit a écrit : ben contigü et dereferencer, ben *pointeur |
Marsh Posté le 06-04-2004 à 15:56:55
Avec un déréférencement le tri sera plus long. si les éléments sont contigus, ça sera plus rapide en mémoire donc à trier
Marsh Posté le 06-04-2004 à 15:58:06
JagStang a écrit : Avec un déréférencement le tri sera plus long. si les éléments sont contigus, ça sera plus rapide en mémoire donc à trier |
ouais, là tu nous fait de la bonne parano
Marsh Posté le 06-04-2004 à 15:59:31
ta gueule
edit :
Marsh Posté le 06-04-2004 à 16:01:03
t'as oublié que ça gaché la mémoire de manière inacceptable aussi
Marsh Posté le 06-04-2004 à 16:14:11
bein un tableau p[i] ca équivaut à *(p+i)
je vois pas trop se que je pourrais découvrire sur les tableaux, je vais revoir ca mais bon
Marsh Posté le 06-04-2004 à 16:15:55
ben ça c'est juste une histoire de notation ... je vois pas ce que tu conclus
Marsh Posté le 06-04-2004 à 16:19:02
push>> où sont stocké les données de ton tableau, pour chaque notation
p[][]
et
*p[]
et
**p
Marsh Posté le 06-04-2004 à 16:20:13
compter pas sur moi pour recoller ma définition un peu complète d'un tableau, c'est pas à moi de faire les recherches, c'est à ceux qui posent les questions
Marsh Posté le 06-04-2004 à 16:20:32
bein je conclus rien
j'essayais juste de trouver des pistes pour différencier p[][] et p*[]
enfin je vais continuer sur la piste "qu'est-ce qu'un tableau" alors.
Marsh Posté le 06-04-2004 à 16:24:25
ReplyMarsh Posté le 06-04-2004 à 16:30:22
JagStang a écrit : push>> où sont stocké les données de ton tableau, pour chaque notation |
en mémoire
non aller
hum, quand on créer un tableaui p[][] on définis d'une manière ou d'une autre sa taille, il aura de de la mémoire alloué pour ca, apres p*[] un tableau de pointeur bein c la même chose non ? on définis la taille de chaque pointeur si on veut mettre des données dedans.
enfin c bien confus quoi ces pointeurs enfait
Marsh Posté le 06-04-2004 à 16:32:29
j'aime bien t'as façon de penser ... c'est la même chose pourtant tu les définis pas pareil ...
Marsh Posté le 06-04-2004 à 16:32:42
Taz a écrit : me dis pas qu'il faudrait écrire une FAQ ... |
tu pourrais écrire un bouquin
Marsh Posté le 06-04-2004 à 16:37:34
chiche, si je trouve pas de travail cet été ... je pourrais faire un petit essai
Marsh Posté le 06-04-2004 à 16:40:52
push a écrit : |
>> oui mais encore, précise
push a écrit : |
Faute avouée à moitié pardonée
Marsh Posté le 06-04-2004 à 13:32:55
voila dans mon esprit un tableau à 2 dimentions cela équivalait à faire un tableau de pointeur où j'aurais alloué de la mémoire à chaque pointeur mais apparement non ?
donc je penssais qu'un char p[2][3];
et un char * p[2]; p[0]=malloc(3); p[1]=malloc(3);
était identique.
Message édité par push le 07-04-2004 à 14:10:18