передача параметра в функцию : array of string

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

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

передача параметра в функцию : array of string

Сообщение sunjob » 05.07.2020 09:55:08

добрый день

изучаю/тестирую/пишу обертку для RunCommandIndir()

Код: Выделить всё
function RunCommandIndir(
  const curdir            : string;
  const exename           : string;
  const commands          : array of string; <- !!! this param
  out   outputstring      : string ;
  out   exitstatus        : integer;
        Options           : TProcessOptions = []):integer;

как передать параметр commands в функцию-обертку? (параметр _arg)
Код: Выделить всё
function run_cmd(const _cmd: string; const _arg: array of string; const _dir: string):integer;
...


исходные
Код: Выделить всё
- fpc-3.0.4
- Linux
Аватара пользователя
sunjob
постоялец
 
Сообщения: 123
Зарегистрирован: 12.01.2011 15:19:54

Re: передача параметра в функцию : array of string

Сообщение Дож » 05.07.2020 10:26:26

Код: Выделить всё
RunCommandIndir('', _cmd, _arg, ...
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: передача параметра в функцию : array of string

Сообщение sunjob » 05.07.2020 10:40:54

в таком случае - несоответствие типа... (иначе-бы и вопроса не было :о)

с "простым" типом все нормально, с array of string не прокатывает...
точне далее, на операторе присвоения - ошибка!

я использую структуру для работы с RunCommandIndir... все остальные поля заполняются нормально, вот с массивом строк проблема... в инете пишут, что надо специльно определять тип и использовать его, для определения типа параметра... не понятно, почему в лоб нельзя? или я то-то опять не так все понимаю? :о)

Код: Выделить всё
type
RunCmdStruct = record
dir : string          ; // in  : directory
cmd : string          ; // in  : cmd to exec
arg : array of string ; // in  : аргументы ком.строки для cmd
str : string          ; // out : выхлоп скрипта
ret : integer         ; // out : exit-code
opt : TProcessOptions ; // in  : [poWaitOnExit,poUsePipes,poStderrToOutPut];
end;
type PRunCmdStruct = ^RunCmdStruct;
...
var
p_run_struct : PRunCmdStruct      ; // указатель на run-структуру
...
p_run_struct^.dir := _dir; // in :
p_run_struct^.cmd := _cmd; // in :
p_run_struct^.arg := _arg; // in :        <- this error
p_run_struct^.str := ''  ; // out : clear
p_run_struct^.ret :=  0  ; // out : clear

Код: Выделить всё
app.pas(155,22) Error: Incompatible types: got "{Open} Array Of AnsiString" expected "RunCmdStruct.{Dynamic} Array Of AnsiString"
Аватара пользователя
sunjob
постоялец
 
Сообщения: 123
Зарегистрирован: 12.01.2011 15:19:54

Re: передача параметра в функцию : array of string

Сообщение Дож » 05.07.2020 11:35:22

в таком случае - несоответствие типа... (иначе-бы и вопроса не было :о)

В таком случае вы неправильно написали сигнатуры функций в первом посте.

точне далее, на операторе присвоения - ошибка!

Когда array of string написано в объявлении сигнатуры функции, это открытый массив (Open Array). Открытый массив можно представлять себе как неявную пару из двух значений: 1) указатель на первый элемент, 2) количество элементов. Или как массив с фиксированным количеством элементов, существующий в пределах выполнения функции.

Когда array of string написано в объявлении типа, это динамический массив (Dynamic Array). Динамический массив может неявно кастоваться в открытый массив, а открытый массив в динамический -- нет.

Об этом вам написано в приведённой ошибке. Чтобы скопировать _arg в arg можно явно написать SetLength и цикл с присваиваниями.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: передача параметра в функцию : array of string

Сообщение sunjob » 05.07.2020 11:54:43

неправильно написали сигнатуры функций в первом посте.

ну и... ? :о) далее... как правильно?

Чтобы скопировать _arg в arg можно явно написать SetLength и цикл с присваиваниями.

так сложно, попроще никак? :о) вроде бы как другие типы без проблем можно передавать, а вот с массивами загвоздочка... :о) как с точки зрения fpc-философии будет правильным использование "такого" параметра?
- формирование из-вне
- передача параметром в функцию
- присвоение внутри функции
Аватара пользователя
sunjob
постоялец
 
