2017-06-14 4 views
1

Je n'ai pas la moindre idée pourquoi cette fonction génère Segmentation fault lorsque n >= 128deque jette Segfault après 128 itérations

Apparemment, cela était censé gérer long long n pour sortir le dernier chiffre de la somme des premiers n nombres de Fibonacci.

Je ne demande pas de solution, je sais qu'il y a des alternatives!

Tout ce que je veux savoir, c'est pourquoi le Segfault? Est-ce que je manque quelque chose? C'est la première fois que je fais affaire avec deque btw.

#include <iostream> 
#include <deque> 

using namespace std; 

int fibonacci_sum_deque(long long n) { 
    if (n <= 2) 
    return n; 

    deque<int> sum(4); 
    sum[0] = 0; 
    sum[1] = 1; 
    sum[2] = 2; 

    for (long long i = 3; i <= n; ++i) { 
    sum[3] = (sum[2] + sum[1] + 1) % 10; 
    sum.pop_front(); 
    } 

    return sum[2]; 
} 

int main() { 
    long long n = 0; 
    cin >> n; 
    cout << fibonacci_sum_deque(n); 
} 

sortie gdb:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000401861 in fibonacci_sum_deque(long long)() 
(gdb) where 
#0 0x0000000000401861 in fibonacci_sum_deque(long long)() 
#1 0x000000000040342d in main() 
+1

exécutés sous valgrind si vous êtes sur linux – pm100

+9

Vous initialisez le deque avec 4 éléments et de la pop 'n-2' éléments hors – Kevin

+0

@ Kevin Excusez-moi, quand est-ce que j'ai fait apparaître le deuxième élément? Je lance l'élément 'n-1' par itération. Cela fonctionne bien de '0' à' 127' –

Répondre

3

INITIALISATION sum avec 4 éléments et ne jamais ajouter plus. Mais vous faites sum.pop_front() dans une boucle n-2 fois. Vous pouvez initialiser sum avec n éléments ou push_back un nouvel élément comme celui-ci:

deque<int> sum(3); 
sum[0] = 0; 
sum[1] = 1; 
sum[2] = 2; 
for (long long i = 3; i <= n; ++i) { 
    sum.push_back((sum[2] + sum[1] + 1) % 10); 
    sum.pop_front(); 
} 
return sum[2]; 
+0

Génial! Cela a fonctionné, merci :) Cependant, il semble que la technique soit si lente à 'long long n'. –

+0

@AssemAttia Vous pouvez trouver un tableau de taille fixe avec un index qui s'enroule quand il atteint la fin du tableau pour être une approche plus rapide que la deque sans changer l'algorithme global (mais ne devrait pas être beaucoup). Il existe des algorithmes plus rapides que vous pouvez utiliser. Un avertissement: je suis sûr que vous avez quelques mauvais calculs dans l'algorithme pour le moment. Vérifiez vos numéros. – user4581301