Здравствуйте, Трурль, Вы писали:
Т>Здравствуйте, Amidlokos, Вы писали:
A>>Ещё один занят подтасовкой фактов, но уже не так талантливо. Что, i, 0 и 10 посчитать забыли? Т> i,0 и т.п.- чистый оверхед.
Ага, но при этом 10 почему-то всё же не оверхед?
Ловлю на слове: с этого момента дружно начинаем считать оверхедом объявление и использование переменной
Да, кстати, маленький секрет... Этот for коротко записывается так:
int a[10]={0};
A>>И каждую скобку вынесли лексемой? Т>А скобки разве не лексемы?
Так я же согласен — пусть будут лексемами каждая по отдельности.
A>>Даже если так, звёздочек всё равно многовато. Т>Нам уже разъяснили что пробела тоже надо учитывать.
Это разъясняли про значащие пробелы. Иначе код:
int a ;
Побьёт по оверхеду код
int a;
Впрочем, к вашей чести, в вашем коде незначащих пробелов нет.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
Здравствуйте, Трурль, Вы писали:
Т>Оверхед — все, что не относится к делу.
К какому делу? Делу коммунистической партии?
Только вот не надо ерунды с "делом", а то получите симметричный ответ, что там "не по делу" во всяких оберонах (и я уже вижу, как он будет выглядеть — скажем, получается чудная куча звёзд в цикле WHILE с нестандартным выходом — см. в теме). Анализируете язык — вот и анализируйте. Как вам такое:
int a[10];for(int i=0;i<10;i++)a[i]=i;
(специально пишу в том же беспробельно-минималистическом стиле)
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
Здравствуйте, Privalov, Вы писали:
MN>>Даже смотреть не буду (трафик не резиновый) — уверен, что не помогло !
P>Судя по всему все гораздо хуже. Состояние весьма запущено. Требуется принципиально иной подход к лечению.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Privalov, Вы писали:
MN>>>Даже смотреть не буду (трафик не резиновый) — уверен, что не помогло !
P>>Судя по всему все гораздо хуже. Состояние весьма запущено. Требуется принципиально иной подход к лечению.
SJA>Я бы даже сказал, структурный подход к лечению
А лечение будет иметь точки прерывания или завершения? И сколько?
Здравствуйте, Курилка, Вы писали:
P>>>Судя по всему все гораздо хуже. Состояние весьма запущено. Требуется принципиально иной подход к лечению.
SJA>>Я бы даже сказал, структурный подход к лечению
К>А лечение будет иметь точки прерывания или завершения? И сколько?
Лечение не будет иметь выхода, кроме как через полное излечение.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Курилка, Вы писали:
P>>>>Судя по всему все гораздо хуже. Состояние весьма запущено. Требуется принципиально иной подход к лечению.
SJA>>>Я бы даже сказал, структурный подход к лечению
К>>А лечение будет иметь точки прерывания или завершения? И сколько?
SJA>Лечение не будет иметь выхода, кроме как через полное излечение.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>!(a < 10) — ЗАВЕРШАЕТ СГ>break — ЗАВЕРШАЕТ!!!!!!!!!!!!!!!!!!!!!!!!! СГ>goto на конец — ЗАВЕРШАЕТ
СГ>return — ПРЕРЫВАЕТ СГ>throw куда подальше — ПРЕРЫВАЕТ СГ>goto куда подальше — ПРЕРЫВАЕТ СГ>assert — ПРЕРЫВАЕТ СГ>...
Я тоже так умею:
!(a < 10) — ЗАВЕРШАЕТ
break — ПРЕРЫВАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!
return — ЗАВЕРШАЕТ
throw куда подальше — ПРЕРЫВАЕТ
и т. д....
Детский сад, честное слово. Вы таки объяснить можете, чем одно от другого отличается? Про "выполняется или нет следующая команда" рассказывать не надо: вот здесь, например, она вполне себе выполняется в обоих случаях:
LOOP
WHILE 1<2 DO
IF 3<4 THEN EXIT END
END
ENDA := B;
Здравствуйте, Сергей Губанов, Вы писали:
П>> То есть вычислить шаг цикла в рантайме я не могу? СГ>В FOR — нет. Это, видимо, предусмотрено для возможной оптимизации. Иначе FOR ну вообще бы ни чем не отличался от WHILE. А зачем в точности дублировать то что и так уже есть? Используйте WHILE...
... а если цикл надо прервать посередке — то LOOP. В общем есть только LOOP и оберон — пророк его. Итого простенькая запись
for (i = 0; i < max_level; i += step) {
sound_level(i);
}
реализуется сперва вот так:
{O-o-ops! Пользователь забыл сказать нам, что хочет регулировать нарастание звука
и мы приняли step за константу}FOR i := 0 TO MAX_LEVEL BY step DO
sound_level(i);
END
потом превращается сперва в такого вот гадкого утенка:
{вся разница лишь в том, что step больше не константа.}
step := get_step();
i := 0;
WHILE i < max_level DO
sound_level(i);
i := i + step;
END
... а затем, когда юзера осеняет, что он к тому же хочет иногда вручную прерывать звучание на середине — в совсем уж что-то непохожее:
step := get_step();
i := 0;
LOOP
IF i >= max_level THEN EXIT END;
sound_level(i);
i := i + step;
IF manual_interrupt() THEN EXIT END;
END
... при том, что в C++ все то же самое решится дописыванием двух строчек в исходный код:
step := get_step();for (i = 0; i < max_level; i += step) {
sound_level(i);
if (manual_interrupt()) break;
}
Здравствуйте, Amidlokos, Вы писали:
A>Кто сказал, что вызов close() будет удачным?
А delete?
A>И уж простите меня, КТО вам сказал, что Release() удаляет объект?! Этот кто-то врал и не краснел. См. MSDN.
Ну если говорить точно, он _может_ удалить объект. Но я нигде и не говорил, что он удаляет объект. Я всего лишь говорил, что противоположные по смыслу действия должны обозначаться противоположными по смыслу словами. Может, Release() на самом деле и не удаляет объект (наверняка мы этого знать не можем), но этот метод образует логическую пару с созданием объекта (CreateInstance()). Такую же пару образуют new и delete, но в отличие от Create/Release эти слова не противоположны по смыслу (разве что в сознании, испорченном C++), и к тому же вообще из разных грамматических категорий.
Здравствуйте, Дарней, Вы писали:
Д>Ну возьмем лучше RegOpenKey. Принцип тот же самый.
А что, ключ реестра — это объект ядра? К тому же тезис о глаголах, обознающих действия создания/открытия и о противоположных словах для противоположных действий эта функция только подтверждает.
Здравствуйте, Amidlokos, Вы писали:
C>>>ЗЫ: как смешно читать нападки на С++
F>>Форум такой, так что стараемся.
A>Спасибо, у вас получается — коллеги улыбаются
Здравствуйте, Amidlokos, Вы писали:
A>Такое впечатление, что никто не понимает основных принципов C/C++, но всем надо покритиковать.
Такое впечатление, что вы не поняли сути дискуссии с самого начала. И я попрошу вас воздержаться от оценки моих пофессиональных навыков, без предварительного тестирования.
A>ptr — это именно указатель. На что он там указывает — твои личные дела. Компилятор не должен отслеживать ничего в этом случае. От конструктора это никак не зависит.
A>1. Раз объект стековый (а не указатель на какую-то память где-то в куче), то всё же компилятор заботится о его создании. Вот он и ругается. A>2. В случае с пустым конструктором достаточно (а может быть, слишком) умный компилятор определяет, что разницы между вызовом конструктора и отсутствием такого вызова не будет никакой. Вот и не ругается.
А теперь к сути дискуссии, поскольку вы, судя по всему, её не поняли. Кодт утверждал, что правильный компилятор не позволит перескочить (goto) через определение локальных переменых. Однако, согласно пункту 6.7/3 стандарта C++ — это не так:
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program
that jumps77) from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is illformed unless the variable has POD type (3.9) and is declared without an initializer (8.5).
[Example:
void f()
{
// ...
goto lx; // illformed: jump into scope of a
// ...
ly:
X a = 1;
// ...
lx:
goto ly; // OK, jump implies destructor
// call for a followed by construction
// again immediately following label ly
}
—end example]
Что я и показал своим примером... И понимание сути указателя или предположения об умности компилятора в случае пустого конструктора тут и рядом не лежало.
Указатель или постейших класс являются POD типами, поэтому такой переход не является illformed и нормально допускается, какая инициализация будет в этом случае я не знаю, но судя по всему default-initialization, приводящая в случае POD типов к неопределённому результату. В случае VC 7.1, если переменная, определение которой перескакивается оператором goto, является принадлежит классу, который является POD-типом, но имеет определённый конструктор (даже конструктор по-умолчанию), или при определении этой переменной к ней была применена value-initialization, в этом случае VC 7.1 реагирует предупреждением, но не может запретить такое поведение — это не illformed-код (см. выше). В этом случае переменная опять таки оказывается default-initialized. Если goto выполняет переход через участок кода, содержащий определение переменной не-POD типа, в этом случае код является illformed и компиляция прерывается. Добавьте к классу деструктор и вы сами в этом убедитесь.
Так что, прежде чем отзываться о профессиональных навыках оппонента, убедитесь, что вы сами понимаете суть вопроса.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, faulx, Вы писали: F>Ну если говорить точно, он _может_ удалить объект. Но я нигде и не говорил, что он удаляет объект. Я всего лишь говорил, что противоположные по смыслу действия должны обозначаться противоположными по смыслу словами. Может, Release() на самом деле и не удаляет объект (наверняка мы этого знать не можем), но этот метод образует логическую пару с созданием объекта (CreateInstance()). Такую же пару образуют new и delete, но в отличие от Create/Release эти слова не противоположны по смыслу (разве что в сознании, испорченном C++), и к тому же вообще из разных грамматических категорий
А с каких это пор у нас CreateInstance противоположно по смыслу Release? Не пора ли заглянуть в словарь?
Парой к CreateInstance была бы, очевидно, DeleteInstance. Парой к Release — Lock. А парой к AddRef (которая на самом деле парная к Release в Com — CreateInstance штука неспаренная) была бы RemoveRef.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Amidlokos, Вы писали:
A>P.S. Mr. None, только на мою фразу про "никто не понимает" обижаться не нужно Сгоряча сказалось.
В следующий раз досчитайте до 10, прежде чем горячиться и перечтите всю ветку дискуссии.
A>Ведь правда же — пример, в котором указатель не отличают от стекового объекта... Нехорошо это даже для флейма
Отличий между указателем (именно указетелем, а не объектом, на который он указывает) и стековым объектом POD-типа нет. Потому что указатель такой же POD-тип, подчинённый тем же правилам поведения.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Sergey J. A., Вы писали:
P>>Судя по всему все гораздо хуже. Состояние весьма запущено. Требуется принципиально иной подход к лечению.
SJA>Я бы даже сказал, структурный подход к лечению
Может, это и хороший способ, только с принципиальными отличиями от традиционных методов не все ясно. Лечение подобным? Нет, здесь что-то совсем другое требуется. А вот что... В общем, тема для хорошего флейма...