Petit problème de compréhension dans un passage de paramètre...

Petit problème de compréhension dans un passage de paramètre... - C - Programmation

Marsh Posté le 19-08-2003 à 15:32:30    

:hello:  
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  :sol:


Message édité par neo9205 le 19-08-2003 à 20:21:47
Reply

Marsh Posté le 19-08-2003 à 15:32:30   

Reply

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.

Reply

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.


---------------
Le Tyran
Reply

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".
&blist[i] est alors l'adresse du i ème élément du tableau.


 
Ah oki merci, j'étais sur le point de me mefier du realloc  :pt1cable:

Reply

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  :hello:

Reply

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 ?

Reply

Marsh Posté le 19-08-2003 à 15:49:50    

neo9205 a écrit :

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 ?


 
 :non:  
Realloc ne change rien du tout, realloc ne fait qu'allouer de la mémoire.


---------------
Le Tyran
Reply

Marsh Posté le 19-08-2003 à 15:52:15    

LetoII a écrit :


 
 :non:  
Realloc ne change rien du tout, realloc ne fait qu'allouer de la mémoire.


 
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.

Reply

Marsh Posté le 19-08-2003 à 15:57:42    

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


 
 :heink:  
 
Révise les pointeurs toi


---------------
Le Tyran
Reply

Marsh Posté le 19-08-2003 à 15:59:14    

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


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

Reply

Marsh Posté le 19-08-2003 à 15:59:14   

Reply

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

Reply

Marsh Posté le 19-08-2003 à 16:46:45    

Taz a écrit :

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
 


 
Depuis ton intervention, moi non plus !
Tu peux pas lui expliquer pourquoi au lieu de lui dire que ça va cracher ?

Reply

Marsh Posté le 19-08-2003 à 16:49:19    

El_gringo a écrit :


 
Depuis ton intervention, moi non plus !
Tu peux pas lui expliquer pourquoi au lieu de lui dire que ça va cracher ?


S'il expliquait ce serait pas taz voyons ;) :o


---------------
Le Tyran
Reply

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

Reply

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.

Reply

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.

Reply

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

Reply

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    [:spamafote]

Reply

Marsh Posté le 19-08-2003 à 21:08:42    

Taz a écrit :

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    [:spamafote]  


 
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.

Reply

Marsh Posté le 20-08-2003 à 00:26:27    

Code :
  1. void *realloc(void *ptr, size_t size);


 
Taz> If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size.

Reply

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

Reply

Marsh Posté le 20-08-2003 à 08:04:28    

Bah tu le fait pour C et C++ la macro spa grave  
 

Code :
  1. #ifndef NULL
  2. #ifdef  __cplusplus
  3. #define NULL    0
  4. #else
  5. #define NULL    ((void *)0)
  6. #endif
  7. #endif


Reply

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


Message édité par Taz le 20-08-2003 à 08:17:14
Reply

Marsh Posté le 20-08-2003 à 08:39:51    

Taz a écrit :


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)  


 
Heuuu... c'est quoi c't'agression !?
J'crois que j'ai répondu a sa question initiale, MOI !

Reply

Marsh Posté le 20-08-2003 à 08:42:59    

El_gringo a écrit :


 
Heuuu... c'est quoi c't'agression !?
J'crois que j'ai répondu a sa question initiale, MOI !


 
El_gringo VS Taz
round 1
fight!
 
 [:magicpanda]  
 
 [:ddr555]  
 
Calmez vous, ça vaut pas le coup de se foutre sur la gueule pour un topic de ce genre.


---------------
Le Tyran
Reply

Marsh Posté le 20-08-2003 à 09:01:58    

pétant de rire [:rofl], j'ai un client qui s'appelle "Le Scanf"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed