2015-12-05 1 views
3

Le code suivant donne "Erreur de bus: 10", bien que cela fonctionne parfaitement quand n est changé à 30. Je ne vois vraiment pas de raison unique pour cette erreur. Pourquoi pensez-vous que cela se passe?std :: La fonction de tri donne "Erreur de bus: 10"

#include <algorithm> 
#include <cstdio> 
#define MAX 100000 
using namespace std; 

struct suffix 
{ 
    int cur; 
}; 

suffix suffixes[MAX]; 

bool cmp(suffix a, suffix b) 
{ 
    return (a.cur <= b.cur); 
} 

int main() 
{ 
    int n = 1000; 
    sort(suffixes,suffixes + n,cmp); 
    return 0; 
} 
+1

Quelle plate-forme/système d'exploitation utilisez-vous? Combien de RAM y a-t-il dans votre machine? – Drop

+0

MacOS, processeur double cœur Intel Core i5 à 2,7 GHz, 8 Go de RAM – Transcendental

+2

'sort' nécessite une fonction de comparaison qui effectue un tri monotone. Changez <= 'à' <'et voyez si ça aide. Voir http://stackoverflow.com/questions/2385690/sorting-only-using-the-less-than-operator-compared-to-a-trivalue-compare-functio – RedX

Répondre

4

Votre fonction de comparaison a un problème. Il ne satisfait pas the requirements prévu par std::sort. Il doit donner un strict faible commande, il doit retourner false pour les éléments équivalents. Essayez de le modifier à:

bool cmp(suffix a, suffix b) 
{ 
    return (a.cur < b.cur); // note comparison is < instead of <= 
} 
+0

Ça aide, merci. Mais pourquoi pensez-vous qu'il existe un seuil comme 35? – Transcendental

+0

@Enes: Si vous ne respectez pas les prérequis de l'algorithme, cela peut conduire à un comportement indéfini. Crashing est un résultat possible, le seuil spécifique n'est pas si important. – Blastfurnace

+0

@Enes - FYI, si vous avez utilisé le compilateur Visual C++, cette erreur aurait été détectée (dans l'exécution du débogage) et votre programme aurait arrêté avec une assertion. La façon dont Visual C++ vérifie ceci est d'appeler deux fois la fonction 'cmp' - la première fois avec (a, b) et une seconde fois avec (b, a). Si vous avez répondu 'true' pour les deux appels, le moteur d'exécution affirme. La raison en est qu'il n'y a aucun moyen 'a PaulMcKenzie