【发布时间】:2017-05-17 00:24:44
【问题描述】:
代码目录结构,
./Computing$ ls -LR
.:
list file.txt mergeSort.c program.exe type.h
./list:
arrayImpl.c linkedListImpl.c list.h
编译过程:
$./Computing
gcc -Wall -Werror -DARRAY -I. mergeSort.c ./list/*.c -o program
Here 是包含文件的完整代码,mergeSort.c、list/*、type.h
用List的给定表示,
typedef struct List{
void **array;
/* Housekeeping - Array enhancement/shrink */
int lastItemPosition;
int size;
}List;
下面在list->array上执行合并排序,其中aux维护array的浅拷贝
void mergeSort(List *list, size_t listSize, isLess less){
if(list != NULL){
void **aux = malloc(list->size * sizeof(void*)); //Auxillary shadow copy
if(aux != NULL){
printf("Size of list: %d\n", listSize);
mSort(list->array, aux, 0, listSize-1, less);
}else{
fprintf(stderr, "mergeSort() - Malloc failure");
exit(EXIT_FAILURE);
}
}else{
fprintf(stderr, "mergeSort() - List is NULL");
}
}
static void mSort(void **array, void **aux, int low, int high, isLess less){
if(high <= low) return;
int mid = (low + high)/2;
mSort(array, aux, low, mid, less);
mSort(array, aux, mid+1, high, less);
merge(array, aux, low, mid, high, less);
}
static void merge(void **array, void **aux, int low, int mid, int high, isLess less){
for(int index = 0; index <= high; index++){
aux[index] = array[index]; //Shallow copy
}
printf("Low-%d, Mid-%d, High-%d\n", low, mid, high);
int leftIndex = low; int rightIndex = mid+1;
printf("leftIndex-%d, rightIndex-%d\n", leftIndex, rightIndex);
for(int index = 0; index <= high; index++){
if(leftIndex > mid) /* right array exhausted */ array[index] = aux[rightIndex++];
else if(rightIndex > high) /*left array exhausted*/ array[index] = aux[leftIndex++];
else if( less(aux[rightIndex], aux[leftIndex]) ) array[index] = aux[rightIndex++];
else array[index] = aux[leftIndex++];
}
}
使用代码在哪里,
bool less(const void *key, const void *item){
printf("\nIn less function\n");
printf("left-%d, Right-%d\n\n", ((Record *)key)->age, ((Record *)item)->age);
if( ((Record *)key)->age < ((Record *)item)->age ){
printf("Return true\n");
return true;
}else{
printf("Return false\n");
return false;
}
}
int main(){
FILE *pFile = fopen("file.txt", "r");
checkHandleFailure(pFile, FILE_HANDLE_FAILURE);
char buf[MAX_RECORD_SIZE];
DBCache *cache = initCache(pFile);
readHeader(pFile, cache, buf);
readData(pFile, cache, buf);
printRecords(cache);
printf("Before calling mergesort() \n");
mergeSort(cache->records, listGetSize(cache->records), less);
}
实际输出为:
$ ./program.exe
Age,LastName,FirstName
------------------------------
50,B,A
30,A,B
20,X,D
10,F,A
90,V,E
60,N,M
Records#: 6
Before calling mergesort()
Size of list: 6
Low-0, Mid-0, High-1
leftIndex-0, rightIndex-1
In less function
left-30, Right-50
Return true
Low-0, Mid-1, High-2
leftIndex-0, rightIndex-2
In less function
left-20, Right-30
Return true
Low-3, Mid-3, High-4
leftIndex-3, rightIndex-4
In less function
left-90, Right-10
Return false
Low-3, Mid-4, High-5
leftIndex-3, rightIndex-5
Segmentation fault (core dumped)
In less function
如何解决这个问题?
Cygwin 不支持使用 gdb 的 coredump 跟踪格式,提供了跟踪(上图)
【问题讨论】:
-
如果您发布相关的堆栈跟踪将更容易提供帮助
-
@yankee2905 请在查询中阅读我的注释(下方)。我可以分享完整的代码
-
我们无法知道
cache->records是否有效。为什么使用void?为什么要发送两次大小,list->size和listSize? -
@Stargateur 因为
List是接受任何特定类型的订购项目的抽象。List<T>在 java 中。 Kya kare bhai,面试官在 Arista 网络上提出这样的问题 -
@overexchange 为什么要两颗星?
void *在这种情况下就足够了。
标签: c sorting pointers mergesort double-pointer