LinuxForum.Fans
Тема

Реализация команд ksh на Pascal

Автор: u____________16 44 сообщений 7579 просмотров 🔒 закрыта
#350656
"bormant" написал:
А можно хотя бы один пример,

У меня это было на бывшей работе, несколько лет назад. Доступа к тем исходникам, к сожалению, не имею. Помню, что выражение было достаточно сложным, с использованием разныъ типов переменных, в т.ч. и булевых.

P.S. Может, это был просто сбой компилятора, не исключаю. Но именно скобки исправили ситуацию.

#350989

rizado, bormant, я нашла вот такие коды по копированию и удалению файлов.

Показать
text
function CommandByName(name: string):TCommand;
var i: integer;
begin
for i:=0 to Length(Commands)-1 do
if Commands[i].name = name then
begin
Result := Commands[i];
Exit;
end;
result := Commands[14];
end;

cp

procedure CopyCmd(const Params: CmdParams; ParamCnt: integer; var ResStr: string; UseSock: TSocket;const Addr: SockAddr_In; var Client: TReadData); var defcnt: integer; var FileName: string; begin try defcnt := CommandByName('cp').num_params; if ParamCnt < defcnt then ResStr := 'Not enought parameters' else begin FileName := ''; ARet(Params[0],FileName); if pos(':',FileName)=0 then FileName:=sCurrDir+FileName; ACopy(Params[0],FileName); FileName := ''; ARet(Params[1],FileName); if pos(':',FileName)=0 then FileName:=sCurrDir+FileName; ACopy(Params[1],FileName); CopyFile(Params[0],Params[1],false); ResStr := 'OK'; end; except ResStr := 'No such file or other error'; end; end;

DEL

procedure DelCmd(const Params: CmdParams; ParamCnt: integer; var ResStr: string); var filename: string; begin if ParamCnt < CommandByName('del').num_params then ResStr := 'Not enought parameters' else begin ARet(Params[0],FileName); if pos(':',FileName)=0 then FileName:=sCurrDir+FileName; ACopy(Params[0],FileName); deletefile(Params[0]); ResStr := 'OK'; end; end;

но у меня не получается по аналогии дописать их в имеющийся код...:( не поможете?

#350991

Юлия Крамар, прошу повторно: оформляйте код отступами, а то он у вас нечитаемый. В сети полно примеров.
Хотя бы так (на примере приведённого вами фрагмента кода):

text
function CommandByName(name: string): TCommand;
var
  i: integer;
begin
  for i := 0 to Length(Commands) - 1 do
    if Commands[i].name = name then begin
      Result := Commands[i];
      Exit;
    end;
  result := Commands[14];
end;

И не экономьте на пробелах :) .

#350992

rizado, Хорошо :) Не буду ;) Так пойдёт?

Показать
text
function CommandByName(name: string):TCommand;
var i: integer;
 begin
  for i:=0 to Length(Commands)-1 do
   if Commands[i].name = name then
    begin
      Result := Commands[i];
      Exit;
    end;
   result := Commands[14];
 end;

cp

procedure CopyCmd(const Params: CmdParams; ParamCnt: integer; var ResStr: string; UseSock: TSocket;const Addr: SockAddr_In; var Client: TReadData); var defcnt: integer; var FileName: string; begin try defcnt := CommandByName('cp').num_params; if ParamCnt < defcnt then ResStr := 'Not enought parameters' else begin FileName := ''; ARet(Params[0],FileName); if pos(':',FileName)=0 then FileName:=sCurrDir+FileName; ACopy(Params[0],FileName); FileName := ''; ARet(Params[1],FileName); if pos(':',FileName)=0 then FileName:=sCurrDir+FileName; ACopy(Params[1],FileName); CopyFile(Params[0],Params[1],false); ResStr := 'OK'; end; except ResStr := 'No such file or other error'; end; end;

DEL

procedure DelCmd(const Params: CmdParams; ParamCnt: integer; var ResStr: string); var filename: string; begin if ParamCnt < CommandByName('del').num_params then ResStr := 'Not enought parameters' else begin ARet(Params[0],FileName); if pos(':',FileName)=0 then FileName:=sCurrDir+FileName; ACopy(Params[0],FileName); deletefile(Params[0]); ResStr := 'OK'; end; end;

Люди добрые ну помогите мне пожалуйста!Переменные разные и я путаюсь...не получается написать...

#350994

Чтобы не путаться в переменных, нужно:
1) делать комментарии;
и 2) использовать нормальный "программистский" редактор кода или даже целую IDE (Integrated Development Envirinment).

#350995

yars, насчёт п. 2 могу поспорить с тобой. Это от опыта зависит. При желании код и в GEdit форматирвоать можно идеально.

#350996

yars, я бы написала комментарии..и разобралась,но там переменные замудренные какие-то..лично для меня.

#350997

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

#350998

Юлия Крамар, я бы вам советовал всё же попробовать начать писать с нуля, так как часто "доводить до ума" чужой код сложнее, чем написать собственный аналог. Заодно и новых знаний больше получите. И определитесь со средой программирования. Консольная программа в Lazarus?

Для начала надо чётко поставить задачу. Вам, как я понимаю, нужна программная эмуляция выполнения ряда команд Unix/Linux (рекомендовал бы добавить ещё "exit" для выхода из программы). Можно начать с простого и постепенно добавлять функционал.

Для начала предлагаю начать более простой вариант: выводить приглашегние командной строки и ждать ввода команды. Распознавать введённую и отвечать сообщением типа "выведена команда копирования/создания файла" или "команда не распознана". Сразу обрабатываем команду "exit". Кроме этого, сразу стОит предусмотреть ввод параметров для команды, хотя на первых порах их можно не обрабатывать, а просто выделять команду из всей строки.

Подсказку по выделению команды дать?

#351000

rizado, нет я пишу на паскале...не в лазарусе. С нуля мне сложнее я хочу разобраться с основными командами,как их писать,а потом уже самостоятельно(с нуля) написать реализацию других команд.
А на счет exit он есть в данной программе. Я запускаю ввожу exit и осуществляется выход.

#351002

Юлия Крамар, в какой именно среде? Их же есть несколько реализаций.

#351004

rizado, может вы мне поможете отладить код...где что неправильно?..пожалуйста...

#351010
"Юлия Крамар" написал:
rizado, Turdo Pascal

Ещё скажите, что под Windows... Или в DosBox запускаете?

"Юлия Крамар" написал:
может вы мне поможете отладить код...где что неправильно?

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

#351011

rizado, да в DOSBox запускаю,а что?

#351012

rizado, ну вот для вас проще и быстрее с нуля...а у меня не получается

#351013

Юлия Крамар, да Lazarus позволяет консольные программы делать. А то получается, что вы под Linux пишете Windows-программу, эмулирующую выполнение Linux-команд. Зачем такие извращения?

#351014

Потому что нам так говорят работать...пока так...

#351015

rizado, кроме паскаля мы ничего не изучали еще

#351016

Юлия Крамар, вы не поняли. Используйте Lazarus, в нём есть возможность создания консольных приложений. Просто используйте родную для Linux среду разработки.

Войдите или зарегистрируйтесь, чтобы ответить.