C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Массив указателей, Как его передать в процедуру?
Wasabi
Отправлено: 08.09.2004, 10:57


Ученик-кочегар

Группа: Участник
Сообщений: 23



1. Есть массив указателей (допустим TControl).

Есть процедура в которую мне надо передать этот массив чтобы обработать эти контролы на которые указывают указатели в массиве.

Как это сделать с точки зрения синтаксиса?

2. Как задать размер массиву указателей?
Например есть

TControl ptr[Кол-во];

Хочу чтобы он по размеру соответствовал количеству контролов допустим на Панеле.
Типа такого

TControl ptr[Panel1->ControlCount];
Компилятор конечно меня посылает. Как написать правильно?

Спасибо
Konstantine
Отправлено: 08.09.2004, 11:29


Мастер участка

Группа: Модератор
Сообщений: 545



Размер в этом случае токо динамически:
CODE
int size=Panel1->ControlCount;
TControl **arr=new TControl*[size];
...
Юзаешь его
...
delete arr;
а в фунцию передать типа этого:
CODE
определение функции: void func(TControl** ar, int s);
вызов:  func(arr,size);
Dima
Отправлено: 08.09.2004, 11:57


Дежурный стрелочник

Группа: Участник
Сообщений: 61



с точки зрения синтаксиса это можно сделать так :
CODE

 // создать массив указателей на указатели
TControl **ptr = new TControl*[Panel1->ControlCount];
 // инициализировать указатель
ptr[0] = new TControl(Form1);
ptr[0]->BringToFront();
Func(ptr, Panel1->ControlCount);

 //сперва нужно удалить элементы
delete ptr[0];
 // теперь можно удалить сам массив
delete[] ptr;


void Func(TControl **p, int size)
{
int i=0;
  if(i < size)
     p[i]->BringToFront();
}


использовать выражение типа :
TControl *ptr = new TControl[Panel1->ControlCount];
нельзя, т.к. объект TControl не имеет конструктора по умолчанию
Konstantine
Отправлено: 08.09.2004, 12:26


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (Dima @ 08/09/2004, 12:59)
//сперва нужно удалить элементы
delete ptr[0];
// теперь можно удалить сам массив
delete[] ptr;

А по-моему он сам удаляет (посмотри при дебагере)
Doga
Отправлено: 08.09.2004, 13:29


Мастер участка

Группа: Участник
Сообщений: 575



Лучше через TList, не надо будет передавать в функцию кол-во елементов массива.

CODE

TList *ControlList = new TList();
//Указатели могут быть на разные классы, напр:
ControlList->Clear();
ControlList->Add(Edit1);
ControlList->Add(Edit2);
ControlList->Add(ComboBox1);
ControlList->Add(Panel1);
//...

//void __fastcall Func(TList *AControlList );
Func(ControlList);

//кол-во елементов массива ControlList->Count

//Удаляем ControlList
delete ControlList;
Dima
Отправлено: 08.09.2004, 13:53


Дежурный стрелочник

Группа: Участник
Сообщений: 61



QUOTE (Konstantine @ 08/09/2004, 13:28)
А по-моему он сам удаляет (посмотри при дебагере)

Это вопрос стиля. Рекомендуется явно созданные объекты удалять явно.
Konstantine
Отправлено: 08.09.2004, 14:10


Мастер участка

Группа: Модератор
Сообщений: 545



кстати в исходном вопросе не было того, что эти объекты нада создать... Я так понял, что эти объекты созданы, но их нада вкинуть в ф-цию.

Вернуться в Вопросы программирования в C++Builder