2014-02-20 6 views
0

Попытка написать алгоритм пузырьковой сортировки, который сортирует данные любого типа и работающий аналогично QSort в STDLIB в С.Сегментация Ошибка в Bubble Сортировка

Это код ив написано, компиляция это дает мне «Segmentation Fault» ошибка Пробовал компиляции с опцией -g для отладки GDB, который дал путь больше ошибок

as: In function `testcmp': 
(.text+0x21a): multiple definition of `testcmp' 
/tmp/cc9ULHuO.o:new.c:(.text+0x12d): first defined here 
as: In function `_fini': 
(.fini+0x0): multiple definition of `_fini' 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_info): relocation 0 has invalid symbol index 7 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_info): relocation 1 has invalid symbol index 8 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_info): relocation 2 has invalid symbol index 9 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_ranges): relocation 0 has invalid symbol index 4 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_ranges): relocation 1 has invalid symbol index 4 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_ranges): relocation 2 has invalid symbol index 5 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_ranges): relocation 3 has invalid symbol index 5 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here 
as: In function `bsort': 
(.text+0x148): multiple definition of `bsort' 
/tmp/cc9ULHuO.o:new.c:(.text+0x5b): first defined here 
as: In function `data_start': 
(.data+0x0): multiple definition of `__data_start' 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here 
as: In function `data_start': 
(.data+0x8): multiple definition of `__dso_handle' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o:(.data+0x0): first defined here 
as:(.rodata+0x0): multiple definition of `_IO_stdin_used' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here 
as: In function `_start': 
(.text+0x0): multiple definition of `_start' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o:/build/buildd/eglibc-2.18/csu/../sysdeps/x86_64/start.S:118: first defined here 
as: In function `main': 
(.text+0x245): multiple definition of `main' 
/tmp/cc9ULHuO.o:new.c:(.text+0x158): first defined here 
as: In function `_init': 
(.init+0x0): multiple definition of `_init' 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_line): relocation 0 has invalid symbol index 4 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crti.o(.debug_line): relocation 1 has invalid symbol index 5 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o:/build/buildd/eglibc-2.18/csu/../sysdeps/x86_64/crti.S:64: first defined here 
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__' 
as:(.data+0x10): first defined here 
/usr/bin/ld: error in as(.eh_frame); no .eh_frame_hdr table will be created. 
collect2: error: ld returned 1 exit status 

Любом Херес код для него

#include <stdio.h> 
#include <stdlib.h> 

static void swap(char *a, char *b, unsigned int width) 
{ 
    char tmp; 

    if (a != b) 
    { 
     while (width--) 
     { 
      tmp = *a; 
      *a++ = *b; 
      *b++ = tmp; 
     } 
    } 
} 

void bsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*)) 
{ 
    char *lo, *hi; 
    unsigned int i,j; 

    if(num<2 || size == 0) return; 

    for(i = 1; i <= num; i++) 
    { 
     for(j = 1; j <= num - i - 1; j++) 
     { 
      lo = (char *)base + size * (j-1); 
      hi = (char *)base + size * j; 

      if(compar(lo, hi) > 0) 
       swap(lo, hi, size); 
     } 
    } 
} 

int testcmp(char **a, char **b) 
{ 
    return strcmp(*a, *b); 
} 

typedef int (*b_compare)(const void *a, const void *b); 

int main(int argc, char *argv[]) 
{ 
    char *ass[] = {"nabsdb", "asdjkhasd", "asdasdk", "ierik"}; 
    bsort(ass,4,sizeof(char *),(b_compare)testcmp); 


    return 0; 
} 

Я нахожусь угадываю что-то делать с гольцов указателями, я сделал поиск много и судил много вопросов на самом Stack Overflow, Помоги мне

Что я получил от GDB, на самом деле не привыкли использовать GDB много

(gdb) step 
30    lo = (char *)base + size * (j-1); 
(gdb) step 
31    hi = (char *)base + size * j; 
(gdb) print lo 
$3 = 0x7fffffffe370 "d\[email protected]" 
(gdb) print *lo 
$4 = 100 'd' 
(gdb) step 
33    if(compar(lo, hi) > 0) 
(gdb) step 
testcmp (a=0x7fffffffe370, b=0x7fffffffe378) at new.c:41 
41  return strcmp(*a, *b); 
(gdb) step 
__strcmp_ssse3() at ../sysdeps/x86_64/multiarch/../strcmp.S:180 
180 ../sysdeps/x86_64/multiarch/../strcmp.S: No such file or directory. 
(gdb) step 
181 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
183 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
184 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
205 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
206 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
207 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
208 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
209 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
210 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
211 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
212 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) step 
233 in ../sysdeps/x86_64/multiarch/../strcmp.S 
(gdb) bt 
#0 __strcmp_ssse3() at ../sysdeps/x86_64/multiarch/../strcmp.S:233 
#1 0x0000000000400683 in testcmp (a=0x7fffffffe370, b=0x7fffffffe378) 
    at new.c:41 
#2 0x000000000040060d in bsort (base=0x7fffffffe370, num=4, size=8, 
    compar=0x40065a <testcmp>) at new.c:33 
#3 0x00000000004006cf in main (argc=1, argv=0x7fffffffe478) at new.c:49 
(gdb) 
+2

Какова полная команда, которую вы использовали для компиляции ваших материалов? Похоже, вы пытаетесь связать свой код дважды. Таким образом, вы скрываете свою проблему segfault за другой проблемой! : -s – zmo

+0

@zmo gcc filename.c -o -g exec. Хотя gcc filename.c -o exec отлично работает, Но я уверен, что его проблема с кодом –

+6

try 'gcc file.c -g -o exec' аргумент' -o' ожидает параметра сразу после него. После того, как вы скомпилируете его, запустите 'gdb./Exec' и в командной строке gdb' run', пока не достигнете краха сбоя сегментации, а затем введите 'bt' и вставьте файл' bt' в свой вопрос. – zmo

ответ

1

Программа, скорее всего, переходит к testcmp() Ссылка на NULL.

Разъявление этого документа приводит к нарушению сегрегации.


Btw: Массивы в C на основе 0. Доступ к C-массивам 1 st элемент выполнен с использованием 0 в качестве индекса.

+0

проверит, спасибо :) –

+0

Попытка исправить это, опубликует любое обновление –

0

Вы должны быть прикреплены в этом же файле дважды! Используете ли вы терминал для компиляции кода? Проверьте, указано ли имя файла дважды в нем.

+0

нет, это не проблема, спасибо, хотя –

0

У вас есть num = 4. У меня будут значения от 1 до num. Что происходит, когда i == num? Петля для j пытается выполнить итерацию (j = 1; j < = num - i - 1; ++ j). Когда i == num, он становится для (j = 1; j < = num - num - 1; ++ j) или для (j = 1; j < = -1; ++ j). Но ваши номера без знака int. Таким образом, -1 является неподписанным int, и поскольку нет отрицательных чисел без знака, -1 превращается в максимально возможное беззнаковое int. Таким образом, ваша петля

for (j = 1; j <= many billions; ++j) 

и, конечно же, сбой.

+0

ах! я вижу, что я сделал неправильно, спасибо: D –

+0

Это все еще не исправить, странно –

0

Проблема в вашей петле for в функции bsort. Вы пытаетесь получить доступ к памяти из пределов массива, переданного в bsort, в функцию strcmp в testcmp. Измените for петли на:

// inside bsort function 
unsigned int i, j; 

for(i = 0; i < num-1; i++) {  
    for(j = i+1; j < num; j++) { 
     lo = (char *)base + size * (j-1); // from base[0] to base[num-2] 
     hi = (char *)base + size * j;  // from base[1] to base[num-1] 
     if(compar(lo, hi) > 0) 
      swap(lo, hi, size); 
    } 
} 

Кроме того, включить файл string.h заголовка для strcmp прототипа.

0

Вы получили ответ на отступ от сегментации, поскольку переменная b в strcmp(*a, *b) в какой-то момент вернулась (null). См. Ниже значения a и b перед вызовом strcmp (*a, *b). Вы заметите, что он не удался, когда b был (null).

The value of a is nabsdb and b is asdjkhasd 
The value of a is nabsdb and b is asdasdk 
The value of a is asdjkhasd and b is asdasdk 
The value of a is asdasdk and b is asdjkhasd 
The value of a is asdjkhasd and b is nabsdb 
The value of a is nabsdb and b is ierik 
The value of a is nabsdb and b is (null) 
Segmentation fault (core dumped) 
+0

спасибо за подробное объяснение: D –

Смежные вопросы