Передача статического многомерного массива процедуре как параметр

wellvk
Дата: 18.06.2009 09:18:57
Уважаемые форумчане, помогите решить проблему- все, думаю, тривиально, но не для меня....
Суть: есть
const
na :array[0..1,0..1] of string =(('test1','test2'),('test3','test4'));
необходимо её передать в качестве параметра функции
procedure TPriv.access(form:Tform;p:pointer);
var 
mas:array of string; i:integer;
begin
mas:=p;   Showmessage(inttostr(high(mas)));
i:=0;
while i<=high(mas)do
begin
       Showmessage(mas[i]); inc(i);
end;
end;

вот так передаю экземпляру класса:
TPriv.access(Form1,@na)
Кол-во эл-тов массива узнать не могу и т.д
пробвывал разные конфигурации, а решить проблем-не хватает знаний.
Спасибо.
Petro123
Дата: 18.06.2009 09:28:57
вместо массива передавай TStringList
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
Tosh
Дата: 18.06.2009 09:34:30
для передачи массивов, как параетры процедурам и функциям, необходимо завести новый тип
что-то вроде такого:
tpe
  TArr = array[0..1,0..1] of string;
const
  ns: TArr = (('test1','test2'),('test3','test4'));

procedure TPriv.access(form:Tform;p:TArr)
i:integer;
begin
end;

TPriv.access(Form1,na)
второй вариант - немного интереснее но небезопасен:
const
  na :array[0..1,0..1] of string =(('test1','test2'),('test3','test4'));

procedure TPriv.access(form:Tform;p);
var 
mas:array[0..1,0..1] of string; absolute p;
i:integer;
begin
end;

TPriv.access(Form1,na)
wellvk
Дата: 18.06.2009 10:02:53
Спасибо Tosh, Вы не в первый раз даёте жизненные советы- сразу видно проффи.
Tosh
Дата: 18.06.2009 10:04:12
только цчтите одну весч - вы там внетрях пытаесь работать как с одномерным масивом - такое приведение невозможно ...
Док
Дата: 18.06.2009 10:23:00
wellvk
Спасибо Tosh, Вы не в первый раз даёте жизненные советы- сразу видно проффи.

к тому же он наверняка читает "правильные" книги, например, Тейксейру с Пачеко, где разбирается подробно именно ваш вопрос :)
Barmaley57
Дата: 18.06.2009 11:12:53
Я думаю, что человек прочитавший книги Пачеко все-таки сделает что-то типа:
type
  TArr = array[0..N,0..M] of string;
  PArr=^Tarr;

var
  ns:PArr;

procedure access(form:Tform;p:PArr);
var i:integer;
begin
  for i:=0 to high(p^) do ...
end;

В противном случае может случиться так, что он долго будет искать ошибку типа AV в программе, которая сожрет весь стек (не дай бог рекурсивные вызовы использовать)...
Док
Дата: 18.06.2009 11:18:41
Barmaley57
Я думаю, что человек прочитавший книги Пачеко все-таки сделает что-то типа...

требуется, как минимум, просто слизать код
Зайцев Фёдор
Дата: 18.06.2009 11:20:42
Barmaley57
Я думаю, что человек прочитавший книги Пачеко все-таки сделает что-то типа:
А не проще ли
procedure access(form:Tform; var p:TArr);
Barmaley57
Дата: 18.06.2009 11:30:43
Зайцев Фёдор
Barmaley57
Я думаю, что человек прочитавший книги Пачеко все-таки сделает что-то типа:
А не проще ли
procedure access(form:Tform; var p:TArr);


Проше конечно :) Но чтобы как следует это понять - надо самому прочувствовать (вручную).