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

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

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

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

Сообщение sunjob » 06.07.2020 05:21:36

да запросто может быть переопределен условной компиляцией :о)
в зов-ти от того, какие параметры принимает виндовая версия

Добавлено спустя 41 минуту 1 секунду:
епрст... ахренеть, на целевом паскаль-форуме, при добавлении файла, что мы видим?
Расширение pas/txt/odt запрещено администратором. :о) - великолепно!

убираю расширение, пытаюсь добавить main_pas получаю
Расширение запрещено администратором. :о) - блеск! квест какой-то...

ладно, пусть это будут архивы с вирусами :о))) ...
Расширение xz запрещено администратором. :о) - шик!

а вот zip - сожрала... падла :о) - браво, мама, вы луТчая, танцуЙте!!! где логика?!

...

ладно, теперь к телу, - в архиве урезанный шаблон/пример моего нерабочего проекта...
p.s. убираем из имени zip и распаковываем как нормальный tar.xz-архив

...

добавил отработку методов dbd.03_array_string.tar.xz.zip, немного разруливается проблема
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось sunjob 06.07.2020 10:33:32, всего редактировалось 3 раз(а).
Аватара пользователя
sunjob
постоялец
 
Сообщения: 125
Зарегистрирован: 12.01.2011 15:19:54

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

Сообщение zub » 06.07.2020 09:30:57

Да, есть ошибка, sunjob научитесь делать минимальные примеры, а не портянки которые даже на форум выложить проблема)) выглядит примерно так:
Код: Выделить всё
program Project1;

uses process;

var
commands,commands2:array of string;

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

begin
  setlength(commands,2);commands[0]:='fpc';commands[1]:='lazarus';
  run_cmd('ping',commands,'d:\');
  run_cmd('ping',['fpc','lazarus'],'d:\');
end.

т.е. динамический массив в открытый fpc конвертит сам, а наоборот - ругается. Делфи ведет себя также, такчто это не проблема - так и задумано. Дож квк всегда прав
Лечится ручной конвертацией, или заменой в определении функции
const _arg: array of string
на
const _arg: TStringArray
или на ваш тип TMyArrayOfString: array of string если зависимость от sysutils не желательна
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение sunjob » 06.07.2020 10:32:51

добавил отработку методов dbd.03_array_string.tar.xz.zip

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

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

Сообщение Alex2013 » 06.07.2020 12:49:35

sunjob писал(а):епрст... ахренеть, на целевом паскаль-форуме, при добавлении файла, что мы видим?
Расширение pas/txt/odt запрещено администратором. :о) - великолепно!

убираю расширение, пытаюсь добавить main_pas получаю
Расширение запрещено администратором. :о) - блеск! квест какой-то...

ладно, пусть это будут архивы с вирусами :о))) ...
Расширение xz запрещено администратором. :о) - шик!

Мне видимо за любовь к скриншотам еще 2013-м вообще запретили на форуме файлы размещать.
Так что с вложениями по осторожнее "пути админов и модераторов неисповедимы ".
Последний раз редактировалось Alex2013 07.07.2020 02:44:57, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение smith9 » 06.07.2020 14:43:46

Нет "на уровне практики" разница понятна но чисто теоретически именно для Array of String; разницы быть не должно. Это же не фиксированный массив, не запись, не объект или класс . Array of String; всегда и всюду одинаков. То есть он не может внезапно стать Array of Longint;

С уважением:
Смит ,,,,
smith9
незнакомец
 
Сообщения: 2
Зарегистрирован: 06.07.2020 10:46:19

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

Сообщение bormant » 06.07.2020 15:13:10

zub писал(а):минимальные примеры

На самом деле пример шикарен ;-) особенно, если вспомнить, что у RunCommandInDir три перегруженных варианта, а тот, что использован в примере, возвращает Boolean, результат функции остался неопределён.

Как вариант:
Код: Выделить всё
{$mode ObjFPC}{$H+}
uses process;

type
  TStringArr = array of String;
  TRunCmd = record
    dir: String;
    cmd: String;
    arg: TStringArr;
    opt: TProcessOptions;
    str: String;
    ret: Integer;
  end;

function run_cmd(var c: TRunCmd): Integer;
begin with c do
  Result:=RunCommandInDir(dir,cmd,arg,str,ret,opt);
end;

function ToStringArr(const v: array of String): TStringArr;
var i: Integer;
begin
  SetLength(Result,Length(v));
  for i:=0 to Length(v)-1 do Result[i]:=v[i];
end;

var
  c: TRunCmd;
begin
  with c do begin
    dir:='';
    cmd:='ping';
    arg:=ToStringArr(['-n','4','localhost']);
    WriteLn('run_cmd is ',run_cmd(c),' exit code is ',ret);
    WriteLn('command output is');
    WriteLn(str);
  end;
end.

PS. Для Windows предпринять меры по соблюдению кодировки выхлопа команды.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

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

Сообщение sunjob » 06.07.2020 16:13:05

> результат функции остался неопределён
в своем варианте я все предусмотрел... и выхлоп, и код возврата, и анализ кода-возврата RunCommandIndir... думаю "это" тут не принципиально, т.к. основная проблема в "передаче параметра"... :о)

за код спасибо, примерно в этом-же направлении рыл... рассматривал еще TStringLists, как вариант...

п.с. только я еще анализирую код возврата run_cmd(c), смысл продолжать печать результата, если команда не отработала или отработала с ошибкой?!

п.с.2 вспомнил еще: exit code is - надо разворачивать

я сделал так
Код: Выделить всё
var
LO  : byte   ;
HI  : byte   ;
TMP : integer;

...

//
// TMP = exit-code [LO][HI] -> поменять местами
//
LO := byte(TMP shl (sizeOf(byte)*8));
HI := byte(TMP shr (sizeOf(byte)*8));
prc_struct.ret := LO + HI;

п.с.3
быстрым набегом, ваш код выдает пустой результат
Код: Выделить всё
run_cmd is 0 exit code is 512
command output is
-->
Код: Выделить всё
arg:=ToStringArr(['-c','4','localhost']);

п.с.4
ToStringArr() как насчет чистоты реализации? (выделение/очистка памяти)

вопрос для всех
не смог запустить с помощью RunCommandIndir - мультикоманду/перенаправление/конвейр итд...
это вообще возможно?

Код: Выделить всё
//
// mount | grep /dev/sda
//
cmd:='mount';
arg:=ToStringArr(['|','grep','/dev/sda']);

-->
Код: Выделить всё
run_cmd is 0 exit code is 256
command output is
mount: only root can do that


...

add to bormant
работает и так:
Код: Выделить всё
type
TStringArr = array of String;
TRunCmd    = record
dir: String;
cmd: String;
//arg: TStringArr;
arg: array of String; // <- !!! this
str: String;
ret: Integer;
opt: TProcessOptions;
end;
Последний раз редактировалось sunjob 07.07.2020 09:24:36, всего редактировалось 5 раз(а).
Аватара пользователя
sunjob
постоялец
 
Сообщения: 125
Зарегистрирован: 12.01.2011 15:19:54

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

Сообщение Снег Север » 06.07.2020 18:34:06

sunjob писал(а):mount: only root can do that

Как бы намекает...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение sunjob » 07.07.2020 02:58:45

... что для команды
Код: Выделить всё
mount | grep /dev/sda
требуется права рута?

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

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

Сообщение Снег Север » 07.07.2020 08:30:03

Я к тому, что это - линухопроблемы, а не проблемы fpc.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение sunjob » 07.07.2020 09:17:43

... ну конечно же :о)

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

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

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

Сообщение SSerge » 07.07.2020 10:33:02

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


mount всегда требует рут-привилегий.
Если оно у вас работает без рута, то текущему пользователю правилами chroot её запускать разрешено.
А вот под каким uid действует ваша программа - и самое главное - запускаемый ею скрипт - это отдельный вопрос. As is, в некоторых линуксах, например запрещено в принципе ставить setuid root на скрипт. И да, запускаете процесс - позаботьтесь о том, чтобы ему был выдан правильный uid, а не то, что по умолчанию подразумевает система.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение sunjob » 07.07.2020 11:09:41

> mount всегда требует рут-привилегий
тяжело, наверное, с таким линуксом жить? :о)

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

p.s. по ходу астра такие финты выкидывает...? :о)
Аватара пользователя
sunjob
постоялец
 
Сообщения: 125
Зарегистрирован: 12.01.2011 15:19:54

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

Сообщение bormant » 07.07.2020 11:23:24

sunjob писал(а):тяжело, наверное, таким линуксом пользоваться? :о)

Обращаю внимание, Вам выше уже про SETUID намекнули, жаль мимо пролетело...
Намекну еще разок:
Код: Выделить всё
ls -l $(which mount)
-rwsr-xr-x  1  root:root ... /bin/mount

Обратите внимание на права владельца "rws", почитайте, что означает "s" вместо "x", разберитесь, от чьего имени запускается /bin/mount в этом случае и почему было недостаточно "rwx".

Перенаправления ввода-вывода не являются аргументами команды, эти символы обрабатывает оболочка (bash или иная).
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

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

Сообщение sunjob » 07.07.2020 12:05:55

Перенаправления ввода-вывода не являются аргументами команды, эти символы обрабатывает оболочка (bash или иная).

вот, это самое ценное, спасибо!!!

пока решил что все "сложные и серьезные системные операции" надо делать скриптами

зю
...пролетело...

вылетело не искаженным ... :о)
про setuid/permission - в курсе, но, это, в данном контексте, не имеет отношение к "вопросу", только сопутствующее...
Аватара пользователя
sunjob
постоялец
 
Сообщения: 125
Зарегистрирован: 12.01.2011 15:19:54

Пред.След.

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

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

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

Рейтинг@Mail.ru