ДГ>>Это из той же оперы, что i+1 и i++. Запись удобная, но чревата ошибками по забывчивости: i — число или указатель.
SWW>Просветите меня, темного, в чем проблема-то, никак не пойму? Я много всякой гадости читал про С, а вот гадость про оператор ++ первый раз слышу. Во-первых, хоть я и много всяких ошибок делал — но забыть, какого типа переменная — это уж выходит за всякие рамки. А во-вторых — поблема-то когда возникает: когда i число или когда указатель?
Про тип переменной забыть трудно, а вот про размер объекта, на который она ссылается, можно. Хоть это и ламерская ошибка, но довольно распространенная. Пишешь i++, а указатель на 20 байт сдвигается. Может, это просто дурацкий пример той гадости, о которой я тут уже высказывался: слишком большая семантическая нагрузка на операторы (делающая семантику языковых конструкций сильно контекстно зависимой и потому далекой от интуитивной понятности) и слишком фривольное обращение с типами данных и памятью.
Здравствуйте, Дм.Григорьев, Вы писали:
Д>>.... которые настоятельно не рекомендуется использовать в любых целях, кроме освобождения памяти. ДГ>Которая, кстати, сама освобождается, так что они как бы и не нужны.
точно. то, что их оставили — это просчет разработчиков языка
Д>> Про что многие привыкшие к безопасности программеры забывают и за это потом получают по балде. ДГ>Ну я себя к таким не относил, по крайней мере в части данного глюка... Я в целом про язык: приучает к дисциплине.
К дисциплине приучает С++. А Ява просто принудительно не дает косячить
Видел я программы, которые писали явисты на С++ — страшное зрелище....
Д>> Вот еще вспомнилось: объявление исключений в заголовках функций. Просто заставляет задумываться о корректной обработке всего, что неохота помещать в заголовок, тогда как на C++ можно было бы просто махнуть рукой и сказать: ну такого вылететь точно не может.
в С++ эти объявления тоже есть, только мало кем используются
Здравствуйте, Дарней, Вы писали: Д>И если уж заговорили про Вирта — за with ему надо бы отрубить руки по самые уши. Вот это точно пример очень плохого двусмысленного кода.
Кстати да. Вариант из VB гораздо прозрачнее.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Дарней, Вы писали:
Д>К дисциплине приучает С++. А Ява просто принудительно не дает косячить Д>Видел я программы, которые писали явисты на С++ — страшное зрелище....
Я думаю, что без понимания идеологии программирования зеленый C++шник может написть не хуже. Ни один язык не научит писать хорошо структурированные программы. Но принудительный подход Явы мне больше по душе: прежде чем человек, пишуший на C++, приучится к дисциплине (еще не факт, что это вообще произойдет), он имеет шанс взорвать не один десяток космических ракет (конечно я утрирую, но идея, я думаю, понятна).
А про программы явистов на C++ — к идеологии другого языка всегда трудно привыкать. Поди напиши что-нибудь серьезное на прологе после нескольких лет C++санья. Спецы по прологу тоже плеваться будут. А если те программы структурно кривые, значит такие программисты.
ДГ>>>Это из той же оперы, что i+1 и i++. Запись удобная, но чревата ошибками по забывчивости: i — число или указатель.
SWW>>Просветите меня, темного, в чем проблема-то, никак не пойму? Я много всякой гадости читал про С, а вот гадость про оператор ++ первый раз слышу. Во-первых, хоть я и много всяких ошибок делал — но забыть, какого типа переменная — это уж выходит за всякие рамки. А во-вторых — поблема-то когда возникает: когда i число или когда указатель?
ДГ>Про тип переменной забыть трудно, а вот про размер объекта, на который она ссылается, можно. Хоть это и ламерская ошибка, но довольно распространенная. Пишешь i++, а указатель на 20 байт сдвигается. Может, это просто дурацкий пример той гадости, о которой я тут уже высказывался: слишком большая семантическая нагрузка на операторы (делающая семантику языковых конструкций сильно контекстно зависимой и потому далекой от интуитивной понятности) и слишком фривольное обращение с типами данных и памятью.
Может я чего-то не понимаю, но по-моему это ерунда какая-то... Да, указатель сдвигается на размер структуры, а если написать i += 10 то на десять размеров структуры — по-моему вполне очевидное поведение: благодая этому указатель всегда указывает на структуру, а не на ее середину. А ты считаешь, было бы удобнее если бы указатель при инкременте сдвигался на один байт? Извини, но это просто глупо.
Здравствуйте, SWW, Вы писали:
SWW> Может я чего-то не понимаю, но по-моему это ерунда какая-то... Да, указатель сдвигается на размер структуры, а если написать i += 10 то на десять размеров структуры — по-моему вполне очевидное поведение: благодая этому указатель всегда указывает на структуру, а не на ее середину. А ты считаешь, было бы удобнее если бы указатель при инкременте сдвигался на один байт? Извини, но это просто глупо.
Да нет же! Не надо на указывать на середину! Я пытаюсь протолкнуть идею, что операции над числами и указателями должны отличаться внешне, чтобы увеличить интуитивную понятность кода и избавиться от тех (совершаемых на автопилоте) ошибок, при которых как раз указатели и вылетают за границы данных или указывают на середину структуры.
Здравствуйте, Дм.Григорьев, Вы писали:
ДГ>Ругать и обсуждать — разные вещи. А в языке действительно масса проблем. Если ты считаешь, что это не так, значит ты просто мало писал на нем и не пробовал другие языки. Попробуй поработать на Java: имхо он гораздо лучше чем C++ (сама идеология языка, сырые библиотеки не в счет), на столько же, насколько C++ лучше старого паскаля.
Ява? не смешите мои тапочки
Из-за отсутствия шаблонов, нормальной альтернативы деструкторам и проблем с ковариантностью Ява никогда не станет для меня достойным языком... C# выглядит намного лучше, хотя 2.0 я пока руками не трогал
Это как раз идеологические проблемы, знаете ли
ДГ>Лично я думаю, что время C/C++ как языка для прикладных задач подходит к концу. Он будет жить еще долго просто за счет *nix-ов и прочих многолетних наработок, но за время его существования программирование проделало очень большой путь, и синтез этого опыта требует принципиально новых технологий — на данный момент .NET
он как раз совсем не принципиально новый — он просто вбирает в себя лучшие наработки, на данный момент времени
ДГ> потом наверняка войдут в обиход математически доказываемые системы, про которые упоминалось в статье-разборе полетов mission-critical глюков.
Здравствуйте, Дарней, Вы писали:
Д>Из-за отсутствия шаблонов, нормальной альтернативы деструкторам и проблем с ковариантностью Ява никогда не станет для меня достойным языком... C# выглядит намного лучше, хотя 2.0 я пока руками не трогал Д>Это как раз идеологические проблемы, знаете ли
Шаблоны скоро будут (может, уже есть). Про остальное спорить не буду — в реальных задачах не пригождалось. C# вообще не видел, но и не говорил я про него.
ДГ>>Лично я думаю, что время C/C++ как языка для прикладных задач подходит к концу. Он будет жить еще долго просто за счет *nix-ов и прочих многолетних наработок, но за время его существования программирование проделало очень большой путь, и синтез этого опыта требует принципиально новых технологий — на данный момент .NET
Д>он как раз совсем не принципиально новый — он просто вбирает в себя лучшие наработки, на данный момент времени
Новый. Попробуй воткни в старый C++ garbage collection — если и получится, то сложность языка зашкалит.
ДГ>> потом наверняка войдут в обиход математически доказываемые системы, про которые упоминалось в статье-разборе полетов mission-critical глюков. Д>очень узкая ниша — это максимум
На ближайшее будущее — да. Но это самая важная ниша — в ней от глюков люди гибнут.
Здравствуйте, Дм.Григорьев, Вы писали:
ДГ>Здравствуйте, Дарней, Вы писали:
Д>>К дисциплине приучает С++. А Ява просто принудительно не дает косячить Д>>Видел я программы, которые писали явисты на С++ — страшное зрелище....
ДГ>Я думаю, что без понимания идеологии программирования зеленый C++шник может написть не хуже. Ни один язык не научит писать хорошо структурированные программы. Но принудительный подход Явы мне больше по душе: прежде чем человек, пишуший на C++, приучится к дисциплине (еще не факт, что это вообще произойдет), он имеет шанс взорвать не один десяток космических ракет (конечно я утрирую, но идея, я думаю, понятна).
ДГ>А про программы явистов на C++ — к идеологии другого языка всегда трудно привыкать. Поди напиши что-нибудь серьезное на прологе после нескольких лет C++санья. Спецы по прологу тоже плеваться будут. А если те программы структурно кривые, значит такие программисты.
короче говоря, это выливается в очередной C++ vs Java
смысла в таких спорах все равно нет. Каждую задачу надо решать наиболее подходящим средством, только и всего.
ДГ>Да нет же! Не надо на указывать на середину! Я пытаюсь протолкнуть идею, что операции над числами и указателями должны отличаться внешне, чтобы увеличить интуитивную понятность кода и избавиться от тех (совершаемых на автопилоте) ошибок, при которых как раз указатели и вылетают за границы данных или указывают на середину структуры.
Интуитивная понятность — понятие субъективное (извини за каламбур). Мне, например, интуитивно понятно, что ++ сдвигает указатель на размер структуры. И то, что выглядит она как и операция над числами, не вызывает никаких проблем. Я вполне допускаю, что начинающему это может показаться неочевидным, но после пары примеров он также согласится, что сделано это правильно. В отличие от, например, приоритета операций &,| и ==,!= к чему я не могу привыкнуть до сих пор (но, к счастью, VC7.1 выдает предупреждения).
Что же касается выхода указатель за границы данных (или индекса за пределы массива, что одно и то же), то эта проблема не имеет ничего общего и инкреметтом указателя и ее решение гораздо сложнее чем принято считать.
SWW>Интуитивная понятность — понятие субъективное (извини за каламбур). Мне, например, интуитивно понятно, что ++ сдвигает указатель на размер структуры. И то, что выглядит она как и операция над числами, не вызывает никаких проблем. Я вполне допускаю, что начинающему это может показаться неочевидным, но после пары примеров он также согласится, что сделано это правильно.
Тебе часто приходится разбираться в чужих исодниках?
Здравствуйте, Дм.Григорьев, Вы писали:
ДГ>Шаблоны скоро будут (может, уже есть). Про остальное спорить не буду — в реальных задачах не пригождалось. C# вообще не видел, но и не говорил я про него.
уже есть, в бете. точнее говоря — некая эмуляция шаблонов. Лучше, чем ничего — всё, что я могу сказать
а это как раз идеологические проблемы, из-за которых кодеры пихают код для закрытия сокетного соединения в финалайзер и потом сильно удивляются, что количество соединений на серваке зашкаливает
ДГ>Новый. Попробуй воткни в старый C++ garbage collection — если и получится, то сложность языка зашкалит.
запросто.... только это не помешает никому накосячить, если ему сильно захочется — вот в чем проблема
ДГ>На ближайшее будущее — да. Но это самая важная ниша — в ней от глюков люди гибнут.
не хочу показаться злодеем, но и дальше будут. Только из-за багов в математической модели
Здравствуйте, Дарней, Вы писали:
Д>а это как раз идеологические проблемы, из-за которых кодеры пихают код для закрытия сокетного соединения в финалайзер и потом сильно удивляются, что количество соединений на серваке зашкаливает
Согласен.
ДГ>>Попробуй воткни в старый C++ garbage collection — если и получится, то сложность языка зашкалит. Д>запросто.... только это не помешает никому накосячить, если ему сильно захочется — вот в чем проблема
Ну эта проблема нерешаемая. Человеческий фактор. Потому мне кажется, что будущее за доказываемыми системами. Хотя доказывать для случаев предельной загрузки ресурсов... брр...
ДГ>>На ближайшее будущее — да. Но это самая важная ниша — в ней от глюков люди гибнут. Д>не хочу показаться злодеем, но и дальше будут. Только из-за багов в математической модели
... М-да. Фактически выходит, что имеет смысл описывать модель только крупных блоков, рассматриваемых как черный ящик, иначе сложность модели превысит сложность реализующего ее кода. Воздержусь-ка я лучше от прогнозов.
Здравствуйте, Vadim B, Вы писали:
VB>Ну, вообще говоря, на том фортране (70-х годов) первое не было оператором цикла. Надо было написать что-нибудь типа VB>
VB>do 10 i=1,100
VB>
VB>где 10 — метка последнего оператора цикла.
Да, конечно! Спасибо! Я забыл, что там должна быть метка поставлена. VB>Но сути сообщения это, конечно, не меняет .
Именно!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Kh_Oleg, Вы писали:
K_O>>
K_O>>Взрыв 4 июня 1996 г. ракеты Ариан-5, стоившей пол-миллиарда долларов, имел причиной программную ошибку, которую компилятор Оберона/Компонентного Паскаля просто не пропустил бы.
VD>А вот интересно как можно определить от чего взарвалась ракета если ее бортовой компьютер был уничтожен взрывом?
Здравствуйте, Odi$$ey, Вы писали:
ДГ>>Попробуй воткни в старый C++ garbage collection — если и получится, то сложность языка зашкалит. OE>http://www.rsdn.ru/article/cpp/GCcpp.xml
М-да. С "зашкалит" я погорячился. "__gc" это прикольно, но все равно изврат: ползаешь по коду и вспоминаешь, какие объекты у тебя __gc, а какие надо вручную убивать. Надеюсь, мое исходное утверждение о невозможности до бесконечности наращивать и усложнять существующие технологии возражений не встретит.
Здравствуйте, Дм.Григорьев, Вы писали:
ДГ>М-да. С "зашкалит" я погорячился. "__gc" это прикольно, но все равно изврат: ползаешь по коду и вспоминаешь, какие объекты у тебя __gc, а какие надо вручную убивать. Надеюсь, мое исходное утверждение о невозможности до бесконечности наращивать и усложнять существующие технологии возражений не встретит.
да, такое есть. На старичок С++ уже слишком много всего навешали, и не всегда хорошо это сделали.
Впрочем, умирать он все равно не собирается
SWW wrote:
> Просветите меня, темного, в чем проблема-то, никак не пойму? Я много > всякой гадости читал про С, а вот гадость про оператор ++ первый раз > слышу. Во-первых, хоть я и много всяких ошибок делал — но забыть, какого > типа переменная — это уж выходит за всякие рамки. А во-вторых — поблема-то > когда возникает: когда i число или когда указатель?
В редакторе vim тип переменной быстро вспоминается. Жмешь gd и ты прыгаешь к
определению переменной, Ctrl+o — возвращаешься туда, где был. Доли секунды
Дм.Григорьев wrote:
> Про тип переменной забыть трудно, а вот про размер объекта, на который она > ссылается, можно. Хоть это и ламерская ошибка, но довольно > распространенная. Пишешь i++, а указатель на 20 байт сдвигается.
Прежде всего, указатель сдвигается к следующему элементу, а уже потом
(не поймите это буквально) на 20 байт. Редко соль именно в том, 20 это байт
или не 20. sizeof рулит
--
Bitte ein Bit