Erreur de segmentation

Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009 - 6 nov. 2005 à 18:21
Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009 - 7 nov. 2005 à 18:27
Bonjour à tous, je suis étudiant en informatique, et j'ai un algorithme
à écrire. J'ai voulu le mettre en c pour le vérifier mais j'ai une
erreur de segmentation. La compilation se passe bien mais à l'excution
une erreur de ce type apparait. Petite précision, je suis sous linux
(j'ai essayé sous daube mais rien ne de passe la-dessus). Merci à tous.



Voici la source:



#include <stdlib.h>

#include <stdio.h>



int *

calcul(void)

{

int p[3];

int t[5][5] = {{5, 9, 6 , 10, 4},{7, 8, 15, 2, 12}, {14, 1, 3, 11, 6},{16, 4, 8, 9, 13},{12, 6, 18, 5, 3}};

int i,j,k,l,m,n,max,minimax;

max = t[1][1];

for (j = 2; j <= 5; j++)

{

if (t[1][j] > max)

{

max = t[1][j];

k = 1;

l = j;

}

}

minimax = max;

for (i = 2; i <= 5; i++)

{

max = t[i][1];

m = i;

n= j;

for (j = 2; j <= 5; i++)

{

if (t[i][j] > max)

{

max = t[i][j];

m = i;

n = j;

}

}

if (max < minimax)

{

minimax = max;

k = m;

l = n;

}

}

p[1] = k;

p[2] = l;

p[3] = minimax;

return *p;

}



int

main (void)

{

int *m = calcul();

printf ("La valeur minimum des maximum est %d et pour coordonnees [%d][%d].\n", m[3], m[2], m[3]);

return 0;

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 18:34
Le compilo de ton linull ne gueule pas ???

Tu déclares func int* et tu retournes une valeur *p (vaut p[0]) au lieu d'une adresse.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 18:38
et aussi, comment veux tu retourner l'adresse d'une variable LOCALE à une focntion. Cette variable n'existe sur la pile que le temps de la fonction, elle a toute chance d'être écrasée sur la pile en sortie de fonction.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
6 nov. 2005 à 19:38
salut,

en + t'as pas bien pigé qu'en C les indices des tableaux vont de 0 a n-1 :

tu fais un buffer overflow qd t'écris : int p[3]; puis p[3] = minimax;

si tu écris int p[3]; ca va de p[0] à p[2].

pareil pour le tableau t c'est de t[0][0] à t[4][4].



a+
0
Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009
6 nov. 2005 à 20:47
Merci à vous deux pour vos réponses. Merci cosmobob, en effet j'avais
oublié qu'on partait de 0 car en cours d'algo y nous apprenent à partir
de 1 ce qui me porte toujours à
confusion. BruNews, je vois à peut près ton 1er post bien que je
ne soit pas sur qu'il faille retourner une adresse à moins que
.....pour ton 2ème, je ne vois pas vraiment comment faire alors si je
ne peux pas retourner l'adresse du pointeur vers la tableau p si
celui-ci reste local (y me semble que la but des pointeurs c'est
justement de travailler directement sur des valeurs et non pas sur une
copie ). Merci à vous (ceci dit j'ai toujours pas résolu mon prob)
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 20:59
valeur, copie... tu ne serais pas passé par vb ou autre bidouillerie de ce genre ???

un pointeur stocke une adresse mémoire, pour lire ou affecter ce qu'il y a à cette adresse on déréférence avec '*' (ex *p). Il n'y a pas notion de copie ici.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
6 nov. 2005 à 21:32
pour résoudre ton pb:

au début de ta fonction calcul:

static int p[3]; // le tableau p persiste en dehors du contexte local de ta fonction



et a la fin:



return p;





a+
0
Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009
6 nov. 2005 à 22:09
Heu non je crois pas Brunews, j'essaye d'appliquer ce que j'apprends
(mais j'avoue j'en chie avec ces con de pointeurs), mais je suis tout à
fait d'accord, il n'y a pas de copie (justement l'interet des
pointeurs) dans le cas de mon tableau p. Je viens d'essyer ta solution
cosmobob mais j'ai toujours une erreur de segmentation.
0
Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009
6 nov. 2005 à 22:22
je mets quand même le nouveau code source:



#include <stdlib.h>

#include <stdio.h>





int *

calcul(void)

{

static int p[3];

int t[5][5] = {{5, 9, 6 , 10, 4},{7, 8, 15, 2, 12}, {14, 1, 3, 11, 6},{16, 4, 8, 9, 13},{12, 6, 18, 5, 3}};

int i,j,k,l,m,n,max,minimax;

max = t[0][0];

for (j = 1; j <= 4; j++)

{

if (t[0][j] > max)

{

max = t[0][j];

k = 0;

l = j;

}

}

minimax = max;

for (i = 1; i <= 4; i++)

{

max = t[i][0];

m = i;

n = 0;

for (j = 1; j <= 4; i++)

{

if (t[i][j] > max)

{

max = t[i][j];

m = i;

n = j;

}

}

if (max < minimax)

{

minimax = max;

k = m;

l = n;

}

}

p[0] = k;

p[1] = l;

p[2] = minimax;

return p;

}



int

main (void)

{

int *m = calcul();

printf ("La valeur minimum des maximum est %d et pour coordonnees [%d][%d].\n", m[2], m[1], m[0]);

return 0;

}





et merci à tout ceux qui prennent de leur temps pour me répondre
0
Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009
6 nov. 2005 à 22:30
désolé pour les 40 messages à la suite mais j'ai pas vu de fonction "editer", je vous mets tout les fichiers correspondant à mon problème ici.
0
Snacksou Messages postés 7 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 février 2009
7 nov. 2005 à 18:27
re tout le monde, désolé d'avoir fait le boulet mais après de multiple
essais, j'ai enfin trouvé, dans la 2ème boucle pour ce n'est pas "for
(j = 1; j <= 4; i++)" mais "for (j = 1; j <= 4; J++)". Normal l'erreur puisqu'il essaye de trouver une valeur du tableau qui n'existe pas .Encore merci à ceux qui m'ont aidé. @+
0
Rejoignez-nous