Решено SetLength и procedure <name> (var array: array of <>)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
evb87ar
новенький
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Решено SetLength и procedure <name> (var array: array of <>)

Сообщение evb87ar »

Задача:
В процедуру передаётся переменная (скажем in_out_array), объявленная как array of [type].
В процедуре во время работы массив заполняется данными.

Проблема:
Но, при попытке сделать SetLength(in_out_array, <число>) компилятор ругается: Error: Type mismatch.

Текущее решение:
in_out_array объявлена в секции var unit'а.

Вопрос:
Как вывести динамический массив из процедуры или функции, не используя var? Может у кого-нибудь был такой опыт?
Выносить in_out_array в общий var как-то не хочется, ибо тогда в var unit'а будет кучка таких вот переменных.

Предположение:
Может попробовать использовать указатели (ещё не пробовал, вдруг у кого-то есть решение этой проблемы)?

Вот урезанный код:

Код: Выделить всё

  type t_objSQL_Struct = record
    from_table, from_field: string;
    to_table,   to_field  : string;
  end;

  procedure objSQL_link_getStruct(in_link_string: string; var out_link_struct: array of t_objSQL_Struct);
    begin
      SetLength(out_link_struct, 0);
    end;
Последний раз редактировалось evb87ar 30.03.2012 12:12:12, всего редактировалось 1 раз.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Динамический массив нужно объявлять отдельным типом:

Код: Выделить всё

type
  tarray=array of tobjSQL_Struct;

procedure objSQL_link_getStruct(var out_link_struct: tarray);


иначе аргумент процедуры будет не динамическим, а открытым массивом (open array). Несмотря на одинаковый синтаксис, это разные вещи.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

Код: Выделить всё

 procedure objSQL_link_getStruct(in_link_string: string; var out_link_struct: array of t_objSQL_Struct);

При передаче в функцию "array of" означает динамический массив, а статический массив произвольной длины. Чтобы передать динамический массив надо делать так:

Код: Выделить всё

TSqlArray = array of t_objSQL_Struct;
 procedure objSQL_link_getStruct(in_link_string: string; var out_link_struct: TSqlArray);
Аватара пользователя
evb87ar
новенький
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Сообщение evb87ar »

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