- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
const int size=8;
class Bin
{
public:
Bin();
private:
char first[size];
char second[size];
};
Bin::Bin()
{
for (int s=0;s<=size;s++, first[s]='0');
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+61.8
const int size=8;
class Bin
{
public:
Bin();
private:
char first[size];
char second[size];
};
Bin::Bin()
{
for (int s=0;s<=size;s++, first[s]='0');
}
Вот вам смешно? А я пару часов думал почему при заполнении одного вектора меняется другой...
но первый элмент точно
так не возникнет
Лучше всегда использовать префикс, так как он не должен создавать временное значение, чтобы его вернуть.
Если вы используете классический С-массив, то зачем вам врЕменная переменная s?
Смешно.
Не пользуйте C-массив -- есть valarray, не заполняйте его сами -- используйте конструктор, не используйте константы -- используйте шаблоны.
Пишите на С++ =]
Вот код автора с минимальной переделкой, в котором не может быть двух найденных ошибок:
#include <algorithm>
using namespace std;
const int size=8;
class Bin
{
public:
Bin();
private:
char first[size];
char second[size];
};
void myPolicy(char& myValue)
{
myValue = '0';
}
Bin::Bin()
{
for_each(first, first + size, myPolicy);
}
Однако, большинству программистов valarray не нужен.
http://www.cplusplus.com/reference/std/valarray/
http://steps3d.narod.ru/tutorials/c-minus-minus.html
Со временем пришло понимание, что на С++ иначе просто нельзя !!! Средства, изначально заложенные в сам язык, настолько негибки и жестки, что реализовывать системы, требующие гибкости на С++ было крайне тяжело и постояннно приводило к кривым способам (т.е. это бага а фича :)).
Ну что можно сказать, дальше можно уже не читать, а автору сего высера советую взглянуть на Qt и удавится
Увидеть Париж и умереть :-)
Пора бы вспомнить, что Qt - это как раз НЕ C++, это надстройка над C++. А точнее это отчаянная попытка преодолеть отсутствие в нём элементарных средств вроде делегирования.
Не нравится автору STL - так никто не неволит, используйте сторонние библиотеки. Loki и Boost - произведения искусства, почему не сосредоточится на них в рассмотрении?
Про ссылки вообще смешно - если синтаксис языка говорит о том, что нужно использовать "&" для передачи параметра по ссылке, а мы об этом забыли... Это говорит о большой харизме.. ой, простите, маразме :-)
То же относится к проблемам старых компиляторов. Мы что, историю изучаем, или выбираем инструмент решения задачи?
Да, C++ не лишен недостатков, и граблей в нем огромное количество, и для изучения он не прост. Для определенного круга задач, однако, он остается оптимальным инструментом. При следовании набору правил, на C++ пишутся программы, поведение которых жестко детерминировано. Например, я точно знаю, когда создается объект, когда его копия, когда он уничтожается и даже откуда берется память для его размещения. При этом бо`льшую часть ошибок, действительно проверяет компилятор еще до запуска программы.
Если не знаем как пользоваться спецификатором &, вероятно, лучше почитать умных книжек, прежде чем садиться писать программы.
Интересно, а в каком языке он достиг наивысшего дао?
Или для его задач пока не придуман хороший язык высокого уровня, и "дядька" занимается его созданием?
К сожалению я опоздал...
Тут уже много написано. Что-то по делу, что не по делу...
Главная мысль, которую следует усвоить: каждая сущность создана для чего-то, и у каждой сущности есть своё место. Так вот C++ по скорости разработки и эффективности в определённых задачах не сравним с другими языками. Он универсален, и его можно применять и на космической станции и для подсчёта носков в магазине. Но для решения каждой конкретной задачи могут существовать свои средства. Зачем вам C++ , если вы не считаетесь с машинными средствами? Зачем вам С++, если вас не волнует расширяемость и гибкость системы? Зачем вам С++? Какую задачу вы хотите решать? В каких вы находитесь временных рамках? Какими вы располагаете ресурсами? Аккуратно проанализировав ситуацию, вы придёт к заключению о том, на каком именно языке вы будете что-то реализовывать. Это может быть и машинный язык, и MSIL, и fortran, и C, и С++, и Java, и Python, и LISP, и Neko или Javascrpit, Perl или PHP, и ещё огромный спектр языков...
Фанатизм пока что помогал людям только в борьбе между собой за территорию. Кроме "корытных" проблем, бывают ещё и "звёздные" задачи.
можно еще так)
> если это POD класс, но проблемы невозможны... в остальных случаях программист идиот...
но отличить POD от не POD не всегда получается сразу :-)
Могу с уверенностью сказать: в компиляторе C++ VS6 объекты с перегруженными new и delete ведут себя нестабильно после memset'a: вместо перегруженного для класса вызывается глобальный delete, со всеми вытекающими.
а еще я думаю, что у комипилятора VS6 есть достаточно качественные новые версии, которые более соответствуют стандарту...
проблема была в том что надо было size-1 в условии поставить. и присваивание внутри цикла.
for (int s=0;s<size;++s) {
first[s]='0';
}
И почему мемсет не подойдёт? Дайте пруфлинков на возможные проблемы. Ведь если не заходить за границы массива - ничего случиться не должно.
Почитать эту занимательную историю более развернуто можно у Герба Саттера в задачах по C++.
о каких последствиях memset здесь может идти речь?
развели дискуссию ни о чем. для разных задач - свои инструменты, и не надо религиозные вопросы поднимать по каждому поводу.