Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

разбор строка   Найти похожие ветки 

 
Максим   (2008-02-20 09:31) [0]

я передаю параметры для работы свой программы через строку(например так: -a -b -c) все работает,но хотелось чтобы -abc  было равносильно -a -b -c.
Как такое сделать?


 
allucard   (2008-02-20 09:44) [1]

только не помню как параметры идентифицируются.
Перекинь их в переменные, или в StringList.
var s: string;

s := Param[1]; //присваиваем параметр переменной

for i:=0 to length(s) do
begin
s[i];          -вот те твои параметры в отдельности
end;


 
Palladin ©   (2008-02-20 09:47) [2]


> [1] allucard   (20.02.08 09:44)

бред какой то...


> я передаю параметры для работы свой программы через строку(например
> так: -a -b -c) все работает,но хотелось чтобы -abc  было
> равносильно -a -b -c.
> Как такое сделать?

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


 
Ega23 ©   (2008-02-20 09:47) [3]


> я передаю параметры для работы свой программы через строку(например
> так: -a -b -c) все работает,но хотелось чтобы -abc  было
> равносильно -a -b -c.


Так делать некорректно. Но если очень хочется, то ParamCount, ParamStr(N), Pos или StringReplace, ко всему этому F1 и подключенные мозги.
Пишется за 20 минут максимум.


 
{RASkov} ©   (2008-02-20 09:48) [4]

> [0] Максим   (20.02.08 09:31)

Так:
> -a -b -c

это три параметра, а так:
> -abc  

один. Вот и вся разница.... анализируй один параметр, ну и типа for i:=1 to length(ParamStr(N)) do if ParamStr(N)[i].... then ... else ...., как обычно....


 
Ega23 ©   (2008-02-20 09:48) [5]


> allucard   (20.02.08 09:44) [1]


Ты сам проверил то, что тут насоветовал?


 
{RASkov} ©   (2008-02-20 09:49) [6]

Ух... чет я медленно печатаю.... понаотвечали тут уже :)


 
{RASkov} ©   (2008-02-20 09:50) [7]

> [1] allucard   (20.02.08 09:44)

садись - два (с)


 
palva ©   (2008-02-20 10:39) [8]

В сабже ясно сказано, что параметры передаются через строку, то есть параметр всегда один. Программа prog, видимо, запускается так:
prog "-a -b -c"
Строку эту автор получает s := Param[1];
И сабж он называет "разбор строки"


 
{RASkov} ©   (2008-02-20 10:43) [9]

> [8] palva ©   (20.02.08 10:39)
> что параметры передаются через строку, то есть параметр всегда один

Это как? :)

> И сабж он называет "разбор строки"

тогда ему нужно cmdline получается, и разбирать ее до посинения :)


 
oldman ©   (2008-02-20 10:46) [10]


> -abc  было равносильно -a -b -c


А зачем?
Покажи мне прогу, где реализована подобная система передачи параметров...
Или считаешь юзеров даунами? Что, мол, они могут забыть, как передавать параметры?

"Либо дудочка, либо кувшинчик" ©


 
Ник   (2008-02-20 10:49) [11]

Похоже, что опять не докурили ...
Так читайте же вопросы внимательней.

Автор просит именно то, что предложил allucard   (20.02.08 09:44) [1]


 
Григорьев Антон ©   (2008-02-20 10:50) [12]

var
 ParamsPresent: array["A".."Z"] of Boolean;
 I, J: Integer;
 S: string;
begin
 FillChar(ParamsPresent, SizeOf(ParamsPresent), 0);
 for I := 1 to ParamCount do
 begin
   S := ParamStr(I);
   if (Length(S) > 0) and (S[1]="-") then
   begin
     for J := 2 to Length(S) do
       if UpCase(S[J]) in ["A".."Z"] then
         ParamsPresent[UpCase(S[J])] := True
   end
 end;
 // После выполнения этого кода если некоторая буква встретилась в параметрах,
 // то ParamsCount[Эта_буква_в_верхнем_регистре] = True, если не встретилась - False
 // Домашнее задание - разобраться, почему
end;


 
{RASkov} ©   (2008-02-20 11:01) [13]

> [12] Григорьев Антон ©   (20.02.08 10:50)
> if (Length(S) > 0) and (S[1]="-") then

а если параметр не -abc а просто abc?) Я так понял, что "-" выключает, без него(-) типа "+" - включено....

> Максим
> // Домашнее задание - разобраться, почему


 
Johnmen ©   (2008-02-20 11:02) [14]


