Карта сайта

Это автоматически сохраненная страница от 18.12.2012. Оригинал был здесь: http://2ch.hk/b/res/39899946.html
Сайт a2ch.ru не связан с авторами и содержимым страницы
жалоба / abuse: admin@a2ch.ru

Втр 18 Дек 2012 22:44:15
Реквест погромистов ИТТ.
Хикканы-погромисты, ай нид халп. Закончил писать сраную прогу, но она мне выдает ошибку сегментации. Язык - си. Я вообще не совсем понял, что это такое, указателей в моей проге нет, за границы массива тоже вылазить не должен. Да и вообще, вот ради примера написал такую хуйню:
#include <stdio.h>
int main()
{
int n = 4;
int a[n];
int y = -1;
a[y] = 3;
printf("a[%d] = %d\n", y, a[y]);
}

Здесь вот как раз есть выход за границы массива, но она блять какого-то хуя работает, и не выдает ошибку сегментации. Хикканы, помогите, иначе я сейчас совсем ебанусь.


Втр 18 Дек 2012 22:49:54
>>39899946
А в чём вопрос-то? Покажи, что у тебя не работает. И да, из-за того, что что-то где-то работает, не значит, что оно правильно.
c: richest намекает, что тебе пора почитать K&amp;R.

Втр 18 Дек 2012 22:50:09
Бамп. Ну же, посоны, помогите.

Втр 18 Дек 2012 22:51:15
>>39900443
Вопрос в том, что такое ошибка сегментации, и как она может быть вызвана в работе с массивами. И в частности почему прога из оп-поста работает, мы же вылезли за пределы массива?

Втр 18 Дек 2012 22:51:47
>>39900443
А показать, что не работает - там большая прога очень, хуй кто разбираться будет.

Втр 18 Дек 2012 22:52:16
Кинь-ка лучше свою прогу, а я в ней поищу ошибку.
По поводу примера: чтение из любой ячейки памяти ничем не черевато. Вот изменение - да.
Можно, например, так сделать.

printf("%i", (int*)rand()) // Вывод челого числа из случайноя ячейки памяти.
В этом нет никакой ошибки.

Втр 18 Дек 2012 22:52:29
>>39899946
Толсто.

Втр 18 Дек 2012 22:52:43
массив - это указатель на его начало, в данном случае ты обращаешься к предыдущим 4 байтам в памяти перед местом хранения массива. При попытке записи вероятнее всего выдаст ошибку, хотя может и не выдать, тут как повезет.
Считается дурным тоном.
Быдлокодер

Втр 18 Дек 2012 22:56:23
>>39900656
Бро, там очень довольно большая прога, да еще и написано моим быдлоязыком, без функций и прочего. Только циклы и условия. Задача коммивояжера, если ты в курсе что это за хуйня. Вылетает с такой ошибкой, как только я пытаюсь увеличить одну переменную в цикле, я знаю что ошибка из-за нее, но она не должна вызывать такую ошибку. Кидать?

Ты говоришь, что изменение чревато, но мы ведь и изменяем в проге из оп-поста ячейку a[-1], которой вообще по идее не должно существовать? Границы массива ведь находятся от 0-го элемента до 3-го?

Втр 18 Дек 2012 22:57:36
>>39900656
Я обосрался. Правильнее так:
int var = (int)rand();
printf("%i", *var);

Втр 18 Дек 2012 22:57:44
>>39899946
>за границы массива тоже вылазить не должен
>int y = -1;
>a[y]

Втр 18 Дек 2012 22:57:50
>>39900692
Так какого рода ошибку, как раз-таки сегментации?

Втр 18 Дек 2012 22:59:16
>>39901067
Читай оп-пост внимательнее. Это не нужная мне прога, это я просто накидал пример, когда есть выход за границы массива, но ошибки сегментации почему-то не возникает. А нужной мне проге наоборот вроде как не должно возникать выхода за границы, но ошибка возникает.

Втр 18 Дек 2012 22:59:36
>>39900692
ОП и спрашивает, почему ошибка выскакивает как повезёт.

Втр 18 Дек 2012 23:02:56
>>39900966
>Ты говоришь, что изменение чревато, но мы ведь и изменяем в проге из оп-поста ячейку a[-1], которой вообще по идее не должно существовать? Границы массива ведь находятся от 0-го элемента до 3-го?

Да. Вероятность того, что программа вылетит с сегфолтом очень мала в такой маленькой программе. Но в больший программах ты случайно можешь записать в ячейку, уже используемую другой частью программы. Вот это приводит как раз к сегфолтам и труднонаходимым ошибкам.

Втр 18 Дек 2012 23:06:18
>>39899946
ОП, не томи, давай программу!

Втр 18 Дек 2012 23:06:25
>>39899946
ОП что ты за хуйню подсовываешь оно даже не компелябельно.

Втр 18 Дек 2012 23:07:02
http://rghost.ru/42345272
Оп

Втр 18 Дек 2012 23:08:00
>>39901660
Все компилится, во всяком случае в моем gcc

Втр 18 Дек 2012 23:08:29
>>39901687
Эту хуйню ни кто качать не будет, кинь на pastebin.

Втр 18 Дек 2012 23:10:37
http://pastebin.com/P5srSFaJ

Втр 18 Дек 2012 23:12:16
>>39901957
И входной файл:

5
0 20 18 23 7
14 0 15 10 6
9 9 0 13 6
16 19 12 0 6
7 14 12 17 0

Втр 18 Дек 2012 23:14:19
>>39899946
хуйнёй маешся. пиши на js - заебёшься радоватсья.

Втр 18 Дек 2012 23:14:29
>>39901797

Я скачал. ОП, кто тебя учил ТАК писать программы?

Втр 18 Дек 2012 23:14:59
>>39901408
Но почему вообще не возникает ошибки при обращении к -1-му элементу массива? Его же вообще не существует!

Втр 18 Дек 2012 23:16:04
>>39902242
Я знаю, что я хуй, я же об этом предупреждал. Вообще не могу в функции и т.п. Знаю, что нужно научиться нормально, но сейчас время уж очень сильно поджимает.

Втр 18 Дек 2012 23:16:21
>>39902228-кун, конечно, хуйню говорит, но действительно, не стоит писать на чистом си в 2012 году.

Втр 18 Дек 2012 23:16:39
>>39901687
int n;
int assign[n][n];
int startmatrix[n][n];
int reduktmatrix[n][n];
int tekmatrix[n][n];
КАК ЭТА ХУЙНЯ МОГЛА СКОМПИЛИСТЯ?
ОП в чем заключается задача?

Втр 18 Дек 2012 23:18:40
>>39902427
Оно на Си написано, оно немного мутировало после появления плюсов.

