LINUX.ORG.RU

[Pascal] Как нормально реализовать аргументы в паскале?

 


0

1

Приходится потихоньку изучать паскаль. Недавно начал осваивать аргументы для программ. Нагуглил, нашел что-то по функциям paramcount и paramstr. Но как я не бьюсь не могу организовать аргументы. case видимо такое нечто как '--help': не понимает, ему цифры подавай. Это значит программе, надо цифрами аргументы давать?
Подскажите, как прикрутить к ней аргументы, вроде "--help", "-h" и подобных

★★★★
Ответ на: комментарий от nexfwall
calc_fibonacci.pas(63,15) Error: Identifier not found "hasoption"
calc_fibonacci.pas(68,15) Error: Identifier not found "hasoption"
calc_fibonacci.pas(71,32) Error: Identifier not found "getoptionvalue"
calc_fibonacci.pas(74,15) Error: Identifier not found "hasoption"
calc_fibonacci.pas(77,32) Error: Identifier not found "getoptionvalue"
calc_fibonacci.pas(120,14) Error: Variable identifier expected
calc_fibonacci.pas(121,14) Error: Variable identifier expected
calc_fibonacci.pas(122,9) Error: Variable identifier expected
calc_fibonacci.pas(129) Fatal: There were 8 errors compiling module, stopping

Мне уже хоть кто-нибудь скажет, что за модуль с getoptionvalue и hasoption, что описаны здесь

nexfwall ★★★★
() автор топика

Зачем усложнять жизнь библиотеками и использовать непременно case?

var
  n : Integer;
begin
  for n := 1 to MAX do
    begin
      {$I args} // if paramstr(n) = 'X' or 'Y' then Z; 
    end
end.
[/quote]
а в файлике args уже спокойно и красиво пишешь проверки.

chinarulezzz ★★
()
Ответ на: комментарий от nexfwall

case умеет только целые значения. Увы. Рекомендую глянуть ассемблерный код или хотя бы разобраться в принципе работы case.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от AlexCones

Я уже все перепробовал: «uses CRT,sysutils,getopts,unix,baseunix,linux,custapp;» сейчас. Но все равно:

Free Pascal Compiler version 2.4.0 [2010/05/05] for i386
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Linux for i386
Compiling calc_fibonacci.pas
calc_fibonacci.pas(63,15) Error: Identifier not found "hasoption"
calc_fibonacci.pas(68,15) Error: Identifier not found "hasoption"
calc_fibonacci.pas(71,32) Error: Identifier not found "getoptionvalue"
calc_fibonacci.pas(74,15) Error: Identifier not found "hasoption"
calc_fibonacci.pas(77,32) Error: Identifier not found "getoptionvalue"
calc_fibonacci.pas(120,14) Error: Variable identifier expected
calc_fibonacci.pas(121,14) Error: Variable identifier expected
calc_fibonacci.pas(122,9) Error: Variable identifier expected
calc_fibonacci.pas(129) Fatal: There were 8 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)

nexfwall ★★★★
() автор топика
Ответ на: комментарий от chinarulezzz

Проклятые урановые рудники^UКурсачи на паскале, АРМы на FoxPro, ракетные шахты, проекты с унаследованными велосипедолибами на паскале (теперь кроссплатформенном и многопоточном, но криво портированном)...

slackwarrior ★★★★★
()
Ответ на: комментарий от nexfwall

getopts, легко и понятно:

program testopt;

{ Program to depmonstrate the getopts function. }

{
  Valid calls to this program are
  optex --verbose --add me --delete you
  optex --append --create child
  optex -ab -c me -d you
  and so on
}
uses getopts;

var c : char;
    optionindex : Longint;
    theopts : array[1..7] of TOption;

begin
  with theopts[1] do
   begin
    name:='add';
    has_arg:=1;
    flag:=nil;
    value:=#0;
  end;
  with theopts[2] do
   begin
    name:='append';
    has_arg:=0;
    flag:=nil;
    value:=#0;
  end;
  with theopts[3] do
   begin
    name:='delete';
    has_arg:=1;
    flag:=nil;
    value:=#0;
  end;
  with theopts[4] do
   begin
    name:='verbose';
    has_arg:=0;
    flag:=nil;
    value:=#0;
  end;
  with theopts[5] do
   begin
    name:='create';
    has_arg:=1;
    flag:=nil;
    value:='c'
  end;
  with theopts[6] do
   begin
    name:='file';
    has_arg:=1;
    flag:=nil;
    value:=#0;
  end;
  with theopts[7] do
   begin
    name:='';
    has_arg:=0;
    flag:=nil;
  end;
  c:=#0;
  repeat
    c:=getlongopts('abc:d:012',@theopts[1],optionindex);
    case c of
      '1','2','3','4','5','6','7','8','9' :
        begin
        writeln ('Got optind : ',c)
        end;
      #0 : begin
           write ('Long option : ',theopts[optionindex].name);
           if theopts[optionindex].has_arg>0 then
             writeln (' With value  : ',optarg)
           else
             writeln
           end;
      'a' : writeln ('Option a.');
      'b' : writeln ('Option b.');
      'c' : writeln ('Option c : ', optarg);
      'd' : writeln ('Option d : ', optarg);
      '?',':' : writeln ('Error with opt : ',optopt);
   end; { case }
until c=endofoptions;
if optind<=paramcount then
    begin
    write ('Non options : ');
    while optind<=paramcount do
      begin
      write (paramstr(optind),' ');
      inc(optind)
      end;
    writeln
    end
end.

chinarulezzz ★★
()

хз, может лучше и правда закопать до конца это чудище?

nexfwall ★★★★
() автор топика
Ответ на: комментарий от chinarulezzz

У меня компилятор ругается что не знает никаких getoptionvalue, и hasoption. и я не знаю что с этим делать

nexfwall ★★★★
() автор топика
Ответ на: комментарий от nexfwall
{$mode objfpc}{$H+}
uses
  custapp;
type

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
  end;

procedure TMyApplication.DoRun;
begin
  Terminate;
end;

var
  Application : TMyApplication;

begin
  Application := TMyApplication.Create(nil);
  Application.Run;

  if Application.HasOption('h', 'help') then writeln('Hello');

  Application.Free;
end.

Все работает если включать мозг. Просто оставь паскаль. Не для тебя он.

chinarulezzz ★★
()
Ответ на: комментарий от slackwarrior

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

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

ОК. Согласен, с bash у меня все быстрее и проще получалось.
Только вот интересно, мне ведь скоро(если перейду на 2 курс) изучать C++ или C. Вот скажите, там все так-же странно, или проще?

nexfwall ★★★★
() автор топика
Ответ на: комментарий от korvin_

>да конечно свой мотороллер лучше

да. Не веришь - посмотри на код того же getopts или не дай боже залезь в класс TCustomApplication.
Если класс используется в проекте в другом коде - то да, имеет смысл его использовать вместо своего велосипеда. Если нет - зачем лишняя абстракция?

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

И да, почему я ленивый идиот? В том вики не было указано, что надо использовать:

type

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
  end;

procedure TMyApplication.DoRun;
begin
  Terminate;
end;
Да и то, тут используются классы(а что это такое? название знаю, а что это такое нет), и уже объектно-ориентированный паскаль, как я вижу.

nexfwall ★★★★
() автор топика
Ответ на: комментарий от nexfwall

Вот скажите, там все так-же странно, или проще?

int getWinner() 
{
  int i(0),*d(&field[0][0]),*n(&field[0][2]);
  while(i-3){int*r(&field[i][0]),*c(&field[0][i++]);
  if((*r)&&(*r++==*r)&&(*r++==*r))return*r;
  if((*c)&&(*c==*(c+3))&&(*c==*(c+6)))return*c;}
  return (*d)&&(*d==*(d+4))&&(*d==*(d+8))?*d:
  ((*n)&&(*n==*(n+2))&&(*n==*(n+4))?*n:0);
}

бгг)

chinarulezzz ★★
()
Ответ на: комментарий от nexfwall

>И да, почему я ленивый идиот?

потому что я нашел решение а ты нет. Достаточное доказательство? xD

Да и то, тут используются классы(а что это такое? название знаю, а что это такое нет), и уже объектно-ориентированный паскаль, как я вижу.


и что? Объектный паскаль. Претензии?

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

О, это уже не так странно! Тут я уже хоть что-то понимаю
korvin_: Можешь давать лопату :3

nexfwall ★★★★
() автор топика
Ответ на: комментарий от chinarulezzz

Я объектный паскаль не проходил даже в колледже еще, и смотрю еще долго не буду

nexfwall ★★★★
() автор топика
Ответ на: комментарий от AlexCones

>Case может обслужить только перечислимые типы и char (который по сути есть byte).

Это ты с каким-то другим языком перепутал, в паскале строки в case работают.

madcore ★★★★★
()
Ответ на: комментарий от madcore

У меня оно все равно ругалось почему-то. Даже если поместить названия ключей в константы

nexfwall ★★★★
() автор топика
Ответ на: комментарий от nexfwall

>уже все перепробовал: «uses CRT,sysutils,getopts,unix,baseunix,linux,custapp;»

О, хоспади. Де ж вы такие ниасиляторы беретесь. Прямым текстом написано же по ссылке:

The unit custapp that comes with FPC provides the TCustomApplication class, which provides functions to easily check and read parameters.

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

dikiy ★★☆☆☆
()
Ответ на: комментарий от nexfwall

>Да и то, тут используются классы(а что это такое? название знаю, а что это такое нет), и уже объектно-ориентированный паскаль, как я вижу.

не хочешь объектного, юзай

uses getopts

ссылку уже давал.

dikiy ★★☆☆☆
()
Ответ на: комментарий от nexfwall

>Я классы еще не проходил. Да и пока тебя не было, решили закопать в пользу C

Ооо. откапывай обратно. В С тебя ожидает вообще ни с чем не сравнимый секс со строками.

dikiy ★★☆☆☆
()
Ответ на: комментарий от nexfwall

>изучать C++ или C. Вот скажите, там все так-же странно, или проще?

«Изучать» в каком объеме? велосипедопарсеры-то? Аналогично, если не хуже. На С некоторые любят мозголомные свичи посимвольно в циклах. На плюсах кто с шаблонами связался и полюбил это дело - вообще могут моск взорвать.

slackwarrior ★★★★★
()
Ответ на: комментарий от dikiy

А классы мне тоже определенно рано, потому что я даже из матчасти по классам ничего не понимаю. «Объекты, над которыми можно прозводить действия» я пока игры быдлокодить не собираюсь.

nexfwall ★★★★
() автор топика
Ответ на: комментарий от nexfwall

>Да и пока тебя не было, решили закопать в пользу C

Абассаца! Ниасилятор паскаля лезет в С. За тобой уже выехали * и & :)

Attila ★★
()
Ответ на: комментарий от slackwarrior

Так я вообще скоро заброшу программирование, и пойду убьюсь апстену, с такими то постами

nexfwall ★★★★
() автор топика
Ответ на: комментарий от nexfwall

>А классы мне тоже определенно рано, потому что я даже из матчасти по классам ничего не понимаю.

ну так я и сказал. Юзай uses getopts. Там никаких классов нет.

dikiy ★★☆☆☆
()
Ответ на: комментарий от nexfwall

>«Объекты, над которыми можно прозводить действия» я пока игры быдлокодить не собираюсь.

А какая связь? Быдлокодить игры на любом языке можно.

slackwarrior ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.