Bonjour a tous ! voilà mon problème j"essais de construire une matrice d'entier d'ordre 10 000 et ensuite effectuer certaines opérations sur la matrice. j'ai construit un sous programme qui effectuera l'opération sur la matrice. mais lorsque je lance le sous programme j'obtiens segmentation fault je crois bien que cela viens du fait que je lui transmet la matrice comme paramètre voila le sous programme
#include<stdio.h>
#include<math.h>
#define N 1000
void rech(int posi, int posj, int elt, int comp, int fin, int (*mat)[N]){
int j,comp2,ligne,ligne2,bs,ht;
j=posj;
comp2=comp; // comparons si l'élément selectionné est premier ou mulitple
for(ligne=posi; ligne<fin; ligne+=elt) mat[ligne][j]=0;
for(ligne=posi; ligne>1; ligne-=elt) mat[ligne][j]=0;
if(elt!=comp)mat[posi][posj]=0;
j+=1;
ligne2=posj;
while(mat[ligne2][j]%elt!=0){
ht+=1;
ligne2-=1;
}
while(mat[ligne2][j] % elt!=0){
bs+=1;
ligne2+=1;
}
if (mat[ligne2-ht][j]!=0){
rech(ligne2-ht, j, mat[ligne2][j],comp2,fin,mat);
}else{rech(ligne2+bs, j, mat[ligne2][j],comp2,fin,mat);}
}
l'idéé c'est de créer une matrice d'entier affin de rechercher des nombres premiers en essayant d'améliorer le crible d'eratosthène. mais j'ai se problème segmentation fault et également je ne sais comment faire de l'allocation dynamique si vous pouvez me filer un coup de main pour mon programme. voici tout le code:
#include<stdio.h>
#include<math.h>
#define N 1000
void rech(int posi, int posj, int elt, int comp, int fin, int (*mat)[N]){
int j,comp2,ligne,ligne2,bs,ht;
j=posj;
comp2=comp; // comparons si l'élément selectionné est premier ou mulitple
for(ligne=posi; ligne<fin; ligne+=elt) mat[ligne][j]=0;
for(ligne=posi; ligne>1; ligne-=elt) mat[ligne][j]=0;
if(elt!=comp)mat[posi][posj]=0;
j+=1;
ligne2=posj;
while(mat[ligne2][j]%elt!=0){
ht+=1;
ligne2-=1;
}
while(mat[ligne2][j] % elt!=0){
bs+=1;
ligne2+=1;
}
if (mat[ligne2-ht][j]!=0){
rech(ligne2-ht, j, mat[ligne2][j],comp2,fin,mat);
}else{rech(ligne2+bs, j, mat[ligne2][j],comp2,fin,mat);}
}
int Matrice(){
int mat[N][N];
long i=1,j=1,l,m,ordre,som=0;
printf("Veuillez entrer l'ordre de la matrice:\n");
scanf("%ld",&ordre);
rewind(stdin);
while(i<=ordre){
j = 1;
while(j<=ordre){
som = som + 1;
mat[j][i] = som;
j++;
}
i++;
}
for(l=1;l<=ordre;l++){
for(m=1;m<=ordre;m++){
printf(" %d ", mat[l][m]);
}
printf("\n");
}
printf("\n\n");
for(i=1;i<=ordre;i++){
for(j=1;j<=ordre;j++){
if(mat[j][i]%2!=0 && mat[j][i]%3!=0 && mat[j][i]%5!=0){
rech(j,i,mat[j][i],mat[j][i], ordre, mat);
}
}
}
/*for(i=1;i<=ordre;i++){
if (mat[i][1]==2 || mat[i][1]==3 || mat[i][1]==5){
for(j=2;j<ordre+1;j++)mat[i][j]=0;
}
else if ((mat[i][1]>2 && mat[i][1]%2 == 0)||(mat[i][1]>3 && mat[i][1]%3 == 0)){
for(j=1;j<ordre+1;j++)mat[i][j]=0;
}
else if (mat[i][1]>5 && mat[i][1]%5 == 0){
for(j=1;j<ordre+1;j++)mat[i][j]=0;
}
else{
for(j=2;j<ordre+1;j++){
if (mat[i][j]>7 && mat[i][j]%7 == 0)mat[i][j]=0;
else if ((mat[i][j]>11 && mat[i][j]%11 == 0)||(mat[i][j]>13 && mat[i][j]%13 == 0))mat[i][j]=0;
else if ((mat[i][j]>17 && mat[i][j]%17 == 0)||(mat[i][j]>19 && mat[i][j]%19 == 0))mat[i][j]=0;
else if ((mat[i][j]>23 && mat[i][j]%23 == 0)||(mat[i][j]>29 && mat[i][j]%29 == 0))mat[i][j]=0;
else if ((mat[i][j]>31 && mat[i][j]%31 == 0)||(mat[i][j]>37 && mat[i][j]%37 == 0))mat[i][j]=0;
}
}
}
for(l=1;l<=ordre;l++){
for(m=1;m<=ordre;m++){
printf(" %d ", mat[l][m]);
}
printf("\n");
}*/
return 0;
}
int main(){
Matrice();
return 0;
}
merci si vous pouvez me donner un coup de main pour mon projet.
Non. Tu les as declarées mais pas initialisées. Actuellement elles existent mais peuvent contenir n'importe quelle valeur vu que tu ne les initialises pas.
Ce n'est pas la cause de ton problème (quoique, peut-être aussi), mais en C, l'indice d'un tableau de taille N va de 0 à N-1. Ton programme va planter si je donne 1000 pour l'ordre de la matrice
Edit: c'est pas bien de modifier son post suite à une remarque....
- Edité par edgarjacobs 28 octobre 2019 à 19:26:42
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
merci pour la remarque edgarjacobs je tacherais de faire plus ample attention la prochaine fois. Pour revenir au code comment puis-je faire pour que l'ordre de la matrice soit supérieur a 10000j'ai initialisé les variables bs et ht mais le code tourne en boucle j'essais de voir la ou il peut exister des boucles infinies je ne trouve pas.
ok! comment je peux faire pour augmenter la pile? ou soit il y'a une autre manière que je puisse coder pour éviter le débordement de pile ? désolé de m'appuyer sur toi ainsi mais je ne sais pas comment faire. merci
Augmenter la pile ? C'est faisable, mais idiot (*). Tu vas t'arranger pour que ton tableau puisse avoir 10000 x 10000 int, mais avec 10100 x 10100, ça plantera, ou tu changeras le type de int en float ou double (exemple). Ce n'est donc pas la solution, qui viendra de l'allocation dynamique avec malloc()
(*) En plus, rien ne dit que la machine sur laquelle tournera ton programme puisse le supporter
- Edité par edgarjacobs 28 octobre 2019 à 21:19:10
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
merci a tous! j'ai fini par trouver le problème je faisais de la récursivité dans la fonction rech sans pour autant lui indiquer quand est ce qu'il doit s'arrêter j'ai pu corriger le bug merci a tous pour votre aide
segmentation fault
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent