Difference between revisions of "Console Mode Pascal/ru"

From Free Pascal wiki
Jump to navigationJump to search
 
(2 intermediate revisions by the same user not shown)
Line 127: Line 127:
  
 
Пример программы:
 
Пример программы:
 +
<syntaxhighlight  lang="Pascal">
 +
program uniconsole;
 +
 +
{$mode objfpc}{$H+}
 +
{$APPTYPE CONSOLE}
 +
 +
uses
 +
  {$IFDEF UNIX}
 +
    {$IFDEF UseCThreads}
 +
    cthreads,
 +
    {$ENDIF}
 +
  {Диспетчер широких строк, необходимый для поддержки широких строк}
 +
  cwstring,
 +
  {$ENDIF}
 +
  {$IFDEF WINDOWS}
 +
  Windows, {для setconsoleoutputcp}
 +
  {$ENDIF}
 +
  Classes
 +
  ;
 +
 +
var
 +
UTF8TestString: string;
 +
 +
begin
 +
{$IFDEF WINDOWS}
 +
SetConsoleOutputCP(CP_UTF8);
 +
{$ENDIF}
 +
UTF8TestString:= 'rosé, водка and ούζο';
 +
writeln ('plain: ' + UTF8TestString);
 +
{Видимо для этого нам не нужен UTF8ToConsole
 +
Фактически, UTF8ToConsole для меня ничего не сделал.}
 +
end.
 +
</syntaxhighlight>
  
 
== Примеры ==
 
== Примеры ==
  
Можно испытать работу редактора Lasarus, попробовав все примеры из обычной книги по языку Pascal, или написав собственный. Наиболее полезные - те, что выполняют системные команды или запускают другие программы (написанные на Pascal, C или Perl, или сценарии оболочки).
+
Вы можете использовать редактор Lazarus, чтобы опробовать все примеры из стандартных учебников Паскаля, или можете написать свой собственный. Некоторые из наиболее полезных процедур - это процедуры для выполнения системных команд или для запуска других программ (написанных на Паскале, C или Perl, либо в сценариях оболочки или пакетных сценариях).
  
 
=== Выполнение команд оболочки ===
 
=== Выполнение команд оболочки ===
 +
<syntaxhighlight lang="Pascal">
 +
program TryShell;
 +
uses
 +
  Classes, Unix;
 +
var
 +
  S: LongInt;
 +
begin
 +
  S := fpsystem('/bin/ls -la *.p*'); //отображает .pp, .pas, .php, .png и т.д. в текущем каталоге
 +
  WriteLn('Program exited with status : ', S)
 +
end.</syntaxhighlight>
 +
 +
 +
==== Пример: обновить FPC и Lazarus ====
  
Приведен пример для ''Custom Program'' или ''Program'':
+
Могут быть выполнены более сложные команды. Например, если вы уже проверили репозитории SVN для FPC и Lazarus (см. [[Buildfaq]]), вы можете поддерживать свои исходные файлы FPC и Lazarus в актуальном состоянии, извлекая их из репозитория SVN с помощью следующей последовательности вызовов :
  
<pre>
 
Program TryShell;
 
uses classes, unix;
 
var S: longint;
 
begin
 
  S := fpsystem ('/bin/ls -la *.p*'); //lists .pp, .pas, .php, .png etc in current directory
 
  writeln ('Program exited with status : ', S)
 
end.
 
</pre>
 
  
 
=== Пример: корректировка fpc и lazarus ===
 
=== Пример: корректировка fpc и lazarus ===
Line 150: Line 187:
 
Могут выполняться более сложные команды. Например, после посещения хранилища SVN с новейшими версиями FPC и Lazarus (см. [[buildfaq]]) можно иметь исходные версии FPC и Lazarus новейшими, путем взятия из хранилища SVN следующей последовательностью вызовов:
 
Могут выполняться более сложные команды. Например, после посещения хранилища SVN с новейшими версиями FPC и Lazarus (см. [[buildfaq]]) можно иметь исходные версии FPC и Lazarus новейшими, путем взятия из хранилища SVN следующей последовательностью вызовов:
  
<pre>
+
<syntaxhighlight lang="Pascal">
Program LazUpdate;
+
program LazUpdate;
uses classes, unix;
+
uses
var s : longint;
+
  Classes, Unix;
 +
var  
 +
  S: LongInt;
 
begin  
 
begin  
   S := fpsystem ('cd /usr/local/src/fpc/devel/fpc ; make clean');
+
   S := fpsystem('cd /usr/local/src/fpc/devel/fpc       ; make clean');
   S := fpsystem ('cd /usr/local/src/fpc/devel/lazarus ; make clean');
+
   S := fpsystem('cd /usr/local/src/fpc/devel/lazarus ; make clean');
   S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update fpc >& ~/cvscheckout.log');
+
   S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update fpc       >& ~/cvscheckout.log');
   S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update lazarus >& ~/cvslaz.log');
+
   S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update lazarus >& ~/cvslaz.log'       );
end.
+
end.</syntaxhighlight>
</pre>
 
  
Заметьте, что порядок команд
+
Обратите внимание, что выдача команды
  
fpsystem ('cd /somedirectory')
+
<syntaxhighlight lang="Pascal">fpsystem('cd /somedirectory');</syntaxhighlight>
сопровождаемая
+
с последующим
fpsystem ('что-то делающей в этой папке')
+
<syntaxhighlight lang="Pascal">fpsystem ('сделать что-нибудь в этом подкаталоге');</syntaxhighlight>
не сработает, поскольку после каждого вызова функции fpsystem выполняемая программа возвращается в папку, из которой она запускалась; поэтому нужно в строку вызова оболочки ставить множество операторов.
+
не работает, потому что после каждого вызова [[Function | функции]] '''fpsystem()''' выполнение программы возвращается в каталог, в котором она была запущена; поэтому нам нужно включить несколько операторов в каждую строку в наши вызовы оболочки через '''fpsystem()'''. [Скорее так: он всегда начинается.]
  
Конечно, не стоит вводить каждую команду отдельной строкой Pascal; лучше создать сценарий наподобие приведенному ниже (из [[buildfaq]]):
+
Необязательно вводить каждую команду как отдельную строку Паскаля; можно создать файл сценария '''bash''' следующим образом (из [[buildfaq]]):
<pre>
+
<syntaxhighlight lang="bash">
 
#!/bin/sh
 
#!/bin/sh
 
cd /usr/local/src/fpc/devel
 
cd /usr/local/src/fpc/devel
Line 181: Line 219:
 
svn up fpc >& ~/cvscheckout.log
 
svn up fpc >& ~/cvscheckout.log
 
svn up lazarus >& ~/cvslaz.log  
 
svn up lazarus >& ~/cvslaz.log  
</pre>
+
</syntaxhighlight>
  
Его имя - updatelaz.sh, и он вызывается из программы Pascal так:
+
Назовите файл '''updatelaz.sh''', а затем вызовите его из программы на Паскале для его непосредственного выполнения вместо использования '''bash''' следующим образом:
 
+
<syntaxhighlight lang="Pascal">
<pre>
+
(* Это может быть скомпилировано или использовано как скрипт Паскаля. *)
Program LazUpdate1;
+
program LazUpdate1;
uses classes, unix;
+
uses  
var S : longint;  
+
  Classes, Unix;
 +
var  
 +
  S: LongInt;  
 
begin
 
begin
   S := fpsystem ('updatelaz.sh')
+
   S := fpsystem('updatelaz.sh')
end.
+
end.</syntaxhighlight>
</pre>
 
  
 
== Примечание для пользователей Windows ==
 
== Примечание для пользователей Windows ==
 
Традиционно при написании консольных программ в Windows используется кодировка cp866. Если не принять специальных мер, то при написании консольной программы в IDE в консоли вместо русских букв будут выводиться кракозябры. Чтобы получился нормальный русский текст, в окне кода программы нужно нажать правую кнопку мыши и выбрать в контекстном меню "Параметры файла -> Кодировка -> CP866".
 
Традиционно при написании консольных программ в Windows используется кодировка cp866. Если не принять специальных мер, то при написании консольной программы в IDE в консоли вместо русских букв будут выводиться кракозябры. Чтобы получился нормальный русский текст, в окне кода программы нужно нажать правую кнопку мыши и выбрать в контекстном меню "Параметры файла -> Кодировка -> CP866".
  
== Параметры командной строки ==
+
==См.также==
  
См. [[Command line parameters and environment variables]].
+
* [[Command line parameters and environment variables|Параметры командной строки и переменные среды]]
 +
* [[Executing_External_Programs/ru|Выполнение внешних программ]]
 +
* [[Debugger_Console_App| Отладка консольных приложений]]
 +
* [[InstantFPC]]

Latest revision as of 23:06, 21 June 2021

