1306
Общий раздел / Re:Приспособим PureBuilder для разработки игр
« : Март 09, 2011, 08:39:46 pm »Обратите внимание, в цитируемом сообщении не было сказано про использование по разным условиям, поскольку в обсуждаемом вопросе важна лишь необходимость инициализации нескольких переменных по 1-му условию, не более.
Мне кажется, что в подобных случаях изначальная проблема в правильной декомпозиции. Пусть будет одно условие:
Код: [Выделить]
int a, b;
if (условие)
a = ...
else
b =...
/*общий код*/
if (условие)
a;
else
b;
Вот такая штука намного естественнее смотрится приведенная к такому виду:
Код: [Выделить]
int a, b;
if (условие)
int a = ...
f();/*общий код*/
a;
else
int b =...
f();/*общий код*/
b;
Цитировать
ЦитироватьЕсли, конечно, не пытаться повторять плюсовую семантику с конструкторами копирования и т.д.Потому я и написал, что можно обойти. А теперь про шутки, которые неизбежно вылезут.
struct S {int a,b};
s = S{s.b, s.a};//Прийдётся компилятор сделать шибко умным, чтобы правильно обрабатывать такие ситуации без ошибок и без накладных расходов
Хе-хе. А вот здесь мы имеем не инициализацию, а присваивание. Сильно разные вещи. Здесь всегда будет копирование. Оно здесь будет даже если вы напишите на оригинальном обероне по всем правилам - с объявлением временной структуры, ее инициализацией и последующим копированием.
Цитировать
s = f(s);//А вот тут даже умный компилятор не знает как без накладных расходов не допустить ошибок в общем случае, прийдётся выдумывать другие хитрые механизмы.
Аналогично. Это присваивание.
Цитировать
S f(S s, int i) { return {s.b + 1, s.a / (i - 1)} }
S s = S{1, 2};//1
try {
s = f(s, 1);//2
} catch {
s = f(s, 2);//программист вправе ожидать, что до присваивания s всё ещё имеет 1-е значение.
}
Аналогично. Это присваивание.
Цитировать
ЦитироватьКакая-то надуманная ситуация. Почему именно в секции модуля?Потому что несколько переменных могут зависеть от общих временных данных.
Ну и объявите эти временные данные здесь же, не в секции. В чем проблема-то?
Цитировать
ЦитироватьДа никто ж не заставляет размазывать. Пропишите непосредственно перед секцией. Можно даже потребовать на уровне компилятора.Как бы не так. Для того, чтобы проинициализировать осмысленным значением, бывает нужен более сложный алгоритм чем однострочник, и тут уж нужна процедура, объявленная до переменной, и, следовательно, появляется возможность размазывания.
Ну правильно. Все процедуры будут объявлены до переменной и до секции. Где размазывание? Тут на самом деле более интересная проблема: если инициализировать вызовом функции, то как обеспечить, чтобы функция не обратилась к этой же переменной модуля.
Структуры и массивы - дело тонкое, а мусором является любое не осмысленное значение
Не, не скажите. С ноликами разница принципиальная. Если нолики всегда одинаковые, то и поведение всегда одинаковое (пусть даже и неправильное). А если мусор, то поведение начинает зависеть от фазы луны. Такое недопустимо в безопасном языке.
Цитировать
Цитироватьstruct Stack {int count, int s[N]};;
Stack s;
s.count = 0;
Структура инициализирована или нет?
Ошибка компиляции. Должна быть проинициализирована в точке объявления.
Цитировать
f(a);//устанавливаем значение уже объявленной
T b = {...};//мусорное присваивание, оно же накладные расходы
f(b)// ах, да - просто не надо создавать такие процедуры( так может и VAR-параметры удалить; + ещё 1 изменение ), но я уже написал про ваш хитрый автоматический механизм, так что надо.
Да, не надо писать такие процедуры. Если надо установить новое значение уже объявленной - пожалуйста, пишите a = f(). Да, в данном случае для a (объявление/инициализация/присваивание) накладные расходы при прочих равных будут больше, согласен. Зато есть гарантия, что структура не останется проинициализированной наполовину.