Tableau en parametre

tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007 - 4 mai 2006 à 20:58
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 5 mai 2006 à 11:23
Bonjour,

j'ai un segmentation fault sur l'execution d'un programme.

Le probleme vient d'une fonction ayant un tableau en parametre. Lorsque
je veux acceder au tableau j'ai segmentation fault alors que le
programme compile



voici le programme:

bool bellmanFord(int origine, int nbNoeuds, float **distance, int borneRoutage)

{

int i,u,v,h;

float mini;

float d[nbNoeuds];

int pi[nbNoeuds];

float B[nbNoeuds][borneRoutage];

ARETE a;

vector::const_iterator itr = aretes.begin();

vector::const_iterator fin = aretes.end();




/*methode
nouvelle*/

/*for(u=0;u<nbNoeuds;u++)

for(h=0;h<nbNoeuds;h++)

if(u==borneRoutage)


B[u][h] =
FLT_MAX;

else

B[u][h] = 0;



for(h=0;h B[a.destination][h])



B[a.destination][h] = mini;



itr ++;

}

}*/


/*methode
bouquin*/

/*Initialisation*/

for(i=0;i<nbNoeuds;i++)

{

d[i] = INT_MAX;

pi[i] = nbNoeuds + 1;

}



d[origine] = 0;

cout << distance[0][0]; //Probleme!!!



return true;

};



Appelle de la fonction:

g.bellmanFord( 0 , 5 , (float **)&distance,borneRoutage);



Merci de votre aide. je suis sur ce probleme depuis ce matin...

7 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
4 mai 2006 à 21:26
g.bellmanFord( 0 , 5 , (float **)&distance,borneRoutage);
A priori le & est inutile.
++
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
4 mai 2006 à 21:29
Merci,
ce petit changement ne change rien à mon pb. Malheureusement... :-(
je rajoute la déclaration de distance:
int distance[nbNoeuds][nbNoeuds];

Si qqn a une idée ce serait sympa
Merci
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
5 mai 2006 à 08:31
Dans ton programme tu dois avoir un autre problème:
float d[nbNoeuds];
int pi[nbNoeuds];
float B[nbNoeuds][borneRoutage];
nbNoeuds et bornesRoutage ne sont pas des #define, dont tu peut pas declarer tes tabeaux comme ca normalement. Il faut que tu les alloue dynamiquement.

int tab[6]; // tu a le droit

int a =6;
int tab[a]; // normalement tu as pas le droit
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
5 mai 2006 à 10:56
Pour le problème : cout << distance[0][0]; //Probleme!!!
Tu peut essayer de faire int a = distance[0][0]; cout << a; pour voir si ca marche ou pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
5 mai 2006 à 10:57
oui je pense aussi qu'au moment de la compilation, la variable nbNoeuds n'étant pas définie, puisque c'est une variable d'exécution, le complilateur ne connait pas la taille des tableaux. Il doit faire une supposition (du type nbNoeuds == 0) et tes tableaux ne sont pas alloués correctement. Il faudrait peut être passer par une allocation dynamique (malloc ou autre)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2006 à 11:17
g.bellmanFord( 0 , 5 , (float **)distance,borneRoutage);
avec float distance[nbNoeuds][nbNoeuds];

ce cast ne peut pas marcher (cf ma réponse sur ton autre question)

car

distance[x][y] <=> *(distance+x*dim1+y)
si float distance[dim1][dim2];

distance[x][y] <=> *((*(distance+x)) + y)
si float** distance

dans les 2 cas tu n'accèdes pas à la mémoire de la même facon donc on peut pas caster de l'un à l'autre...
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2006 à 11:23
petite erreur de ma part :

distance[x][y] <=> *(distance+x*dim2+y)
si float distance[dim1][dim2];
0
Rejoignez-nous