Страница 5 из 7

Re: Помогите Исправить Ошибки в Программе

Добавлено: 09 окт 2009, 14:40
BBB
Airhand, я так и не осилил понять, что ты от меня хочешь.

Re: Помогите Исправить Ошибки в Программе

Добавлено: 09 окт 2009, 19:08
Airhand
BBB писал(а):Airhand, я так и не осилил понять, что ты от меня хочешь.
Я от тебя хочу очень простую вещь: приведи пример того, как по-твоему компилятор "неверно" понимает твой код.

.

Добавлено: 09 окт 2009, 19:56
BBB
Airhand писал(а):Я от тебя хочу очень простую вещь: приведи пример того, как по-твоему компилятор "неверно" понимает твой код.
Например, если бы в описанной мной ситуации. Объявлен статический экземпляр класса, но, когда программа запустится, окажется, что никакого экземпляра вообще нет, а нужный мне код, находящийся в конструкторе этого каласса, не выполняется.

Только, думается мне, что если такое произойдет, то это будут фокусы некомпилятора (дело которого, собственно скомпилировать данные ему текст в машинные коды), а линкера.

Re: .

Добавлено: 10 окт 2009, 12:32
Airhand
BBB писал(а):Например, если бы в описанной мной ситуации. Объявлен статический экземпляр класса, но, когда программа запустится, окажется, что никакого экземпляра вообще нет, а нужный мне код, находящийся в конструкторе этого каласса, не выполняется.
Я просил пример того, как действия с членами класса не позволяют что-то сделать и обращения во вне нет. Я писал:
Airhand писал(а):если никая функция не вызывается (нестатическая) и членам объекта ничего не присваивается, то компилятор просто не создаёт объект. Т.е. откладывает создание до того момента пока не будет к нему реального обращения.
Объясни , где тут указания на функции не члены класса. Я, наверное, не чётко выразился: не должно быть любого обращение к наруже класса, т.е. функций-не членов класса и вызываемых внутри функций-членов "внешних" функций. Твой пример не подходит.

.

Добавлено: 10 окт 2009, 13:19
BBB
Airhand писал(а):Я просил пример того, как действия с членами класса не позволяют что-то сделать и обращения во вне нет.
Вообще-то, в самой последней "просьбе" содержалось вот это:

"приведи пример того, как по-твоему компилятор "неверно" понимает твой код."

А вообще говоря, утомил ты уже. Теоретизировать на тему "как бы мог выглядеть плохой компилятор" мне, признаться, совершенно неинтересно.

Re: .

Добавлено: 10 окт 2009, 16:18
Airhand
BBB писал(а): А вообще говоря, утомил ты уже. Теоретизировать на тему "как бы мог выглядеть плохой компилятор" мне, признаться, совершенно неинтересно.
Не можешь привести пример. А как выпендривался. Съезжаешь на то, что это дескать - неинтересно. А когда начинал спор это было интересно ?

Re: Помогите Исправить Ошибки в Программе

Добавлено: 10 окт 2009, 16:21
BBB
Airhand, "на слабо уже не сорок не ведусь" (c) :) ))

Re: .

Добавлено: 12 окт 2009, 10:13
atavin-ta
Airhand писал(а):BBB
Да, я ошибся на счёт того, что в классах инты зануляются, но ты тоже неправ, когда говоришь: Ты знаешь что такое "отложенная компиляция". Это когда не вставляется конструктор (например) до тех пор, пока не будет реального обращения к экземпляру класса. В данном случае это не катит. Всё закрыли вопрос.
Не совсем правы оба. При объявлении статического экземпляра конструктор вызывается, но при динамическом выделении памяти под экземляр с посмощью malloc, calloc, или realloc не вызывается. Так как один говорит о выделении памяти, а другой об объявлении экземпляра, то если ваши высказывания раздлить по разным темам, то будете правы оба. Обоюдная ошибка в том, что пытаетесь спорить, не потрудившись понять друг друга.
&quot писал(а):отложенная компиляция
Первый раз о таком слышу и ни разу не видел в стандарте.
В стандарте такого нет и врядли будет. Но отложенная компиляция все таки не вымысел. Некоторые компиляторы пытаются таким образом оптимизировать сам процесс компиляции, вставляя вызов конструктора непосредственно перед первым обращением к обекту, отличным от его декларации. Но и в этом случае для объявленного статического экземпляра гарантированно вызывается конструктор. Так что не имеет занчения, отложенная у тебя компиляция, или обычная, результат будет одни. Меняется лишь относительный порядок тех операций, порядок которых произволен по смыслу исходника. сравните:

Код: Выделить всё

 int a;
int b;
 int c;
a=2;
b=23;
c=a+b;
и

Код: Выделить всё

 int a;
int b;
 int c;
b=23;
a=2;
c=a+b;
. От перестановки операций в данном случае и во многих подобных ему результат не меняется. То же самое относится и к вызову конструктора при обычной и при отложенной компиляции.
&quot писал(а):Твои слова:
Эээ... MS VC 6.0 компилил так, что меня вполне устраивало, и, более того, казалось логичным с точки зрения здравой логики. Т.е. он компилил вполне, "как я хочу"
Разве это бочка на старые компиляторы? Читать научись. BBB как раз пишет, что старый компилятор его вполне устраивает.
Могу привести пример компилятора вообще конца 80-х, который компилил не так, как я хочу. Бейсик-компилятор Blast. Он компилил проги, которые умудрялись на построение поверхности тратить 26 минут. Тот же исходник на той же машине, но интерпретированный встроенным в zx spectrum (так она называлась) интерпретатором тратил на построение тойже поверхности 23 минуты. 3 лишних минуты - это явные тормоза внесённые компилятором. Конечно, такая компиляция меня не устроила.
А если компилятор не правильно понимает чей-то код (а это очень даже распростанённое явление), то причина этого - ошибка в самом коде по причине плохого знания языка разработчиком данного кода. Тогда учи язык, и оставь в покое его компиляторы.

Re: .

Добавлено: 12 окт 2009, 13:36
Airhand
atavin-ta писал(а):Не совсем правы оба. При объявлении статического экземпляра конструктор вызывается, но при динамическом выделении памяти под экземляр с посмощью malloc, calloc, или realloc не вызывается. Так как один говорит о выделении памяти, а другой об объявлении экземпляра, то если ваши высказывания раздлить по разным темам, то будете правы оба. Обоюдная ошибка в том, что пытаетесь спорить, не потрудившись понять друг друга.
Ты не понял о чём спор и уже подпрягаешся.
Разве это бочка на старые компиляторы? Читать научись.
Сам читать научись. Мы спорили о том, что ВВВ говорит будто не сушествует отложеной компиляции, а я говорю, что существует.
Не переходи на личности. Это приводит к демагогии и является очень слабым аргументом в споре.

Re: Помогите Исправить Ошибки в Программе

Добавлено: 13 окт 2009, 00:48
Romeo
&quot писал(а):Изъясняйся яснее. Что ты имееш ввиду под гвардами ? Если стражи включения, то там работает препроцессор.
Гварды, это классы, которые делают в конструкторе некие действия, а в деструкторе делают действия обратные действиям конструктора. Образовывайся понемногу, книжки читай.

Вот пример гварда:

Код: Выделить всё

class CCOMInitializerGuard
{
public:
   CCOMInitializerGuard()
   {
      ::CoInitialize(NULL);
   }
   ~CCOMInitializerGuard()
   {
      ::CoUninitialize();
   }
};


void main()
{
   CCOMInitializerGuard comGuard;

   // Any action that needs COM to be initialized
   _bstr_t bstrString = OLESTR("OLE string");
   std::cout << bstrString << std::endl;
}
Если хоть какой-то оптимизатор посмотрит, что моя переменная comGuard нигде дальше не использует и рискнёт соптимизировать и не вызвать конструктор и/или деструктор, то я удавлю разработчика этого компилятора собственными руками потому, что:

1. Он нарушит стандарт.
2. Он разломает идеологию гвардов, которая родилась ещё на заре С++.
3. Он разломает мой код и я буду в ярости.

:)