2017-12-10 3 views
-1

以下は、マージソートプロジェクト用の(不完全な)コードです。これは、128行のテストファイルからソートされた31 MBのファイルに切り替えるまで、私が実装した部分に対してうまく機能しました。今セグメンテーションを取得し、私はこれを解決するために何をすべきか分からない。小さなテストファイルから31 MBのファイルに切り替えるときのSegFault

いくつかの行を削除しました。「主にコード」のために重要ではないと私は信じています。

struct Record { 
    char key[KEYSIZE+1]; 
    char data[DATASIZE+1]; 
}; 
int threadCount; 
int tiers; 
static struct ThdArg { 
     int thdNum; // Thread number 0,1,2,3 
     struct Record * lowRec; // First record of group or first index of record 
     struct Record * hiRec; // Last record of group or last index of record 
}; 


int lines; 
int tiers; 
void *threadFunc(void *var) 
{ 
    struct ThdArg temp2 = *((struct ThdArg*)var); 
    qsort((temp2.lowRec), lines/threadCount, sizeof(struct Record), comparator); 
    for(int k=0;k<tiers;k++) 
     if(temp2.thdNum%(int)(pow(2,k+1))==0) 
     { 
      qsort((temp2.lowRec), lines/(threadCount/(int)pow(2,k+1)), sizeof(struct Record),comparator); 

     } 
} 

int main(int argc, char **argv[]) 
{ 
    if (argc!=2) 
    { 
     printf("Please enter a file name"); 
     return 0; 
    } 
    threadCount =8; 

    tiers =(int)log2((double)threadCount); 
    pthread_t threads[threadCount]; 
    FILE *recordFile=fopen(argv[1], "r"); 
    char ch; 
    fseek(recordFile, 0, SEEK_END); 
    lines = ftell(recordFile); 
    fseek(recordFile, 0, SEEK_SET); 
    lines=lines/64; 

    struct Record recArr[lines]; 

    char buffer[9]; 
    char buffer2[57]; 
    for(int j=0;j<lines;j++) 
    { 
     fgets(buffer, 9, recordFile); 
     for(int i=0;i<8;i++) 
     { 
      recArr[j].key[i]=buffer[i]; 
     } 
     recArr[j].key[8]='\0'; 
     fgets(buffer2, 57, recordFile); 
     for(int i=0;i<56;i++) 
     { 
      recArr[j].data[i]=buffer2[i]; 
     } 
     recArr[j].data[57]='\0'; 
    } 
    struct ThdArg temp[threadCount]; 
    for(int i=0;i<threadCount;i++) 
    { 
     temp[i].thdNum = i; 
     temp[i].lowRec=&recArr[(lines/threadCount)*i]; 
     temp[i].hiRec=&recArr[(lines/threadCount)*(i+1)-1]; 
     pthread_create(&threads[i],NULL, threadFunc, (void *)&temp[i]); 
    } 
    for(int i=0;i<threadCount;i++) 
    { 
     pthread_join(threads[i], NULL); 
    } 

} 
+0

マージソートの実装では 'qsort()'ですか? – RoadRunner

+0

qsort()はプロジェクトの仕様に含まれていたので、そうです – BGrossman

+0

[小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-プログラム/) – alk

答えて

2

次の行:

struct Record recArr[lines]; 

は、スタック上のメモリを割り当てます。そのサイズは制限されています。 あなたは非常に大きな使用のmallocことができるファイルを読み込む場合:

#include <stdlib.h> 

typedef struct { 
    char key[KEYSIZE +1]; 
    char data[DATASIZE +1]; 
}Record; 

... 

recArr = malloc(sizeof(Record) * lines); 
... 
free(recArr); 

あなたは、配列のようにポインタを使用することができます。 (実際は同じです)

+2

'あなたは配列のようなポインタを使用することができます。 (実際、彼らは同じです) '...まあ...いいえ、彼らは同じではありません。配列はポインタに崩壊することができますが、ポインタではありません。私が考えることのできる違いの1つは、配列/ポインタに対してsizeof演算子を適用する場合です。 – HatsuPointerKun

+0

@ HatsuPointerKun:そうです。 – Peter

+0

ありがとう、このように使用するとrecArrはどのくらい正確に宣言しますか? – BGrossman

関連する問題