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


Автор: kibr3 24.4.2011, 06:06
Borland C++ Builder 6

Код

class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TTimer *Timer1;
 
        TButton *Button1;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        


        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        TPanel  *Panel[100];
        __fastcall TForm1(TComponent* Owner);
};

Создаю через кнопку массив из 4 объектов динамически
Код


void __fastcall TForm1::Button3Click(TObject *Sender)
{

     for(int i = 0; i < 4; i++) {
         Panel[i] = new TPanel(Owner);
         MicrobsCount++;
         // TPanel *Panel3 = new TPanel(Owner);

        static int Name_Num;
       Name_Num++;
        Panel[i]->Parent = Form1;
        Panel[i]->Height = 9;
        Panel[i]->Width = 9;
        Panel[i]->Color = clActiveCaption;
        Panel[i]->Left = rand()%Form1->ClientWidth;
        Panel[i]->Top = rand()%Form1->ClientHeight;
        Panel[i]->Enabled = true;
        Panel[i]->Name = "Panel"+IntToStr(Name_Num+4);
        Panel[i]->Caption = "";
        Panel[i]->Visible=true;
   }        
}


Далее через другую кнопку даю разрешение на передвижение созданных объектов.
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     MicrCreated_flag =true;       
}


В обработчике таймера выводит ошибка при нажатии Button2 в дебаг. С указанием строки (строка указана в коде)
Причем если в таймере обращаюсь не через массив а через индекс (2 например) то все работает.
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

  if(MicrCreated_flag) {
   for(int i = 0; i < MicrobsCount; i++){
        Form1->Panel[i]->Left +=1;                                  // тут выкидывает после нажаия кнопки Button2
        if (Form1->Panel[i]->Left >= Form1->ClientWidth)
        Form1->Panel[i]->Left = 0;

        Form1->Panel[i]->Top +=1;
        if (Form1->Panel[i]->Top >= Form1->ClientHeight )
        Form1->Panel[i]->Top = 0;

      //  Form1->Panel[2]->Left +=1;                            //тут все работает 
      //  Form1->Panel[2]->Top +=1;
     }
   }
 
}


Вопрос в чем ошибка? Как в Таймере обращиться  по очереди к объектам. 

Автор: volatile 24.4.2011, 12:25
Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
 for(int i = 0; i < MicrobsCount; i++){
        Form1->Panel[i]->Left +=1;                                  // тут выкидывает после нажаия кнопки Button2

Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
    //  Form1->Panel[2]->Left +=1;                            //тут все работает 

Во-первых надо давать сообщение ошибки.
Второе - тут и без сообщения видно, что видимо, i выходит за пределы массива. (а что еще может быть?)
Несмотря на излишне приведенный код, я так и не увидел где инициализируется MicrobsCount.
скорей всего ошибка именно в инициализации MicrobsCount = 0

Автор: kibr3 24.4.2011, 14:52
Цитата(volatile @ 24.4.2011,  12:25)
Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
 for(int i = 0; i < MicrobsCount; i++){
        Form1->Panel[i]->Left +=1;                                  // тут выкидывает после нажаия кнопки Button2

Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
    //  Form1->Panel[2]->Left +=1;                            //тут все работает 

Во-первых надо давать сообщение ошибки.
Второе - тут и без сообщения видно, что видимо, i выходит за пределы массива. (а что еще может быть?)
Несмотря на излишне приведенный код, я так и не увидел где инициализируется MicrobsCount.
скорей всего ошибка именно в инициализации MicrobsCount = 0

В том то и дело. Нет кода ошибки. Ошибка выпадает на этапе выполнения после нажатия кнопки Button2 (до того объекты уже созданы путем нажатия Button3). 
Инициализация MicrobsCount как глобальные. 
Код

TForm1 *Form1;
bool MicrCreated_flag = false;
int MicrobsCount = 2;


Но похоже что вы правы. Дело MicrobsCount. 
Если пишу 
Код

 for(int i = 0; i < 2; i++) 

Вместо
Код

 for(int i = 0; i < MicrobsCount; i++)

то все работает. 
Только вот не пойму у меня же и так MicrobsCount = 2 ??

Проблема решилась. Банальная невнимательность. Не заметил MicrobsCount++; (вызов 4 раза) в обработчике Button3. 
Тогда перефразирую вопрос. Как избежать подобных ошибок при при работе с массивом? 

Автор: borisbn 24.4.2011, 22:40
Цитата(kibr3 @  24.4.2011,  14:52 Найти цитируемый пост)
Как избежать подобных ошибок при при работе с массивом?

не использовать массивы. использовать вектор и его http://www.cplusplus.com/reference/stl/vector/at/

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