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

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

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

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

Сообщение evb87ar » 30.03.2012 10:26:53

Задача:
В процедуру передаётся переменная (скажем 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 раз.
Аватара пользователя
evb87ar
новенький
 
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Re: Ошибка:SetLength и procedure <name> (var array: array of

Сообщение Sergei I. Gorelkin » 30.03.2012 11:00:46

Динамический массив нужно объявлять отдельным типом:
Код: Выделить всё
type
  tarray=array of tobjSQL_Struct;

procedure objSQL_link_getStruct(var out_link_struct: tarray);


иначе аргумент процедуры будет не динамическим, а открытым массивом (open array). Несмотря на одинаковый синтаксис, это разные вещи.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Ошибка:SetLength и procedure <name> (var array: array of

Сообщение kipar » 30.03.2012 11:02:08

Код: Выделить всё
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);
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

Re: Ошибка:SetLength и procedure <name> (var array: array of

Сообщение evb87ar » 30.03.2012 12:10:12

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru