передача параметра в функцию : array of string
Модератор: Модераторы
да запросто может быть переопределен условной компиляцией :о)
в зов-ти от того, какие параметры принимает виндовая версия
Добавлено спустя 41 минуту 1 секунду:
епрст... ахренеть, на целевом паскаль-форуме, при добавлении файла, что мы видим?
Расширение pas/txt/odt запрещено администратором. :о) - великолепно!
убираю расширение, пытаюсь добавить main_pas получаю
Расширение запрещено администратором. :о) - блеск! квест какой-то...
ладно, пусть это будут архивы с вирусами :о))) ...
Расширение xz запрещено администратором. :о) - шик!
а вот zip - сожрала... падла :о) - браво, мама, вы луТчая, танцуЙте!!! где логика?!
...
ладно, теперь к телу, - в архиве урезанный шаблон/пример моего нерабочего проекта...
p.s. убираем из имени zip и распаковываем как нормальный tar.xz-архив
...
добавил отработку методов dbd.03_array_string.tar.xz.zip, немного разруливается проблема
в зов-ти от того, какие параметры принимает виндовая версия
Добавлено спустя 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 09:33:32, всего редактировалось 3 раза.
Да, есть ошибка, sunjob научитесь делать минимальные примеры, а не портянки которые даже на форум выложить проблема)) выглядит примерно так:
т.е. динамический массив в открытый fpc конвертит сам, а наоборот - ругается. Делфи ведет себя также, такчто это не проблема - так и задумано. Дож квк всегда прав
Лечится ручной конвертацией, или заменой в определении функции
const _arg: array of string
на
const _arg: TStringArray
или на ваш тип TMyArrayOfString: array of string если зависимость от sysutils не желательна
Код: Выделить всё
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 не желательна
добавил отработку методов dbd.03_array_string.tar.xz.zip
п.с. ваш пример не смотрел, пока некогда...
п.с. ваш пример не смотрел, пока некогда...
sunjob писал(а):епрст... ахренеть, на целевом паскаль-форуме, при добавлении файла, что мы видим?
Расширение pas/txt/odt запрещено администратором. :о) - великолепно!
убираю расширение, пытаюсь добавить main_pas получаю
Расширение запрещено администратором. :о) - блеск! квест какой-то...
ладно, пусть это будут архивы с вирусами :о))) ...
Расширение xz запрещено администратором. :о) - шик!
Мне видимо за любовь к скриншотам еще 2013-м вообще запретили на форуме файлы размещать.
Так что с вложениями по осторожнее "пути админов и модераторов неисповедимы ".
Последний раз редактировалось Alex2013 07.07.2020 01:44:57, всего редактировалось 1 раз.
Нет "на уровне практики" разница понятна но чисто теоретически именно для Array of String; разницы быть не должно. Это же не фиксированный массив, не запись, не объект или класс . Array of String; всегда и всюду одинаков. То есть он не может внезапно стать Array of Longint;
С уважением:
Смит ,,,,
С уважением:
Смит ,,,,
zub писал(а):минимальные примеры
На самом деле пример шикарен
Как вариант:
Код: Выделить всё
{$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 предпринять меры по соблюдению кодировки выхлопа команды.
> результат функции остался неопределён
в своем варианте я все предусмотрел... и выхлоп, и код возврата, и анализ кода-возврата RunCommandIndir... думаю "это" тут не принципиально, т.к. основная проблема в "передаче параметра"... :о)
за код спасибо, примерно в этом-же направлении рыл... рассматривал еще TStringLists, как вариант...
п.с. только я еще анализирую код возврата run_cmd(c), смысл продолжать печать результата, если команда не отработала или отработала с ошибкой?!
п.с.2 вспомнил еще: exit code is - надо разворачивать
я сделал так
п.с.3
быстрым набегом, ваш код выдает пустой результат
-->
п.с.4
ToStringArr() как насчет чистоты реализации? (выделение/очистка памяти)
вопрос для всех
не смог запустить с помощью RunCommandIndir - мультикоманду/перенаправление/конвейр итд...
это вообще возможно?
-->
...
add to bormant
работает и так:
в своем варианте я все предусмотрел... и выхлоп, и код возврата, и анализ кода-возврата 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 08:24:36, всего редактировалось 5 раз.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
sunjob писал(а):mount: only root can do that
Как бы намекает...
... что для команды
требуется права рута?
п.с. я эту "песню про рута" где-то слышал, натыкался в инете, но не помню "о чем она" и "как закончилась" :о)
Код: Выделить всё
mount | grep /dev/sda
п.с. я эту "песню про рута" где-то слышал, натыкался в инете, но не помню "о чем она" и "как закончилась" :о)
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Я к тому, что это - линухопроблемы, а не проблемы fpc.
... ну конечно же :о)
а запустите-ка на своей любимой винде подобную комбинированную команду с конвейром... а?!
(проблема, не в линух, а, думаю, в том, что команда с аргументами неправильно интерпретируется в данном случае и, возможно, даже в данном случае опасная (после интер-трепаци), и требует рут-привилегий)
p.s. а командочку у себя, все таки попробуйте запустить, если не сложно!? не все-же дым пускать... :о) раскажете, общественности пригодится!
а запустите-ка на своей любимой винде подобную комбинированную команду с конвейром... а?!
(проблема, не в линух, а, думаю, в том, что команда с аргументами неправильно интерпретируется в данном случае и, возможно, даже в данном случае опасная (после интер-трепаци), и требует рут-привилегий)
p.s. а командочку у себя, все таки попробуйте запустить, если не сложно!? не все-же дым пускать... :о) раскажете, общественности пригодится!
sunjob писал(а):что команда с аргументами неправильно интерпретируется в данном случае и, возможно, даже в данном случае опасная (после интер-трепаци), и требует рут-привилегий)
mount всегда требует рут-привилегий.
Если оно у вас работает без рута, то текущему пользователю правилами chroot её запускать разрешено.
А вот под каким uid действует ваша программа - и самое главное - запускаемый ею скрипт - это отдельный вопрос. As is, в некоторых линуксах, например запрещено в принципе ставить setuid root на скрипт. И да, запускаете процесс - позаботьтесь о том, чтобы ему был выдан правильный uid, а не то, что по умолчанию подразумевает система.
> mount всегда требует рут-привилегий
тяжело, наверное, с таким линуксом жить? :о)
хотите продолжить эту тему - выполните у себя под обычным юзером ту самую команду, и выкус сюда с описанием системы, будем разбираться, знатоки подскажут, че-к-чему, ежели чего... ( и без нотаций тока... :о) мы тут не резьбой мерямся, а дружеские посиделки устроили, балагурим, семечки щелкаем, девок обсуждаем... общаемся, короче ... не нравятся наши семечки, нечЁ плеваться :о) приходите со своими... :о)
p.s. по ходу астра такие финты выкидывает...? :о)
тяжело, наверное, с таким линуксом жить? :о)
хотите продолжить эту тему - выполните у себя под обычным юзером ту самую команду, и выкус сюда с описанием системы, будем разбираться, знатоки подскажут, че-к-чему, ежели чего... ( и без нотаций тока... :о) мы тут не резьбой мерямся, а дружеские посиделки устроили, балагурим, семечки щелкаем, девок обсуждаем... общаемся, короче ... не нравятся наши семечки, нечЁ плеваться :о) приходите со своими... :о)
p.s. по ходу астра такие финты выкидывает...? :о)
sunjob писал(а):тяжело, наверное, таким линуксом пользоваться? :о)
Обращаю внимание, Вам выше уже про SETUID намекнули, жаль мимо пролетело...
Намекну еще разок:
Код: Выделить всё
ls -l $(which mount)
-rwsr-xr-x 1 root:root ... /bin/mount
Обратите внимание на права владельца "rws", почитайте, что означает "s" вместо "x", разберитесь, от чьего имени запускается /bin/mount в этом случае и почему было недостаточно "rwx".
Перенаправления ввода-вывода не являются аргументами команды, эти символы обрабатывает оболочка (bash или иная).
Перенаправления ввода-вывода не являются аргументами команды, эти символы обрабатывает оболочка (bash или иная).
вот, это самое ценное, спасибо!!!
пока решил что все "сложные и серьезные системные операции" надо делать скриптами
зю
...пролетело...
вылетело не искаженным ... :о)
про setuid/permission - в курсе, но, это, в данном контексте, не имеет отношение к "вопросу", только сопутствующее...
