Как лучше обрабатывать параметры в программе на FLTK? (И вообще в иксовых программах.)

Модератор: Модераторы разделов

MiK13
Сообщения: 581
ОС: Windows XP

Как лучше обрабатывать параметры в программе на FLTK?

Сообщение MiK13 » 28.06.2016 16:50

Здравствуйте!
Чтобы не разбираться с системными функциями (там не всегда удобно), я применял простую обработку параметров:

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

for(int i=1;i<argc;i++) {
  if(!strcmp(argv[i],"-key1")) { ...; continue; }
  if(!strncmp(argv[i],"-key2=value",5)) { ...; continue; }
    ...
}
В принципе, всё работает. Но в программе на FLTK в конце идёт

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

  foo_window->show(argc, argv);
  return Fl::run();
То есть передаются аргументы элементу show. И в результате:
Программа работает нормально, но при запуске выдаёт:

Код:

$ ./set_par -r1="Вариант 1" -r2="Вариант 2" options are: -bg2 color -bg color -di[splay] host:n.n -dn[d] -fg color -g[eometry] WxH+X+Y -i[conic] -k[bd] -na[me] classname -nod[nd] -nok[bd] -not[ooltips] -s[cheme] scheme -ti[tle] windowtitle -to[oltips]
В общем, это не мешает. Но хотелось бы, чтобы программа вообще ничего лишнего не выдавала.
Как это сделать?
Спасибо сказали:

MiK13
Сообщения: 581
ОС: Windows XP

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение MiK13 » 28.06.2016 17:12

Пока пришёл в голову только такой вариант:

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