Deutsch (de) English (en) español (es) suomi (fi) magyar (hu) 日本語 (ja) русский (ru) slovenčina (sk)

Программирование в консольном режиме Pascal

Многие из нас писали программы на Паскале задолго до того, как вошли в моду Графический интерфейс пользователя (GUI) и Интегрированные среды разработки (IDE). Многие другие являются новичками в программировании на Pascal, и им необходимо уметь опробовать основные инструменты языка. Третьим нужны консольные приложения или приложения текстового режима для выполнения сложных задач управления системой.

Программирование в консольном режиме без Lazarus

Хотя многие предпочитают использовать Lazarus IDE для написания программ в режиме консоли, вы также можете написать их с помощью любого текстового редактора и скомпилировать их самостоятельно, вызвав компилятор FPC, например так для программы в example.pas:

fpc example.pas

Также доступен текстовый режим IDE fp (немного похожий на старый Turbo Pascal).В следующих разделах мы сосредоточимся на программировании с помощью Lazarus.

Программирование в консольном режиме с помощью Lazarus

Lazarus предоставляет идеальную среду для изучения Паскаля и разработки программ в текстовом режиме. Можно использовать все функции интегрированной среды разработки, включая редактор исходного кода с ее подсветкой синтаксиса, доступом к библиотекам, сложными инструментамиы поиска и завершения кода, а также проверкой синтаксиса. Если вам не нужна Form с ее визуальными компонентами, можно и без нее, но редактор исходного кода Lazarus по-прежнему остается отличной средой для разработки программ. Вы можете компилировать и запускать свою программу во время разработки, не выходя из редактора.

Чтобы запустить программу в режиме консоли, перейдите в главное меню и выберите Project -> New Project(Проект - новый проект), а затем выберите Program(Программа) или Console Application(Консольное приложение). Среда IDE не будет генерировать все дополнительные файлы, связанные с полным графическим приложением, и не откроет окно инспектора объектов, но откроет редактор исходного кода со структурой скелетной программы и будет ожидать ввода вашего программирования.

Light bulb  Примечание: В Windows приложение с графическим интерфейсом пользователя не имеет консоли и, следовательно, не может выполнить writeln или readln. Вы получите ошибку File not open(Файл не открыт). Снимите галочку в разделе Project Options / Compiler Options / Linking / Target specific options / Win32 GUI application(Параметры проекта / Параметры компилятора / Связывание / Частные параметры цели / Приложение Win32 GUI), чтобы создать консольное приложение. Начиная с Lazarus IDE 1.4 она находится в разделе Project(menu) / Project Options / Compiler Options / Config and Target / Target specific options / Win32 GUI application(Проект (меню) / Параметры проекта / Параметры компилятора / Настройка и целевая платформа / Частные параметры цели / Приложение Win32 GUI).
Light bulb  Примечание: Lazarus имеет некоторые функции для программ командной строки, такие как copyfile. Чтобы использовать их, добавьте требование к проекту для LazUtils (Project / Project Inspector / Required Packages --> "Add" --> New Requirement --> choose "LazUtils" --> OK), которое не будет задействовать весь LCL. Затем добавьте соответствующий модуль в раздел uses.

Тип проекта: Console Application (Консольное приложение)

Выбор этого типа проекта в Lazarus создает программу с новым классом, производным от TCustomApplication. TCustomApplication предоставляет много всяких штучек и упрощает программирование утилит командной строки. Например, проверка параметров командной строки, написание справки, проверка переменных окружения и обработка исключений. Все программы LCL используют это автоматически.

Тип проекта: Program (Программа)

В качестве демо мы напишем очень минималистичную программу на Паскале. В среде IDE выберите тип проекта Program(Программа), и пусть среда IDE вам немного поможет. Например, когда вы добавляете еще один модуль, IDE автоматически добавит имя модуля в раздел программы uses. Это поведение определяется в параметрах проекта. Таким образом, вы можете переключаться между 'Program'(Программой) и 'Custom Program'(Пользовательской программой) в любое время.

Пример для начинающих:

program Project1;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes;
begin
  WriteLn('Hello World!');
  ReadLn;
end.

Pascal scripts

Кроме того, можно писать сценарии, которые динамически компилируются с помощью InstantFPC, кроссплатформенного решения для запуска (небольших) программ Pascal в виде сценариев. Шебанг

#!/usr/bin/env instantfpc

позволяет запускать скрипт как отдельную программу.

