На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
if (counter =! 0 ) {
"Любая случайная последовательность символов является корректной С-программой"...
И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>"Любая случайная последовательность символов является корректной С-программой"... LVV>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС! LVV>
ЧУДОВИЩНО! УЖАСНО! А еще! Можно перепутать < и >! Это безобразие! Будь прокляты Ричи и Керниган! Как они могли! Доколе!
Of course, the code must be complete enough to compile and link.
Здравствуйте, LaptevVV, Вы писали:
LVV>Он не путает. Это — простая описка. Бывает, что при наборе слова буквы наоборот напечатаешь. Здесь именно тот случай...
Не, ну а если он 91 вместо 19 напишет, компилятор тоже должен выдать ошибку? Требовать от языка, чтобы он был устойчивым к перестановке букв при наборе слова, это уже чересчур, может он еще и самокорректирующимся должен быть?
Здравствуйте, shasa, Вы писали:
S>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>>
LVV>> if (counter =! 0 ) {
LVV>>
S>Напиши пару-тройку нужных людям и работающих программ, а потом пиши такое. Я уверен что на других языках можно найти примеры похожего характера.
Я писал пару-тройку полезных программ еще в то время, когда вас даже в проекте не было. Яйца курицу — не учат.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>>
LVV>> if (counter =! 0 ) {
LVV>>
LVV>>"Любая случайная последовательность символов является корректной С-программой"... LVV>>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС! LVV>>
A>Ну вот тебе код из программы, на которой скорее всего была разведена твоя материнка:
A>if( некая_функция( некие_параметры ),true )
A>Это работало несколько лет, потом случайно нашли.
Вот именно! Язык НЕ ДОЛЖЕН ПОЗВОЛЯТЬ писать подобные вещи.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, MasterZiv, Вы писали:
MZ>On 10.01.2011 14:02, LaptevVV wrote:
>> Более просты, наверное, нет. А вот простые и более надежные — есть. Компонентный >> паскаль — Оберон. Там невозможно совершить подобных ошибок по по определению.
MZ>От них тошнит только.
Возможно, программирование — не ваша профессия?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>Вот именно! А то вы невнимательно читаете. Начинающий — РЕШАЛ ЗАДАЧУ! И все с логикой и алгоритмизацией у него было в порядке. А язык подложил ему БОЛЬШУЮ СВИНЬЮ! И это — ЗЛО! LVV>Больше спорить не буду.
И не надо, так как пример ваш — дрянь. Ладно бы человек нахреначил чего-то там с памятью или указателями, а тут он тупо операторы путает. Этак он и плюс с минусом или -= с =- попутает а вы будете орать, какое С — лютое зло.
Of course, the code must be complete enough to compile and link.
Здравствуйте, ononim, Вы писали:
A>>>Это работало несколько лет, потом случайно нашли. LVV>>Вот именно! Язык НЕ ДОЛЖЕН ПОЗВОЛЯТЬ писать подобные вещи. O>вообще меня удивляет то что люди считают ошибки в стиле
if (counter =! 0 )
или даже проблемы с выделением/освобождением памяти корнем зла. На моей практике в достаточно больших проектах получить на руки баг с access violation это же просто кодерское щасте. 90% реальных (не учебных!) проблем — разборки с тн "бизнес" логикой.
Дело в том, что данный оператор присваивания был написан начинающим в учебной программе. И он спрашивал на Винграде, почему среднее арифметическое не вычисляется. То есть, ЭТО ПРОСТО ОПИСКА. Чел правильно разобрался в алгоритме, правильно написал всю функцию, то есть ПРАВИЛЬНО РАЗОБРАЛСЯ с бизнес-логикой вычисления среднего арифметического последовательности чисел. И сделал ДУРАЦКУЮ ОПИСКУ. Естественно, поиски ошибки в логике программы ничего не дали.
Поэтому для начинающих язык С — зло! Причем в сочетании с со студией — зло практически АБСОЛЮТНОЕ!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
A>>Это работало несколько лет, потом случайно нашли. LVV>Вот именно! Язык НЕ ДОЛЖЕН ПОЗВОЛЯТЬ писать подобные вещи.
Почему? Вы претендуете на знание абсолютного критерия какие вещи можно писать а какие нет? Кому то не понравится и возможность написать
system("rm -rf");
а кому-то захочется сделать вызов функции внутри всегда срабатывающего условия...
вообще меня удивляет то что люди считают ошибки в стиле
if (counter =! 0 )
или даже проблемы с выделением/освобождением памяти корнем зла. На моей практике в достаточно больших проектах получить на руки баг с access violation это же просто кодерское щасте. 90% реальных (не учебных!) проблем — разборки с тн "бизнес" логикой.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, The Lex, Вы писали:
TL> Очевидно, товарищу начинающему программисту про дебаггеры и прочие излишества всякие нехорошие рассказать забыли.
Мне кажется, что для начинающего программиста дебаггеры — зло и им надо категорически запретить ими пользоваться. В том числе, чтобы учились подобные ошибки выявлять тестами и внимательным чтением кода.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, LaptevVV, Вы писали:
LVV>>3. Совершенно не обращают внимания, что писал начинающий... То есть — СОВСЕМ начинающий, первый раз изучающий программирование (незнакомый мне первокурсник, фиг знает, с какого города)... J>Причем либо японец, либо индус, либо носитель еще какого языка, в котором отрицание ставится после отрицаемого слова. J>В русском все же "не равно" транслируется буквально в "!=", если знать, что "!" — это "не" (что "=" — это "равно", надеюсь, все абитуры знают... ну большинство, хотя бы...)
В таком случае запись
if (counter =! 0 ) {
значит: "Если счетчик равен не нулю ...", что, на мой взгляд, то же вполне по-русски.
Здравствуйте, kaa.python, Вы писали:
KP>Да просто надо сразу приучать к несколько иному написанию сравнения. Первым аргументом всегда писать константы. И будет всем счастье.
KP>
KP> if ( 0 != counter ) {
KP>
ИМХО это жуткого вида костыль.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Пацак, Вы писали:
П>Дык как раз с перестановками букв в слове проблем, как правило, не бывает — в большинстве случаев, написав скажем dobule вместо double или PACKET_SZIE вместо PACKET_SIZE, мы честно получим некомпилирующуюся программу.
А теперь попробуй перепутать знаки в !=. Шо, не получается? Shift мешает? Ну так и о чем речь, проблема высосана из пальца.
11.01.2011 11:16, LaptevVV пишет:
> S>Напиши пару-тройку нужных людям и работающих программ, а потом пиши > такое. Я уверен что на других языках можно найти примеры похожего характера. > Я писал пару-тройку полезных программ еще в то время, когда вас даже в > проекте не было. Яйца курицу — не учат.
Мда-с, жалко мне твоих студентов.
Здравствуйте, MescalitoPeyot, Вы писали:
B>>>В любом языке есть свои подводные камни и типичные ошибки новичков. B>>>С/С++ мы любим не за это LVV>>Вы знаете, я с С познакомился по первому изданию K&R. C TurboC++ — еще году то ли 87, то ли 88ю С С++ я познакомился по первому изданию Страуструпа в 91 году. Я любил этот язык настолько, что написал аж 3 книжки, причем для студентов. Четвертую — не дописал еще (там все программы — на С/С++). LVV>>Больших прог на С/С++ мне писать не довелось (ну, не более 15000 операторов), но опыт программирования у меня большой — порядка 20 лет. От кодов ЭВМ, до PL-1 и С++, от операционной системы (как раз на ЭВМ типа pdp-11) до зарплаты. И членом команды и руководителем команды. LVV>>Обвинить меня в ненависти к С/С++ — нельзя. Но после того, как я познакомился в Блэск-боксом (2009 год) + Компонентный Паскаль, я все более убеждаюсь, что С/С++ — для начинающих — это ЗЛО. Никлаус Вирт — гораздо опытнее Страуструпа в обучении, поэтому абсолютно несомненно, что языки Вирта абсолютно лучше С/С++ для обучения.
MP>Вот именно. Программистом не являетесь, больших программ не писали, однако напозволяли себе тут уже выше-ниже по топику кучу высказываний типа "курица с яйцами" и "программист — это не ваше".
Вот именно!
1. Я имею большИй опыт программирования, чем поучающие меня программисты. Не писал больших программ на С/С++, на остальном — писал. Операционная система — большая программа? И имею 18-тилетний опыт преподавания программирования. Чего поучающий меня программист явно не имеет вообще. Страуструп, между прочим, учил начинающих программистов всего 6 лет. Результат — он написал ОЧЕНЬ ХОРОШУЮ КНИЖКУ для ОБУЧЕНИЯ.
2. Профи, если он профи, не может тошнить от инструмента.
MP>Хоть сколько-нибудь неначинающий разработчик оперирует не с ифами и даже не с классами, а с конкретными задачами. (У самого под рукой плюсовый проект, где и обжектив си ифоновское, и ява с йни андроидовские и как-то пофигу какие где там ифы и наследование, главное уметь переключаться и ловить волну).
Вот именно! А то вы невнимательно читаете. Начинающий — РЕШАЛ ЗАДАЧУ! И все с логикой и алгоритмизацией у него было в порядке. А язык подложил ему БОЛЬШУЮ СВИНЬЮ! И это — ЗЛО!
Больше спорить не буду.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
Интересно, какие языки могли бы войти в эту пару-тройку более простых чем C языков в 2011 году?
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, alpha21264, Вы писали:
A>>Ну вот тебе код из программы, на которой скорее всего была разведена твоя материнка:
A>>if( некая_функция( некие_параметры ),true )
A>>Это работало несколько лет, потом случайно нашли. LVV>Вот именно! Язык НЕ ДОЛЖЕН ПОЗВОЛЯТЬ писать подобные вещи.
Я не спорю.
Есть такая легенда. Когда-то был язык богов, на котором была невозможна неправда.
Здравствуйте, igna, Вы писали:
I>Не, ну а если он 91 вместо 19 напишет, компилятор тоже должен выдать ошибку?
Некорректное сравнение. Во-первых 19 и 91 — это совершенно определенно какие-то константы, хардкодить которые непосредственно внутрь алгоритма — зло. Вероятность же ошибки в хедере меньше во столько же раз, во сколько количество объявлений констант меньше количества мест, где они используются. Во-вторых 19 и 91, как ни крути, отличаются лишь семантикой — с точки зрения синтаксиса они совершенно похожи и отличить, когда в коде нельзя использовать одно, а когда другое — компилятор в принципе не способен. В случае же смешения "!=" и "=!" мы имеем не просто разные по смыслу действия, мы имеем синтаксически различные конструкции — у них даже количество операций и то не совпадает. Причем насколько я помню C++ (давно его не трогал уже, так что может и вру), нормальные компиляторы в курсе этой проблемы и, в отличие от "19 vs 91", честно выдают на подобном коде warning. Вопрос лишь в том, почему именно warning, почему не error.
I>Требовать от языка, чтобы он был устойчивым к перестановке букв при наборе слова, это уже чересчур
Дык как раз с перестановками букв в слове проблем, как правило, не бывает — в большинстве случаев, написав скажем dobule вместо double или PACKET_SZIE вместо PACKET_SIZE, мы честно получим некомпилирующуюся программу. Проблемы возникают, когда мы начинаем переставлять слова в предложениях.
Здравствуйте, CreatorCray, Вы писали:
M>>Мне кажется, что для начинающего программиста дебаггеры — зло и им надо категорически запретить ими пользоваться. В том числе, чтобы учились подобные ошибки выявлять тестами и внимательным чтением кода.
CC>Т.е. вместо того, чтоб быстро найти конкретное место в программе где выполнение пошло не так, как предполагалось новичку предлагается напрячь и так перегретые попыткой написать программу мозги и пройтись отладчиком "в уме"? Дык нету у него ещё столько ума то, он его только набирается.
Без отладчика так пару раз помучается и станет аккуратнее. Отладчик начинающего программиста развращает умственно, он может его приучить к небрежности, привычке в случае проблем не головой думать, а F8 (или еще что-нибудь) тыкать. И все бы ничего, но далеко не всегда отладчик — панацея и самый быстрый путь найти ошибку. Иногда его, к тому же и не бывает.
Полезность отладчика в выявлении проблем вообще несколько преувеличена.
Есть случаи, когда он нужен: на мой взгляд, в первую очередь это отладка взаимодействия с операционной системой или другими программами. Исследование и разбор чужого кода или работы на низком уровне своего. Может быть полезен, если в каком-то сильно нетривиальном куске кода встретилось что-то не очень понятное.
Вместе с тем, например, отладчики плохо помогают в случае параллельных вычислений. Или бывает, что поведение программы под отладчиком и без него по разным причинам различается.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
А еще лучше вот так
if(counter!=!0)...
Симметричнее и красивее. И даже на философские мысли какие-то тянет
Предупреждение, правда, все равно будет.
Здравствуйте, ononim, Вы писали:
A>>Я не спорю. A>>Есть такая легенда. Когда-то был язык богов, на котором была невозможна неправда. O>Просто в нем не было условных переходов...
Язык богов ныне утерян.
Я думаю, что условные переходы там были.
А вот операция "не" к _числовому_ операнду скорее всего не применялась.
Ну а операция "запятая" — это явные происки диавола.
Здравствуйте, CreatorCray, Вы писали:
CC>С макросами в основном Сшники сношаются. CC>В С++ эквилибристика на макросах используется крайне редко, бо есть более удобные средства генерации кода.
Я постоянно пользуюсь. В основном для максимального уменьшения вероятности описок в очень похожих строчках кода.
МС>> а в сочетании с препроцессором иногда очень трудно сказать, что же ты конкретно навключал. CC>Для особо тяжких случаев есть /showIncludes
В особо тяжком случае я нахально проставил #error message в местах между #ifdef-ами и отладил таким образом компиляцию.
МС>>Хотя бы то, что при неосторожном обращении получаем полное копирование на каждый чих. CC>А можно пример? А то что то у меня не придумывается что надо с ними делать чтоб на каждый чих копировалось. В C# стиле писать что ли.
Я что-то пропустил: а в паскале строки не копируются? Там встроенные счетчики обращений есть?
МС>> А проблема стандартных сишных строк относится скорее к проблеме сишных массивов как таковых, а это потеря размерности при передаче в другую функцию вследствие приведения к указателю. CC>Честно говоря не сильно помню когда мне приходилось использовать массивы кроме как временного буфера для вызова Сшных функций, который за пределы небольшого scope никуда не выходил. CC>Всё больше контейнеры и обёртки.
Угу. Я, например, вот только сегодня нашел (в смыле: свежая статистика — опыт-то старый, не умеют давно... никогда не умели...), что "контейнерами и обертками" никак не умеют пользоваться "выросшие на контейнерах и обертках программисты" и хак — (char*)std_string_value.c_str() — для передачи строки в качестве буфера — "нормальное" дело.
Здравствуйте, MasterZiv, Вы писали:
MZ>On 10.01.2011 1:51, LaptevVV wrote:
>> if (counter =! 0 ) { >> >> >> "Любая случайная последовательность символов является корректной С-программой"... >> И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях >> спотыкаются начинающие — УЖОС!
MZ>Так известно. С -- это ассемблер PDP-11, считающий себя языков высокого уровня.
Кстати самый логичный ассемблер, как и система команд. Если бы не экономили в свое время каждый байт в коде...
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
Напиши пару-тройку нужных людям и работающих программ, а потом пиши такое. Я уверен что на других языках можно найти примеры похожего характера.
LVV>Дело в том, что данный оператор присваивания был написан начинающим в учебной программе. И он спрашивал на Винграде, почему среднее арифметическое не вычисляется. То есть, ЭТО ПРОСТО ОПИСКА. Чел правильно разобрался в алгоритме, правильно написал всю функцию, то есть ПРАВИЛЬНО РАЗОБРАЛСЯ с бизнес-логикой вычисления среднего арифметического последовательности чисел. И сделал ДУРАЦКУЮ ОПИСКУ. Естественно, поиски ошибки в логике программы ничего не дали. LVV>Поэтому для начинающих язык С — зло! Причем в сочетании с со студией — зло практически АБСОЛЮТНОЕ!
у нас есть кхм.... коллега — он регулярно путает <, >, <=, >=, чем реально доставляет всем остальным. означает ли это, что С++ — плохой язык?
нет, это означает, что чел — неряха и невнимательное чмо. и никакой язык с таким бардаком в башке не поможет.
язык си для начинающих — зло, но вовсе не по причине того, что человек элементарно операторы путает.
Of course, the code must be complete enough to compile and link.
Здравствуйте, vitasR, Вы писали:
R>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>А еще лучше вот так
PD>>if(counter!=!0)...
R>мораль: на си надо писать в сишном стиле if(counter), не страдая паскализмом и все будет хорошо
Когда я вижу if (c), я не знаю ничего о типе. Глядя на такую запись, я предполагаю, что это булевская переменная. Когда я вижу
if(c != 0) то, это, очевидно, c — целая;
if(c != NULL) то, это, очевидно, c — указатель;
if(c != '\0') то, это, очевидно, c — символ.
Код делается более читабельным. Строгая типизация рулит.
Здравствуйте, Пацак, Вы писали:
П>Здравствуйте, Пацак, Вы писали:
MZ>>>От них тошнит только. Ещё претенденты есть ? П>>Java, например. В ней подобный фокус можно выкинуть только если переменная внутри условия будет булевской.
П>Upd: А в питоне подобное вообще вызывает синтаксическую ошибку:
П>
>>>> b = True
>>>> if b = not True: pass
П> File "<stdin>", line 1
П> if b = not True: pass
П> ^
П>SyntaxError: invalid syntax
П>
Диагностика — супер, понравилась. Лучше просто:"Error"
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
On 10.01.2011 20:02, Ops wrote:
> А можно озвучить "более простые языки, на которых нужно учиться > программировать"? Желательно, настолько же близкие к низкому уровню.
Так scheme, common lisp, python . Низкий уровень тут ни при чём.
Здравствуйте, rising_edge, Вы писали:
_>Когда я вижу if (c), я не знаю ничего о типе. Глядя на такую запись, я предполагаю, что это булевская переменная. Когда я вижу
Когда я вижу if (c) я точно знаю что это проверка на неравенство нулю.
И мне совершенно плевать какой тип у данной переменной. bool, числовой или указатель. Один фиг.
_>Код делается более читабельным. Строгая типизация рулит. Он и так совершенно читабелен.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
K>Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист: K>1. препроцессор вместо раздельной компиляции
/me поперхнулся
причем тут препроцессор и чем плоха та раздельная компиляция что есть в любой мало мальски стоящей среде — разбиеие на проекты, модули etc..
K>2. сишные строки
а че мучительного в std::string/std::wstring?
Как много веселых ребят, и все делают велосипед...
1. Совершенно не обращают внимания на смайлик в заголовке темы...
2. Совершенно не обращают внимания (то есть, смотрят в текст, а видят ФИГУ) на то, что означенный пример с винграда. LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
Тут же сделали выводы о квалификации меня и моих студентов — заклеймили типа абсолютных неучей...
Могу в ответ только посочувствовать сослуживцам и начальникам таких программеров...
3. Совершенно не обращают внимания, что писал начинающий... То есть — СОВСЕМ начинающий, первый раз изучающий программирование (незнакомый мне первокурсник, фиг знает, с какого города)...
Если вы ездить еще не умеете, а вам сразу болид формулы — 1 в руки — и вперед!
А рядом стоит кто-нить и утверждает, что вы тупой, поскольку не можете ехать...
Короче, я под столом...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Мишень-сан, Вы писали:
МС>Ну тут уже не попляшешь особо... ЕМНИП по стандарту внутреннее представление basic_string не обязано быть ни одним блоком, ни null-terminated.
Это минус исключительно в зубы стандарту.
Вроде как в 0х это поменяли.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
LVV>"Любая случайная последовательность символов является корректной С-программой"... LVV>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС! LVV>
Плохому танцору яйца мешают.
С — язык, который создавался профессиональными высококвалифицированными программистами для своих нужд и под себя.
Зачем профессионалу защита от ошибок, если он и так не ошибается? Соответственно, новичкам в С делать нечего. Есть хороший язык, предназначенный специально для обучения программированию — Паскаль. Прививает хороший стиль. А мне лично в С не хватает деструкторов и многих других вещей, которые есть в плюсах. Я лично на С-ях писать не очень люблю по той причине, что не хватает деструкторов и многих других вещей, имеющихся в плюсах. После С++ очень обрезано и неудобно.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, quwy, Вы писали:
Q>>Препод -- это диагноз. Я сам паскалист, сиподобные языки мне чисто визуально неприятны, но ваши взгляды и заявления заставляют плеваться. LVV>А много знаете о моих взглядах?
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
LVV>"Любая случайная последовательность символов является корректной С-программой"... LVV>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС! LVV>
Ну вот тебе код из программы, на которой скорее всего была разведена твоя материнка:
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, bkat, Вы писали:
B>>В любом языке есть свои подводные камни и типичные ошибки новичков. B>>С/С++ мы любим не за это LVV>Вы знаете, я с С познакомился по первому изданию K&R. C TurboC++ — еще году то ли 87, то ли 88ю С С++ я познакомился по первому изданию Страуструпа в 91 году. Я любил этот язык настолько, что написал аж 3 книжки, причем для студентов. Четвертую — не дописал еще (там все программы — на С/С++). LVV>Больших прог на С/С++ мне писать не довелось (ну, не более 15000 операторов), но опыт программирования у меня большой — порядка 20 лет. От кодов ЭВМ, до PL-1 и С++, от операционной системы (как раз на ЭВМ типа pdp-11) до зарплаты. И членом команды и руководителем команды. LVV>Обвинить меня в ненависти к С/С++ — нельзя. Но после того, как я познакомился в Блэск-боксом (2009 год) + Компонентный Паскаль, я все более убеждаюсь, что С/С++ — для начинающих — это ЗЛО. Никлаус Вирт — гораздо опытнее Страуструпа в обучении, поэтому абсолютно несомненно, что языки Вирта абсолютно лучше С/С++ для обучения.
Вот именно. Программистом не являетесь, больших программ не писали, однако напозволяли себе тут уже выше-ниже по топику кучу высказываний типа "курица с яйцами" и "программист — это не ваше". Хоть сколько-нибудь неначинающий разработчик оперирует не с ифами и даже не с классами, а с конкретными задачами. (У самого под рукой плюсовый проект, где и обжектив си ифоновское, и ява с йни андроидовские и как-то пофигу какие где там ифы и наследование, главное уметь переключаться и ловить волну).
Засим предлагаю переехать в КСВ.
Здравствуйте, blackhearted, Вы писали:
LVV>>Поэтому для начинающих язык С — зло! Причем в сочетании с со студией — зло практически АБСОЛЮТНОЕ!
B>Студия даже ворнинг не показала? Не верю. B>А если у вас ребята учатся писать на уровне ниже /W4 игонорируя вывод компилятора — то флаг им в руки.
B>
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
как раз таки наоборот
сначала нужно начинат с С, а потом что угодно
я видел много делфистов которые переседая на С писали
Здравствуйте, ononim, Вы писали:
A>>Язык богов ныне утерян. A>>Я думаю, что условные переходы там были. O>а смысл, если все условия — истинные, а неправда (aka false) там отсутствовала по определению?
Это ты зря. Как извстно, Пилат спросил Иисуса : "что есть истина" ? И Иисус не ответил. Потому что он не знал языка C/C++
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, alpha21264, Вы писали:
A>>Здравствуйте, Kerbadun, Вы писали:
K>>>Здравствуйте, bkat, Вы писали:
B>>>>В любом языке есть свои подводные камни и типичные ошибки новичков. B>>>>С/С++ мы любим не за это
K>>>А за что вы его любите?
A>>Это платформа. Позволяющая писать на любом уровне снизу до верху.
A>>Правда сейчас это уже динозавр — круто, но устарело.
Ops>Хочу альтернативу. Раз устарело — давайте.
С альтернативами пока плохо.
Но это не отменяет того факта, что в программировании накопилось дохрена идей,
(например функциональное программирование) которые в С++ уже не впихнешь.
Попробуй написать что-нибудь например на Питоне.
Сразу поймешь, что в С++ тебе массы всего не хватает.
И вообще он раздражает тебя своей многословностью.
Здравствуйте, alpha21264, Вы писали:
Ops>>Хочу альтернативу. Раз устарело — давайте.
A>С альтернативами пока плохо. A>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>(например функциональное программирование) которые в С++ уже не впихнешь.
A>Попробуй написать что-нибудь например на Питоне. A>Сразу поймешь, что в С++ тебе массы всего не хватает. A>И вообще он раздражает тебя своей многословностью.
Ну в питоне мне не хватает много чего из хотя бы С. Задачи такие.
А вот полноценной альтернативы нет и пока не предвидится.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Pzz>>>Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать. LVV>>Начинающие на этом этапе Debug от Release отличить не могут, не то, что предупреждения отключить... B>Кто-то кроме студентоты таким страдает? А учеников нужно учить.
Никлаус Вирт при создании паскаля написал: Одним из главных побуждающих мотивов создания нового языка стало то, что ему надоело учить студентов не программированию, а особенностям языка (и транслятора) фортрана.
Язык НЕ ДОЛЖЕН позволять писать ошибочные конструкции, которые пропускаются компилятором.
Знаменитая ошибка в программе на фортране: вместо запятой была поставлена точка и оператор цикла превратился в оператор присваивания.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Ops, Вы писали:
A>>С альтернативами пока плохо. A>>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>>(например функциональное программирование) которые в С++ уже не впихнешь.
Вполне себе впихнешь. Почитайте Джеймса Коплиена Advanced C++ — он там пишет. A>>Попробуй написать что-нибудь например на Питоне. A>>Сразу поймешь, что в С++ тебе массы всего не хватает. A>>И вообще он раздражает тебя своей многословностью. Ops>Ну в питоне мне не хватает много чего из хотя бы С. Задачи такие. Ops>А вот полноценной альтернативы нет и пока не предвидится.
А попробуйте Оберон...
Вполне себе альтернатива.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, blackhearted, Вы писали:
LVV>>>>>
LVV>>>>> if (counter =! 0 ) {
LVV>>>>>
Pzz>>>>Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать. LVV>>>Начинающие на этом этапе Debug от Release отличить не могут, не то, что предупреждения отключить... B>>Кто-то кроме студентоты таким страдает? А учеников нужно учить. LVV>Никлаус Вирт при создании паскаля написал: Одним из главных побуждающих мотивов создания нового языка стало то, что ему надоело учить студентов не программированию, а особенностям языка (и транслятора) фортрана.
Фортран — это, конечно, вещь. С ним можно всё что угодно сравнивать, всё равно никто не сможет аргументировано доказать.
LVV>Язык НЕ ДОЛЖЕН позволять писать ошибочные конструкции, которые пропускаются компилятором.
Treat warnings as errors и никаких гвоздей. Получишь палки в колёса от компилятора.
Или нужно полагаться полностью на дизайн языка и голову вообще не включать?
Так мы докатимся до того, что в языке вообще не может быть никаких side-effects и всё иммутабельно — есть такой подход в обучении, начинать с подобных языков. Только вот Виртовский Паскаль под это описание ну не подходит никак.
LVV>Знаменитая ошибка в программе на фортране: вместо запятой была поставлена точка и оператор цикла превратился в оператор присваивания.
И опять он — великий и ужасный. Где сейчас начитают учить с фортрана, в ПТУ? В моё время учили как раз с Паскаля. И ошибки делали на Виртовском творении еще покруче, чем на в будущем на Сях.
Можно еще Аду вспомнить — вот она, безопасность. Но это уже оффтоп.
LVV>Дело в том, что данный оператор присваивания был написан начинающим в учебной программе. И он спрашивал на Винграде, почему среднее арифметическое не вычисляется. То есть, ЭТО ПРОСТО ОПИСКА. Чел правильно разобрался в алгоритме, правильно написал всю функцию, то есть ПРАВИЛЬНО РАЗОБРАЛСЯ с бизнес-логикой вычисления среднего арифметического последовательности чисел. И сделал ДУРАЦКУЮ ОПИСКУ. Естественно, поиски ошибки в логике программы ничего не дали. LVV>Поэтому для начинающих язык С — зло! Причем в сочетании с со студией — зло практически АБСОЛЮТНОЕ!
Студия даже ворнинг не показала? Не верю.
А если у вас ребята учатся писать на уровне ниже /W4 игонорируя вывод компилятора — то флаг им в руки.
bool counter = false;
if (counter =! 0)
{
}
warning C4706: assignment within conditional expression
Здравствуйте, Vzhyk, Вы писали:
V>11.01.2011 11:16, LaptevVV пишет:
>> S>Напиши пару-тройку нужных людям и работающих программ, а потом пиши >> такое. Я уверен что на других языках можно найти примеры похожего характера. >> Я писал пару-тройку полезных программ еще в то время, когда вас даже в >> проекте не было. Яйца курицу — не учат. V>Мда-с, жалко мне твоих студентов.
On 11.01.2011 1:08, bkat wrote:
> A>Но это не отменяет того факта, что в программировании накопилось дохрена идей, > A>(например функциональное программирование) которые в С++ уже не впихнешь. > > Так, для справки... > Lisp появился в 1958 году. > Он всего лишь на годик-другой моложе Фортрана
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>И не надо, так как пример ваш — дрянь. Ладно бы человек нахреначил чего-то там с памятью или указателями, а тут он тупо операторы путает. Этак он и плюс с минусом или -= с =- попутает а вы будете орать, какое С — лютое зло.
Pzz>Это могла быть просто описка. И ее, между прочим, не видно. Я долго пялился в тот фрагмент кода, прежде чем понял, в чем проблема. А я на Си пишу давно и помногу.
Pzz>В Си много таких подводных камней. Например, можно написать:
Pzz>
Здравствуйте, LaptevVV, Вы писали:
LVV>1. Я имею большИй опыт программирования, чем поучающие меня программисты. Не писал больших программ на С/С++, на остальном — писал. Операционная система — большая программа? И имею 18-тилетний опыт преподавания программирования. Чего поучающий меня программист явно не имеет вообще.
Операционная система — это хорошо, это уважамс.
А вот что может дать 18-летний опыт преподавания — я очень смутно понимаю. Я в университете видел людей, преподававших свой предмет лет по 10 и ничего в нём не понимающих. Видел преподавателей, которые принимая программы на ассемблере или паскале ограничивались проверкой синтаксиса.
Охотно верю, что вы не такой. Но тем не менее, практический опыт применения языка на реальных проектах я ценю больше, чем опыт преподавания полугодового/годового курса ООП студентам.
LVV>Вот именно! А то вы невнимательно читаете. Начинающий — РЕШАЛ ЗАДАЧУ! И все с логикой и алгоритмизацией у него было в порядке. А язык подложил ему БОЛЬШУЮ СВИНЬЮ! И это — ЗЛО!
Ну тут уже несколько раз повторяли, что нужно было читать предупреждения компилятора.
В C++ есть и гораздо более изощрённые способы выстрелить себе в ногу. Никто не спорит с тем, что есть неудобные и чреватые ошибками моменты. Проблема в том, что хороших альтернатив нет (учитываем распространённость языков, доступность библиотек, литературы, средств разработки, API к различным сервисам и т.д.). Может быть тот же Oberon в этом плане лучше, я не знаю. Но я не буду писать на нём продакшн-сервисы сейчас, потому как после меня это некому будет поддерживать. Всё-таки Java/C/C++/C# — это, де-факто, мэйнстрим.
Сам я сначала учил бэйсик (который на спектрумах был), потом паскаль, потом С. Но, честно говоря, я сейчас что-то сомневаюсь в том что изучение бэйсика и паскаля было для меня полезным. Я изучил два языка, которые сложно применить в работе, а потом тратил время на изучение синтаксиса и библиотек С. Уж наверное лучше бы сразу С учил.
А сейчас можно начинать изучение с питона — его знание не будет бесполезным, это вполне себе распространённый язык.
LVV>Дело в том, что данный оператор присваивания был написан начинающим в учебной программе. И он спрашивал на Винграде, почему среднее арифметическое не вычисляется. То есть, ЭТО ПРОСТО ОПИСКА. Чел правильно разобрался в алгоритме, правильно написал всю функцию, то есть ПРАВИЛЬНО РАЗОБРАЛСЯ с бизнес-логикой вычисления среднего арифметического последовательности чисел. И сделал ДУРАЦКУЮ ОПИСКУ. Естественно, поиски ошибки в логике программы ничего не дали. LVV>Поэтому для начинающих язык С — зло! Причем в сочетании с со студией — зло практически АБСОЛЮТНОЕ!
Очевидно, товарищу начинающему программисту про дебаггеры и прочие излишества всякие нехорошие рассказать забыли.
Я понимаю когда у тебя сишные функции запросто друг на друга линкуются, потому как никакой особой проверки типов указателей нет, да и все равно все пользуются void* — а ты потом заходишь в функцию, и видишь что только что бывшую красивую структуру уже склоняют каким-то нереальным образом и что так быть не может — просто не могли так программисты задумать. Наверное...
А тут в дебаггере хоть что-нибудь должно было измениться после прохождения такого условия — не?
Я бы сказал, что для начинающих вообще программирование как таковое — зло. В результате мы имеем все более навороченные средства, на которых "начинающие программисты" не в силах выразить свои все более скудеющие мысли. А виноват, конечно же, инструмент. А что сейчас процентов 90 сайтов требует таких а...нных ресурсов — причем как на стороне клиента, так и на стороне сервера — ну так что же? Поставим еще один юнит, еще одну нитку волокна протянем, а пользователь пускай еще ядер докупает — 21-й век надворе!
ЗЫ: ты его не спросил таки что же именно он в отладчике увидел в этом месте, не?
Здравствуйте, Пацак, Вы писали:
I>>Не, ну а если он 91 вместо 19 напишет, компилятор тоже должен выдать ошибку?
П>Некорректное сравнение. Во-первых 19 и 91 — это совершенно определенно какие-то константы, хардкодить которые непосредственно внутрь алгоритма — зло. Вероятность же ошибки в хедере меньше во столько же раз, во сколько количество объявлений констант меньше количества мест, где они используются. Во-вторых 19 и 91, как ни крути, отличаются лишь семантикой — с точки зрения синтаксиса они совершенно похожи и отличить, когда в коде нельзя использовать одно, а когда другое — компилятор в принципе не способен.
Не вопрос! Выносим 19 и 91 в хедер, а вместе с ними — и еще 93 сопуствующие константы, которые все называем красивыми символическими именами.
И в коде путаем не 19 и 91, а символические имена.
Таки разница!
П>В случае же смешения "!=" и "=!" мы имеем не просто разные по смыслу действия, мы имеем синтаксически различные конструкции — у них даже количество операций и то не совпадает. Причем насколько я помню C++ (давно его не трогал уже, так что может и вру), нормальные компиляторы в курсе этой проблемы и, в отличие от "19 vs 91", честно выдают на подобном коде warning. Вопрос лишь в том, почему именно warning, почему не error.
Нормальные компиляторы в курсе, что "вьюноши с горящими глазами" частенько лажают и путают оператор присваивания с оператором эквивалентности в местах, где логично ожидать таки оператор эквивалентности. Рестрикта там нет. Более того, старый добрый "сишный стиль" повсеместно использует присваивание вместе с проверкой в одном и том же выражении. При аккуратном отношении к стилю (читай: читабельности) помарки вычитываются либо на раз, либо — при аккуратном отношении к архитектуре — "на два", путем сперва загоняния "подозрительного места" в довольно определенное место кода и последующего вычитывания или прохождения этого места пошаговым отладчиком. А иногда — дописыванием "отладочной обвязки" с целью выследить "жука".
Только, похоже, в сабжевых университетах этому не учат...
I>>Требовать от языка, чтобы он был устойчивым к перестановке букв при наборе слова, это уже чересчур
П>Дык как раз с перестановками букв в слове проблем, как правило, не бывает — в большинстве случаев, написав скажем dobule вместо double или PACKET_SZIE вместо PACKET_SIZE, мы честно получим некомпилирующуюся программу. Проблемы возникают, когда мы начинаем переставлять слова в предложениях.
см. выше про 93 константы — каждая со своим символьным именем. Лично мне пока что неизвестен метод придумывания "опискоустойчивых имен".
Здравствуйте, Пацак, Вы писали:
П>Конкретный пример — да, но вообще присваивание и сравнение перепутать имхо довольно несложно. Особенно если программист не чистый сишник, а пишет параллельно на нескольких языках.
Делаем вывод: писать на нескольких языках зло и ересь богомерзская.
Панеслаааась!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Michael7, Вы писали:
M>Без отладчика так пару раз помучается и станет аккуратнее.
Если бы. Продолжительные мучения в поисках "гдеж это я накосячил" куда скорее приводят к воплям "Язык говно!!!" на форумах, что мы периодически тут от подобных ниасиливших видим.
M> Отладчик начинающего программиста развращает умственно, он может его приучить к небрежности, привычке в случае проблем не головой думать, а F8 (или еще что-нибудь) тыкать.
Какие высокие слова.
Инструментарий надо знать и уметь им пользоваться всем. А то это получается как "оператор += приводит к раку мозга, вшам и диарее блаблабла, надо только x = x + ...".
M> И все бы ничего, но далеко не всегда отладчик — панацея и самый быстрый путь найти ошибку.
Я где то говорил что это панацея?
Я про то, что отказываться от отладчика на ранних этапах, когда обучаемый ещё не накопил опыта совершения и осознания ошибок попросту неэффективно. Чем быстрее он найдёт ошибку, тем быстрее он в ней разберётся и поймёт.
M>Иногда его, к тому же и не бывает.
Это скорее минус environment-у. Ну, не бывает, значит там придётся мудохаться куда сильнее.
M> Есть случаи, когда он нужен: на мой взгляд, в первую очередь это отладка взаимодействия с операционной системой или другими программами. Исследование и разбор чужого кода или работы на низком уровне своего. Может быть полезен, если в каком-то сильно нетривиальном куске кода встретилось что-то не очень понятное.
Когда поведение кода зависит от кучи параметров ты в уме все эти параметры к конкретной точке ни в жизнь не просчитаешь. Посмотреть что именно творилось в переменных в данной точке программы отладчиком куда удобнее чем нашпиговывать в прогу debug output.
M>Вместе с тем, например, отладчики плохо помогают в случае параллельных вычислений. Или бывает, что поведение программы под отладчиком и без него по разным причинам различается.
И? Про серебрянную пулю и так речи не шло.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, The Lex, Вы писали:
A>>С альтернативами пока плохо. A>>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>>(например функциональное программирование) которые в С++ уже не впихнешь.
TL>А нужно впихнуть?
Скорее да чем нет, хотя бы в том же объеме что впихнули в D чистые функции и
полноценные лямбды.
Здравствуйте, FR, Вы писали:
A>>Не боись. Я тоже недавно начал. Я не ожидал, что мне понравится FR>Питон для многих сишников обладает наркотическим эффектом
Схожий по эффекту с приёмом подогретой смеси спирта, димедрола, касторового масла и марганцовки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
А на самом деле — с точностью до наоборот. Потому что гораздо правильнее учиться на языке, который каждый раз стреляет тебе в ногу — и запоминать на уровне синапсов, как можно писать и как нельзя — и потом, если вдруг жизнь пересадит на что-то более миролюбивое, спокойно работать, чем наоборот — привыкнуть к языкам, прощающим ошибки, а потом посадить в баг код для ядерной электростанции.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
LVV>"Любая случайная последовательность символов является корректной С-программой"... LVV>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС! LVV>
начитался сегодня вас на винграде
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>>
LVV>> if (counter =! 0 ) {
LVV>>
LVV>>"Любая случайная последовательность символов является корректной С-программой"... LVV>>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС! LVV>>
X>начитался сегодня вас на винграде
Я сегодня там один пост запостил... Только что сейчас...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>"Любая случайная последовательность символов является корректной С-программой"... LVV>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС!
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>>
LVV>> if (counter =! 0 ) {
LVV>>
Pzz>Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать.
Начинающие на этом этапе Debug от Release отличить не могут, не то, что предупреждения отключить...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Alexey Sudachen, Вы писали:
AS>Здравствуйте, LaptevVV, Вы писали:
LVV>>"Любая случайная последовательность символов является корректной С-программой"... LVV>>И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях спотыкаются начинающие — УЖОС!
AS>Хы, а Perl — это тогда УЖАС-УЖАС что ли?! =)))
Perl — ПЕРЛ! Это для начинающих — УЖОС-УЖОС — УЖОС-УЖОС — УЖОС-УЖОС!!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
Pzz>>Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать. LVV>Начинающие на этом этапе Debug от Release отличить не могут, не то, что предупреждения отключить...
Они по дефолту выключены, чтобы чайников не расстраивать. Вот в этом — зло
Здравствуйте, igna, Вы писали:
I>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
I>Интересно, какие языки могли бы войти в эту пару-тройку более простых чем C языков в 2011 году?
Более просты, наверное, нет. А вот простые и более надежные — есть. Компонентный паскаль — Оберон. Там невозможно совершить подобных ошибок по по определению.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
On 10.01.2011 1:51, LaptevVV wrote:
> if (counter =! 0 ) { > > > "Любая случайная последовательность символов является корректной С-программой"... > И смешно, и смеяться — не хочется. Ибо на скольких аналогичных граблях > спотыкаются начинающие — УЖОС!
Так известно. С -- это ассемблер PDP-11, считающий себя языков высокого уровня.
On 10.01.2011 14:02, LaptevVV wrote:
> Более просты, наверное, нет. А вот простые и более надежные — есть. Компонентный > паскаль — Оберон. Там невозможно совершить подобных ошибок по по определению.
On 10.01.2011 14:02, LaptevVV wrote:
> I>Интересно, какие языки могли бы войти в эту пару-тройку более простых чем C > языков в 2011 году? > Более просты, наверное, нет. А вот простые и более надежные — есть. Компонентный > паскаль — Оберон. Там невозможно совершить подобных ошибок по по определению.
На самом деле я-то знаю более простые языки, на которых нужно учиться
программировать. Но только ПОСЛЕ них уже на С программировать не захочется.
Так что вопрос о первом языке очень интересен (мне).
Здравствуйте, Kerbadun, Вы писали:
K>Здравствуйте, bkat, Вы писали:
B>>В любом языке есть свои подводные камни и типичные ошибки новичков. B>>С/С++ мы любим не за это
K>А за что вы его любите?
Это платформа. Позволяющая писать на любом уровне снизу до верху.
Правда сейчас это уже динозавр — круто, но устарело.
A>>>Я не спорю. A>>>Есть такая легенда. Когда-то был язык богов, на котором была невозможна неправда. O>>Просто в нем не было условных переходов...
A>Язык богов ныне утерян. A>Я думаю, что условные переходы там были.
а смысл, если все условия — истинные, а неправда (aka false) там отсутствовала по определению?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Pzz, Вы писали:
Pzz>>Здравствуйте, LaptevVV, Вы писали:
LVV>>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>>>
LVV>>> if (counter =! 0 ) {
LVV>>>
Pzz>>Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать. LVV>Начинающие на этом этапе Debug от Release отличить не могут, не то, что предупреждения отключить...
Кто-то кроме студентоты таким страдает? А учеников нужно учить.
Здравствуйте, MasterZiv, Вы писали:
MZ>On 10.01.2011 14:02, LaptevVV wrote:
>> I>Интересно, какие языки могли бы войти в эту пару-тройку более простых чем C >> языков в 2011 году? >> Более просты, наверное, нет. А вот простые и более надежные — есть. Компонентный >> паскаль — Оберон. Там невозможно совершить подобных ошибок по по определению.
MZ>На самом деле я-то знаю более простые языки, на которых нужно учиться MZ>программировать. Но только ПОСЛЕ них уже на С программировать не захочется. MZ>Так что вопрос о первом языке очень интересен (мне).
А можно озвучить "более простые языки, на которых нужно учиться программировать"? Желательно, настолько же близкие к низкому уровню.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ononim, Вы писали:
A>>>>Я не спорю. A>>>>Есть такая легенда. Когда-то был язык богов, на котором была невозможна неправда. O>>>Просто в нем не было условных переходов...
A>>Язык богов ныне утерян. A>>Я думаю, что условные переходы там были. O>а смысл, если все условия — истинные, а неправда (aka false) там отсутствовала по определению?
Православный Бог един, хотя его 3, так что нужна троичная логика. А поскольку ошибаться он(и) не может(ут), то все 3 варианта однозначно правильные.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, Kerbadun, Вы писали:
K>>Здравствуйте, bkat, Вы писали:
B>>>В любом языке есть свои подводные камни и типичные ошибки новичков. B>>>С/С++ мы любим не за это
K>>А за что вы его любите?
A>Это платформа. Позволяющая писать на любом уровне снизу до верху.
A>Правда сейчас это уже динозавр — круто, но устарело.
Хочу альтернативу. Раз устарело — давайте.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Это ты зря. Как извстно, Пилат спросил Иисуса : "что есть истина" ? И Иисус не ответил. Потому что он не знал языка C/C++
Здравствуйте, Пацак, Вы писали:
MZ>>От них тошнит только. Ещё претенденты есть ? П>Java, например. В ней подобный фокус можно выкинуть только если переменная внутри условия будет булевской.
Upd: А в питоне подобное вообще вызывает синтаксическую ошибку:
>>> b = True
>>> if b = not True: pass
File "<stdin>", line 1
if b = not True: pass
^
SyntaxError: invalid syntax
Здравствуйте, alpha21264, Вы писали:
A>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>(например функциональное программирование) которые в С++ уже не впихнешь.
Так, для справки...
Lisp появился в 1958 году.
Он всего лишь на годик-другой моложе Фортрана
Здравствуйте, bkat, Вы писали:
B>В любом языке есть свои подводные камни и типичные ошибки новичков. B>С/С++ мы любим не за это
Вы знаете, я с С познакомился по первому изданию K&R. C TurboC++ — еще году то ли 87, то ли 88ю С С++ я познакомился по первому изданию Страуструпа в 91 году. Я любил этот язык настолько, что написал аж 3 книжки, причем для студентов. Четвертую — не дописал еще (там все программы — на С/С++).
Больших прог на С/С++ мне писать не довелось (ну, не более 15000 операторов), но опыт программирования у меня большой — порядка 20 лет. От кодов ЭВМ, до PL-1 и С++, от операционной системы (как раз на ЭВМ типа pdp-11) до зарплаты. И членом команды и руководителем команды.
Обвинить меня в ненависти к С/С++ — нельзя. Но после того, как я познакомился в Блэск-боксом (2009 год) + Компонентный Паскаль, я все более убеждаюсь, что С/С++ — для начинающих — это ЗЛО. Никлаус Вирт — гораздо опытнее Страуструпа в обучении, поэтому абсолютно несомненно, что языки Вирта абсолютно лучше С/С++ для обучения.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LVV>>Вот именно! А то вы невнимательно читаете. Начинающий — РЕШАЛ ЗАДАЧУ! И все с логикой и алгоритмизацией у него было в порядке. А язык подложил ему БОЛЬШУЮ СВИНЬЮ! И это — ЗЛО! LVV>>Больше спорить не буду.
L_L>И не надо, так как пример ваш — дрянь. Ладно бы человек нахреначил чего-то там с памятью или указателями, а тут он тупо операторы путает. Этак он и плюс с минусом или -= с =- попутает а вы будете орать, какое С — лютое зло.
Он не путает. Это — простая описка. Бывает, что при наборе слова буквы наоборот напечатаешь. Здесь именно тот случай...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>Он не путает. Это — простая описка. Бывает, что при наборе слова буквы наоборот напечатаешь. Здесь именно тот случай...
Так и в вашем славном Обероне можно описаться и вместо + использовать -, а вместо * — /.
С — и правда не самый лучший язык для начинающих, но его и создали не для этого.
Впору задуматься, скорее, хорош ли преподаватель и программа обучения, что в качестве первого
выбирают такой язык.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, MasterZiv, Вы писали:
MZ>>On 10.01.2011 14:02, LaptevVV wrote:
>>> I>Интересно, какие языки могли бы войти в эту пару-тройку более простых чем C >>> языков в 2011 году? >>> Более просты, наверное, нет. А вот простые и более надежные — есть. Компонентный >>> паскаль — Оберон. Там невозможно совершить подобных ошибок по по определению.
MZ>>На самом деле я-то знаю более простые языки, на которых нужно учиться MZ>>программировать. Но только ПОСЛЕ них уже на С программировать не захочется. MZ>>Так что вопрос о первом языке очень интересен (мне).
Ops>А можно озвучить "более простые языки, на которых нужно учиться программировать"? Желательно, настолько же близкие к низкому уровню.
А зачем низкий уровень?
Как-то нормально прошло обучение Архитектура/Паскаль -> С -> Asm/С++ -> microAsm.
ИМХО, проще микро ассемблера вообще ничего нет и ниже тоже мало кто существует.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, blackhearted, Вы писали:
B>>А как же B>>
B>>warning C4800: 'uint32_t' : forcing value to bool 'true' or 'false' (performance warning)
B>>От ненавистного MS?
CC>Пользуйтесь кошерными компиляторами, у которых нет performance issue для такого сравнения. ICC например. CC>Оно со всех сторон пользительнее выйдет.
Ну, судя по всему, ТС использует для обучения MSVS и подключать к ней ICC не хочет.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, shasa, Вы писали:
S>>Здравствуйте, LaptevVV, Вы писали:
LVV>>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>>>
LVV>>> if (counter =! 0 ) {
LVV>>>
S>>Напиши пару-тройку нужных людям и работающих программ, а потом пиши такое. Я уверен что на других языках можно найти примеры похожего характера. LVV>Я писал пару-тройку полезных программ еще в то время, когда вас даже в проекте не было. Яйца курицу — не учат.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>И не надо, так как пример ваш — дрянь. Ладно бы человек нахреначил чего-то там с памятью или указателями, а тут он тупо операторы путает. Этак он и плюс с минусом или -= с =- попутает а вы будете орать, какое С — лютое зло.
Это могла быть просто описка. И ее, между прочим, не видно. Я долго пялился в тот фрагмент кода, прежде чем понял, в чем проблема. А я на Си пишу давно и помногу.
В Си много таких подводных камней. Например, можно написать:
Здравствуйте, quwy, Вы писали:
Q>Препод -- это диагноз. Я сам паскалист, сиподобные языки мне чисто визуально неприятны, но ваши взгляды и заявления заставляют плеваться.
А много знаете о моих взглядах?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
On 10.01.2011 20:48, alpha21264 wrote:
> Попробуй написать что-нибудь например на Питоне. > Сразу поймешь, что в С++ тебе массы всего не хватает. > И вообще он раздражает тебя своей многословностью.
+1
On 11.01.2011 12:41, MescalitoPeyot wrote:
> Вот именно. Программистом не являетесь, больших программ не писали, однако > напозволяли себе тут уже выше-ниже по топику кучу высказываний типа "курица с > яйцами" и "программист — это не ваше".
On 11.01.2011 12:09, LaptevVV wrote:
> — для начинающих — это ЗЛО. Никлаус Вирт — гораздо опытнее Страуструпа в > обучении, поэтому абсолютно несомненно, что языки Вирта абсолютно лучше С/С++ > для обучения.
On 11.01.2011 13:22, LaptevVV wrote:
> СВИНЬЮ! И это — ЗЛО! > Больше спорить не буду.
LaptevVV, ну хорошо, С зло для начинающих -- я согласен на 100%.
Давайте ещё раз подумаем над проблемой.
Данный-то случай не связан с проблемами именно программирования,
положим, наш начинающий программист уже знаком с каким-то языком
программирования и умеет программировать, но не на C. Но ведь когда-то нашему
начинающему, если он хочет освоить С, придётся на нём учиться писать и
ТАКИЕ ошибки он может сделать, и они НЕ СВЯЗАНЫ с тем, что он не знает
программирования, они связаны с тем, что он не знает именно язык С.
Я бы в паскале мог сделать (и делал) точно такие же ошибки, связанные
с тем, что приоритет логических операций там больше, чем операций сравнения.
Правда, конечно паскаль на это чётко ругается и не компилирует программу.
Конечно, С -- язык злобных хакеров для написания операционной системы UNIX.
Здравствуйте, LaptevVV, Вы писали:
LVV>Я писал пару-тройку полезных программ еще в то время, когда вас даже в проекте не было. Яйца курицу — не учат.
Нус, уважаемый, тут есть только его слово против твоего. Поэтому не надо давить возрастом, это несерьезно выглядит. Возраст, так же как и количество "опыта" ничего не значат вот по какой причине: есть очень много людей, у которых не опыт 20 лет, а 1 год опыта помноженный на 20. Я не говорю, что ты как раз этот случай, но данный факт, дискредитирует подобные аргументы полностью.
Из рассказа «Письмо к ученому соседу» Антона Павловича Чехова (1860—1904). Автор этого письма — «Войска Донского отставной урядник из дворян» Василий Семи-Булатов — пишет своему соседу:
«Вы сочинили и напечатали в своем умном соченении, как сказал мне о. Герасим, что будто бы на самом величайшем светиле, на солнце, есть черные пятнушки. Этого не может быть, потому что этого не может быть никогда. Как Вы могли видеть на солнце пятны, если на солнце нельзя глядеть простыми человеческими глазами, и для чего на нем пятны, если и без них можно обойтиться? Из какого мокрого тела сделаны эти самые пятны, если они не сгорают? Может быть по-вашему и рыбы живут на солнце? Извините меня дурмана ядовитого, что так глупо сострил! Ужасно я предан науке!»
Здравствуйте, rising_edge, Вы писали:
_>Когда я вижу if (c), я не знаю ничего о типе. Глядя на такую запись, я предполагаю, что это булевская переменная. Когда я вижу _>if(c != 0) то, это, очевидно, c — целая; _>if(c != NULL) то, это, очевидно, c — указатель; _>if(c != '\0') то, это, очевидно, c — символ.
Посмотреть тип переменной вполне можно и не полениться. Даже если его не видно из имени. А его должно.
if (n) — очевидно, n — целое;
if (size) — очевидно, size — количество байт или элементов;
if (p) — очевидно, p — указатель;
if (c) — очевидно, c — символ.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
А в чем вообще цель обучения? Если написать курсовую из 300 строк и забыть об этом программировании, как о страшном сне, то лучше может и вовсе ему (программированию) так не учиться? Если же стать программистом, все промышленные языки довольно плохие, а было бы неплохо, чтобы ученик рос не в совсем уж стерильных условиях. Иначе как он научится такие проблемы в реальной жизни решать?
И да, изучать алгоритмы лучше на каком-то совсем уж упрощенном языке, типа того, который Дейкстра использует. Потому что прибамбасы современных языков для изучения алгоритмов совершенно не нужны и только мешают.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
Pzz>А в чем вообще цель обучения? Если написать курсовую из 300 строк и забыть об этом программировании, как о страшном сне, то лучше может и вовсе ему (программированию) так не учиться? Если же стать программистом, все промышленные языки довольно плохие, а было бы неплохо, чтобы ученик рос не в совсем уж стерильных условиях. Иначе как он научится такие проблемы в реальной жизни решать?
Цель — понравиться преподу, и, даже, если заказчики жмут хвост, с проектом который ты пишешь, выдать ему кусок из него, переделанный за хз сколько времени на оберон.
Pzz>И да, изучать алгоритмы лучше на каком-то совсем уж упрощенном языке, типа того, который Дейкстра использует. Потому что прибамбасы современных языков для изучения алгоритмов совершенно не нужны и только мешают.
И да и нет. Я бы под это вообще среду отдельную сделал, с интерпретатором, генератороми всяких данных, и сандбокс к ней.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
П>> if b = not True: pass
П>> ^
П>>SyntaxError: invalid syntax
П>>
Ops>Диагностика — супер, понравилась. Лучше просто:"Error"
Ну в сочетании со стрелкой-указателем это фактически означает "line XXX: Unexpected token '=' at position 10". Вполне так информативно имхо. Т.е. могло бы быть и получше, конечно, не спорю, но при минимальном знании питоновского синтаксиса и такое сообщение тоже напрягов не вызывает.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
Правильно. Учится нужно на КулХацкеле.
А true недостаков С и (С++) вы, профессор, еще не заметили.
Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист:
1. препроцессор вместо раздельной компиляции
2. сишные строки
Здравствуйте, ononim, Вы писали:
K>>Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист: K>>1. препроцессор вместо раздельной компиляции O>/me поперхнулся O>причем тут препроцессор и чем плоха та раздельная компиляция что есть в любой мало мальски стоящей среде — разбиеие на проекты, модули etc..
1) Отладка сколь-нибудь нетривиальных макросов — ещё то веселье.
2) Заголовки вместо нормальных модулей особо доставляют при поиске зависимостей, а в сочетании с препроцессором иногда очень трудно сказать, что же ты конкретно навключал. А раздельная компиляция — изменение одного хедера может привести к пересборке всего солюшена, запросто.
K>>2. сишные строки O>а че мучительного в std::string/std::wstring?
Хотя бы то, что при неосторожном обращении получаем полное копирование на каждый чих. А проблема стандартных сишных строк относится скорее к проблеме сишных массивов как таковых, а это потеря размерности при передаче в другую функцию вследствие приведения к указателю.
O>>/me поперхнулся O>>причем тут препроцессор и чем плоха та раздельная компиляция что есть в любой мало мальски стоящей среде — разбиеие на проекты, модули etc.. МС>1) Отладка сколь-нибудь нетривиальных макросов — ещё то веселье.
макросы зло (c)
МС>2) Заголовки вместо нормальных модулей особо доставляют при поиске зависимостей, а в сочетании с препроцессором иногда очень трудно сказать, что же ты конкретно навключал. А раздельная компиляция — изменение одного хедера может привести к пересборке всего солюшена, запросто.
Ну это да.. Но все в ваших руках — не надо делать настолько глобальные хедеры и не надо их часто менять если уж сделали Впрочем проблема конечно имеется, но она не так уж страшна
K>>>2. сишные строки O>>а че мучительного в std::string/std::wstring? МС>Хотя бы то, что при неосторожном обращении получаем полное копирование на каждый чих.
Дык.. это зависит от реализации стринга. Вот тут например строки reference-counted: http://stdcxx.apache.org/
МС>А проблема стандартных сишных строк относится скорее к проблеме сишных массивов как таковых, а это потеря размерности при передаче в другую функцию вследствие приведения к указателю.
Ну так не пользуйтесь в С++ "сишными" строками. Пользуйтесь string'ом, он хранит длину (или может быстро ее посчитать)
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Kluev, Вы писали:
K>Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист:
K>1. препроцессор вместо раздельной компиляции K>2. сишные строки
Нельзя ли развить мысль?
Бо единственное что на самом деле меня в околоС++шной области напрягает — криво написанные библиотеки.
В частности на 80% бесполезная и в целом малофункциональная библиотека под названием CRT.
Но это ни разу не проблема именно языка. Это извечная проблема обратной совместимости и поддержки legacy.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, ononim, Вы писали:
O>>>/me поперхнулся O>>>причем тут препроцессор и чем плоха та раздельная компиляция что есть в любой мало мальски стоящей среде — разбиеие на проекты, модули etc.. МС>>1) Отладка сколь-нибудь нетривиальных макросов — ещё то веселье. O>макросы зло (c)
МС>>2) Заголовки вместо нормальных модулей особо доставляют при поиске зависимостей, а в сочетании с препроцессором иногда очень трудно сказать, что же ты конкретно навключал. А раздельная компиляция — изменение одного хедера может привести к пересборке всего солюшена, запросто. O>Ну это да.. Но все в ваших руках — не надо делать настолько глобальные хедеры и не надо их часто менять если уж сделали Впрочем проблема конечно имеется, но она не так уж страшна
K>>>>2. сишные строки O>>>а че мучительного в std::string/std::wstring? МС>>Хотя бы то, что при неосторожном обращении получаем полное копирование на каждый чих. O>Дык.. это зависит от реализации стринга. Вот тут например строки reference-counted: http://stdcxx.apache.org/
МС>>А проблема стандартных сишных строк относится скорее к проблеме сишных массивов как таковых, а это потеря размерности при передаче в другую функцию вследствие приведения к указателю. O>Ну так не пользуйтесь в С++ "сишными" строками. Пользуйтесь string'ом, он хранит длину (или может быстро ее посчитать)
Вы правильно описали ситуацию. Ничего смертельного и неисправимого нет, но эти мелочи в целом могут организовать недетский баттхёрт. А по поводу string в частности и всех шаблонов в общем, могу сказать, что меня как программиста под Windows крайне печалит основная их проблема — передача владения через границу DLL. Мне известно только то, что это вызвано особенностями работы с памятью в VS реализации CRT и соотв-но не лечится.
А за stdcxx спасибо, посмотрю на досуге.
Здравствуйте, Мишень-сан, Вы писали:
K>>>Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист:
Кстати по проблемам С и С++ довольно таки отличаются друг от друга. Так что С и С++ программисты как правило "мучаются" с довольно таки разными проблемами.
O>>причем тут препроцессор и чем плоха та раздельная компиляция что есть в любой мало мальски стоящей среде — разбиеие на проекты, модули etc.. МС>1) Отладка сколь-нибудь нетривиальных макросов — ещё то веселье.
С макросами в основном Сшники сношаются.
В С++ эквилибристика на макросах используется крайне редко, бо есть более удобные средства генерации кода.
МС>2) Заголовки вместо нормальных модулей особо доставляют при поиске зависимостей
Покуда особых проблем не имел.
Разве что при разгребании говнокода.
Говнокод на C# разгребать было не проще.
МС> а в сочетании с препроцессором иногда очень трудно сказать, что же ты конкретно навключал.
Для особо тяжких случаев есть /showIncludes
МС>А раздельная компиляция — изменение одного хедера может привести к пересборке всего солюшена, запросто.
Если он воткнут везде — да. И что?
Предложи вариант как от этого избавиться но сохранить все плюшки типа инлайнинга.
В любом случае все зависимости придётся обработать. А зависимости ты указал включением хидера. Не включай его там где он не нужен и будет тебе щасте.
K>>>2. сишные строки O>>а че мучительного в std::string/std::wstring? МС>Хотя бы то, что при неосторожном обращении получаем полное копирование на каждый чих.
А можно пример? А то что то у меня не придумывается что надо с ними делать чтоб на каждый чих копировалось. В C# стиле писать что ли.
МС> А проблема стандартных сишных строк относится скорее к проблеме сишных массивов как таковых, а это потеря размерности при передаче в другую функцию вследствие приведения к указателю.
Честно говоря не сильно помню когда мне приходилось использовать массивы кроме как временного буфера для вызова Сшных функций, который за пределы небольшого scope никуда не выходил.
Всё больше контейнеры и обёртки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Pzz, Вы писали:
Pzz>Я так описываюсь иногда (точку с запятой в конце строки на автомате ставишь, и в глаза она совершенно не бросается). gcc не ругается, зараза.
Здравствуйте, LaptevVV, Вы писали:
LVV>Никлаус Вирт — гораздо опытнее Страуструпа в обучении, поэтому абсолютно несомненно, что языки Вирта абсолютно лучше С/С++ для обучения.
Это ваше мнение и возможно лет 30 назад я бы (имей я тогда свое мнение на этот счет ) с ним даже согласился.
Мое личное наблюдение, преподы-поклонники Вирта более успешны в убивании интереса к программированию,
чем в привитии "хороших программистких манер".
Они с самого начала слишком усердно пытаются причесать студентов,
не давая им побыть некоторое время в хаосе.
Кстати, а что такое "язык для обучения" применительно к программистам,
которые почти наверняка будут сталкиваться с разными языками и которым полезно будет узнать и о граблях того же C?
Здравствуйте, bkat, Вы писали:
B>Здравствуйте, LaptevVV, Вы писали:
LVV>>Никлаус Вирт — гораздо опытнее Страуструпа в обучении, поэтому абсолютно несомненно, что языки Вирта абсолютно лучше С/С++ для обучения.
B>Это ваше мнение и возможно лет 30 назад я бы (имей я тогда свое мнение на этот счет ) с ним даже согласился. B>Мое личное наблюдение, преподы-поклонники Вирта более успешны в убивании интереса к программированию, B>чем в привитии "хороших программистких манер". B>Они с самого начала слишком усердно пытаются причесать студентов, B>не давая им побыть некоторое время в хаосе.
B>Кстати, а что такое "язык для обучения" применительно к программистам, B>которые почти наверняка будут сталкиваться с разными языками и которым полезно будет узнать и о граблях того же C?
дык мы своих как раз кидаем в разую воду...
Вот программных инженеров в самом первом семестре начали учить на Кумире — чтобы привести их к общему знаменателю всех. Очень с разной подготовкой приходят.
Потом у них семестр глубокого погружения в процедурную часть С++.
Потом семестр писания курсовой по процедурной части С++. И освоение указателей с итераторами... По мере возможностей...
Одновременно с этим — семестр введения в ООП на С++ — до шаблонов.
Хотя основы STL в виде векторов (и итераторов) они уже в предыдущем семестре проходят.
Следом — ударная доза С++ в виде шаблонов, STL, паттернов и управления памятью с перегрузкой new|delete. И конкретно в этом годе хочу дать основы Qt — для знакомства с реализацией интерфейса.
Одновременно с этим — писание курсовой по ООП. Тут разрешается использовать любой язык, помимо С++. Часто студиозы сами осваивают WinForms и основы Додиеза, чтобы интерфейс написать. Хотя есть такие, которые предпочитают С++|CLI. А один "монстр для написания первой курсовой самостоятельно разобрался с MFC — пацан из Дагестана, из сельской школы...
Одновременно с этим — изучение структур данных и алгоритмов, где некоторые алгоритмы им показывают на Питоне, Додиезе и С++.
И одновременно с этим — основы архитекутуры ЭВМ, где они на лабах пробуют писать ассемблерные вставки — чтоб знали, как все это работает...
Ну, а уж третий курс — это ваще...
Тут тебе и базы данных (+курсовая), и SQL Server (+курсовая), и программирование компьютерной графики, и операционные системы, и системное программирование (и все на С++) и еще много...
А четвертый курс — это NET-программирование — годовой курс, и опять курсовая.
Так что учим мы — на совесть.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Kluev, Вы писали:
K>Здравствуйте, LaptevVV, Вы писали:
LVV>>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
K>Правильно. Учится нужно на КулХацкеле. K>А true недостаков С и (С++) вы, профессор, еще не заметили.
K>Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист:
K>1. препроцессор вместо раздельной компиляции K>2. сишные строки
Да как-то с этим проблем не наблюдается... Лабы есть по каждой теме, народ вполне себе осваивает.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, alpha21264, Вы писали:
A>С альтернативами пока плохо. A>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>(например функциональное программирование) которые в С++ уже не впихнешь.
А нужно впихнуть?
A>Попробуй написать что-нибудь например на Питоне. A>Сразу поймешь, что в С++ тебе массы всего не хватает. A>И вообще он раздражает тебя своей многословностью.
Придется таки попробовать: уже плешь проели этим своим питоном.
Здравствуйте, LaptevVV, Вы писали:
LVV>Он не путает. Это — простая описка. Бывает, что при наборе слова буквы наоборот напечатаешь. Здесь именно тот случай...
Простите, какой из этого человека _программист_, если он не может выявить _свою_ _собственную_ описку в таком простом случае и в таком простом языке?
Может вам стоило бы учить начинающих не тому что "Си — зло" (к), а тому, что жизнь вообще и программирование в частности — говно — и что такие "описки" — это просто обычные рабочие моменты и что _программист_ должен знать о возможности их существования в программе и уметь находить подобные места и уметь анализировать их и исправлять — нет? Или чему вы там своих "начинающих программистов" вообще учите?
Здравствуйте, rising_edge, Вы писали:
PD>>>А еще лучше вот так
PD>>>if(counter!=!0)...
R>>мораль: на си надо писать в сишном стиле if(counter), не страдая паскализмом и все будет хорошо
_>Когда я вижу if (c), я не знаю ничего о типе. Глядя на такую запись, я предполагаю, что это булевская переменная. Когда я вижу _>if(c != 0) то, это, очевидно, c — целая; _>if(c != NULL) то, это, очевидно, c — указатель; _>if(c != '\0') то, это, очевидно, c — символ.
_>Код делается более читабельным. Строгая типизация рулит.
Я выделил выделенное. В _Си_ нет строгой типизации.
Угу. Запускать программы не пробовали? Если в каком-то месте какой-то кусочек кода не вызывается, хотя по всем внешним признакам (самосинг езмъ истино!) — должен — аккуратно вычитать соотв. место и найти опиську не составляет обого труда. Это вам не "плюсы" с ихними шаблонами и многоуровневыми аллокаторами и еще черт-и-знает-чем на что хватило фантазии авторов — на какие-нибудь скриптовые вставки, например.
Здравствуйте, igna, Вы писали:
LVV>>Он не путает. Это — простая описка. Бывает, что при наборе слова буквы наоборот напечатаешь. Здесь именно тот случай...
I>Не, ну а если он 91 вместо 19 напишет, компилятор тоже должен выдать ошибку? Требовать от языка, чтобы он был устойчивым к перестановке букв при наборе слова, это уже чересчур, может он еще и самокорректирующимся должен быть?
У нас тут намедни нашли старинную и вообще непонятно как возникающую ошибку: расхождение по вертикали, которого быть не может не должно и вообще непонятно как такое может возникать в системе. Оказалось все просто: по вине переписчика в одном месте был перепутан подъем с переворотом... Всего делов-то!
ЗЫ: понятно, что "кошерно" вводить отдельную сущность для углов, и отдельную — для длинн и высот... Только потом...
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, alpha21264, Вы писали:
A>>С альтернативами пока плохо. A>>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>>(например функциональное программирование) которые в С++ уже не впихнешь.
TL>А нужно впихнуть?
Нуу... было бы полезно.
A>>Попробуй написать что-нибудь например на Питоне. A>>Сразу поймешь, что в С++ тебе массы всего не хватает. A>>И вообще он раздражает тебя своей многословностью.
TL>Придется таки попробовать: уже плешь проели этим своим питоном.
Не боись. Я тоже недавно начал. Я не ожидал, что мне понравится
Здравствуйте, Kluev, Вы писали:
K>Вот то с чем осознанно или неосознанно мучается почти любой Ц/ЦПП программист:
K>1. препроцессор вместо раздельной компиляции
Э-э-э... у-у-у... Я вот как-то и не мучаюсь...
K>2. сишные строки
Это "нуль-терминированные", что ли? Чем не угодили-то?
K>PS: Тред не читал
Здравствуйте, LaptevVV, Вы писали:
LVV>Потом семестр писания курсовой по процедурной части С++. И освоение указателей с итераторами... По мере возможностей...
м-м-м... я что-то потерялся: итераторы — это еще процедурная часть языка или уже нет?
LVV>Одновременно с этим — семестр введения в ООП на С++ — до шаблонов.
имхо, плохо разделять с шаблонами — оные, кстати, еще на "процедурном" этапе давать надо и потом развивать до ООП по мере того как. Ну и имхо самая мутная часть современных "плюсов".
LVV>Хотя основы STL в виде векторов (и итераторов) они уже в предыдущем семестре проходят.
Угу... Подозреваю для упрощения загрузки неокрепших мозгов понятием "массив в си/си++". Точнее отказом от загрузки как таковой...
LVV>Следом — ударная доза С++ в виде шаблонов, STL, паттернов и управления памятью с перегрузкой new|delete. И конкретно в этом годе хочу дать основы Qt — для знакомства с реализацией интерфейса.
имхо, последнее — плохо. Достойно отдельной темы обсуждения.
Простите, но мне виден характерный "преподавательский" подход...
LVV>Одновременно с этим — писание курсовой по ООП. Тут разрешается использовать любой язык, помимо С++. Часто студиозы сами осваивают WinForms и основы Додиеза, чтобы интерфейс написать. Хотя есть такие, которые предпочитают С++|CLI. А один "монстр для написания первой курсовой самостоятельно разобрался с MFC — пацан из Дагестана, из сельской школы...
Простите великодушно, но почему бы тогда прямо сразу с "додиеза" и не начинать?
LVV>Одновременно с этим — изучение структур данных и алгоритмов, где некоторые алгоритмы им показывают на Питоне, Додиезе и С++.
Можно примеры алгоритмов? И какие-нибудь обоснования подобного зоопарка, если можно...
LVV>И одновременно с этим — основы архитекутуры ЭВМ, где они на лабах пробуют писать ассемблерные вставки — чтоб знали, как все это работает...
Ну как жеж без этого преподавать-то!
А что — самостоятельно написать лабу, стартующую "с нуля" в качестве нулевого круга ОС и перебрасывающую машинку в защищенный режим — слабо?
имхо, бессмысленность "основ архитектуры ЭВМ" без какой-либо привязки к ОС — хотя бы Миникс взять собрать-разобрать своими руками! — не знает границ и "преподавательского оттенка" сей подход.
LVV>Ну, а уж третий курс — это ваще...
Я даже все и угадал. Хотя я закончил уже 10 лет тому назад и на лекциях не учился, а просто "проводил время".
LVV>Тут тебе и базы данных (+курсовая), и SQL Server (+курсовая), и программирование компьютерной графики, и операционные системы, и системное программирование (и все на С++) и еще много...
(позёвывая) и шо за "системное программирование — и все на Си++"?
Смешались в кучу кони, люди... (к)
LVV>А четвертый курс — это NET-программирование — годовой курс, и опять курсовая.
А нет чтобы с него начать...
LVV>Так что учим мы — на совесть.
Да, конечно. Я 10 лет тому назад как раз так "на совесть" учился. Совести у меня, правда, не было — потому сдавал все в последний момент. Весь "годовой курс" — экстерном за пару вечеров. Вот Варкрафт был — это да! Кажется, это уже был второй — первый, помнится, совсем был убогий.
Как приятно, что в курсе "основы программирования" ничего и не изменилось — ну просто помолодел лет на 13, считая когда тот курс вообще закончился.
Здравствуйте, alpha21264, Вы писали:
A>>>С альтернативами пока плохо. A>>>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>>>(например функциональное программирование) которые в С++ уже не впихнешь.
TL>>А нужно впихнуть?
A>Нуу... было бы полезно.
И шо таки мешает?
TL>>Придется таки попробовать: уже плешь проели этим своим питоном.
A>Не боись. Я тоже недавно начал. Я не ожидал, что мне понравится
У меня сейчас серверная часть на питоне (вроде — я кроме бинарных пакетов и чатов с "серверными инженерами" ничего в живом виде не видел) написана. Вот ведь страшная вещь: серверные инженеры отладочный сервер подняли (после 3-недельной переписки с попытками выпытать у меня что же именно у меня не работает, после чего нашелся хороший человек и правильно их пнул и оказалось, что на сервере ничего-то и не поднято вообще ) — а вот релизный теперь не могут. Причем отписаться "сам дурак" тоже не могут: на отладочном все работает. Страшная, видать, сила, этот ваш питон!
Здравствуйте, The Lex, Вы писали:
TL>Не вопрос! Выносим 19 и 91 в хедер, а вместе с ними — и еще 93 сопуствующие константы, которые все называем красивыми символическими именами. TL>И в коде путаем не 19 и 91, а символические имена. TL>Таки разница!
Таки да, разница — опечататься и набить в коде HASH_OFFSET вместо MAX_REPEAT_COUNT несколько сложнее, чем 91 вместо 19.
TL>Нормальные компиляторы в курсе, что "вьюноши с горящими глазами" частенько лажают и путают оператор присваивания с оператором эквивалентности в местах, где логично ожидать таки оператор эквивалентности. Рестрикта там нет. Более того, старый добрый "сишный стиль" повсеместно использует присваивание вместе с проверкой в одном и том же выражении.
Ну дык в том и вопрос, нафига он нужен — такой стиль-то? Минусы, которые он приносит, видны невооруженным глазом, плюсы же [лично мне] мягко говоря неочевидны. Нет, ну то есть я могу предположить, что это играло какую-то роль в те далекие времена, когда компьютеры были большими, а компиляторы неоптимизирующими — но сейчас-то зачем?
Здравствуйте, MescalitoPeyot, Вы писали:
MP>А теперь попробуй перепутать знаки в !=. Шо, не получается? Shift мешает? Ну так и о чем речь, проблема высосана из пальца.
Конкретный пример — да, но вообще присваивание и сравнение перепутать имхо довольно несложно. Особенно если программист не чистый сишник, а пишет параллельно на нескольких языках.
Здравствуйте, LaptevVV, Вы писали:
LVV>Тут тебе и базы данных (+курсовая), и SQL Server (+курсовая), и программирование компьютерной графики, и операционные системы, и системное программирование (и все на С++) и еще много... LVV>А четвертый курс — это NET-программирование — годовой курс, и опять курсовая. LVV>Так что учим мы — на совесть.
Не с целью как-то усомниться в последнем предложении, но просто из интереса, что сейчас проходят, входит ли в программу обучение написанию компиляторов и правильному составлению собственных языков для предметной области? Это я помимо прочего намекаю на парадигму LOP — Language Oriented Programming
Здравствуйте, LaptevVV, Вы писали:
LVV>3. Совершенно не обращают внимания, что писал начинающий... То есть — СОВСЕМ начинающий, первый раз изучающий программирование (незнакомый мне первокурсник, фиг знает, с какого города)...
Причем либо японец, либо индус, либо носитель еще какого языка, в котором отрицание ставится после отрицаемого слова.
В русском все же "не равно" транслируется буквально в "!=", если знать, что "!" — это "не" (что "=" — это "равно", надеюсь, все абитуры знают... ну большинство, хотя бы...)
Здравствуйте, The Lex, Вы писали:
CC>>С макросами в основном Сшники сношаются. CC>>В С++ эквилибристика на макросах используется крайне редко, бо есть более удобные средства генерации кода. TL>Я постоянно пользуюсь. В основном для максимального уменьшения вероятности описок в очень похожих строчках кода.
А можно пример для оценки насколько твои макросы нетривиальны.
Тривиальные отлаживать особо гемору нет.
МС>>> а в сочетании с препроцессором иногда очень трудно сказать, что же ты конкретно навключал. CC>>Для особо тяжких случаев есть /showIncludes TL>В особо тяжком случае я нахально проставил #error message в местах между #ifdef-ами и отладил таким образом компиляцию.
МС>>>Хотя бы то, что при неосторожном обращении получаем полное копирование на каждый чих. CC>>А можно пример? А то что то у меня не придумывается что надо с ними делать чтоб на каждый чих копировалось. В C# стиле писать что ли. TL>Я что-то пропустил: а в паскале строки не копируются? Там встроенные счетчики обращений есть?
Без понятия что там на данный момент с паскалем, но у меня строки копируются как правило если они меняются или передаются куда то на более долговременное хранение. В остальных случаях идут как & или &&
TL>Угу. Я, например, вот только сегодня нашел (в смыле: свежая статистика — опыт-то старый, не умеют давно... никогда не умели...), что "контейнерами и обертками" никак не умеют пользоваться "выросшие на контейнерах и обертках программисты" и хак — (char*)std_string_value.c_str() — для передачи строки в качестве буфера — "нормальное" дело.
У меня правильные контейнеры. В них у строки есть метод .str() который возвращает WCHAR* спецом для получения строк из winapi и прочих C функций.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, alpha21264, Вы писали:
A>>>>С альтернативами пока плохо. A>>>>Но это не отменяет того факта, что в программировании накопилось дохрена идей, A>>>>(например функциональное программирование) которые в С++ уже не впихнешь.
TL>>>А нужно впихнуть?
A>>Нуу... было бы полезно.
TL>И шо таки мешает?
Ну например в чистом финкциональном программировании нет разрушающего присваивания.
То есть например i++ написать нельзя.
TL>У меня сейчас серверная часть на питоне (вроде — я кроме бинарных пакетов и чатов с "серверными инженерами" ничего в живом виде не видел) написана. Вот ведь страшная вещь: серверные инженеры отладочный сервер подняли (после 3-недельной переписки с попытками выпытать у меня что же именно у меня не работает, после чего нашелся хороший человек и правильно их пнул и оказалось, что на сервере ничего-то и не поднято вообще ) — а вот релизный теперь не могут. Причем отписаться "сам дурак" тоже не могут: на отладочном все работает. Страшная, видать, сила, этот ваш питон!
Нуу... Ты-ж понимаешь, что тут дело не в питоне. Сдуру можно и такую вещь сломать, которая вроде не ломается.
Здравствуйте, Michael7, Вы писали:
M>Здравствуйте, LaptevVV, Вы писали:
LVV>>Тут тебе и базы данных (+курсовая), и SQL Server (+курсовая), и программирование компьютерной графики, и операционные системы, и системное программирование (и все на С++) и еще много... LVV>>А четвертый курс — это NET-программирование — годовой курс, и опять курсовая. LVV>>Так что учим мы — на совесть.
M>Не с целью как-то усомниться в последнем предложении, но просто из интереса, что сейчас проходят, входит ли в программу обучение написанию компиляторов и правильному составлению собственных языков для предметной области? Это я помимо прочего намекаю на парадигму LOP — Language Oriented Programming
На 3-м курсе есть дисциплина Системное ПО (это помиомо операционных систем). С целью врубить народ в современную реализацию языков, лабы такие: написать интерпретатор виртуальной машины, написать ассемблер для означенной машины, в процессе писания ассемблера — сделать интерпретатор выражений (арифметических и логических), где ознакомление с конечными автоматами и грамматиками. Потом отладчик для означенной машины, потом уж компилятор для простого императивного языка — для означенной машины. Все должно работать и выдавать конкретный результат для совершенно конкретных программ: для виртуальной машины, ассемблер, отладчик и компилятор.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Michael7, Вы писали:
TL>> Очевидно, товарищу начинающему программисту про дебаггеры и прочие излишества всякие нехорошие рассказать забыли.
M>Мне кажется, что для начинающего программиста дебаггеры — зло и им надо категорически запретить ими пользоваться. В том числе, чтобы учились подобные ошибки выявлять тестами и внимательным чтением кода.
Как бы вам сказать... Тяжело в учении — легко в бою! (к) Если его начинать учить "внимательному вычитыванию кода" и только — как он будет "вычитывать" кода строк на полмильйона со всякими сложными "интеркоммуникейшинами"?
Юнит-тест покажет что в данной функции есть ошибка. Это все. Далее правильно бы все же попытаться пройти "фейлящийся" тест под дебагером и посмотреть — чаще всего, просветление наступает. имхо, этому надо учить в том числе — работа у нас такая, разгребать ...
Здравствуйте, CreatorCray, Вы писали:
CC>>>С макросами в основном Сшники сношаются. CC>>>В С++ эквилибристика на макросах используется крайне редко, бо есть более удобные средства генерации кода. TL>>Я постоянно пользуюсь. В основном для максимального уменьшения вероятности описок в очень похожих строчках кода. CC>А можно пример для оценки насколько твои макросы нетривиальны. CC>Тривиальные отлаживать особо гемору нет.
Тривиальны. Для нетривиального сношения специально обученные люди пишут специально навороченные шаблоны. Их у нас тоже есть!
CC>Без понятия что там на данный момент с паскалем, но у меня строки копируются как правило если они меняются или передаются куда то на более долговременное хранение. В остальных случаях идут как & или &&
Меряться так меряться: у меня строки еще и кушают специальный флажок, который означает "строка из ресурсов" и тогда указатель — не указатель, а идентификатор (считай индекс) предустановленной строки из ресурсов.
CC>У меня правильные контейнеры. В них у строки есть метод .str() который возвращает WCHAR* спецом для получения строк из winapi и прочих C функций.
Так в школе ж твои правильные контейнеры не учат.
ЗЫ: А я вот сейчас бодаюсь с особенностями реализации юникода на маке. И хоть бы мне ж тот Мак нужен был — так мне всего-то от сервера полученный utf8 в используемый гуями wchar_t преобразовать. Причем аж (!) в одном месте аж в одной "маркетинговой единице функциональности". Причем остальное вроде работает... Вот _этому_ в школах надо учить — индустриальному подходу и что часто нужно копать и копать. имхо.
Здравствуйте, alpha21264, Вы писали:
A>Ну например в чистом финкциональном программировании нет разрушающего присваивания. A>То есть например i++ написать нельзя.
Надо будет погуглить что за концепция такая "разрушающее присваивание".
TL>>У меня сейчас серверная часть на питоне (вроде — я кроме бинарных пакетов и чатов с "серверными инженерами" ничего в живом виде не видел) написана. Вот ведь страшная вещь: серверные инженеры отладочный сервер подняли (после 3-недельной переписки с попытками выпытать у меня что же именно у меня не работает, после чего нашелся хороший человек и правильно их пнул и оказалось, что на сервере ничего-то и не поднято вообще ) — а вот релизный теперь не могут. Причем отписаться "сам дурак" тоже не могут: на отладочном все работает. Страшная, видать, сила, этот ваш питон!
A>Нуу... Ты-ж понимаешь, что тут дело не в питоне. Сдуру можно и такую вещь сломать, которая вроде не ломается.
Медицина говорит: ломается — есть прецеденты. Мой опыт говорит: сервера тоже ломаются — прецеденты постоянно. Остается убедить в этом а) начальство; б) "другую сторону которая сервером управляет". В целом, второй вопрос не столь трудет — технически. Но это уже менежмент и коммуникации — этому в школе программирования тоже поди не учат.
Здравствуйте, The Lex, Вы писали:
TL>Так в школе ж твои правильные контейнеры не учат.
Дык в школе вообще не учат разработке софта.
TL>ЗЫ: А я вот сейчас бодаюсь с особенностями реализации юникода на маке. И хоть бы мне ж тот Мак нужен был — так мне всего-то от сервера полученный utf8 в используемый гуями wchar_t преобразовать. Причем аж (!) в одном месте аж в одной "маркетинговой единице функциональности". Причем остальное вроде работает... Вот _этому_ в школах надо учить — индустриальному подходу и что часто нужно копать и копать. имхо.
Тебе Utf8->UCS2 функцию подогнать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, blackhearted, Вы писали:
B>>ИМХО, проще микро ассемблера вообще ничего нет и ниже тоже мало кто существует.
TL>Есть еще особенности работы современных процессоров: кеширования всякие, предсказания, многопроцессорность опять же, DMA... м-м-м... у меня все.
Я в курсе.
Но тут же затык в самом начале, еще до ДМА как до луны. Какие уж кеширования?
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, blackhearted, Вы писали:
LVV>>>Поэтому для начинающих язык С — зло! Причем в сочетании с со студией — зло практически АБСОЛЮТНОЕ!
B>>Студия даже ворнинг не показала? Не верю. B>>А если у вас ребята учатся писать на уровне ниже /W4 игонорируя вывод компилятора — то флаг им в руки.
B>>
Здравствуйте, Michael7, Вы писали:
M>Здравствуйте, The Lex, Вы писали:
TL>> Очевидно, товарищу начинающему программисту про дебаггеры и прочие излишества всякие нехорошие рассказать забыли.
M>Мне кажется, что для начинающего программиста дебаггеры — зло и им надо категорически запретить ими пользоваться. В том числе, чтобы учились подобные ошибки выявлять тестами и внимательным чтением кода.
да, согласен.
Но варнинги нужно читать, а не понижать их уровень, а потом искать тестами/чтением в чём же проблема.
Здравствуйте, Michael7, Вы писали:
TL>> Очевидно, товарищу начинающему программисту про дебаггеры и прочие излишества всякие нехорошие рассказать забыли.
M>Мне кажется, что для начинающего программиста дебаггеры — зло и им надо категорически запретить ими пользоваться. В том числе, чтобы учились подобные ошибки выявлять тестами и внимательным чтением кода.
Т.е. вместо того, чтоб быстро найти конкретное место в программе где выполнение пошло не так, как предполагалось новичку предлагается напрячь и так перегретые попыткой написать программу мозги и пройтись отладчиком "в уме"? Дык нету у него ещё столько ума то, он его только набирается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, blackhearted, Вы писали:
B>Но варнинги нужно читать, а не понижать их уровень, а потом искать тестами/чтением в чём же проблема.
Waning as error — наше всё!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, alpha21264, Вы писали:
A>Ну например в чистом финкциональном программировании нет разрушающего присваивания. A>То есть например i++ написать нельзя.
А где тут присваивание? Это инкремент
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Пацак, Вы писали:
П>Таки да, разница — опечататься и набить в коде HASH_OFFSET вместо MAX_REPEAT_COUNT несколько сложнее, чем 91 вместо 19.
Не ну мне тут совсем недавно вижуалко сошло с ума и стало автодополнять HRES... не как HRESULT, которого в коде туевы хучи а как HRESOURCE, который пару раз встретился.
Так шта...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, blackhearted, Вы писали:
B>>[ccode] B>>Compile as C Code (/TC) + Level 4 (/W4) B>>
B>>warning C4706: assignment within conditional expression
B>>Повторюсь, если игнорить варнинги — то ССЗБ и язык тут не при чём.
TL>Да, только в "простом Си" — присваивание внутри условия — довольно распространенная практика.
По мнению ТС — это всё должно быть запрещено самим дизайном языка.
Здравствуйте, Пацак, Вы писали:
П>Таки да, разница — опечататься и набить в коде HASH_OFFSET вместо MAX_REPEAT_COUNT несколько сложнее, чем 91 вместо 19.
Зато опечататься и набить 91 вместо 19 при определении HASH_OFFSET или MAX_REPEAT_COUNT несколько проще.
Здравствуйте, blackhearted, Вы писали:
TL>>Да, только в "простом Си" — присваивание внутри условия — довольно распространенная практика.
B>По мнению ТС — это всё должно быть запрещено самим дизайном языка.
Угу. И добавив сюда "сообщения об ошибках" вида "произошла ошибка в строке ххх" — мы получим невероятно "человеколюбимый" язык. Знаем, плавали.
Здравствуйте, MasterZiv, Вы писали:
MZ>On 10.01.2011 23:34, Пацак wrote:
>> Java, например.
MZ>Ни в коем случае Java не должна быть первым языком. MZ>Она чистый ООП, программировать надо начинать БЕЗ ООП.
Здравствуйте, The Lex, Вы писали:
TL>Угу. Я, например, вот только сегодня нашел (в смыле: свежая статистика — опыт-то старый, не умеют давно... никогда не умели...), что "контейнерами и обертками" никак не умеют пользоваться "выросшие на контейнерах и обертках программисты" и хак — (char*)std_string_value.c_str() — для передачи строки в качестве буфера — "нормальное" дело.
вот это трындец... это в промышленном коде такое творится?
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, The Lex, Вы писали:
TL>>Угу. Я, например, вот только сегодня нашел (в смыле: свежая статистика — опыт-то старый, не умеют давно... никогда не умели...), что "контейнерами и обертками" никак не умеют пользоваться "выросшие на контейнерах и обертках программисты" и хак — (char*)std_string_value.c_str() — для передачи строки в качестве буфера — "нормальное" дело.
B>вот это трындец... это в промышленном коде такое творится?
А всё потому, что кто то когда то не подумал как бы std::basic_string удобно заюзать для получения строк из сишных функций.
Вот народ и выкручивается чтоб не делать лишние буфера с копированием.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
M>>Без отладчика так пару раз помучается и станет аккуратнее. CC>Если бы. Продолжительные мучения в поисках "гдеж это я накосячил" куда скорее приводят к воплям "Язык говно!!!" на форумах, что мы периодически тут от подобных ниасиливших видим.
Они это и с отладчиком вопят, потому что такие звуки от начинающих говорят скорее о психологических проблемах конкретного индивидуума. Будьте уверены: на отладчике они не заканчиваются.
С другой стороны, именно для разбора тупых вопросов начинающих и нужен преподаватель, а при его отсутствии, благодаря интернету, есть форумы, где можно поспрашивать. Собственно, на винграде как раз пример вопроса и получился. Все нормально.
Кстати, в данном вопросе: а что такого начинающему, кроме скачущей по экрану полоски с выделенной строчкой кода, покажет отладчик? Я говорю именно о вообще начинающем программисте, опытный человек, если ранее не знал C++, но имеет опыт с другими языками, вообще иначе будет обучаться.
Как это не тривиально, но надо еще додуматься в отладчике посмотреть на значение конкретной переменной, чтобы увидеть присваивание в if. Для нас это пустяк, но действительно начинающий, он же везде начинающий.
С другой стороны, по простейшим тестам тоже можно заметить, что где-то в районе if произошло нежелательное присваивание.
Также и warning-и, если их не отключать, дадут более точную информацию чем отладчик.
M>> Отладчик начинающего программиста развращает умственно, он может его приучить к небрежности, привычке в случае проблем не головой думать, а F8 (или еще что-нибудь) тыкать. CC>Какие высокие слова. CC>Инструментарий надо знать и уметь им пользоваться всем. А то это получается как "оператор += приводит к раку мозга, вшам и диарее блаблабла, надо только x = x + ...".
Так я разве против знания инструментария? Вот только должна быть и определенная последовательность в обучении. Прежде чем ездить на пятой передаче стоит научиться это делать на первой.
Так что моё мнение прежнее: прежде чем обучающийся не освоит элементарные вещи из языка, не набьет немного шишек на своих первых программах — нечего ему показывать отладчик, он им все-равно толком пользоваться не сможет, а дурные привычки приобретет.
Пусть для начала научится писать на Си простые программы без проблем с памятью, многие из которых, кстати, весьма плохо выявляются отладчиком. Вот после этого этапа можно и отладчик давать.
CC>Я про то, что отказываться от отладчика на ранних этапах, когда обучаемый ещё не накопил опыта совершения и осознания ошибок попросту неэффективно. Чем быстрее он найдёт ошибку, тем быстрее он в ней разберётся и поймёт.
Да даже, чтобы правильно искать ошибку уже надо иметь некоторый опыт. Даже в педагогических целях полезно помучиться при поиске ошибки — лучше запоминается тогда. Не чрезмерно, конечно.
CC>Когда поведение кода зависит от кучи параметров ты в уме все эти параметры к конкретной точке ни в жизнь не просчитаешь. Посмотреть что именно творилось в переменных в данной точке программы отладчиком куда удобнее чем нашпиговывать в прогу debug output.
В уме — нет, на бумажке можно и просчитать. Не повредит даже имеющим опыт И это не ретроградство, а реально иногда бумага — самое удобное средство для выражения мыслей. Например, когда я писал на ассемблере код для FPU, именно на бумаге тщательно выписывал состояние стека FPU. Потом в код в комментарии перенес.
CC>И? Про серебрянную пулю и так речи не шло.
Ну и я не про полный запрет отладчика. Просто это достаточно мощный и серьезный инструмент для эффективного обращения с которым нужна определенная культура и навык программирования.
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, blackhearted, Вы писали:
LVV>>>>>>
LVV>>>>>> if (counter =! 0 ) {
LVV>>>>>>
Pzz>>>>>Ну ваше-то, любой нормальный компилятор в этом месте предупреждение напишет, если их (предупреждения) не отключать. LVV>>>>Начинающие на этом этапе Debug от Release отличить не могут, не то, что предупреждения отключить... B>>>Кто-то кроме студентоты таким страдает? А учеников нужно учить. LVV>>Никлаус Вирт при создании паскаля написал: Одним из главных побуждающих мотивов создания нового языка стало то, что ему надоело учить студентов не программированию, а особенностям языка (и транслятора) фортрана. B>Фортран — это, конечно, вещь. С ним можно всё что угодно сравнивать, всё равно никто не сможет аргументировано доказать.
LVV>>Язык НЕ ДОЛЖЕН позволять писать ошибочные конструкции, которые пропускаются компилятором. B>Treat warnings as errors и никаких гвоздей. Получишь палки в колёса от компилятора. B>Или нужно полагаться полностью на дизайн языка и голову вообще не включать? B>Так мы докатимся до того, что в языке вообще не может быть никаких side-effects и всё иммутабельно — есть такой подход в обучении, начинать с подобных языков. Только вот Виртовский Паскаль под это описание ну не подходит никак.
LVV>>Знаменитая ошибка в программе на фортране: вместо запятой была поставлена точка и оператор цикла превратился в оператор присваивания. B>И опять он — великий и ужасный. Где сейчас начитают учить с фортрана, в ПТУ? В моё время учили как раз с Паскаля. И ошибки делали на Виртовском творении еще покруче, чем на в будущем на Сях.
B>Можно еще Аду вспомнить — вот она, безопасность. Но это уже оффтоп.
Ну тогда уж не Аду, а Оберон — там вообще никакого синтаксического сахара. Описание языка — смешные 16 страниц.
Здравствуйте, Michael7, Вы писали:
M>Кстати, в данном вопросе: а что такого начинающему, кроме скачущей по экрану полоски с выделенной строчкой кода, покажет отладчик? Я говорю именно о вообще начинающем программисте, опытный человек, если ранее не знал C++, но имеет опыт с другими языками, вообще иначе будет обучаться.
Ну, я не знаю насколько я был опытный ( ) в школьные годы, но когда у меня появился отладчик Zeus для Z80 то он мне очень многое говорил.
M>>> Отладчик начинающего программиста развращает умственно, он может его приучить к небрежности, привычке в случае проблем не головой думать, а F8 (или еще что-нибудь) тыкать. CC>>Какие высокие слова. CC>>Инструментарий надо знать и уметь им пользоваться всем. А то это получается как "оператор += приводит к раку мозга, вшам и диарее блаблабла, надо только x = x + ...".
M>Так я разве против знания инструментария? Вот только должна быть и определенная последовательность в обучении. Прежде чем ездить на пятой передаче стоит научиться это делать на первой.
Искать ошибку только по исходнику это совсем не 1я передача. Для этого уже надо багаж знаний иметь.
M>Пусть для начала научится писать на Си простые программы без проблем с памятью, многие из которых, кстати, весьма плохо выявляются отладчиком. Вот после этого этапа можно и отладчик давать.
Зато некоторые — прекрасно. Например пошагово идём и смотрим в каком месте в определённой памяти оказывается нагажено. Локализовываем ошибку а дальше смотрим что там уже в коде понакручено.
А там и Refactor Find Reference может понадобится и callstack и прочее и прочее.
CC>>Я про то, что отказываться от отладчика на ранних этапах, когда обучаемый ещё не накопил опыта совершения и осознания ошибок попросту неэффективно. Чем быстрее он найдёт ошибку, тем быстрее он в ней разберётся и поймёт. M>Да даже, чтобы правильно искать ошибку уже надо иметь некоторый опыт. Даже в педагогических целях полезно помучиться при поиске ошибки — лучше запоминается тогда. Не чрезмерно, конечно.
И потом получаются оригиналы, которые вместо того, чтоб один раз пройти отладчиком и найти ошибку начинают воскуривать километры кода. А масштаб то уже не учебный нифига.
CC>>Когда поведение кода зависит от кучи параметров ты в уме все эти параметры к конкретной точке ни в жизнь не просчитаешь. Посмотреть что именно творилось в переменных в данной точке программы отладчиком куда удобнее чем нашпиговывать в прогу debug output. M>В уме — нет, на бумажке можно и просчитать.
Отладчик лучше бумажки (т.е. человека) в том, что он не ошибается. Т.е. он показывает то, что в реале произошло, тогда как код на глаз должен был сделать совсем другое. Такие ошибки на бумажке можно дооолго ловить.
Или например есть у нас ошибка, которая проявляется после нетривиальной обработки пары десятков метров данных. Сколько коробок бумаги и человеколет надо чтобы методом "бумажки" найти где баг?
M> Не повредит даже имеющим опыт И это не ретроградство, а реально иногда бумага — самое удобное средство для выражения мыслей.
Строго субъективно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, alpha21264, Вы писали:
TL>>Придется таки попробовать: уже плешь проели этим своим питоном.
A>Не боись. Я тоже недавно начал. Я не ожидал, что мне понравится
Питон для многих сишников обладает наркотическим эффектом
Здравствуйте, alpha21264, Вы писали:
A>Ну например в чистом финкциональном программировании нет разрушающего присваивания. A>То есть например i++ написать нельзя.
Вообще достаточно чистоты функций, то есть результат функции зависит только от параметров,
а что там происходит внутри неважно. Вот тут http://www.digitalmars.com/d/2.0/accu-functional.pdf
D'шники все неплохо объясняют.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, blackhearted, Вы писали:
B>>Здравствуйте, The Lex, Вы писали:
TL>>>Угу. Я, например, вот только сегодня нашел (в смыле: свежая статистика — опыт-то старый, не умеют давно... никогда не умели...), что "контейнерами и обертками" никак не умеют пользоваться "выросшие на контейнерах и обертках программисты" и хак — (char*)std_string_value.c_str() — для передачи строки в качестве буфера — "нормальное" дело.
B>>вот это трындец... это в промышленном коде такое творится? CC>А всё потому, что кто то когда то не подумал как бы std::basic_string удобно заюзать для получения строк из сишных функций. CC>Вот народ и выкручивается чтоб не делать лишние буфера с копированием.
Здравствуйте, Мишень-сан, Вы писали:
B>>>вот это трындец... это в промышленном коде такое творится? CC>>А всё потому, что кто то когда то не подумал как бы std::basic_string удобно заюзать для получения строк из сишных функций. CC>>Вот народ и выкручивается чтоб не делать лишние буфера с копированием.
МС>std::vector<char> buf(BUFFER_SIZE); ?
Это и есть лишний буфер.
Потому как дальше с полученной строкой надо работать как со string?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Мишень-сан, Вы писали:
B>>>>вот это трындец... это в промышленном коде такое творится? CC>>>А всё потому, что кто то когда то не подумал как бы std::basic_string удобно заюзать для получения строк из сишных функций. CC>>>Вот народ и выкручивается чтоб не делать лишние буфера с копированием.
МС>>std::vector<char> buf(BUFFER_SIZE); ? CC>Это и есть лишний буфер. CC>Потому как дальше с полученной строкой надо работать как со string?
Ну тут уже не попляшешь особо... ЕМНИП по стандарту внутреннее представление basic_string не обязано быть ни одним блоком, ни null-terminated.
А ещё некоторые особо одарённые С-функции даже не позволяют узнать, сколько же им буфера надо. Примеров, правда, сейчас не приведу, но пару раз натыкался.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
Да просто надо сразу приучать к несколько иному написанию сравнения. Первым аргументом всегда писать константы. И будет всем счастье.
Здравствуйте, kaa.python, Вы писали:
KP>Да просто надо сразу приучать к несколько иному написанию сравнения. Первым аргументом всегда писать константы. И будет всем счастье.
Здравствуйте, LaptevVV, Вы писали:
LVV>На винграде обнаружил замечательный образчик кода на С, который замечательно демонстрирует, что начинать учиться программировать на С, не имея за плечами пару-тройку более простых языков, — сильно не рекомендуется.
LVV>
LVV> if (counter =! 0 ) {
LVV>
Сам писал сначала на Паскале, и допускал таки ошибки типа
LVV>
LVV> if (counter = 0 )
LVV>
Но теперь на всех немногих известных мне языках пишу правильно, даже переходя от одного к другому.
А дабы не спотыкаться об ошибки, нужно писать программу пошагово и хорошо структурировать её. Так, проверил корректность на данном этапе, а под подозрение могут попасть только недавно добавленные цикл и условие. Их проверить на наличие ошибок несложно. Тем более, такие ошибки в конце концов перестаёшь допускать.
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 4: warning: use of "=" where "==" may have been intended
if (counter = 0)
CC>Waning as error — наше всё!
О, не всегда, не всегда.
Как сейчас помню, был у меня в какой-то разновидности автомата state в enum. И имелся dummy концевой элемент — чтобы считать количество допустимых стейтов, и еще для чего-то.
Ну и был там красивый такой switch с разнообразными значениямию. Так gcc давал мне ворнинг — мол, одно из значений enum не используется в switch. Причем возможности отключить конкретно этот ворнинг я не нашел — только со всей пачкой. Ну и нафиг мне не компилирующаяся программа?
V>О, не всегда, не всегда. V>Как сейчас помню, был у меня в какой-то разновидности автомата state в enum. И имелся dummy концевой элемент — чтобы считать количество допустимых стейтов, и еще для чего-то. V>Ну и был там красивый такой switch с разнообразными значениямию. Так gcc давал мне ворнинг — мол, одно из значений enum не используется в switch. Причем возможности отключить конкретно этот ворнинг я не нашел — только со всей пачкой. Ну и нафиг мне не компилирующаяся программа?
ну такой код должен выглядеть так:
switch (x) {
case A:
....
case B:
....
case X:
default:
assert(0);
}
что касается оптимизации, то компилятор должен уметь распознавать ассерты.
Здравствуйте, Vamp, Вы писали:
V>Как сейчас помню, был у меня в какой-то разновидности автомата state в enum. И имелся dummy концевой элемент — чтобы считать количество допустимых стейтов, и еще для чего-то. V>Ну и был там красивый такой switch с разнообразными значениямию. Так gcc давал мне ворнинг — мол, одно из значений enum не используется в switch. Причем возможности отключить конкретно этот ворнинг я не нашел — только со всей пачкой. Ну и нафиг мне не компилирующаяся программа?
Ну это уже самодеятельность компилера. Такие warnings надо делать remark.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока