Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Порядок объявления переменных


Автор: AntonChik 6.10.2007, 14:05
извиняюсь если спрашиваю какую-то глупость (убейте, поиском не воспользовался), но вот стало интересно почему если в рабочем коде :
Код

 TButton **b;
 int z;
 int n=10;

 for (z=0;z<n;z++)
  {
   b[z] = new TButton(Application);
   b[z]->Parent = Form1;
   b[z]->Visible=true;
  }


объявить  **b после z и n, т.е. вот так

Код

 int z;
 int n=10;
 TButton **b;

 for (z=0;z<n;z++)
  {
   b[z] = new TButton(Application);
   b[z]->Parent = Form1;
   b[z]->Visible=true;
  }

то в строке 
Код

   b[z] = new TButton(Application);

вылетает access violation ???!

Автор: volvo877 6.10.2007, 14:18
Цитата(AntonChik @  6.10.2007,  13:05 Найти цитируемый пост)
в рабочем коде

Ты считаешь, что он действительно рабочий? А память, прости, под массив b, ты где выделяешь?

Автор: AntonChik 6.10.2007, 14:39
Цитата(volvo877 @ 6.10.2007,  14:18)
Ты считаешь, что он действительно рабочий? 

я не считаю, я поимел смелость лично в этом убедиться, продемонстрировав себе успешную компиляцию, запуск приложения и произведя действия, ведущие к вызову данного кода...

а вот память под очередной элемент массива b я выделаю вот здесь:
Код

b[z] = new TButton(Application);

или здесь происходит нечто другое?)))

Автор: Alexeis 6.10.2007, 14:48
TButton **b;
это указатель на указатель, т.е. сначала нужно выделить память под массив указателей, а затем уж под каждый объект.

Автор: AntonChik 6.10.2007, 15:09
ок. знаю и верю. почему тогда работает первый код? кнопочки успешно создаются и даже щелкаются(!) smile

Автор: zkv 6.10.2007, 15:18
Код

TButton **b;
 int n=10;
b = new TButton *[n];
 int z;
 for (z=0;z<n;z++)
  {
   b[z] = new TButton(Application);
   b[z]->Parent = Form1;
   b[z]->Visible=true;
  }


Цитата(AntonChik @  6.10.2007,  15:09 Найти цитируемый пост)
почему тогда работает первый код

не должен работать. Либо не все показал, либо это упущение Билдера, если он такие ошибки пропускает.

Автор: Alexeis 6.10.2007, 15:21
zkv, если переменная неинециализирована, то там может быть допустимый адрес где-то в выделенной памяти.

Автор: zkv 6.10.2007, 15:28
Цитата(Alexeis @  6.10.2007,  15:21 Найти цитируемый пост)
если переменная неинециализирована, то там может быть допустимый адрес где-то в выделенной памяти. 

Visual C++ в таком случае заполняет эти участки такими значениями, чтобы прога гарантированно вылетела, при попытке обращения, конечно в режиме отладки.
также указатели все инициализируются, в режиме отладки
Поэтому я и говорю -  баг Билдера получается  smile 

Автор: Fazil6 6.10.2007, 15:38
Цитата(AntonChik @  6.10.2007,  15:09 Найти цитируемый пост)
ок. знаю и верю. почему тогда работает первый код? кнопочки успешно создаются и даже щелкаются(!)


Цитата(AntonChik @  6.10.2007,  14:39 Найти цитируемый пост)
я не считаю, я поимел смелость лично в этом убедиться, продемонстрировав себе успешную компиляцию, запуск приложения и произведя действия, ведущие к вызову данного кода...

Код

TButton **b;
 int z;
 int n=10;

 for (z=0;z<n;z++)
  {
   b[z] = new TButton(Application);
   b[z]->Parent = Form1;
   b[z]->Visible=true;

   ShowMessage(n);   // << -----  думаю так твой работающий код рухнет
  }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)