Segmentation fault

Модератор: Модераторы разделов

JelF
Сообщения: 62
ОС: Debian

Segmentation fault

Сообщение JelF »

Код: Выделить всё

jelf@sec:~/c&cpp$ g++ isl.cpp
^C
jelf@sec:~/c&cpp$ '/home/jelf/c&cpp/a.out'
Enter size    2
2
Segmentation fault


Код:

#include <iostream> static int n,m; static bool** pMap; typedef bool* pBool; static void delE(int x, int y) { pMap[x][y]=false; if(x>0) if(pMap[x-1][y]) delE(x-1,y); if(y>0) if(pMap[x][y-1]) delE(x,y-1); if(x<n-1) if(pMap[x+1][y]) delE(x+1,y); if(y<m-1) if(pMap[x][y+1]) delE(x,y+1); } int main(int argc,char* argv[]) { std::cout<<"Enter size\t"; std::cin>>n>>m; std::cout<<"Enter map"; pMap=new pBool[n]; int i,j; for(i=0;i<n;i++) { pMap[i]=new bool[m]; for(j-0;j<m;j++) std::cin>>int(pMap[i][j]); } int count=0; for(i=0;i<n;i++) for(j=0;j<m;j++) if(pMap[i][j]) { delE(i,j); count++; } for(i=0;i<n;i++) delete pMap[i]; delete pMap; return 0; }


чем может быть вызвана такая ошибка и как с ней боротся?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Segmentation fault

Сообщение NickLion »

Код: Выделить всё

static bool delE(int x, int y)
{
    pMap[x][y]=false;
    if(x>0) if(pMap[x-1][y]) delE(x-1,y);
    if(y>0) if(pMap[x][y-1]) delE(x,y-1);
    if(x<n) if(pMap[x+1][y]) delE(x+1,y);
    if(y<m) if(pMap[x][y+1]) delE(x,y+1);
}

:) внимательнее присмотритесь, надо:

Код: Выделить всё

static bool delE(int x, int y)
{
    pMap[x][y]=false;
    if(x>0) if(pMap[x-1][y]) delE(x-1,y);
    if(y>0) if(pMap[x][y-1]) delE(x,y-1);
    if(x<n-1) if(pMap[x+1][y]) delE(x+1,y);
    if(y<m-1) if(pMap[x][y+1]) delE(x,y+1);
}
Спасибо сказали:
JelF
Сообщения: 62
ОС: Debian

Re: Segmentation fault

Сообщение JelF »

точно.

но ругается она до этого тк нет вывода
std::cout<<"Enter map";
Спасибо сказали:
arch
Сообщения: 74
ОС: freebsd/arch

Re: Segmentation fault

Сообщение arch »

как с ней боротся?

gdb(компилить с -ggdb)
Спасибо сказали:
JelF
Сообщения: 62
ОС: Debian

Re: Segmentation fault

Сообщение JelF »

Код: Выделить всё

jelf@sec:~$ g++ 'c&cpp/isl.cpp' -ggdb
jelf@sec:~$ dir 'c&cpp'
a.out  islands.c~  isl.cpp  isl.cpp~
jelf@sec:~$ 'c&cpp/a.out'
Enter size    2 2
Segmentation fault
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 460
ОС: openSUSE

Re: Segmentation fault

Сообщение Фантом »

Кстати, в этой вот строке

Код: Выделить всё

for(j-0;j<m;j++) std::cout<<int(pMap[i][j]);

в "j-0" есть какой-то глубокий смысл? :crazy:
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Segmentation fault

Сообщение NickLion »

1. arch вам посоветовал использовать отладчик ;) а вы лишь добавили отладочную информацию.
2. Фантом похоже указал истинную причину, надо =.
3.
но ругается она до этого тк нет вывода
std::cout<<"Enter map";
это же буферизированные операции ввода-вывода, тут нельзя быть уверенным. Там не все так просто, ввод и вывод между собой синхронизируются, но вот после std::cout<<"Enter map"; не факт, что оно что-то выведет на экран. чтобы гарантировать это попробуйте std::cout<<"Enter map"<<endl;.
4. Ну и напоследок - delete pMap нехорошо, все-таки выделили массив - delete [] pMap. Я понимаю, что для данного примера разницы нет, т.к. элементы не классы, но лучше приучить себя сразу писать правильно.

PS чуть не забыл - а какова цель этой программы? Просто она сначала ВЫводит неинициализированный массив, затем "очищает" - заполняет false, вызывая delE для каждой ячейки, которая волной чистит ограниченную 0 область матрицы...
Спасибо сказали:
JelF
Сообщения: 62
ОС: Debian

Re: Segmentation fault

Сообщение JelF »

Глубокий смысл этой программы в том чтобы посчитать количество "островов" из ячеек типа true.

за for спасибо.

А что же всетаки означает эта ошибка?
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: Segmentation fault

Сообщение Sleeping Daemon »

JelF писал(а):
17.11.2008 22:27
Глубокий смысл этой программы в том чтобы посчитать количество "островов" из ячеек типа true.

за for спасибо.

А что же всетаки означает эта ошибка?

for(j-0;j<m;j++) std::cout<<int(pMap[i][j]);
Вот в этой строке, j на момент выполнения чему равно, как Вы думаете?
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 460
ОС: openSUSE

Re: Segmentation fault

Сообщение Фантом »

JelF писал(а):
17.11.2008 22:27
Глубокий смысл этой программы в том чтобы посчитать количество "островов" из ячеек типа true.

за for спасибо.

А что же всетаки означает эта ошибка?


В данном случае - почти наверняка вылезание за границы массива.
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Segmentation fault

Сообщение Reboot »

JelF писал(а):
16.11.2008 15:56
чем может быть вызвана такая ошибка и как с ней боротся?
если все ещё не знаешь => не искал ;) инфы про неё... тьма
segfault — ошибка, возникающая из-за обращения к недоступным для записи участкам памяти или при попытке изменения памяти нехорошими методами.
КМК, одна из самых неприятных ошибок, которая возникает в самый не подходящий момент.
Мой компьютер зовут Марвин
Спасибо сказали:
JelF
Сообщения: 62
ОС: Debian

Re: Segmentation fault

Сообщение JelF »

Огромное спасибо
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Segmentation fault

Сообщение NickLion »

Извиняюсь, что поздно отвечаю, но
Глубокий смысл этой программы в том чтобы посчитать количество "островов" из ячеек типа true.

вопрос был в том, что сначала массив выводится, а начальные значения не заданы...
Спасибо сказали:
JelF
Сообщения: 62
ОС: Debian

Re: Segmentation fault

Сообщение JelF »

перечитайте пожалуйста код
Спасибо сказали: