Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Параметр процедуры [D6, Win2k]


Страницы:   1 2

АлеКо ©   (2005-08-18 10:49:00) 

Добрый день господа.

Создал константы

BlockMFRF : Array[0..3] of Array[0..4] of string =
BlockPP : Array[0..40] of Array[0..4] of string =

Теперь хочу использовать их в качестве входных параметров  в процедуре.
Как правильно описать процедуру.


Digitman   (2005-08-18 12:15:00) [1]


> Leonid Troyanovsky ©   (18.08.05 12:07) [24]


можно и так.

все зависит от ОБДУМАННЫХ фантазий автора.

лишь бы не "гланды через причинное место", как изволил выразиться ув.коллега Плохиш(С)


Digitman   (2005-08-18 12:12:00) [2]


> АлеКо   (18.08.05 12:04) [23]


"шаблонами" здесь, кстати, и не пахнет.

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


Leonid Troyanovsky   (2005-08-18 12:07:00) [3]


> Digitman ©   (18.08.05 11:47) [20]


> для ДАННОЙ КОНКРЕТНОЙ ситуации можно поступить еще проще

> type

 TParamType = (ptBlockMFRF, ptBlockPP);

> PBlockMFRF = ^TBlockMFRF;
> TBlockMFRF = Array[0..3] of Array[0..4] of string;
> PBlockPP = ^TBlockPP;
> TBlockPP = Array[0..40] of Array[0..4] of string;
>
> const
> BlockMFRF : TBlockMFRF = ...;
> BlockPP : TBlockPP = ...;

 procedure ProcessBlock(param: TParamType);

--
Regards, LVT.


АлеКо   (2005-08-18 12:04:00) [4]

Спасибо за советы.

Пошел думать.


Digitman   (2005-08-18 11:53:00) [5]

пардон..

ProcessBlock(BlockMFRF, sizeof(BlockMFRF)); //обработка константы BlockMFRF
ProcessBlock(BlockPP, sizeof(BlockPP));//обработка константы BlockPP


Digitman   (2005-08-18 11:48:00) [6]


> Плохиш ©   (18.08.05 11:47) [19]
> Гланды через одно место.


так точно, сэр !


Digitman   (2005-08-18 11:47:00) [7]

для ДАННОЙ КОНКРЕТНОЙ ситуации можно поступить еще проще :

type
PBlockMFRF = ^TBlockMFRF;
TBlockMFRF = Array[0..3] of Array[0..4] of string;
PBlockPP = ^TBlockPP;
TBlockPP = Array[0..40] of Array[0..4] of string;

const
BlockMFRF : TBlockMFRF = ...;
BlockPP : TBlockPP = ...;

procedure ProcessBlock(const Block; BlockSize: Integer);
begin
 case BlockSize of
  SizeOf(TBlockMFRF): PBlockMFRF(@Block)^ ...; //ветвление для TBlockMFRF
  SizeOf(TBlockPP):   PBlockPP(@Block)^ ...;//ветвление для TBlockPP
 end;
end;

..
ProcessBlock(BlockMFRF);
ProcessBlock(BlockPP);


Плохиш   (2005-08-18 11:47:00) [8]


> АлеКо   (18.08.05 11:44) [18]
> Буду передавать в процедуру название константы.
> В теле процедуры буду обращаться косвенно через @.

Гланды через одно место.


АлеКо   (2005-08-18 11:44:00) [9]

Буду передавать в процедуру название константы.
В теле процедуры буду обращаться косвенно через @.


Digitman   (2005-08-18 11:40:00) [10]


> АлеКо   (18.08.05 11:34) [15]
> не слишком ли это сложно???
> Хотя, решение интересное.


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

если ты впоследствии плпнируешь настрогать еще пару тысяч различных таких вариаций, решение с overload вряд ли оправдано.


Digitman   (2005-08-18 11:37:00) [11]


> Процедура одна на всех


ну тогда и не выпендривайся с типами.

объяви одну-единственную проц-ру, принимающую форм.параметром array of array of string

в теле же процедуры анализируй размерности фактически переданного дин.массива-параметра, и по результатам анализа ветви алгоритм нужным образом

вызывающий же код формирует передаваемый факт.параметр соотв.образом - либо иниц-ет дин.массив на основе данных типа Array[0.. 3] of Array[0..4] of string;
либо на основе тпипа
Array[0.. 40] of Array[0..4] of string;

3 или 40 в 1-й размерности переданного дин.массива как фактического параметра как раз и есть признак для ветвления алгоритма вызванной "Процедуры одной на всех"


Плохиш   (2005-08-18 11:34:00) [12]


> АлеКо   (18.08.05 11:28) [8]
> А как проиницилизировать константу

Так как написано в АлеКо   (18.08.05 10:49)


АлеКо   (2005-08-18 11:34:00) [13]

Digitman а не слишком ли это сложно???
Хотя, решение интересное.


Leonid Troyanovsky   (2005-08-18 11:33:00) [14]


> АлеКо   (18.08.05 11:28) [8]
> А как проиницилизировать константу
>
> Const
>     BlockMFRF : TMyType = (......)


Проинициализировать можно лишь TMyType = record,
скажем  = (field1: 'abc'; field2: 'def';..)

--
Regards, LVT.


Digitman   (2005-08-18 11:32:00) [15]


> АлеКо   (18.08.05 11:28) [8]
> как проиницилизировать константу


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


АлеКо   (2005-08-18 11:31:00) [16]

Эти константы описывают шаблон файла.
Процедура одна на всех.
В процедуру подставляется шаблон и по нему обрабатывется.

Вот такая идея.


Digitman   (2005-08-18 11:30:00) [17]

а overload на что тогда существует ?

type

 TBlockMFRF = Array[0..3] of Array[0..4] of string;
 TBlockPP = Array[0..40] of Array[0..4] of string;

 TForm1 = class(TForm)
 ..
   procedure ProcessBlock(const MFRF: TBlockMFRF); overload;
   procedure ProcessBlock(const PP: TBlockPP); overload;
 ..
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

const
BlockMFRF : TBlockMFRF = ...;
BlockPP : TBlockPP = ...;

..

procedure TForm1.ProcessBlock(const MFRF: TBlockMFRF);
begin
..
end;

procedure TForm1.ProcessBlock(const PP: TBlockPP);
begin
..
end;

...

ProcessBlock(BlockMFRF);
ProcessBlock(BlockBB);


Leonid Troyanovsky   (2005-08-18 11:28:00) [18]


> АлеКо   (18.08.05 10:49)  

> Создал константы

> Теперь хочу использовать их в качестве входных параметров
>  в процедуре.


А зачем их передавать, раз они константы?
Достаточно чтобы они были видимы процедуре.

--
Regards, LVT.


АлеКо   (2005-08-18 11:28:00) [19]

А как проиницилизировать константу

Const
    BlockMFRF : TMyType = (......)


Плохиш   (2005-08-18 11:25:00) [20]


> Описать константу в параметрах процедуры array of array
> of string не получится.

Вы об чём?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо