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
テキストファイルの読み込み
- https://wiki.freepascal.org/File_Handling_In_Pascal にあったサンプルをfpc でオプションを付けずにコンパイル出来るように、AssignFileをAssign、CloseFileをCloseに変換するなどしたもの。
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関係の外部リンク
- Delphi6ローテクTIips
- FDelphi [MES] 電子会議
実行時エラーの検索はどうするの?
実行時に致命的なエラーが発生すると、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で発生した実行時エラーの原因を特定し、効率的にデバッグを行うことができます。