Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[C] pd de pointeur (je pense)
Envoyé par: gege2061

Bonjour,

Voici le code interressant:

typedef struct
{
float x;
float y;
} fPoint;

int main( int argc, char **argv, char **env )
{
static fPoint *tabCentre, **tabSouris;
AllocTab( &tabCentre, &tabSouris );
return( 0 );
}

int AllocTab( fPoint **pTabCentre, fPoint ***pTabSouris )
{
int i, nbMotif, nbSouris;
*pTabSouris = (fPoint **)malloc( nbMotif * sizeof( fPoint * ) );
for( i = 0; i < *pNbMotif; i++ )
(*pTabSouris) = (fPoint *)malloc( nbSouris * sizeof( fPoint ) );
*pTabCentre = (fPoint *)malloc( nbMotif * sizeof( fPoint ) );
Reflexion( nbMotif, pTabCentre );
return( 0 );
}

void Reflexion( int nbMotif, fPoint **pTabCentre )
{
fPoint centre;
switch( nbMotif )
{
case 1:
pTabCentre[0]->x = centre.x;
pTabCentre[0]->y = centre.y;
break;
case 2:
pTabCentre[0]->x = centre.x;
pTabCentre[0]->y = centre.y - taille;
// pTabSouris OK
pTabCentre[1]->x = centre.x;
// pTabSouris a changer
pTabCentre[1]->y = centre.y + taille;
break;
}
return;
}

J'ai simplifier au maximum. Dans un premier temps, j'appelle la fonction avec nbMotif égal à 1: tout va bien mais losque je recommence (je désallou tout auparavant) avec nbMotif égale à 2, sa segfault!
J'ai réussi a voir que l'adresse de *pTabSouris[0] a changer juste aprés TabCentre[1]->x = centre.x.

Je pense qu'il y a un problème d'écrasement mais je ne vois pas où!

Merci de votre aide



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique: rien ne fonctionne et personne ne sait pourqoi!

Poste le Thursday 29 April 2004 17:20:06
Répondre     Citer    
Re: [C] pd de pointeur (je pense)
Envoyé par: jimmy

Salut,

je n'ai pas tout le code donc je vais plutôt essayer de te guider pour faire les vérifications.

Tout d'abors, dans la fonction AllocTab, assure toi bien que *pNbMotif est bien plus petit ou égal à nbMotif.

Je suppose que tu l'a fait mais vérifie bien que nbMotif, nbSouris soit bien défini.

Par contre, un truc me semble bizarre, mais je me trompe peut-être, dans la fonction
Reflexion, au lieu de mettre "pTabCentre[0]", ne faudrait-il pas mettre "(*pTabCentre)[0]" ?

Voilà, j'espère que ça t'aidera, le reste me semble correcte.

Poste le Thursday 29 April 2004 20:59:33
Répondre     Citer    
Re: [C] pd de pointeur (je pense)
Envoyé par: zerbro

Salut,

Apres lecture de ton code, il y a 2/3 choses qui me "choquent" un peu.

Dans le main :

static fPoint *tabCentre, **tabSouris;
AllocTab( &tabCentre, &tabSouris );

AllocTab demande un fpoint** et un fpoint*** . Ton appel n'est pas faut, mais c'est bizar comme type de declaration et d'appel : tu melanges pointeur et variables dans lesquelles tu aloues de la memoire. A priori, ca devrait etre bon, mais ce n''est pas super propre (=> plus dur a deboguer).

Toujours dans AllocTab :

int i, nbMotif, nbSouris;
for( i = 0; i < *pNbMotif; i++ )

C'est quoi ce pNbMotif ? alors que un nbMotif a été déclaré ?

Dans Reflexion tu as un tableau de pointeur en parametre. C'est juste, mais est qu'un simple de tableau ne suffit pas ? La encore tu auras moins de problemes de memoire à gérer (et comme c'est un tableau, tu recuperes bien les changements).

De plus a quoi correspond exactement la vairiable "taille" ? dans pTabCentre[0]->y = centre.y - taille;

Ensuite, pour pinailler, tu ne teste pas la valeur de retour de allocTab, qui par ailleur renvoie forcement 0 => un retour de type void est donc suffisant.
(ou alors teste tes malloc et renvoie -1 en cas d'echec).
De plus return est une macro, pas une fonction, donc les parentheses sont trompeuses :
return 0; est mieux que return( 0 ); (La c'est de l'integrisme, j'admet).

Bref, fait plutot un copier/coller de ton code source stp pour essayer de debuguer la chose. Car la il reste quelque zones sombres pour t'aider reellement.

Poste le Monday 3 May 2004 10:12:34
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[C] pd de pointeur (je pense)
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons