LINUX.ORG.RU

[C++] вот какие бывают ошибки...

 


0

1

Пишет мне давеча один товарищ (в приципе довльно грамотный):

********************************

У меня в программе есть странный кусок:

 
for(int i=n_min+1;i++;i<n_max){ 
   df=h*( (1.-cells[i][0])*dz_*(cells[i][2]-cells[i-1][2])-cells[i [2]*dz_*(cells[i][0]-flast)+cells[n_min][4]/rho_s );     
   flast=cells[i][0]; 
   cells[i][0]+=df; 
} 

Если закомментировать строчку cells[0]+=df; то все нормально работает. Иначе непонятно что делается 4-5 минут. Притом на время не влияет количество элементов в цикле, например в такой записи

for(int i=10;i++;i<11){ ...

непонятно что делается 5 минут. Притом, если убрать цикл и поставить руками int i=10, то все прекрасно выполняется.

У Вас нет идей, что тут может происходить?

**********************************************

Ну при встрече сели разбираться, я замотанный, глаз замыленный... полчаса втыкал всякую диагностику - чудеса творятся! Когда понял... нну в общем да, хотел задушить;-) Интересно, что ТАКОЕ было в нескольких местах, и я когда показал одному гуру - тот тоже долго тупил, пока я пальцем не тыкнул. Во как иногда глючит... ;-))))

★★★★★

> int i=n_min+1;i++;i<n_max

а что там смотреть - быдлокод и все

aho
()
Ответ на: комментарий от tailgunner

> А в цикле инкремент и должен стоять на месте условия?
А что тебя не устраивает?! Вполне же допустимый код.

rival ★★
()
Ответ на: комментарий от rival

>> А в цикле инкремент и должен стоять на месте условия?

А что тебя не устраивает?!

Меня не устраивают "?!" в вопросе. Я таких эмоциональных недоумков в игнор-лист заношу.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Меня не устраивают "?!" в вопросе.
Бгг, я знал. Хотя ты это уже не увидишь.

rival ★★
()

i типа инкрементируется до полного переполнения и потом цикл останавливается? И на это 5 минут?

yoghurt ★★★★★
()

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

сегодня только в iptables забыл снять "!" перед йпишником и, будучи уверенным что в таблицах прописано разрешительное правило, уже начал крыжить mac адреса и пинать железо.

опосля пил чай и чувствовал себя идиотом некоторое время

VladimirMalyk ★★★★★
()
Ответ на: комментарий от tailgunner

хех, чегодня четверть часа искал if(!map[«key»]==«value»])

глаз замыливается, да ещё эта фича мозгов с пряокодм бкув не помогает в поисках мягко говоря.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

я в 1С коде однажды достаточно маялся.
оказалось, что местами в качестве переменной использовалась латинская «c», а местами кириллическая «с» - как две капли воды одна на другую похожи. а поскоку в 1С типизация динамическая и новую переменную ставь где хошь...
таким образом, однажды прощелкав раскладку клавиатуры, я чуть было не собрался в желтый дом ))

VladimirMalyk ★★★★★
()
for(int i=n_min+1;i++;i<n_max){ 

сильный ход, однако :)

shty ★★★★★
()
Ответ на: комментарий от VladimirMalyk

типизация динамическая

и

новую переменную ставь где хошь

совершенно несвязанные вещи.

baverman ★★★
()
Ответ на: комментарий от rival

> А в цикле инкремент и должен стоять на месте условия?

А что тебя не устраивает?! Вполне же допустимый код.

месье не различает синтаксические и логические ошибки?

shty ★★★★★
()
Ответ на: комментарий от VladimirMalyk

я в 1С коде однажды достаточно маялся. оказалось, что местами в качестве переменной использовалась латинская «c», а местами кириллическая «с»

отсюда мораль: каждая переменная должна называться осмысленно, а не i, b, a, c, n и т.д.

в 1С типизация динамическая и новую переменную ставь где хошь

не вижу связи

shty ★★★★★
()
Ответ на: комментарий от shty

> месье не различает синтаксические и логические ошибки?
Месье издевается над шизофренией, не обращайте внимания на него, сударь.

rival ★★
()
Ответ на: комментарий от rival

> месье не различает синтаксические и логические ошибки?

Месье издевается над шизофренией, не обращайте внимания на него, сударь.

оу, месье знает толк в извращениях :)

shty ★★★★★
()
Ответ на: комментарий от shty

> каждая переменная должна называться осмысленно, а не i, b, a, c, n и т.д.

это был безобидный счетчик среди привычных Документы.РасходнаяНакладная.Дата
к тому ж в 1С применение для счетчиков односимвольных переменных есть нормальный стиль кодирования

не вижу связи


я не корректно выразился - нельзя было внятно понять в какой момент появилась та же латиническая с.
ибо совсем неочевидно что в строке c = с + 1 переменная с вовсе не инкрементируется, а создается новая переменная c

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

это был безобидный счетчик

я чуть было не собрался в желтый дом

ога, ога :) первый подход к решению данной проблемы - осознание факта что «безобидных счётчиков» не бывает

совсем неочевидно что в строке c = с + 1 переменная с вовсе не инкрементируется, а создается новая переменная c

там запрещены конструкции вида c+=1?

//это не критика, сам вляпывался в смешные ситуации :)

shty ★★★★★
()
Ответ на: комментарий от shty

> ога, ога :) первый подход к решению данной проблемы - осознание факта что «безобидных счётчиков» не бывает

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

ам запрещены конструкции вида c+=1?


не взлетит на сколько помню

VladimirMalyk ★★★★★
()
Ответ на: комментарий от legolegs

> хех, чегодня четверть часа искал if(!map[«key»]==«value»])

Ну это другое дело. По-моему, у любого ветерана-наСильника на уровне рефлексов заложено, что инкремент идет последним. Чтобы сделать сабжевую ошибку, нужно было кодить в состоянии измененного сознания.

tailgunner ★★★★★
()
Ответ на: комментарий от VladimirMalyk

Отсюда мораль - не используйте ЯП, где допускаются русские индентификаторы;-))))

Да цикл до переполнение инта и потом до нуля, весь диапазон... Если посл строку закомментить, за счет оптимизации видимо цикл просто выбрасывается. Но какая инертность мышления то - ладно в тексте человек воспринимает слово по набору букв, игнорируя в большинстве случаев их порядок, но что б в коде так... В математических формулах ведь не так (сразу ошибку ловишь), хотя там объем гораздо меньше.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

> не используйте ЯП, где допускаются русские индентификаторы;-))))

предметная область 1С такова, что конечности нужно отрывать за идентификаторы латинские ))

VladimirMalyk ★★★★★
()

OMG!! OMG!!

убери кал «for(int i=n_min+1;i++;i<n_max){»

for(int i=n_min+1;i<n_max;++i){

ckotinko ☆☆☆
()
Ответ на: комментарий от AIv

Отсюда мораль - не используйте ЯП, где допускаются русские индентификаторы;-))))

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

Если посл строку закомментить, за счет оптимизации видимо цикл просто выбрасывается.

есть мнение, что дело не в оптимизации, всё время в том цикле указатель гуляет по «левой» памяти (ну и пускай - не запрещено, с точки зрения отламывания ног), а вот в последней строчке происходит попытка записать в непонятный кусок памяти информацию - тут-то они родимые и подкашиваются

shty ★★★★★
()
Ответ на: комментарий от shty

Вообще да, я тоже не пойму как сегфолт не вылетел...

Отсюда мораль - не используйте ЯП, где допускаются русские индентификаторы;-))))

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

Есть гипотеза, что наши программисты круче чем их программисты, потому что для наших английский не родной. Когда видишь for или while они нашими (и индусами;-)))) воспринимаются однозначно, в отличии от носителй языка. Ну кто пробовал писать в школе на алгоритмичском языке, тот поймет;-) Любая наука стремится обзавестить своей терминологией, и хорошо когда эта терминология ортогональна бытвому языку. Я вот невоспринимаю философские тесты в частности потому, что там вроде бытовые слова используются как термины и ХЗ как их трактовать каждый раз... ;-)))

AIv ★★★★★
() автор топика
$ cat > qwe.c
int f(int i){
int j;
for (j = 0; j++; j<i) {}
return j;
}
$ gcc -c -Wall qwe.c 
qwe.c: В функции ‘f’:
qwe.c:3:1: предупреждение: оператор без побочного эффекта

ЧЯДНТ?

geekless ★★
()
Ответ на: комментарий от geekless

> ЧЯДНТ?

выключи их немедленно!, алсо мне непонятно, как ТС «полчаса втыкал всякую диагностику» и не заметил, что i «шагает» дальше n_max

aho
()
Ответ на: комментарий от legolegs

>хех, чегодня четверть часа искал if(!map[«key»]==«value»])

Это ещё фигня... Вот когда с разными языками до того допрыгаешься, что передаёшь в функцию на PHP выражение, держа в глубине сознания, что оно вычислится только если понадобится внутри функции - это уже да, «замыливание мозга» :D - http://balancer.ru/tech/forum/2011/03/t68668--gy-epicheskaya-oshibka-na-php-v...

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Я передавал в функции на PHP строки, которые там eval-ились по мере необходимости. Такой уж был код, что очень функциональщины хотелось, да.

geekless ★★
()
Ответ на: комментарий от tailgunner

>По-моему, у любого ветерана-наСильника на уровне рефлексов заложено, что инкремент идет последним.

Тем не менее, я один раз сам перепутал порядок операндов :) К счастью, там была такая жесть, что ошибка сразу всплыла. И, таки да, я кодил тогда практически не осознавая что делаю :) Сильно о чём-то задумавшись.

KRoN73 ★★★★★
()

i++;i<n_max

Она так и должна сначала сравниваться потом тутже увеличиваться? просто если размер cells = n_max он разве не вылезет последней ходкой за грани? 10++;10<11 и дальше i везде 11 а по условию должно быть меньше)

Пните если туплю, не спал 2 суток.

mrcim
()
Ответ на: комментарий от Tanger

Жесткий аватар, я бы не писал строку «using namespace std», а просто добавил «std::» к cout и endl. 20 символов против 10)

mrcim
()
Ответ на: комментарий от mrcim

Не.. по вертикали места еще хватало..
А это std:: целых пять символов по ширине хавает. нафиг.
И так пришлось шрифт 9 поставить (вроде, не помню уже)

Tanger ★★★★★
()
Ответ на: комментарий от AIv

>бытовые слова используются как термины и ХЗ как их трактовать каждый раз... ;-)))
относись к ним по-философски ;)))
а что, значения терминов сильно противоположны их бытовым значениям?

xydo ★★
()
... cells[i [2]*dz_* ... <- WTF????

Острый дисбаланс скобок детектед. Я хз, что здесь происходит, но это явно попадает под определение undefined behaviour. Дальше парсить просто не стал

Автора кода бить по рукам линейкой до тех пор, пока не поймёт, что С++ - это не perl, и не отрефакторит этот ужас до приемлемого состояния

Zloddey
()
Ответ на: комментарий от Zloddey

> хз, что здесь происходит

В смысле, во что компилятор разворачивает этот (некорректный) код

Zloddey
()
Ответ на: комментарий от Zloddey

Это я очепятался когда постил, сорри, всегда после cells[i] должно быть

Автора кода бить по рукам линейкой до тех пор, пока не поймёт, что С++ - это не perl, и не отрефакторит этот ужас до приемлемого состояния

В моделировании и не такие кракозябры встречаются, это еще ничего, а вот схемы для гидродинамики...

AIv ★★★★★
() автор топика
Ответ на: комментарий от xydo

> а что, значения терминов сильно противоположны их бытовым значениям?

У философов они по момему ничего общего не имеют. А так... когда соотвествуют еще хуже - полного соотвествия же не бывает, а обычно важны как раз нюансы.

AIv ★★★★★
() автор топика

> Пишет мне давеча один товарищ (в приципе довльно грамотный):

Настолько грамотный, что игнорирует предупреждения компилятора? Ведь он учёный и сам лучше знает?

anonymous
()
Ответ на: комментарий от AIv

А вы настолько грамотный, что не знаете про -Werror? Поздравляю, продолжаете поддерживать дисциплину и качество кода.

anonymous
()
Ответ на: комментарий от anonymous

Как ярому попобрнику расовой чистоты, я Вам могу сообщить, что часть сообщений валится напр с модулей нагенеренных swig-ом, поетому с -Werror оно скорей всего не соберется. Чиста ЛОР-овский обычай, делать глубочайшие умозаключения об уровне собеседника на основе трех строчек кода. Поздравляю, Вы достойный представитель местной фауны!

Пост вообще был не про то. Я могу напр отметить, что с т.з. правил русского языка, анонимус должен писаться с большой буквы;-)))))

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

> я Вам могу сообщить, что часть сообщений валится напр с модулей нагенеренных swig-ом, поетому с -Werror оно скорей всего не соберется

возможно что-то вроде такого поможет:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-WAll"

// подключение генереных модулей
...

#pragma GCC diagnostic pop

но конечно это тоже некрасиво, захламлять код прагмами

aho
()
Ответ на: комментарий от AIv

> Как ярому попобрнику расовой чистоты, я Вам могу сообщить, что часть сообщений валится напр с модулей нагенеренных swig-ом, поетому с -Werror оно скорей всего не соберется.

Внезапно (sic!), разные файлы и модули можно собирать с разными флагами и опциями компилятора.

Чиста ЛОР-овский обычай, делать глубочайшие умозаключения об уровне собеседника на основе трех строчек кода. Поздравляю, Вы достойный представитель местной фауны!

Поздравляю, вы действительно очень оригинальны: «смотрите, тут быдлокод, который не работает, и мне не хватило ума быстро найти ошибку». Офигенно, да. Вы что сказать-то этим хотели? Что сами не можете найти простые ошибки, да ещё и не собираетесь принимать меры для их неповторения (к примеру, -Wall -Werror -Wextra -pedantic)? Судя по вашим постам - именно так. Так что умозаключения всё-таки имееют основу под собой и отчасти верны.

Пост вообще был не про то. Я могу напр отметить, что с т.з. правил русского языка, анонимус должен писаться с большой буквы

С точи зрения русского языка вопросительные предложения обозначаются вопросительным знаком в конце предложения. Вопросительные предложения, как можно догадаться из них названия, ничего не утверждают, а просто «спрашивают». Verstehen? Я ничего не утвержал, я задал вопросы

;-)))))

О, быдлосмайлы с кучей скобочок? Это что здесь делает? Несёт какую-то смысловую нагрузку и имеет отношение к коду на С++?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.