Light bulb  Примечание: Хотя он используется для запуска сценариев Pascal, InstantFPC использует обычный Object Pascal, а не язык сценариев PascalScript. Таким образом, "PascalScript" и Pascal script - это не одно и то же.

Запуск программы

Компиляция

Когда вы закончите свою программу (или фрагмент программы), вы можете скомпилировать и запустить ее, выбрав Run -> Build(Выполнить -> Сборка)(или Quick Compile(Быстрая компиляция)) в главном меню или щелкнув значок зеленого треугольника («Выполнить») Start.png на панели кнопок. Любые сообщения компилятора (предупреждения, отчеты о ходе выполнения или сообщения об ошибках) появятся в окне сообщения, и, надеюсь, в конечном итоге будет сообщение, которое скажет

'Project "Project1" successfully built. (Проект "Project1" успешно собран.) :).

А где программа-то ?? !!

Если вы еще не сохранили программу, то среда IDE поместит ее во «временный» каталог (например, /tmp в Linux, C:\temp в Windows, см. Environment Options / Files / Directory (Параметры среды / Файлы / Каталог) для собранных тестовых проектов).

Если вы уже сохранили проект, значит, программа была создана в том же каталоге, где вы сохранили файл project1.lpi.

Запуск в консоли

Вы можете запустить программу, перейдя в окно консоли (терминала), затем с помощью cd перейдя в каталог и введя имя программы. В Unix/Linux, если она находится в текущем каталоге, вам придется начать с ./, поскольку программа, вероятно, не будет найдена в PATH.

Пример для Linux/Unix, где программа хранится в /tmp:

cd /tmp 
./Project1

Однако может быть очень неудобно продолжать переходить из редактора Lazarus в окно терминала и обратно. К счастью, есть механизм, позволяющий открывать окно терминала из среды Lazarus.

Запуск в IDE

Во внутренней консоли: показывается в окне вывода терминала.

При перенаправлении вывода.

В главном меню выберите Run -> Run Parameters(Выполнить -> Параметры запуска), затем установите флажок "Use launching application"(Использовать запускаемое приложение). В первый раз, когда вы сделаете это и попробуете последовательность Compile / Run (Собрать / Запустить), вы, вероятно, получите отлуп:

'xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied'.

Если это произошло, вам необходимо изменить права доступа к соответствующему файлу (например, с помощью chmod +x <имя файла> или с помощью утилиты Windows для изменения разрешений); возможно, вам придется сделать это как root. После этого каждый раз, когда вы будете запускать свою программу, будет появляться окно консоли, в котором будут отображаться все ваши текстовые операции ввода-вывода (readln, Writeln и т. Д.).

После того, как ваша программа завершит выполнение, на экране появится сообщение «Нажмите Enter». Таким образом, любой вывод, сгенерированный вашей программой, останется на экране до тех пор, пока вы не прочтете его; после того, как вы нажмете «Enter», окно консоли закроется.

К сожалению, этот метод не позволяет использовать встроенный отладчик.

Запуск в IDE с перенаправлением вывода

Если вы хотите увидеть, что написано в stdout, и также хотите использовать встроенный отладчик, stdout можно перенаправить в файл следующим кодом:

uses
  baseunix; 

var
  OutputFile: text;

begin     
  Assign(OutputFile, 'Output.txt');
  if FileExists(Filename) then begin
    Append(OutputFile);
  end
  else begin
    Rewrite(OutputFile);   { открываем файл для записи, уничтожая содержимое, если таковое имеется }
  end;

  ResultCode := fpdup(OutputFile, output);

  if ResultCode < 0 then begin
    raise Exception.CreateFmt('Обман не удался: %s', [ResultCode]);
  end;
  Close(OutputFile);
end.

Затем файл output.txt можно просмотреть с помощью команды 'tail -f output.txt' или просмотреть с помощью редактора, если 'tail' недоступен в вашей ОС.

В качестве альтернативы, используя Lazarus 0.9.31 или выше (только в Linux): в меню "View"(Вид) в разделе "Debug Windows"(Отладка Windows) есть запись для "console output"(консольный вывод) для просмотра стандартного вывода.

Unicode (UTF8) вывод

Если вы хотите, чтобы ваша программа в режиме консоли отображала вывод Unicode (UTF8) в Windows Vista и более поздних версиях (а также, возможно, в более ранних версиях), вы можете использовать команду SetConsoleOutputCP для задания консоли набор символов UTF8.