Сообщения: 123
Зарегистрирован: 12.01.2011 15:19:54

Re: передача параметра в функцию : array of string

Сообщение Alex2013 » 05.07.2020 12:34:55

sunjob писал(а):function run_cmd(const _cmd: string; const _arg: array of string; const _dir: string):integer;

А что будет если заменить на var _arg: array of string; ?
Модификатор const по идее должен запрещать модификацию создавая временную копию переменной.
(да знаю работает это не всегда но вдруг причина в этом? )
Последний раз редактировалось Alex2013 05.07.2020 12:46:16, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: передача параметра в функцию : array of string

Сообщение bormant » 05.07.2020 12:45:00

Alex2013 писал(а):А если заменить на var _arg: array of string; ?

Тогда потеряется возможность передать в RunCommandIndir(..., ['command1', 'command2', 'command3'], ...)

Добавлено спустя 1 минуту 29 секунд:
Alex2013 писал(а):Модификатор const по идее запрещает модификацию создавая временную копию переменной.

Нет, ровно наоборот: модификатор const декларирует, что переменная неизменяема, и, следовательно, нет нужды создавать ее копию.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: передача параметра в функцию : array of string

Сообщение Дож » 05.07.2020 12:47:54

ну и... ? :о) далее... как правильно?

Правильно приводить так, как в коде, про который задаёте вопрос.

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

Вы различаете понятия "передача" и "оператор присваивания"?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: передача параметра в функцию : array of string

Сообщение bormant » 05.07.2020 12:53:16

sunjob писал(а):попроще никак?

Нет. Даже Copy в этом не поможет.

Ничего сложного нет в предложенном выше:
Код: Выделить всё
var
  p_run_struct: PRunCmdStruct;
  i: Integer;
...
  with p_run_struct do
  begin
...
    SetLength(arg,Length(_arg));
    for i:=0 to Length(_arg)-1 do arg[i]:=_arg[i];
Последний раз редактировалось bormant 05.07.2020 12:57:21, всего редактировалось 1 раз.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: передача параметра в функцию : array of string

Сообщение Alex2013 » 05.07.2020 12:57:21

bormant писал(а):Тогда потеряется возможность передать в RunCommandIndir(..., ['command1', 'command2', 'command3'], ...)

Ну это довольно просто подпереть "костылем" ..
Run2 (const _cmd: string; const _arg: array of string; const _dir: string RunCom:procedure; ):integer;
В прочем зависит от того где именно вылезает ошибка ... Если при изменении массива то фокус может прокатить а если просто при использовании const _arg: array of string; в качестве параметров то нет.
Последний раз редактировалось Alex2013 05.07.2020 13:04:13, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: передача параметра в функцию : array of string

Сообщение bormant » 05.07.2020 13:02:50

Alex2013 писал(а): довольно просто подпереть "костылем"

[здесь был бородатый анекдот про героическое преодоление трудностей, а именно про секс в гамаке, стоя на лыжах]
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: передача параметра в функцию : array of string

Сообщение sunjob » 05.07.2020 13:05:25

как все сложно-то, а?! :о) ладушки... может проще будет передать указатель на массив? или все равно прийдется в цикле присвоение делать?
Аватара пользователя
sunjob
постоялец
 
Сообщения: 123
Зарегистрирован: 12.01.2011 15:19:54

Re: передача параметра в функцию : array of string

Сообщение Alex2013 » 05.07.2020 13:07:36

bormant писал(а):
Alex2013 писал(а): довольно просто подпереть "костылем"

[здесь был бородатый анекдот про героическое преодоление трудностей, а именно про секс в гамаке, стоя на лыжах]

Все верно .
Но я не претендую на истину а просто высказываю пришедшие в голову идеи в порядке "мозгового штурма".
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: передача параметра в функцию : array of string

Сообщение Дож » 05.07.2020 13:16:24

может проще будет передать указатель на массив? или все равно прийдется в цикле присвоение делать?

Сто пудово придётся, если путать передачу и присвоение.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: передача параметра в функцию : array of string

Сообщение sunjob » 05.07.2020 13:21:53

... а так хорошо начинали ...
Аватара пользователя
sunjob
постоялец
 
Сообщения: 123
Зарегистрирован: 12.01.2011 15:19:54

След.

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

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

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

Рейтинг@Mail.ru