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

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

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

Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

sunjob писал(а):как все сложно-то, а?! :о) ладушки... может проще будет передать указатель на массив? или все равно прийдется в цикле присвоение делать?

Я в подобных случаях использую простейший парсинг строк .

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

// Мини парсер строк
Function Next1(Var SS:String;Ch:Char):String;
var i:Longint;
begin
Result:='';
  I:=Pos(Ch,SS);
  If i>0 then begin
   Result:= Copy (ss,1,i-1);
 delete(SS,1,i);
  end
end;
...
// юзается так
S:='1,2,3,4';
if s<>'' then begin
 while Pos(',',S)<>0 do List.Add( Next1(S,',')); if S<>'' then List.Add(S);
end;
// или так (последний символ  строки обязательно '/' )
S:='1/2/3/4/';
 while S<>'' do List.Add( Next1(S,'/'));

То есть по сути все решается одной строчкой .
Плюс можно достаточно просто ловить и более сложные конструкции .
Последний раз редактировалось Alex2013 05.07.2020 13:43:52, всего редактировалось 5 раз.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

sunjob, объявить тип:

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

type
Tmyarg :array of string;
...
var
   myarg :Tmyarg ;
...
function run_cmd(const _cmd: string; const _arg: Tmyarg ; const _dir: string):integer;
...

SetLength(myarg,...);
...

run_cmd(..., myarg, ...);
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Снег Север писал(а):sunjob, объявить тип:

Он давно уже объявлен в модуле SysUtils.
Откликается на TStringArray(хм, кто бы подумал).
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

ТС объясни пжст для тупых в чем проблема, с простым воспроизводимым кодом?
Вот тут все работает:

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

program Project1;

uses process;

function run_cmd(const _cmd: string; const _arg: array of string; const _dir: string):integer;
var
 rez:string;
begin
  RunCommandIndir(_dir,_cmd,_arg,rez);
  writeln(rez);
end;

var
 commands:array of string;
begin
  setlength(commands,2);commands[0]:='fpc';commands[1]:='lazarus';
  //commands:=['fpc','lazarus'];//в 3.0.4 это еще не работает
  run_cmd('ping',commands,'d:\');
  run_cmd('ping',['fpc','lazarus'],'d:\');
end. 


fpc 3.0.4, но винда
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):Он давно уже объявлен в модуле SysUtils.
Откликается на TStringArray(хм, кто бы подумал).

Можно и так, но непонятно чем это отличается прямого объявления "A:Array of String;" :?:
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Если непонятна разница между

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

function run_cmd(const _cmd: string; const _arg: array of string; const _dir: string): integer; 
и

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

function run_cmd(const _cmd: string; const _arg: TStringArray; const _dir: string): integer;

то следует учить матчасть.

zub писал(а)://commands:=['fpc','lazarus'];//в 3.0.4 это еще не работает

однако вполне себе работает

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

commands := TStringArray.Create('fpc','lazarus');
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>commands:=['fpc','lazarus'];//в 3.0.4 это еще не работает
и
>>commands := TStringArray.Create('fpc','lazarus');
Про матчасть промолчу, но разница не маленькая. TStringArray.Create кстати тоже не так давно появился
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):то следует учить матчасть.

Нет "на уровне практики" разница понятна но чисто теоретически именно для Array of String; разницы быть не должно. Это же не фиксированный массив, не запись, не объект или класс . Array of String; всегда и всюду одинаков. То есть он не может внезапно стать Array of Longint;
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

zub, про матчасть это в порядке сообщений(в сторону Alex2013)
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):zub, про матчасть это в порядке сообщений(в сторону Alex2013)

Ну "моя сторона" как бы не против . :wink: Матчасть вещь полезная. А вообще извиняюсь, что влез толком не вникнув . Жара на мое и так не очень продвинутое "критическое мышление" явно отрицательно виляет.
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

to Alex2013
в подобных случаях использую простейший парсинг строк

по "идее" должны быть родные парсеры
https://www.cyberforum.ru/lazarus/thread2146885.html
но у меня "опять-таки" не проканало, выдает ошибку

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

main.pas(10,10) Error: Illegal qualifier


...

to Снег Север
объявить тип

согласен, я тоже этим грешу, не люблю читать все подряд... если не сильно надо :о)
... надо специльно определять тип и использовать его ...


...

to iskander
SysUtils / TStringArray

так точно! ну...точно помнил... помнил, но забыл :о)

...

to zub
для тупых в чем проблема, с простым воспроизводимым кодом?

нууу... как бы так, что-бы не обидеться самому... :о)
че и как вы там собирали ...?! сами-же видите, все против и говорят, что так по умолчанию не только нельзя, но и не получится в принцыпе!!!
:о) у меня не проканало :о) fpc.cfg практически не настраивал ... ось-линух (винды даже в мыслях нет :о)

доберусь до железки, взгляну еще раз дотошным взглядом :о)
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

sunjob
в оригинале было:
>>ТС объясни пжст для тупых в чем проблема
я туплю и не вижу проблему. Обидеть никого не хотел))
В приведенном мной примере насколько я понимаю какраз то что у вас не работает, или нет?
Чтоб избежать флуда, давайте законченые независимые примеры
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

> Обидеть никого не хотел)
да все нормально :о) (это смайлик, глазики, носик, и рот)

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

> законченые независимые примеры
согласен! :о) (но опять таки, у меня линух)
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

У меня работает пример zub'а в двух конфигурациях
- Linux x86_64, fpc 3.0.4
- Linux ARM, fpc 3.0.0
только строки нужно переделать на AnsiString переписыванием или при помощи -Sh, $H+ или режимом DELPHI.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>из-за отличия в параметрах RunCommandIndir()
а RunCommandIndir случайно нигде не переопределен от fpcшного?
Ответить