> // Домашнее задание - разобраться, почему

Ты действительно такой наивный?


 
Григорьев Антон ©   (2008-02-20 11:28) [15]


> {RASkov} ©   (20.02.08 11:01) [13]
> а если параметр не -abc а просто abc?) Я так понял, что
> "-" выключает, без него(-) типа "+" - включено....

Не думаю. "-" принято использовать в командной строке как признак того, что данный параметр является ключом, включающим что-то, что по умолчанию выключено. В DOS"е, вообще-то, было принято использовать для этого прямой слэш, а "-" - это из UNIX"ов, но постепенно "-" победил и в MS"овских системах.


> Johnmen ©   (20.02.08 11:02) [14]
> Ты действительно такой наивный?

Я специально использовал не слишком известные новичкам вещи, чтобы, если в человеке есть хоть искра интереса, ему стало бы хотя бы любопытно. Тогда разберётся. А если искры нет, то всё равно впрок не пойдёт, на чём-нибудь другом споткнётся.


 
{RASkov} ©   (2008-02-20 11:31) [16]

"немного" переделал код [12]

type
 TParamState = (psNone, psEnable, psDisable);

procedure TForm1.GetParam;
var
ParamsPresent: array["A".."Z"] of TParamState;
I, J: Integer;
S: string; C: Char;
begin
 FillChar(ParamsPresent, SizeOf(ParamsPresent), 0);
 for I := 1 to ParamCount do begin
  S := ParamStr(I);
  J:=1;
  while J<=Length(S) do begin
   if (S[J]="-") and (J<Length(S)) then begin
    INC(J);
    while UpCase(S[J]) in ["A".."Z"] do begin
     ParamsPresent[UpCase(S[J])] := psDisable;
     INC(J); Continue;
    end;
   end;
   if UpCase(S[J]) in ["A".."Z"] then ParamsPresent[UpCase(S[J])] := psEnable
    else ParamsPresent[UpCase(S[J])] := psNone;
   INC(J);
  end;
end;
Caption:=cmdLine;
for C:="A" to "Z" do
 case ParamsPresent[C] of
  psNone: ListBox1.Items.Add(C + " - >> не определен");
  psEnable: ListBox1.Items.Add(C + " - Включен!!");
  psDisable: ListBox1.Items.Add(C+ " - ВЫКЛЮЧЕН");
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 GetParam;
end;

Не тестировал, но вроде работает.... единственное - ключи могут повторятся и реально покажется последний из них
проверил с такими параметрами prog -acf g +j-k -n+xk
ключ k - первый раз сбрасывается, второй - устанавливается....


> [15] Григорьев Антон ©   (20.02.08 11:28)
> Не думаю. "-" принято использовать в командной строке как
> признак того, что данный параметр является ключом, включающим
> что-то, что по умолчанию выключено

Ну мало ли :)


 
{RASkov} ©   (2008-02-20 12:00) [17]

> [16] {RASkov} ©   (20.02.08 11:31)

Хм.... код [16] содержит ошибку... При параметрах "prog -ab-c" покажет, что a и b выключены, а с - включен :(
Могут и еще быть ошибки... нужно тестить :)
А может Антон прав, и не нужно парится, тогда - [12]

Хотя... Ключи это - "/х" а параметры - "/х:-y" или "/х:y" - вроде как.... Впрочем это все условно по большей части, и зависит от программиста...


 
Максим   (2008-02-20 20:32) [18]

прошу прощения что не поучавствовал в обсуждении моего вопроса, только добрался до компутера :)
Большое спасибо всем за ответы! Григорьев Антон прав, по умолчанию параметры выключены, знак "-" означает что параметр включается, причем памаметр может быть просто "-a" а может быть со значением "-a 15", т.е. включаем параметр а со значением 15.
Ща буду разбираться что вы мне тут понаписали! =)


 
Максим   (2008-02-20 20:35) [19]

еще забыл сказать что программы которым я передаю парамтеры,не являются программами "***.exe", Это мои плагины которым я передаю параметры. не пинайте сильно если это кардинально меняет решение всей задачи :))


 
Максим   (2008-02-20 21:11) [20]

хм...что-то криво я изъясняюсь... попробую по-нормальному!:)

Есть основная программа(main) и куча плагинов.
В main есть edit, в котором я пишу: 1)первое слово это название плагина,которому будут передаваться параметры и сами данные на обработку. 2) параметры 3) данные на обработку.
Получается что первое слово удаляем(название плагина) все остальное передаем плагину на обработку,тот в свою очередь должен понять что за параметры,и какие у них значения если они вообще предусматриваются. т.е. на пример параметр -a и -b идут как "просто" параметры, а параметр -c и -d должны быть со значениями,т.е. -a -b -c 5 -d 10, и если после параметра с или d  нету значение то result = "error parametrs" and exit ;)


 
Palladin ©   (2008-02-20 22:20) [21]

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


 
Максим   (2008-02-20 23:13) [22]

буду рад,но сам тоже сейчас помучаюсь, может выйдет что...


 
Сергей М. ©   (2008-02-20 23:26) [23]


> Максим   (20.02.08 21:11) [20]


Ты что, мазохист ?)

За каким лешим тебе понадобилось своему плагину (т.е. некоему программному модулю, о котором никто не знает кроме твоего приложения, и который нафих не нужен другим приложениям) передавать параметры в виде текста, да еще и в извращенной форме ?)


 
Сергей М. ©   (2008-02-20 23:28) [24]


> сам тоже сейчас помучаюсь


Пора тебе полаться в *никсоиды - там как никто и нигде более уважают/ценят/холят/лелеют command-line-параноиков)


 
Максим   (2008-02-20 23:31) [25]

Так надо, здесь я лишь прошу помощи(смотрите выше о чем речь).
Если же у вас есть какие то предложения или советы,то милости просим. А писать то, что нахрен мне это надо....
нчиего личного, просто хочется советов и т.п. услышать =)


 
Сергей М. ©   (2008-02-20 23:49) [26]


> милости просим


Ну я уже зашел. С советом. Без стука)

Совет, за неимением вразумительных объяснений по поводу оправданности именно такого интерфейса межмодульного взаимодействия, как раз и выглядит как "выкинуть нафих интерфейс ком.строки вместе с ее парсинг-велосипедом".


 
Максим   (2008-02-21 00:17) [27]

допустим выкиеу и что взамен этого?


 
Бегущий человек ©   (2008-02-21 00:27) [28]

Memory mapped file спасут отца русской демократии


 
Максим   (2008-02-21 00:34) [29]

причем тут mmap?


 
Германн ©   (2008-02-21 00:43) [30]


> Максим   (20.02.08 21:11) [20]
>
> хм...что-то криво я изъясняюсь... попробую по-нормальному!
> :)
>
> Есть основная программа(main) и куча плагинов.
> В main есть edit, в котором я пишу: 1)первое слово это название
> плагина,которому будут передаваться параметры и сами данные
> на обработку. 2) параметры 3) данные на обработку.
> Получается что первое слово удаляем(название плагина) все
> остальное передаем плагину на обработку,тот в свою очередь
> должен понять что за параметры,и какие у них значения если
> они вообще предусматриваются. т.е. на пример параметр -a
> и -b идут как "просто" параметры, а параметр -c и -d должны
> быть со значениями,т.е. -a -b -c 5 -d 10, и если после параметра
> с или d  нету значение то result = "error parametrs" and
> exit ;)
>

1. Поработай над "разбором строк". Т.е. на функциях/процедурах из букваря.
В частности Pos и Copy. Изучи их хорошенько.
2. Параметры не принято передавать в виде "-d 10". Их принято передавать в виде "-d10". Поскольку пробел разделяет параметры.
3. После изучения букваря вернись к ещё одному прочтению  [23]. Осознай его суть и если что тогда будет непонятно, задай другой вопрос.


 
Бегущий человек ©   (2008-02-21 00:44) [31]


> Сергей М. ©   (20.02.08 23:49) [26]
>
> Совет, за неимением вразумительных объяснений по поводу
> оправданности именно такого интерфейса межмодульного взаимодействия,
>  как раз и выглядит как "выкинуть нафих интерфейс ком.строки
> вместе с ее парсинг-велосипедом".
>


> Максим   (21.02.08 00:17) [27]
>
> допустим выкиеу и что взамен этого?


А то, что теперь
1) Парсим строку параметров в main
2)Записываем параметры в mmap
3)Шлём плагину сообщение, и он все из mmap вычитывает, без геморроя c Paramstr


 
Германн ©   (2008-02-21 00:54) [32]


> Бегущий человек ©   (21.02.08 00:44) [31]
>
>


> А то, что теперь
> 1) Парсим строку параметров в main
> 2)Записываем параметры в mmap
> 3)Шлём плагину сообщение, и он все из mmap вычитывает, без
> геморроя c Paramstr
>

