c++ Segmentation fault

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

azalio
Сообщения: 14

c++ Segmentation fault

Сообщение azalio »

Привет!
Никак не пойму в чем я не прав. Подскажите пожалуйста.

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

#include <cstdio>
#include <stdlib.h>

#define ARRAY 50

int BubbleSort(int *array,long len);

long int random(void);
void srandom(unsigned int seed);

int main(void)
{
        int count,i;
        unsigned seed;

        int array[ARRAY];
        int array2[ARRAY];

        printf("Input any number.\n");
        scanf("%u", &seed);

                printf("ONE");
        srandom(seed);

        for ( count = 0; count < ARRAY; count++)
        {
                array[count] = random();

                *(array2 + i) = random();
        }

        BubbleSort(array,ARRAY);
        BubbleSort(array2,ARRAY);

        for (i=0; i<=ARRAY;i++)
               printf("%d = %d\n",i,array[i]);

        for (i=0; i<=ARRAY;i++)
               printf("massiv ukazatel %d = %d\n",i,*(array2 + i));


        return 0;
}

int BubbleSort(int *array,long len)
{
        int i,j,c;
        int k=0;
        for (i=len;i>1;i--)
        {
                k=0;
                for (j=1;j<i;j++)
                if (array[j]<array[j-1])
                {
                        c=array[j];
                        array[j]=array[j-1];
                        array[j-1]=c;
                        k=1;
                }
                if (k==0) return 0;
        }
}


Компилирую так:

g++ array.cc

Получаю:

./a.out
Input any number.
5
Segmentation fault
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: c++ Segmentation fault

Сообщение elide »

а что ты хочешь сказать конструкцией

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

*(array2 + i) = random();
в условиях, когда i не инициализирована?
кстати, а какая патология мозга нужда заставила тебя написать на форум, вместо того чтобы использовать отладчик? ходят слухи, что их придумали специально для таких ситуаций.....
слава роботам!
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: c++ Segmentation fault

Сообщение d_Sun »

elide писал(а):
04.11.2005 02:01
кстати, а какая нужда заставила тебя написать на форум, вместо того чтобы использовать отладчик? ходят слухи, что их придумали специально для таких ситуаций.....


Дык форум же лучший отладчик! :) Он вам еще и объяснит что, почему и как исправить... ;)
Моя подпись сильно длинная :)
Спасибо сказали:
azalio
Сообщения: 14

Re: c++ Segmentation fault

Сообщение azalio »

elide писал(а):
04.11.2005 02:01
а что ты хочешь сказать конструкцией

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

*(array2 + i) = random();
в условиях, когда i не инициализирована?
кстати, а какая патология мозга нужда заставила тебя написать на форум, вместо того чтобы использовать отладчик? ходят слухи, что их придумали специально для таких ситуаций.....


int count,i;
Это разве не инициализация?

Почему написал - потому что опыта работы с отладчиком нет никакого. Сейчас буду смотреть.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: c++ Segmentation fault

Сообщение t.t »

int count,i;
Это разве не инициализация?
Нет. Это объявление без инициализации. Инициализация -- это присвоение значения.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: c++ Segmentation fault

Сообщение Jan2ary »

Насколько я понял ошибку вызывает строка
scanf("%u", &seed);
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
azalio
Сообщения: 14

Re: c++ Segmentation fault

Сообщение azalio »

t.t писал(а):
04.11.2005 14:10
int count,i;
Это разве не инициализация?
Нет. Это объявление без инициализации. Инициализация -- это присвоение значения.


Да, спасибо.

elide писал(а):
04.11.2005 02:01
а что ты хочешь сказать конструкцией

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

*(array2 + i) = random();
в условиях, когда i не инициализирована?
кстати, а какая патология мозга нужда заставила тебя написать на форум, вместо того чтобы использовать отладчик? ходят слухи, что их придумали специально для таких ситуаций.....


Смутило меня то, что программа валилась сразу же после scanf не доходя до цикла for.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: c++ Segmentation fault

Сообщение elide »

валилась она как раз в цикле.
просто есть такое понятие, как буфферизированный ввод/вывод.
т.е. совсем не факт, что сразу после вызова printf произойдет вывод строки на экран.....
слава роботам!
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: c++ Segmentation fault

Сообщение d_Sun »

elide писал(а):
04.11.2005 18:33
валилась она как раз в цикле.
просто есть такое понятие, как буфферизированный ввод/вывод.
т.е. совсем не факт, что сразу после вызова printf произойдет вывод строки на экран.....


На сколько я помню, если '\n' printf передается, то даже если вывод буфферезированный, вывод строки произойдет.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: c++ Segmentation fault

Сообщение elide »

d_Sun, странно, никогда про это не слышал.... но если заменить в примере автора "ONE" на "ONE\n", то эта строка действительно выводится до падения.
это особенность реализации, или про это где-то в стандарте сказано?
слава роботам!
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: c++ Segmentation fault

Сообщение d_Sun »

elide писал(а):
04.11.2005 19:58
d_Sun, странно, никогда про это не слышал.... но если заменить в примере автора "ONE" на "ONE\n", то эта строка действительно выводится до падения.
это особенность реализации, или про это где-то в стандарте сказано?


Нет, это от реализации не зависит... Это в настройках драйвера терминалов. '\n' это тот esc - символ который является сигналом вывести все содержимое буфера...

Например:

prinf ( "Hello " );
printf ( "World" );
printf ( "\n" ); Вывод произойдет только здесь!


Но это все можно поменять командой stty.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: c++ Segmentation fault

Сообщение elide »

значит я просто неправильно тебя понял... я подумал, что сама printf должна принудительно сбрасывать буфера чем-нить вроде fflush...
слава роботам!
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: c++ Segmentation fault

Сообщение sdk »

Честно - прочитал только первое сообщение, остальные - мельком :).
azalio, пользуй gdb - там есть команда bt (или backtrace), которая точно тебе скажет где вылетело :).
А прога valgrind скажет почему :).

Извините, если влез не туда/сказал не то :).
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: c++ Segmentation fault

Сообщение JK_Darien »

d_Sun писал(а):
04.11.2005 20:05

elide писал(а):
04.11.2005 19:58

d_Sun, странно, никогда про это не слышал.... но если заменить в примере автора "ONE" на "ONE\n", то эта строка действительно выводится до падения.
это особенность реализации, или про это где-то в стандарте сказано?


Нет, это от реализации не зависит... Это в настройках драйвера терминалов. '\n' это тот esc - символ который является сигналом вывести все содержимое буфера...

а разве функция setvbuf() не для этого? если не ошибаюся, то по умолчанию для stdout построчная буферизация, но ведь можно ее отменить:
setvbuf(stdout,NULL,_IONBF,0);

извините, если что-то не понял и сказал не то :)
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: c++ Segmentation fault

Сообщение d_Sun »

JK_Darien писал(а):
07.11.2005 20:11
а разве функция setvbuf() не для этого? если не ошибаюся, то по умолчанию для stdout построчная буферизация, но ведь можно ее отменить:
setvbuf(stdout,NULL,_IONBF,0);

извините, если что-то не понял и сказал не то :)


Вы говорите про буфферизацию потоков В/В, а вывод на терминал происходит через драйвер терминала...
Честно говоря - лень распинаться :), могу только в очередной раз порекомендовать:

W. Richard Stevens. Advanced Programming in the Unix Environment
Моя подпись сильно длинная :)
Спасибо сказали: