Free Pascal

  • Delphi,Turbo Pascal系の言語を

WEBサイト

公式HP

Free Pascal Wiki

仕様等

変数:レコード型

変数:一次元配列


参考URL

コンソールモードPascalプログラミング

https://wiki.freepascal.org/Console_Mode_Pascal/ja

計算機数学 –Pascalプログラミング– - 上越教育大学

https://www.juen.ac.jp/math/nakagawa/computer.pdf


テストプログラム

実行時のコマンドラインパラメータ(文字)を取得、表示

  • 2021-09-18
program cmdParamTest;
 
var
        i: integer;
 
begin
        for i := 0 to ParamCount do begin
                Write(i);
                Write(' : ');
                WriteLn(ParamStr(I));
        end;
end.
  • ParamCountで

上記ソースをcmd.pas 等で保存し、

fpc cmd.pas

として、実行形式、cmdが作成される。
実行結果は以下のような感じです。

$ ./cmd aaaa bbb dddd
0 : /home/isao/free_pascal/cmd
1 : aaaa
2 : bbb
3 : dddd

テキストファイルの読み込み

program ReadFile;
 
uses
 Sysutils;
 
const
  C_FNAME = 'textfile.txt';
 
var
  tfIn: TextFile;
  s: string;
 
begin
  // Give some feedback
  writeln('Reading the contents of file: ', C_FNAME);
  writeln('=========================================');
 
  // Set the name of the file that will be read
  //AssignFile(tfIn, C_FNAME);
  Assign(tfIn, C_FNAME);
 
  // Embed the file handling in a try/except block to handle errors gracefully
//  try
    // Open the file for reading
    reset(tfIn);
 
    // Keep reading lines until the end of the file is reached
    while not eof(tfIn) do
    begin
      readln(tfIn, s);
      writeln(s);
    end;
 
    // Done so close the file
    //CloseFile(tfIn);
    Close(tfIn);
 
//  except
//    on E: EInOutError do
//     writeln('File handling error occurred. Details: ', E.Message);
//  end;
 
  // Wait for the user to end the program
  writeln('=========================================');
  writeln('File ', C_FNAME, ' was probably read. Press enter to stop.');
  readln;
end.


DelphiのプログラムのWEB化

 計算条件をテキストボックスに入力し、実行ボタンをクリックすると計算結果を表示するような簡単なDelphiのプログラムをWEB化する場合は、PHPでHTMLを生成してFORMタグを用いた画面を作成し、POSTで入力内容を値を渡すようなCGIプログラムを作成し、その際に入力内容をPHPなどのシェル実行関数でFreePascalのコマンドを実行し内容を受け取れば、Delphiの計算方法のプログラムコードをある程度生かしてDelphiプログラムをWEBアプリへすることができます。出来るといってもそれほど複雑でない場合になります。結果でグラフ作成などがある場合などはJavaScriptなどのフリーのグラフ作成ライブラリを組み合わせると出来ることも増えます。

 FreePascalはUbuntu22.04LTSなどで比較的容易に導入できます。Ubuntu22.04LTSのServer版でも同様です。VPSで利用可能なOSの一つになっている事が多い。


Delphi関係の外部リンク


実行時エラーの検索はどうするの?

 実行時に致命的なエラーが発生すると、16進数表記らしい形式の情報とエラーメッセージを表示してくれます。私が情報を探せないのですが、この16進数表示はエラーが起きた場所のソースコードでの位置を特定出来る情報だと思っています。もう20年以上前に使ったことがあるTurboPascalシリーズでは、コマンドラインオプションで16進数表記などから該当ソースコードの位置を示していた。まだ後で情報を探してみようと思っていますが、FreePascalで実行時のエラー表示の情報からソースコードの位置を調べる方法をご存知でしたら教えてください。(2025-02-25)

Geminiに聞いてみた

Free Pascalで実行時エラーが発生した際に、16進数で表示される情報からソースコード上の該当箇所を特定する方法はいくつかあります。以下に、一般的な手法とコンパイル時の設定について説明します。(2025-02-27)

1. デバッグ情報の利用

Free Pascalコンパイラは、デバッグ情報を生成するオプションを提供しています。この情報を利用することで、実行時のアドレスとソースコードの対応関係を把握できます。

  • コンパイルオプション:
    • -g または -godwarf:DWARF形式のデバッグ情報を生成します。GDBなどのデバッガで利用可能です。
    • -gl:行番号情報を生成します。アドレスから行番号へのマッピングに役立ちます。

例:fpc -g myprogram.pas

これらのオプションを付けてコンパイルすると、実行ファイルにデバッグ情報が埋め込まれます。

  • デバッガの利用:
    • GDB(GNU Debugger)などのデバッガを使用すると、実行時のアドレスとソースコードの対応関係を調べることができます。
    • GDBで実行ファイルをロードし、エラーが発生したアドレスにブレークポイントを設定することで、その時点のソースコードを確認できます。

2. マップファイルの利用

コンパイラは、シンボルとアドレスの対応関係を示すマップファイルを生成できます。このファイルを手動で解析することで、エラーが発生したアドレスに対応するシンボル(関数名など)を特定できます。

  • コンパイルオプション:
    • -Wm<マップファイル名>.map:マップファイルを生成します。

例:fpc -Wmmyprogram.map myprogram.pas

生成されたマップファイルをテキストエディタで開き、エラーメッセージに表示されたアドレスを検索します。そのアドレスに対応するシンボルが表示されていれば、エラーが発生した関数を特定できます。

3. Address To Line Translation (addr2line)ツールの利用

addr2lineツールを使用すると、実行時のアドレスからソースコードのファイル名と行番号を特定できます。

  • addr2lineの利用:
    • addr2line -e <実行ファイル名> <アドレス>

例:addr2line -e myprogram 0x400100

addr2lineは、実行ファイルに埋め込まれたデバッグ情報(-gオプションで生成)を利用して、アドレスからソースコードの場所を特定します。

エラーメッセージの解析

Free Pascalの実行時エラーメッセージには、エラーの種類や発生したアドレスなどの情報が含まれています。

  • エラーの種類:
    • アクセス違反、算術エラー、範囲エラーなど、エラーの種類を確認します。
  • 発生したアドレス:
    • 16進数で表示されたアドレスをメモしておきます。

これらの情報を組み合わせて、上記の方法でソースコード上の該当箇所を特定します。

注意点

  • 最適化オプション(-O)を付けてコンパイルすると、デバッグ情報が正確でなくなる場合があります。デバッグ時には最適化を無効にするか、最適化レベルを調整してください。
  • 動的リンクライブラリ(DLL)を使用している場合、エラーがDLL内で発生している可能性があります。この場合、DLLのデバッグ情報も必要になります。

これらの情報を活用することで、Free Pascalで発生した実行時エラーの原因を特定し、効率的にデバッグを行うことができます。