Je travaille avec un algorithme statistique et je continue de recevoir une erreur de segmentation, et je ne la vois tout simplement pas. Je suis à peu près sûr que j'ai calloc'd la mémoire correctement. Je me demande si cela a peut-être quelque chose à voir avec le débordement, car je ne reçois la faute qu'après quelques itérations de la boucle. Le code est ci-dessous, avec mes printf
pour le débogage. Désolé si la syntaxe est un peu confuse ici, je suis à côté d'une publication de journal.Erreur de segmentation inattendue fonctionnant avec de petits nombres dans un algorithme
// *** n and m defined previously
float *aux_arr = calloc(n, sizeof(float));
if (aux_arr == NULL) {
printf("calloc failed");
}
int j;
int j0 = 1;
int j1 = 1;
aux_arr[1] = 1;
for (size_t i = 0; i < n - 1; i++) {
printf("\nOUTER\n");
j1 += 1;
printf("i: %zu\n", i);
printf("j1: %i\n", j1);
for (j = j1; j >= j0; j--) {
printf("\nINNER\n");
printf("j: %i\n", j);
printf("j1: %i\n", j1);
printf("j0: %i\n", j0);
// print first 5 elements of my aux_arr
for (int i = 0; i < 5; i++) {
printf("%f\n", aux_arr[i]);
}
aux_arr[j] = (j/m) * (aux_arr[j]) + (1 + (1/m) - (j/m)) * (aux_arr[j - 1]);
if (aux_arr[j] < (1.0 * pow(10, -20))) {
aux_arr = 0;
if (j == j1) {
j1 -= -1;
}
if (j == j0) {
j0 += 1;
}
}
}
}
produit les éléments suivants:
OUTER
i: 0
j1: 2
INNER
j: 2
j1: 2
j0: 1
0.000000
1.000000
0.000000
0.000000
0.000000
INNER
j: 1
j1: 2
j0: 1
0.000000
1.000000
1.000000
0.000000
0.000000
OUTER
i: 1
j1: 3
INNER
j: 3
j1: 3
j0: 2
Segmentation fault: 11
Vous pouvez voir que le problème vient lorsque je tente d'accéder à mon aux_arr
pour la troisième fois. Je ne sais pas pourquoi cela fonctionne bien les deux premières fois cependant.
Merci!
Avez-vous parcouru le code dans un débogueur? C'est la première chose à faire. – OldProgrammer
Pourriez-vous développer votre exemple de code dans un [programme complet] (https://stackoverflow.com/help/mcve) que nous pouvons copier et coller, compiler et exécuter? –
Il est déroutant que vous utilisiez 'i' comme variable d'itération dans la boucle externe et la boucle pour imprimer les 5 premiers éléments. – Barmar