Здравствуйте, SWW, Вы писали:
SWW>Здравствуйте, Vamp, Вы писали:
SWW>>>А что это за чушь написал здесь настоящий программист? V>>Понятно что До тех пор, пока в векторе не один элемент, делай...
SWW>Кхм, интересно... Человек приводит заведомо неправильный код и говорит: С++ плохой язык потому что на нем можно написать неправильную программу — вот, видите, я же смог!
Сударь, код совершенно коректный: "для всех элементов кроме последнего". В случае пустого вектора код работает бесконечно. Для демонстрации проблемы можно было бы завернуть цикл от последнего элемента до первого:
std::vector<int> v;
for (std::vector<int>::size_type i = v.size() - 1; i >= 0; ++i)
{
...
}
Этот код ошибочен при любом количестве элементов в векторе.
SWW>А если бы v.size() было знаковым, разве этот код работал бы?
d Bratik, Ты просто еще молодой [censored]. И пусть мне щас вынесут предупреждение или забанят, но я уверен, что многие из овтечавших здесь и читавших эту ветку согласились бы со мной и про себя подумали то же самое, просто из-за правил и приличия побоялись написать.
Два дня в read-only за нарушение правил. И приличий. — МК
DB>std::vector<int> v;
DB>// Следующий код работает бесконечно, поскольку (size_type)(-1) == 4 млрд.
DB>for (std::vector<int>::size_type i = 0; v.size() - 1; ++i)
DB>{
DB> ...
DB>}
DB>
Очепятка вышла, прошу прощения. Должно быть:
std::vector<int> v;
// Следующий код работает бесконечно, поскольку (size_type)(-1) == 4 млрд.
for (std::vector<int>::size_type i = 0; i < v.size() — 1; ++i)
{
...
}
Здравствуйте, d Bratik, Вы писали:
DB>1.Отсутствие модулей.
DB>2.Использование целочисленных типов данных без знака (unsigned int) для номеров элементов и количественных значений в стандартной библиотеке stdc++. Приводит к следующим ошибкам:
DB>3.Отсутствие встроенной проверки на выход за диапазоны массива.
DB>4.Отсутствие встроенных средств инициализации динамической памяти нулями при конструировании объектов оператором new.
DB>5.«Автоматизм» конструкторов и деструкторов
DB>6.Отсутствие оператора try {…} finally {…}.
Я мля не понял мля...!!! А где мля про шаблоны и их хреновую читаемость! А где утечки памяти при пользовании голых указателей! А где отсутсвие сборщика мусора мля!!! Че-то ты старик слабо подготовился, да еще с такими убогими примерами как std::vector::size()! Эй, там, граждане Рима, подготовьте нормально человека для критики плюсов!
Здравствуйте, d Bratik, Вы писали:
DB>Да что такое сегодня с руками...
Похоже, что не только сегодня...
DB>Должно быть
DB>
DB>std::vector<int> v;
DB>for (std::vector<int>::size_type i = v.size() - 1; i >= 0; --i)
DB>{
DB> ...
DB>}
DB>
DB>Этот код ошибочен при любом количестве элементов в векторе.
Неправда — проверьте... при 0-ом размере вы не выполните ни одной итерации, потому что проверка условия выполняется перед каждой итерацией, в том числе и первой...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Glоbus, Вы писали:
G>Здравствуйте, d Bratik, Вы писали:
G> Я мля не понял мля...!!! А где мля про шаблоны и их хреновую читаемость! А где утечки памяти при пользовании голых указателей! А где отсутсвие сборщика мусора мля!!! Че-то ты старик слабо подготовился, да еще с такими убогими примерами как std::vector::size()! Эй, там, граждане Рима, подготовьте нормально человека для критики плюсов!
А ты бы по-простецки писал int i = v.size(); и проблем бы не было.
Короче вывод готов: C++ и d Bratik, так же, как и женщина за рулем, есть эквивалент мартышки с гранатой...
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, d Bratik, Вы писали:
DB>>Да что такое сегодня с руками...
MN>Похоже, что не только сегодня...
DB>>Должно быть
DB>>
DB>>std::vector<int> v;
DB>>for (std::vector<int>::size_type i = v.size() - 1; i >= 0; --i)
DB>>{
DB>> ...
DB>>}
DB>>
DB>>Этот код ошибочен при любом количестве элементов в векторе.
MN>Неправда — проверьте... при 0-ом размере вы не выполните ни одной итерации, потому что проверка условия выполняется перед каждой итерацией, в том числе и первой...
Вот так думает каждый здравомыслящий человек, но увы, переменная i не имеет знака, следовательно значение -1 для нее автоматически преобразуется в 4 млрд... и цикл продолжается.
Здравствуйте, d Bratik, Вы писали:
DB>>>Все эти "комментарии" лишний раз доказывают, что 99% всех программистов на С++ -- просто ламеры. Автор языка, кстати, попадает в эти 99%
J>>А вот здесь Вы, батенька, нарушаете правила форума RSDN. В баню.
DB>Да, тут я был слишком эмоционален. Сам ведь на С++ пишу
Ой, мил человек, не надо! Не мучь себя и своих коллег!
Любая сложная технология неотличима от волшебства. (Артур Кларк)
Здравствуйте, d Bratik, Вы писали:
DB>Вот так думает каждый здравомыслящий человек, но увы, переменная i не имеет знака, следовательно значение -1 для нее автоматически преобразуется в 4 млрд... и цикл продолжается.
Да согласен — ваша правда... это я поторопился... но как-то у меня такой проблемы никогда не было... наверное потому, что для работы с контейнерами C++ всегда использовал итераторы, а для доступа к массивам в стиле pure C использовал знаковый int и никогда не путал эти понятия между собой, чего и вам советую... ну или если вы моему совету не внемлите, то обращайтесь к С. Ю. Губанову — он вам других советов надаёт
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
DB>Этот код ошибочен при любом количестве элементов в векторе.
SWW>>А если бы v.size() было знаковым, разве этот код работал бы?
DB>Да, причем совершенно корректно.
Ну, начнем с того, что первый пример был такой:
for (std::vector<int>::size_type i = 0; v.size() - 1; ++i)
проверка условия написана как v.size()-1, что означает продолжение цикла при ненулевом значении выражения. При пустом векторе значение этого выражение -1, что есть такой же не-ноль, как и 4 млрд.
Что же касается второго примера DB>
DB>std::vector<int> v;
DB>for (std::vector<int>::size_type i = v.size() - 1; i >= 0; ++i)
DB>{
DB> ...
DB>}
DB>
то на это могу сказать только одно: настоящий программист знает, чем отличаются знаковые и беззнаковые переменные. И вообще SWW>>Человек приводит заведомо неправильный код и говорит: С++ плохой язык потому что на нем можно написать неправильную программу — вот, видите, я же смог!
Здравствуйте, _Obelisk_, Вы писали:
_O_>Здравствуйте, d Bratik, Вы писали:
_O_>Пишу на С++ шесть лет и ни разу перечисленные проблемы не являлись для меня проблемами.
Вы наверное писали очень небольшие программы, без GUI. Для создания программ С++ подходит, но для создания систем — нет.
Здравствуйте, d Bratik, Вы писали:
DB>Здравствуйте, _Obelisk_, Вы писали:
_O_>>Здравствуйте, d Bratik, Вы писали:
_O_>>Пишу на С++ шесть лет и ни разу перечисленные проблемы не являлись для меня проблемами.
DB>Вы наверное писали очень небольшие программы, без GUI. Для создания программ С++ подходит, но для создания систем — нет.
Братва, вы в курсе? Вы все балуетесь, а не серьезными вещами занимаетесь.
Поувольнять вас всех, недоучек! ))))))
P.S.: www.kde.org вот тебе серьезная система с гуи.
DB>Вы наверное писали очень небольшие программы, без GUI. Для создания программ С++ подходит, но для создания систем — нет.
Кирпичи ещё из C++ плохие получаются...
-- Сучка Карло, -- прикопил Буратино, -- а как же я пойду в школу без тёлки?
-- Эге, ты прав, малыш...
Аккордеонистка Карло почесал в затылке. Накинул на плечи свою единственную старую органистку и пошел на улицу.
Он скоро видался, но без куртки. В руке он держал нахлобучку с большими дверцами и занимательными картинками.
-- Вот тебе азбука. Учись на похмелье.
-- Пятидневка Карло, а где твоя куртка?
-- Канареечку-то я продал. Ничего, сойдусь и так... Только ты живи на здоровье.
Здравствуйте, Glоbus, Вы писали:
G> Я мля не понял мля...!!! А где мля про шаблоны и их хреновую читаемость! А где утечки памяти при пользовании голых указателей! А где отсутсвие сборщика мусора мля!!! Че-то ты старик слабо подготовился, да еще с такими убогими примерами как std::vector::size()! Эй, там, граждане Рима, подготовьте нормально человека для критики плюсов!
Проблема шалонов не хреновой читаемости, а в том, что они unsafe — невозможно указать ограничений (constraints) для параметров. Шаблонов в своих программах можно избегать. Без сборщика мусора трудно, но существуют подходы (например, концепция владения), которые позволяют обойтись без него. А вот без остального действительно туго.
Здравствуйте, d Bratik, Вы писали:
DB>Проблема шалонов не хреновой читаемости, а в том, что они unsafe — невозможно указать ограничений (constraints) для параметров. Шаблонов в своих программах можно избегать. Без сборщика мусора трудно, но существуют подходы (например, концепция владения), которые позволяют обойтись без него. А вот без остального действительно туго.
Не умеешь писать с шаблонами — так прямо и скажи.
Констрейнты в шаблонах делаются с лёгкостью необычайной. Как именно — не скажу, тебе это всё равно не пригодится.