Petit problème de compréhension dans un passage de paramètre... - C - Programmation
Marsh Posté le 19-08-2003 à 15:35:48
A cause du realloc, blist est un pointeur vers un tableau d'éléments de type "struct livre4".
&blist[i] est alors l'adresse du i ème élément du tableau.
Marsh Posté le 19-08-2003 à 15:37:21
Alors ton bou de code fait de l'allocation dynamique sur un tableau de structure. blist pointe sur le premier élément de ce tableau. blist[i] est donc le ieme élément. &blist[i] l'adresse de ce ieme élément.
Marsh Posté le 19-08-2003 à 15:38:49
El_gringo a écrit : A cause du realloc, blist est un pointeur vers un tableau d'éléments de type "struct livre4". |
Ah oki merci, j'étais sur le point de me mefier du realloc
Marsh Posté le 19-08-2003 à 15:41:04
LetoII a écrit : Alors ton bou de code fait de l'allocation dynamique sur un tableau de structure. blist pointe sur le premier élément de ce tableau. blist[i] est donc le ieme élément. &blist[i] l'adresse de ce ieme élément. |
Ok merci
Marsh Posté le 19-08-2003 à 15:48:11
On peut donc dire que realloc change le type de blist ?
On n'a ainsi pas besoin d'écrire struct livre4 *blist[nombre de pointeurs voulus].
Quand on veut gérer en dynamique on passe par realloc directement tout en déclarant un pointeur tout simple si j'ai bien compris ?
Marsh Posté le 19-08-2003 à 15:49:50
neo9205 a écrit : On peut donc dire que realloc change le type de blist ? |
Realloc ne change rien du tout, realloc ne fait qu'allouer de la mémoire.
Marsh Posté le 19-08-2003 à 15:52:15
LetoII a écrit : |
Oui d'accord, mais n'empeche que si on aurait utilisé malloc, on aurait écrasé à chaque fois blist sans pouvoir je pense écrire blist[i] plus tard dans le passage de paramètre.
Marsh Posté le 19-08-2003 à 15:57:42
neo9205 a écrit : |
Révise les pointeurs toi
Marsh Posté le 19-08-2003 à 15:59:14
neo9205 a écrit : |
si on AVAIT utilisé...
Là n'est pas la question, realloc, malloc ou calloc on s'en fout.
Juste, realloc comme il est utilisé ici, réserve i+1 fois la taille d'un structure "livre4" à l'adresse pointée par blist.
On peut donc utiliser blist comme un tableau de i+1 éléments.
Tu sais que quand on fait :
struct livre4 mesLivres[100];
mesLivres est un pointeur de type "* struct livre4" sur la tableau ?
c à dire que mesLivres[a] <=> (mesLivres+a)
Ben on se retrouve dans le même style de cas avec ton blist...
Marsh Posté le 19-08-2003 à 16:04:35
struct livre4 *blist;
if((blist=(struct livre4 *)realloc(blist,(i+1)*sizeof(struct livre4)))==null)
boom, à moins d'avoir de la chance 1 sur 4294967296
sans parler du "null" .... je le sens pas terrible ce topic
Marsh Posté le 19-08-2003 à 16:46:45
Taz a écrit : struct livre4 *blist; |
Depuis ton intervention, moi non plus !
Tu peux pas lui expliquer pourquoi au lieu de lui dire que ça va cracher ?
Marsh Posté le 19-08-2003 à 16:49:19
El_gringo a écrit : |
S'il expliquait ce serait pas taz voyons
Marsh Posté le 19-08-2003 à 19:26:55
euh pointeur pas initialisé... ça vous dis quelque chose? c'est bien la peine de faire les cakes avec realloc si on sait pas s'en servir
Marsh Posté le 19-08-2003 à 20:20:33
Taz a écrit : euh pointeur pas initialisé... ça vous dis quelque chose? c'est bien la peine de faire les cakes avec realloc si on sait pas s'en servir |
-Primo ça vient d'un livre et non de moi (de meme pour l'erreur).
-Secondo l'initialisation est dans le livre mais je l'ai enlevé car c'est pas le problème dont il est question dans le topic et de plus ça allège le code pour discuter dessus.
Marsh Posté le 19-08-2003 à 20:26:09
enlève les virgules en fin de ligne : ça allège et ça t'évitera de faire des conneries... en attendant, si tu pouvais ecouter ce que je t'ai dit, ça résoudrait ton problème.
Marsh Posté le 19-08-2003 à 20:55:08
Taz a écrit : enlève les virgules en fin de ligne : ça allège et ça t'évitera de faire des conneries... en attendant, si tu pouvais ecouter ce que je t'ai dit, ça résoudrait ton problème. |
Mon problème n'était pas une initialisation de pointeur !Cette initialisation de pointeur, dans mon prog sur mon PC elle y a toujours été.
Marsh Posté le 19-08-2003 à 20:59:34
et tu l'iniatiles comment juste pour savoir?
elg est dans le décors sur ce topic (moi je trolle sur les topics java, je dis pas des bêtises grosses comme moi)
tu prends ton K&R et hop, chapitre sur les pointeurs
Marsh Posté le 19-08-2003 à 21:08:42
Taz a écrit : et tu l'iniatiles comment juste pour savoir? |
Je l'initialise comme ceci:
struct livre4 *blist=NULL;
Quand au chapitre pointeur, je l'ai passé dans tous les sens y a 4 jours et je pense quand meme que c'est ok maintenant:
Il s'agit juste de cas particuliers lors d'allocation dynamique sur des structures par exemple.
Marsh Posté le 20-08-2003 à 00:26:27
Code :
|
Taz> If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size.
Marsh Posté le 20-08-2003 à 07:17:47
ben mosieur a tout édité, et puis je sais pas ou il compte allé avec ses null ... pour ceux qui aurait pas remarqué, NULL est une macro en C
Marsh Posté le 20-08-2003 à 08:04:28
Bah tu le fait pour C et C++ la macro spa grave
Code :
|
Marsh Posté le 20-08-2003 à 08:16:28
euh en C++, la valeur "pas d'adresse" d'un pointeur est canoniquement 0.
par contre en C, ça peut varier. y a le cast, mais ça peut être autre chose que 0 (je me souviens plus, mais j'ai déjà vu ça)
et puis il sert à quoi ton post? c'est neo qui ecrit du null à tout va ...
Marsh Posté le 20-08-2003 à 08:39:51
Taz a écrit : |
Heuuu... c'est quoi c't'agression !?
J'crois que j'ai répondu a sa question initiale, MOI !
Marsh Posté le 20-08-2003 à 08:42:59
El_gringo a écrit : |
El_gringo VS Taz
round 1
fight!
Calmez vous, ça vaut pas le coup de se foutre sur la gueule pour un topic de ce genre.
Marsh Posté le 19-08-2003 à 15:32:30
J'ai une partie d'un programme (qui vient d'un livre de C) que j'ai trouvé et dans lequel il y a un petit élément que je ne comprend pas :
En global on a :
struct livre4
{
char nom[21];
...
};
Dans le main() :
main()
{
struct livre4 *blist=null;
if((blist=(struct livre4 *)realloc(blist,(i+1)*sizeof(struct livre4)))==null)
{
handle_error();
break;
}
printf("%d",i+1);
readstruct(&blist[i]);
i++;
}
Fonction readstruct :
void readstruct(struct livre4 *b)
{
...
}
Pourquoi quand on fait appel à la fonction readstruct(), on lui donne en parametre &blist[i] alors que blist est un pointeur tout simple vers une structure...et non un tableau de pointeur comme je le comprend moi dans ce passage de paramètre.En effet, il y a indexation comme pour les tableaux.A moins que dans le livre, ils se soient gourrés et qu'il faut déclarer un tableau de pointeurs vers structures.
Merci d'avance pour votre aide
Message édité par neo9205 le 19-08-2003 à 20:21:47