Light bulb  Примечание: вам нужно будет убедиться, что шрифт консоли может отображать буквы, которые вы хотите вывести (например, греческий, кириллица, корейский).
Light bulb  Примечание: вам нужно будет включить модуль Windows.

См. Поддержка Unicode LCL для получения более подробной информации о поддержке Unicode в Lazarus и FPC.

Пример программы:

program uniconsole;

{$mode objfpc}{$H+}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
    {$IFDEF UseCThreads}
    cthreads,
    {$ENDIF}
  {Диспетчер широких строк, необходимый для поддержки широких строк}
  cwstring,
  {$ENDIF}
  {$IFDEF WINDOWS}
  Windows, {для setconsoleoutputcp}
  {$ENDIF}
  Classes
  ;

var
UTF8TestString: string;

begin
{$IFDEF WINDOWS}
SetConsoleOutputCP(CP_UTF8);
{$ENDIF}
UTF8TestString:= 'rosé, водка and ούζο';
writeln ('plain: ' + UTF8TestString);
{Видимо для этого нам не нужен UTF8ToConsole
Фактически, UTF8ToConsole для меня ничего не сделал.}
end.

Примеры

Вы можете использовать редактор Lazarus, чтобы опробовать все примеры из стандартных учебников Паскаля, или можете написать свой собственный. Некоторые из наиболее полезных процедур - это процедуры для выполнения системных команд или для запуска других программ (написанных на Паскале, C или Perl, либо в сценариях оболочки или пакетных сценариях).

Выполнение команд оболочки

program TryShell;
uses 
  Classes, Unix;
var 
  S: LongInt;
begin
  S := fpsystem('/bin/ls -la *.p*'); //отображает .pp, .pas, .php, .png и т.д. в текущем каталоге
  WriteLn('Program exited with status : ', S)
end.


Пример: обновить FPC и Lazarus

Могут быть выполнены более сложные команды. Например, если вы уже проверили репозитории SVN для FPC и Lazarus (см. Buildfaq), вы можете поддерживать свои исходные файлы FPC и Lazarus в актуальном состоянии, извлекая их из репозитория SVN с помощью следующей последовательности вызовов :


Пример: корректировка fpc и lazarus

Могут выполняться более сложные команды. Например, после посещения хранилища SVN с новейшими версиями FPC и Lazarus (см. buildfaq) можно иметь исходные версии FPC и Lazarus новейшими, путем взятия из хранилища SVN следующей последовательностью вызовов:

program LazUpdate;
uses
  Classes, Unix;
var 
  S: LongInt;
begin 
  S := fpsystem('cd /usr/local/src/fpc/devel/fpc        ; make clean');
  S := fpsystem('cd /usr/local/src/fpc/devel/lazarus  ; make clean');
  S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update fpc       >& ~/cvscheckout.log');
  S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update lazarus >& ~/cvslaz.log'        );
end.

Обратите внимание, что выдача команды

fpsystem('cd /somedirectory');

с последующим

fpsystem ('сделать что-нибудь в этом подкаталоге');

не работает, потому что после каждого вызова функции fpsystem() выполнение программы возвращается в каталог, в котором она была запущена; поэтому нам нужно включить несколько операторов в каждую строку в наши вызовы оболочки через fpsystem(). [Скорее так: он всегда начинается.]

Необязательно вводить каждую команду как отдельную строку Паскаля; можно создать файл сценария bash следующим образом (из buildfaq):

#!/bin/sh
cd /usr/local/src/fpc/devel
cd fpc
make clean
cd ..
cd lazarus
make clean
cd ..
svn up fpc >& ~/cvscheckout.log
svn up lazarus >& ~/cvslaz.log

Назовите файл updatelaz.sh, а затем вызовите его из программы на Паскале для его непосредственного выполнения вместо использования bash следующим образом:

(* Это может быть скомпилировано или использовано как скрипт Паскаля. *)
program LazUpdate1;
uses 
  Classes, Unix;
var 
  S: LongInt; 
begin
  S := fpsystem('updatelaz.sh')
end.

Примечание для пользователей Windows

Традиционно при написании консольных программ в Windows используется кодировка cp866. Если не принять специальных мер, то при написании консольной программы в IDE в консоли вместо русских букв будут выводиться кракозябры. Чтобы получился нормальный русский текст, в окне кода программы нужно нажать правую кнопку мыши и выбрать в контекстном меню "Параметры файла -> Кодировка -> CP866".

См.также