Citation
Fanch
porcassou !
tu créées p4 sur la stack ! c'est normal que ça
explose !
en gros : tu veux utiliser p4 en dehors de la
fonction, il ne faut donc pas le déclarer dans la
fonction mais à l'extérieur de cette dernière,
sinon la référence à p4 est créée sur la stack et
non sur le heap du coup => boum.
Absolument pas !!! Où as-tu appris le C ???
p4 est alloué via malloc donc cela ne se passe absolument pas dans la pile !!! Sinon comment on ferait pour créer des fonctions qui allouent des objets et renvoient un pointeur sur l'objet alloué !!!
Citation
Fanch
Règle :
On ne déclare dans une fonction que des éléments
qui ne sont utilisés QUE dans cette fonction. Tout
le reste est paramètre ou variable globale.
Ben justement, p4 est un paramètre !!! Quand à conseiller d'introduire du global je me demande qui est le plus porcassou !!!
Citation
selox
Bonjour, j'ai un probleme sur la fonction
realloc.
Non, t'as un problème de compréhension pour une fonction qui doit modifier les variables qu'elle reçoit. Je t'explique: dans ta fonction "placerpion", tu fais une modification de "p4". Or "p4" est, dans le programme principal, un "char **". Et la règle est que si une fonction doit modifier une variable extèrieure, elle doit recevoir l'adresse de cette variable qui sera stockée dans un pointeur sur le type de la variable
Exemple: Une fonction qui modifie un "int"
void modif(int *pt_a_modifier)
{
(*pt_a_modifier)=(*pt_a_modifier) + 1
}
Et son appel
int var=12;
modif(&var):
Tu as compris le principe ? Tu dois modifier un "int" tu passes l'adresse de ce "int" qui sera stocké dans un "int *". Or, toi tu veux modifier un "char **p4". Tu dois donc passer l'adresse de "p4" qui sera stocké dans un "char ***"
Trois petites remarques:
- la fonction "realloc" a pour but d'agrandir une zone. Elle est donc suceptible de déplacer le contenu de la zone dans une autre partie de la mémoire si la mémoire actuelle n'est pas suffisante. C'est pour ça qu'on passe à realloc le pointeur sur la zone à agrandir => afin qu'elle sache quoi déplacer. Mais comme la fonction renvoie un pointeur sur la nouvelle zone, il est nécessaire de récupérer ce pointeur => autrement dit, la syntaxe de realloc est la suivante
pt4=realloc(pt4, <nouvelle_taille>)
- (ligne+=10)*sizeof => non seulement compacter les instructions ne fait pas aller plus vite mais en plus ça complique la relecture => fais donc d'abord "ligne+=10" puis "realloc(pt4, ligne * ...)
- je te conseillerais d'inclure ton "p4" dans une jolie petite structure. Tout d'abord tu pourras y ajouter aussi tes joueurs et donc réduire tes paramètres (la fonction qui reçoit la structure reçoit à la fois p4 et les joueurs) et en plus ça te simplifiera la vie au niveau des pointeurs (tu seras pas obligé de jouer avec des "char ***p4")...
tu crois vraiment que ça te fera aller plus vite si tu compactes
reçoit un pointeur sur la zone à réallouer afin qu'elle sache quoi recopier si elle
L'homme qui murmurait à l'oreille des pingouins
[
fr.lang.free.fr]