2016-01-21 1 views
-1

Ci-dessous le code que j'essaie d'exécuter, l'erreur Erreur de segmentation persiste. Ajout de comparaison. Dans le programme ci-dessous, je dois considérer un tableau de 5000000 ou moins (c'est n) les numéros et mettre en œuvre un tri rapide sur ces numéros.Erreur lors de l'exécution du programme C++ lors de l'exécution du programme C++

int compare (const void * a, const void * b) 
{ 
    const double *da = (const double *) a; 
    const double *db = (const double *) b; 

    return (*da > *db) - (*da < *db); 
    } 
int main(){ 

int n = rand()% 5000000; 
double arr[n]; 
for (int i=0; i<n; i++) 
{ 
    arr[i] = (double)rand(); 
} 
qsort(arr,n, sizeof(double), compare); 
for (int i=0;i<n;i++){ 
    cout<<arr[i]<<"\n"; 
} 
    return 0; 
} 
+0

Quelle est la valeur de 'n'? –

+2

Probablement trop gros .... –

+0

Pouvez-vous nous montrer le code pour 'comparer' aussi? – miniBill

Répondre

1

Le problème est que la syntaxe double arr[n] vous allouez le tableau sur la pile.

Maintenant, la pile est une ressource limitée et n peut croître jusqu'à près de 5 méga-octets, ce qui est bien au-delà du normal size of the stack

Vous devez allouer le tableau sur le tas avec

double * arr = new double[n]; 

et libre, alors à la fin de la fonction avec

delete[] arr; 
+4

delete [] arr Je suppose que c'est mieux – sestus

+0

Comment modifier pour corriger l'erreur? Je dois considérer un tableau et la longueur du tableau peut aller jusqu'à 5000000 – KSK

+0

@KSK utiliser le tas, pas la pile – johnbakers

2

1) rand peut généralement pas générer des nombres que les grandes. Il est régulièrement limité autour de 32k

2) double arr[n]; n'est pas légal si n n'est pas une constante de compilation. Vous utilisez probablement l'extension de compilateur nonportable.

3) L'espace de pile (où réside l'arr) est généralement très limité. Je doute qu'il puisse accueillir autant de données ce qui est la raison de l'accident.

+0

Y at-il un moyen de le réparer? Je dois considérer un tableau et la longueur du tableau peut aller jusqu'à 5000000 – KSK

+0

@KSK (1) [utiliser la bibliothèque C++ 11 'random' pour générer votre numéro] (http://en.cppreference.com/w/ cpp/numérique/aléatoire). (2) et (3): allouer un tableau dynamiquement dans l'espace du tas. –

+0

1) dépend vraiment du système, windows utilise INT16_MAX standard en-tête gnu utilise INT32_MAX –

0

Désolé, c'est une réponse très partielle, mais je ne peux pas ajouter des commentaires (faible réputation ...) encore, il devrait y avoir une valeur RAND_MAX définie dans stdlib (0x7FFF dans mon cas) donc à mon rand compréhension () retourne une valeur comprise entre 0 et 32767. Si vous voulez une valeur entre 0 et 5000000, vous pouvez essayer

unsigned int n = ((double)rand()/RAND_MAX) * 5000000; 
double * arr = new double[n]; 
... 
delete[] arr; 

en outre, vérifiez que votre structure de comparaison est un comparateur strict.

Espérons que ça aide