int argc1=0;
char *argv1[argc];
for(int i=0;i<argc;i++) {
  if(!strcmp(argv[i],"-key")) { ...; continue' }
    ...
  argv1[argc1++]=argv[i];
}
argv1[argc1]=NULL;
...
foo_window->show(argc1, argv1);

Но, может быть, есть что-то более общепринятое?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 13463
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Bizdelnick » 28.06.2016 17:22

MiK13 писал(а):
28.06.2016 16:50
Чтобы не разбираться с системными функциями

Очень зря.

MiK13 писал(а):
28.06.2016 16:50
передаются аргументы элементу show.

У Вас есть выбор: не передавать их или формировать массив самостоятельно из тех ключей, которые не соответствуют Вашим.

При использовании getopt(3) можно было бы самостоятельно обработать опции, предшествующие --, а последующие передать show().
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Olej » 28.06.2016 17:47

Bizdelnick писал(а):
28.06.2016 17:22
MiK13 писал(а):
28.06.2016 16:50
Чтобы не разбираться с системными функциями

Очень зря.
При использовании getopt(3) можно было бы самостоятельно обработать опции, предшествующие --, а последующие передать show().

getopt() и getopt_long(), а все ваши, ТС, "изыски" - это через задницу. :unsure:
Спасибо сказали:

MiK13
Сообщения: 581
ОС: Windows XP

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение MiK13 » 28.06.2016 17:53

Bizdelnick писал(а):
28.06.2016 17:22
MiK13 писал(а):
28.06.2016 16:50
Чтобы не разбираться с системными функциями

Очень зря.
Может быть. Но, как я понял, getopt() понимает только однобайтовые ключи. И воспринимает последующие байты либо как другой ключ, либо как параметр. А в варианте с длинными именами требует уже в начале "--", что меня не очень устраивает.

Bizdelnick писал(а):
28.06.2016 17:22
У Вас есть выбор: не передавать их или формировать массив самостоятельно из тех ключей, которые не соответствуют Вашим.
Я примерно так и решил сделать.
А сейчас подумал, что можно попробовать в show() вместо argc передать значение 1. Тогда вообще аргументы не будет возможность испортить вид программы. Правда, не знаю, как show() отреагирует на то, что argv[1] будет ненулевой.
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Olej » 28.06.2016 18:00

MiK13 писал(а):
28.06.2016 17:53
Но, как я понял, getopt() понимает только однобайтовые ключи. И воспринимает последующие байты либо как другой ключ, либо как параметр. А в варианте с длинными именами требует уже в начале "--", что меня не очень устраивает.

Это же просто песня! :laugh:
Вместо стандартного (уже лет 30!) и всем понятного поведения командной строки - городить собственное говно ... "изобретение".
Я бы сказал, что это не только просто песня, а песня - погребальная. :drinks:

P.S. А как вы собираетесь разгребать опции и параметры командной строки, когда они будут записаны впересыпку :black_eye: ???:

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

$ prog -o xxx --eee=xyz xxx.c yyy.o -v -z zzz.bak
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 13463
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Bizdelnick » 28.06.2016 18:24

MiK13 писал(а):
28.06.2016 17:53
как я понял, getopt() понимает только однобайтовые ключи. И воспринимает последующие байты либо как другой ключ, либо как параметр. А в варианте с длинными именами требует уже в начале "--", что меня не очень устраивает.

Используйте getopt_long_only() (если переносимость не важна или есть возможность для её обеспечения линковаться с gnulib).
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

MiK13
Сообщения: 581
ОС: Windows XP

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение MiK13 » 28.06.2016 19:47

Olej писал(а):
28.06.2016 18:00
Вместо стандартного (уже лет 30!) и всем понятного поведения командной строки - городить собственное говно ... "изобретение".
Это как? Зачем менять "стандартное" поведение командной строки?
И как её разбирать? С помощью getopt?
А как с помощью getopt разобрать

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

$ prog -bg red -bg2 green -fg blue

Или для этого нужно использовать getopt_long_only?
Olej писал(а):
28.06.2016 18:00
P.S. А как вы собираетесь разгребать опции и параметры командной строки, когда они будут записаны впересыпку :black_eye: ???:

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

$ prog -o xxx --eee=xyz xxx.c yyy.o -v -z zzz.bak

Всё зависит от того, КАК именно надо это разобрать. Например:

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

for(int i=1;i<argc;i++) {
  if(!strcmp(argv[i],"-o")) { name_o=argv[++i]; continue; }
  if(!strncmp(argv[i],"--eee=",6)) { name_eee=argv[i]+6; continue; }
  if(!strcmp(argv[i],"-v")) { par_v=1; continue; }
  if(!strcmp(argv[i],"-z")) { name_z=argv[++i]; continue; }
  name[n++]=argv[i];
}
Спасибо сказали:

MiK13
Сообщения: 581
ОС: Windows XP

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение MiK13 » 28.06.2016 19:52

Bizdelnick писал(а):
28.06.2016 18:24
Используйте getopt_long_only() (если переносимость не важна или есть возможность для её обеспечения линковаться с gnulib).
Спасибо. попробую разобраться с getopt_long_only()
Пока только getopt() использовал.
А что за gnulib?
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Olej » 28.06.2016 19:54

MiK13 писал(а):
28.06.2016 19:52
А что за gnulib?

не POSIX расширения.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 13463
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Bizdelnick » 28.06.2016 19:55

MiK13 писал(а):
28.06.2016 19:52
что за gnulib?

Если не стоит задачи собираться под систему, где нет glibc, не парьтесь этим вопросом. Как возникнет — вспомните.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Как лучше обрабатывать параметры в программе на FLTK?

Сообщение Olej » 28.06.2016 19:56

MiK13 писал(а):
28.06.2016 19:47
Всё зависит от того, КАК именно надо это разобрать. Например:

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

for(int i=1;i<argc;i++) {
  if(!strcmp(argv[i],"-o")) { name_o=argv[++i]; continue; }
  if(!strncmp(argv[i],"--eee=",6)) { name_eee=argv[i]+6; continue; }
  if(!strcmp(argv[i],"-v")) { par_v=1; continue; }
  if(!strcmp(argv[i],"-z")) { name_z=argv[++i]; continue; }
  name[n++]=argv[i];
}

Вы уж меня извините :unsure: ... но говно остаётся говном независимо от того как его намазывать на хлеб - слева направо, или справа налево. :drinks:
Мне не кажутся привлекательными такие бутерброды.
А вам?
Спасибо сказали:

Вернуться в «Программирование для начинающих»