2011-03-20 11 views
7

कुछ प्रस्तावना: मैं एक कंप्यूटर इंजीनियरिंग छात्र जावा में 3 सेमेस्टर (डेटा संरचनाओं तक) के बाद सी में प्रथम श्रेणी ले रहा हूं। यह प्रश्न होमवर्क असाइनमेंट के संबंध में है, लेकिन मेरे लिए इसे हल करने से कुछ कदम हटा दिए गए हैं।तारों की एक सरणी को क्रमबद्ध करने के लिए stdlib के qsort() का उपयोग

मेरे पास एक इनपुट फ़ाइल है जिसे मैंने स्मृति में पढ़ा है जैसे कि यह char [9] [500] में संग्रहीत है। मैंने अधिकतम लंबाई 8 के अधिकतम 500 तारों में पढ़ा है। मैं qsort() फ़ंक्शन में निर्मित stdlib का उपयोग करके इस सरणी को सॉर्ट करने का प्रयास कर रहा हूं, और इसमें कुछ मेमोरी त्रुटियां हैं I कोड की

महत्वपूर्ण स्निपेट:

char data[4][500][60]; 
char debug[500][9]; 
size_t count = 0; 

/* initialize file, open for reading */ 
FILE* pUserlog; 
pUserlog = fopen("userlog","r"); 

while(!feof(pUserlog)) 
{ 
    fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]); 
    fgets(data[3][count], 60, pUserlog); 
    count++; 
} 

यह खंड विन्यास में, डेटा पढ़ता है। इस भाग में रुचि की सरणी "डीबग" है। यह ऊपर निर्दिष्ट सरणी है।

int compare(const void* a, const void* b) 
{ 
    const char **ia = (const char **)a; 
    const char **ib = (const char **)b; 
    puts("I'm in compare!"); 
    return strncmp(*ia, *ib,8); 
} 

यह qsort कॉल करने के लिए मेरे प्रयास है:

size_t debug_len = sizeof(debug)/sizeof(char*); 
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*)); 
qsort(debug,count, sizeof(char *), compare); 

मैं अपने कॉल में debug_len प्रतिस्थापन जहां गिनती है प्रयास किया, लेकिन मैं अभी भी segfaulting हूँ यहाँ qsort के लिए मेरी तुलना कार्य है। यहां आउटपुट है:

 
$ ./test 
debug len: 1125, count: 453, sizeof(char*): 4 
I'm in compare! 
Segmentation fault (core dumped) 

धन्यवाद!

+0

जबकि (! Feof()) गलत है। फीफ झूठी वापसी करेगा, लूप दर्ज किया जाएगा, स्कैनफ डेटा पढ़ने में असफल हो जाएगा, डीबग [गिनती] में फर्जी डेटा होगा, और फिर फीफ सच हो जाएगा। आप इस मामले को गिनती करके ठीक कर सकते हैं - लूप के बाद, लेकिन आम तौर पर आपको बस कभी नहीं करना चाहिए (!feof()) –

+1

यह segfault कहां है? यह निर्धारित करने के लिए कोर डंप की जांच करने के लिए एक अच्छा अभ्यास है कि सीगफॉल्ट कहां होता है, क्योंकि आमतौर पर आपको यह बताता है कि समस्या क्या है। –

उत्तर

8

तुलना समारोह तत्वों है कि तुलना में किया जा रहा है की ओर इशारा प्राप्त होगा। आप प्रभावी रूप से strncmp() का उपयोग कर वर्णों की तुलना करने की कोशिश कर रहे हैं। चूंकि आपके पास प्रत्येक स्ट्रिंग के पॉइंटर्स हैं, इसलिए इसे char * पर डालें और इसकी तुलना करें।

int compare(const void* a, const void* b) 
{ 
    const char *ia = (const char *)a; 
    const char *ib = (const char *)b; 
    puts("I'm in compare!"); 
    return strncmp(ia, ib, 9); 
} 

याद रखें, यह एरे की एक सरणी है, पॉइंटर्स की एक सरणी नहीं है। तो तत्व का आकार सरणी का आकार होना चाहिए, 9 और पॉइंटर, 4 का नहीं होना चाहिए। इस बिंदु पर, sizeof debug[0] का उपयोग करना आसान होगा क्योंकि यह एक द्वि-आयामी सरणी है। यदि आप सही आकार के साथ ऐसा नहीं करते हैं, तो qsort() आपकी सरणी को नष्ट कर देगा।

size_t elemsize = sizeof debug[0];  /* 9 - size of each element */ 
size_t count = sizeof(debug)/elemsize; /* 500 - number of elements in array */ 
qsort(debug, count, elemsize, compare); 
3

यहां क्या होता है: आपके पास 500 स्ट्रिंग हैं। अब आप सभी 500 से qsort पास करते हैं, और यह बदले में प्रत्येक को आपके तुलनात्मक कार्य में पहले और दूसरे तर्क के रूप में पास करता है। यह लिखने जैसा थोड़ा सा है:

compare(debug[0], debug[1]) 

सी कंपाइलर पते के वास्तविक मानों को नहीं, पते को पास करता है। लेकिन अब आप पॉइंटर-टू-पॉइंटर-टू-चार के रूप में पॉइंटर-टू-शून्य को समझते हैं। strncmp पर कॉल करते समय आपका कोड अब एक अव्यवस्था करता है, लेकिन मान (पहले 4 बाइट्स) को strncmp में पॉइंटर के रूप में माना जाता है। लेकिन अब बदले में कचरा "पॉइंटर" (जिसमें आपके तारों में से एक का हिस्सा शामिल है) को हटाने की कोशिश करेगा और इससे बैंग बन जाएगा।

इसे ठीक करने के char ** के बजाय char * का उपयोग करें:

int compare(const void* a, const void* b) 
{ 
    puts("I'm in compare!"); 
    return strncmp((const char *)a, (const char *)b, 8); 
} 
+0

एस/strncpy/strncmp/ –

+0

@ जिम बाल्टर: धन्यवाद, मैंने अपना जवाब सही कर दिया है। – DarkDust

संबंधित मुद्दे