Дык у автора проблемы именно с парсингом строки.


 
Бегущий человек ©   (2008-02-21 01:03) [33]


> Германн ©   (21.02.08 00:54) [32]

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


 
Германн ©   (2008-02-21 01:05) [34]


> Бегущий человек ©   (21.02.08 01:03) [33]
>
>
> > Германн ©   (21.02.08 00:54) [32]
>
> А, ну  если параметры сложной структуры, со значениями ,
> тогда аффтару советую прочесть про синтаксический разбор
> (самый простой метод - рекурсивный спуск).
>

До изучения букваря?


 
Сергей М. ©   (2008-02-21 08:40) [35]


> допустим выкиеу и что взамен этого?


Да что угодно)

Мало ли возможностей передать/принять нетекстовые параметры в натуральном виде, без преобразований в строку и обратно ..


 
Максим   (2008-02-21 10:28) [36]

Германн ©   (21.02.08 00:43) [30]

2. Параметры не принято передавать в виде "-d 10". Их принято передавать в виде "-d10". Поскольку пробел разделяет параметры.

>2. А если в качестве значение передается строка, то получиться -dstroka  что некрасиво,и думаю чтьо не правильно.

Сергей М. ©   (21.02.08 08:40) [35]
если есть возможность то предложите другой вариант передачи параметров.

Если честно,то я не пойму чем плох сам варинт передачи параметров моим плагинам.
Само присутстиве плагинов считаю уместным в моем случае,т.к. довольно узко-направленные рассчеты производятся в них. Рассчитано на узкий круг людей, которым я продаю их по мере надобности(но не об этом в теме,просто хочу чтобы вы поняли мои действия и могли направить в нужное русло). В каждом плагине реализуется обработка тех или иных данных,причем в некотрых полностью отсутствуют каки-либо параметры,кроме как включение его в работу. В некоторые нужно передавать строкуи параметры для обработки(самый частый вариант в моем случае).
Спасибо всем за ответы! Если есть какие то конкретные мысли, говорите, я все готов выслушать дабы сделать правильно!
По-поводу copy,pos,я умею ими пользоваться и представляю как сделать вариант будь то просто -a 10 -t -b -g 15 -h stroka,
но мне все же хотелось узнать как делать правильно и грамотно!


 
Сергей М. ©   (2008-02-21 10:32) [37]


> предложите другой вариант передачи параметров


Вариант прост до безобразия - плагин экспортирует некую ф-цию вида

DoSomethingWithParams(Params: TMyParams)

где, например,

TMyParams = array of OleVariant;


 
{RASkov} ©   (2008-02-21 10:37) [38]

> [36] Максим   (21.02.08 10:28)
> то получиться -dstroka  что некрасиво,и думаю чтьо не правильно.

А это обязательность такая, любоваться параметрами коммандной строкой?

> но мне все же хотелось узнать как делать правильно и грамотно!

Я думаю, что вот так будет правильнее
-d:stroka

НО! Зачем вообще здесь параметры коммандной строки? Уже об этом говорят.... Просто твоя задача мне, например, не совсем ясна, поэтому что-то посоветовать взамен я не могу :(


 
{RASkov} ©   (2008-02-21 10:39) [39]

> [37] Сергей М. ©   (21.02.08 10:32)

Ну этож вообще очевидно и все просто.... неужели автор сам до этого не додумался.... :))


 
Сергей М. ©   (2008-02-21 13:34) [40]


> {RASkov} ©   (21.02.08 10:39) [39]


> неужели автор сам до этого не додумался


Похоже, автор желает по возможности осложнить жизнь юзеру, заставив его ручками формировать ком.строку, держа в голове всю эту командно-параметрическую шнягу. Типа раз уж мне, программеру, геморрой с этой ком.строкой, то пусть уж, мол, и юзер помучается - мол, стадать от придуманного геморроя вдвоем как-то веселей.



Страницы: 1 2 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.016 c
4-1178650355
Strate
2007-05-08 22:52
2008.03.23
Опять ListView, изменение колонки.


9-1168164864
DJ KARIES
2007-01-07 13:14
2008.03.23
Yok - игры на Delphi, OpenGL без VCL


3-1193598546
DimDim
2007-10-28 22:09
2008.03.23
Как быстро переписать значения вычисляемых полей в Data-поля


15-1202889916
Iam
2008-02-13 11:05
2008.03.23
WebMoney


3-1193851478
MM_ASH
2007-10-31 20:24
2008.03.23
StoredProc Source