2017-10-03 14 views
-1

J'écris un algorithme de quicksorting en C et je continue d'obtenir un bus error:10 sur mon terminal. Je comprends que j'ai besoin d'allouer de la mémoire à la matrice bien que je ne sache pas comment dans ce cas précis.C Erreur de bus: 10 en utilisant le tableau de chaînes

Edit: J'ai ajouté les quicksort, partitioning et swap fonctions

void swap(char* a, char* b){ 

int temp = *a; 
*a = *b; 
*b = temp; 
} 

int partitioning(char* A, int start, int finish){ 

    char* pivot = &A[start]; 

    while(1){ 

     while(strcmp(&A[start], pivot) < 0){ 
      start++; 
     } 
     while(strcmp(&A[finish], pivot) > 0){ 
      printf("Decrementing finish\n"); 
      finish--; 
     } 
     if(start >= finish){ 

      return start; 
     } 
     swap(&A[start], &A[finish]); 
    } 
    return start; 
} 

void quicksort(char* A, int start, int finish){ 


if(start < finish){ 

    int p = partitioning(A, start, finish); 
    quicksort(A, start, p); 
    quicksort(A, p+1, finish); 
    } 
} 
int main() 
{ 
    char *A[] ={"Thomas","Carl","Sabrina","Noam","Alex", 
       "Victoria","Julia","Audrey","Elon","Liam","Rebecca"}; 
    int n = 11; 
    for (int i = 0; i < 11; i++) 
    { 
     printf("%s ", A[i]); 
    } 

    quicksort(*A, 0 , n-1); 

    printf("\n-------\n after sort\n------\n"); 
    for (int i = 0; i < 11; i++) 
    { 
     printf("%s ", A[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
+3

'char * A [] = {... liste des chaînes littérales ..}' est très dangereux sans 'const' pour vous mettre en garde contre des erreurs. Aussi, s'il vous plaît poster 'quicksort()'. –

+1

Où sont les critères de tri réels? Vous ne pouvez pas simplement lancer un algorithme de tri d'un morceau aléatoire de données génériques et attendre de savoir comment le trier. – Lundin

+0

'A' est un tableau de' char * 'avec chaque élément pointant vers une chaîne terminée par un caractère nul. En supposant que vous voulez trier les éléments de 'A' en comparant les chaînes qu'ils pointent, passer' * A' à 'quicksort' n'a aucun sens, car c'est la même chose que' A [0] '. Vous voulez trier 'A', pas' A [0] ', donc vous devriez passer' A' à 'quicksort', et le paramètre formel devrait être de type' char ** '. –

Répondre

0

Le principal problème est que vous essayiez de trier A[0] au lieu de A. Le code modifié ci-dessous fonctionne:

#include <stdio.h> 
#include <string.h> 

void swap(char** a, char** b){ 

    char* temp = *a; 
    *a = *b; 
    *b = temp; 
} 

int partitioning(char** A, int start, int finish){ 

    int pivot = start; 

    while(1){ 

     while(strcmp(A[start], A[pivot]) < 0){ 
      start++; 
     } 
     while(strcmp(A[finish], A[pivot]) > 0){ 
      finish--; 
     } 
     if(start >= finish){ 

      return start; 
     } 
     swap(&A[start], &A[finish]); 
    } 
    return start; 
} 

void quicksort(char** A, int start, int finish){ 

    if(start < finish){ 

     int p = partitioning(A, start, finish); 
     quicksort(A, start, p); 
     quicksort(A, p+1, finish); 
    } 
} 

int main() 
{ 
    char *A[] ={"Thomas","Carl","Sabrina","Noam","Alex", 
       "Victoria","Julia","Audrey","Elon","Liam","Rebecca"}; 
    int n = sizeof(A)/sizeof(A[0]); 
    for (int i = 0; i < n; i++) 
    { 
     printf("%s ", A[i]); 
    } 

    quicksort(A, 0 , n-1); 

    printf("\n-------\n after sort\n------\n"); 
    for (int i = 0; i < n; i++) 
    { 
     printf("%s ", A[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
0

Sans beaucoup plus d'informations, vous passez A après déréférencement à quicksort() si vous avez perdu des informations.

En fait, l'appel est équivalent à

quicksort(A[0], 0, n - 1); 

Selon ce que quicksort() est en train de faire, les causes de la SIGBUS doit se situer dans, mais vous ne le postez pas. Néanmoins, votre problème est clairement avec des pointeurs. Il semble que vous ne les compreniez pas tout à fait.

La raison pour laquelle je ne suis pas affirmer que quicksort(A[0], 0, n - 1) est l'origine du problème en raison du problème exprimé dans le paragraphe précédent, est parce que les adresses de A et A[0] sont égaux, la différence réside dans le pointeur Arithmétique qui sont effectuées sur les deux, qui dépendent du type de pointeur qui n'est pas le même.

En outre, vous devez être prudent en utilisant des chaînes littérales ne pas les modifier parce que son comportement non défini, une façon d'éviter accidentellement le faire est d'utiliser const comme ça,

const char *A[] = { ... /* String Literals Here */ ... };