Втр 18 Дек 2012 23:20:59
>>39902394
Отступы есть у меня в линухе, но тут она перегоняется без них.
Да. Дело в том, что nextleaf - просто счетчик. Но он является также указателем на некоторые элементы массива, например leafweight[nextleaf] и leafmarsh[nextleaf][marsh] вот из-за чего может выйти ошибка сегментации, только попроще пожалуйста?
>Так, стоп, ты такую стену кода накатал, но не отлаживал ещё ничего?
Нет, я хуй и не могу в gdb, поэтому и прошу кого-нибудь, кто может, посмотреть, как меняется nextleaf. :(

Втр 18 Дек 2012 23:21:01
>>39902287

Массив - это, по сути, указатель на место в памяти, с которого начинается размещения определенного объема данных. В случае с индексом -1 ты просто берешь данные из предыдущей ячейки памяти. Она существует. И там могут быть даные.

Втр 18 Дек 2012 23:21:44
>>39902228-кун, конечно, хуйню говорит, но действительно, не стоит писать на чистом си в 2012 году.</span>

А что советуешь почитать, и чему в первую очередь обучиться? Именно в функциях дело?

Втр 18 Дек 2012 23:22:29
>>39902287
Массив-переменная в программе воспринимается как указатель. Обращаясь к минус первому элементу, ты просто обращаешься к элементу, адрес которого должен быть на единицу меньше начала массива.

Втр 18 Дек 2012 23:22:36
>>39901058 у меня программа вообще читает число из рандомной ячейки в памяти. И всё норм.
Так же и с массивом. Если адрес переменной, находящейся в нулевом элементе массива равен 10, то адрес минус первого элемента будет 6 (т.к int занимает 4 байта обычно). И можно спокойно читать из 6ой ячейки.

Втр 18 Дек 2012 23:23:31
http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0

Втр 18 Дек 2012 23:26:02
>>39902394
>Так, стоп, ты такую стену кода накатал, но не отлаживал ещё ничего?
Да, забыл добавить, так как я хуй, и не могу в отладчики, я обычно просто вывожу промежуточные значения в printf, и смотрю, как они меняются. Всё вроде нормально работает, но из-за этого nextleaf хуита какая-то происходит с этой сегментацией.

Втр 18 Дек 2012 23:26:12
>>int INFI = 4000001;

Быстро и решительно написал мне диапазон чисел в unsigned int.

Втр 18 Дек 2012 23:26:55
>>39902840
Плюсы, например. После них любой императивный язык за полтора часа учится. А почитать, например, Шилдта.

Втр 18 Дек 2012 23:29:01
>>39902898
Во-первых, не на единицу, а на размер элемента, на 4 байта.
А во-вторых, я точно не знаю, -1 там как отрицательное число воспринимается, или как 2^32 - 1 воспринимается.

Втр 18 Дек 2012 23:30:14
>>39903228
Сделать его long?

Втр 18 Дек 2012 23:33:22
>>39903228
Зависит от компилятора же.

Втр 18 Дек 2012 23:33:42
Тред не читал.
Не динамический массив в С нельзя задавать с переменным размером.
const int N = 4;
int a[N};
Так заработает.

Втр 18 Дек 2012 23:33:46
>>39903297
Дело в том, что я вообще имею очень смутное представление об отладчиках, и как ими пользоваться. Что в них вообще можно делать? Я смогу например запустить прогу, и смотреть по шагам, как будет меняться значение этой сраной nextleaf?
Просто мне кажется, что научиться пользоваться отладчиком - это сложности уровня изучения самого языка.

Втр 18 Дек 2012 23:33:52
>>39903578

32767 - это максимум, который может держать в себе signed int. Unsigned - 65535. Очевидно, что при такой цифре здесь должен быть long.

Втр 18 Дек 2012 23:34:17
>>39899946
залей на ideone


Втр 18 Дек 2012 23:34:18
>>39903882
Очевидный скобкофикс

Втр 18 Дек 2012 23:35:35
>>39903882
Лолшто? Ты с паскалем путаешь. В си можно задавать длину статического массива переменной, другое дело, что так делать не рекомендуется, ибо в стеке места значительно меньше, чем в куче.

Втр 18 Дек 2012 23:35:55
>>39903228
зависит от платформы, дебил.

Втр 18 Дек 2012 23:36:41
>>39902911
Проще объяснить, что массив это указатель на подряд расположенные элементы в памяти.

Втр 18 Дек 2012 23:36:51
>>39901957 но все охуевают от этого говна.

Втр 18 Дек 2012 23:37:29
>>39904040
Нет, нельзя.

Втр 18 Дек 2012 23:38:29
>>39899946
массив блядь
МАССИВ НЕ МОЖЕТ БЫТЬ РАЗМЕРА n БЛЯДЬ
либо пользуйся malloc, sizeof и realloc

Втр 18 Дек 2012 23:40:41
>>39904209
Можно, только что проверил. Алсо, если бы это было невозможно, у ОПа вылезала бы ошибка компиляции, а не рантайма.

Втр 18 Дек 2012 23:40:43
>>39903888
Ох, боженьки, да ты что, никогда среды разработки не видел?
Значит так, первым делом устанавливай себе Windows8, затем студию или любую другую КРУТУЮ IDE.
А потом осознай, каким же ты был мудаком. И вообще, ты на семинары и лабы ходишь? Не верю, что вам не говорили список литературы и необходимый софт.

Втр 18 Дек 2012 23:41:49
>>39901067
Двачую. ОП не умеет в массивы.
a где i от 0 до n-1

Втр 18 Дек 2012 23:41:51
>>39904478
Хули ты там проверил, пруфы рабочести давай.

Втр 18 Дек 2012 23:42:10
>>39904155
>Прога из него и так работает, что собственно и удивляет.
Ты перетер на стеке sizeof(int) байт, но так сложилось, что перетертые данные не были востребованы, вот и ничего не упало.

Втр 18 Дек 2012 23:42:34
>>39904483
Нас как раз-таки учили работать в сраном linux, ты не поверишь. Пользоваться консольной средой разработки и консольным же отладчиком.

Втр 18 Дек 2012 23:43:04
>>39904570
Ты тоже невнимательно прочел оп-пост.

Втр 18 Дек 2012 23:43:09
>>39904478
Странно, я в свое время напарывался на это. Приходилось пользоваться маллоками и каллоками.
Черт возьми, я куда-то просрал С.

Втр 18 Дек 2012 23:44:38
>>39904286
Что ты хуйню-то несешь? У меня все проги норм так работают. Да и в этой ошибка вообще не из-за этого.

Втр 18 Дек 2012 23:45:02
>>39904071
Попизди мне тут

Втр 18 Дек 2012 23:45:05
>>39904682
ты привёл пример - я ответил
problems?
и номер элемента лежит только от нуля, а не -1. да и у массива размер не должен быть плавающим - либо сам задаёшь, либо сам выделяешь память под него. всё что я могу сказать по образцу
ОП не умеет в масствы


← К списку тредов