【Delphi互換!?】FreePascal/Lazarus その2【GPL】

レス数が950を超えています。1000を超えると書き込みができなくなります。
2025/10/07(火) 18:15:23.51ID:PufELU/u
fpcで作成したコンソールアプリが実行時にEAccessViolationとなるのでfpcでソースのエラー位置を調べたら
ある関数の最後のendが示されて役に立ちませんでした
Lazarusに持って行ったら例外で停止さえしませんでした
Delphai6に持って行ってOSによる例外をデバッガが受け取るという設定にしたらやっと発生位置が特定できました

FPC/Lazarusではどうにもならないのでしょうか
Lazurusはちょっと古くて2.2.4です
983デフォルトの名無しさん
垢版 |
2025/10/07(火) 22:35:09.49ID:GcmYQjI+
>>982
プロジェクトオプションの最適化が有効になっているからでは?
「0.最適化なし」にして試してみては?
2025/10/08(水) 09:53:53.24ID:i2Vw4tqm
最適化がオンでもオフでも
Execution stopped with exit-code 1 ($0001)
というポップアップが出て終了してしまいます
エラー位置にカーソルは行ってくれません
デバッガはdefault debuggerでもGdbでも同じです
2025/10/08(水) 10:11:36.23ID:i2Vw4tqm
982で「例外で停止さえしませんでした」というのは嘘でしたstoppedだから停止はしていますね
でもどこで停止したのかがわかりません

fpcでは
fpc -glh -O- とかやってどの関数でエラーが発生したのかまではわかるのですが
986デフォルトの名無しさん
垢版 |
2025/10/08(水) 14:47:25.50ID:xHDBIHkx
fpcそのものからは離れますが
exet code が1でエラーなので例外停止したと読めます

ただコンソールアプリがさまざまな返り値を返すこと自体はエラーでも何でもなく普通のことだと私は理解しています
アプリの終了時に0を返せばいいのでは?

Cだと
int main()
{
printf("hello world");
return 0;
}

エラー位置が特定できないのはそもそもプログラムが終わっているからとも解釈できます。rezarusにexiecode=1のエラーを無視するみたいなのはないのでしょうか?

的外れでしたらすみません
2025/10/08(水) 21:55:59.60ID:i2Vw4tqm
>>986
985 に訂正して書きましたようにLazarusでもエラー停止はしています

デバッガにはエラー位置を特定してもらいたいという話です
Lazarus/FPCではEAccessViolationのエラーについてそれができないようでした
一方Delphi 6では同じソースでEAccessViolationについても停止してからIDE上でカーソルがエラー位置に飛びます
988デフォルトの名無しさん
垢版 |
2025/10/09(木) 07:09:23.25ID:l11UH+Dz
どうもお役に立てなかったようです
2025/10/12(日) 17:55:59.44ID:E5GJpTM9
987です
前回のプログラムは開発途中でもう残っていないのですが、EAccessViolationが発生する単純なプログラムで
今日改めてテストして見ました所Lazarus/FPCとも正しくエラー行を表示してくれました
お騒がせしてすみませんでした
前回は一体何だったのだろうか・・・

{$APPTYPE CONSOLE}
program test;
uses SysUtils;
var
 p: PInteger;
begin
 Writeln('Start');
 p := nil;
 p^ := 123;
 Readln
end.
990デフォルトの名無しさん
垢版 |
2025/10/13(月) 09:39:19.36ID:Jdg3EAgT
コンソールアプリの返り値が1なのでエラーだったと思いますが
書き込まれたソースですと返り値が指定されていません
よって返り値は不定なのでその度に結果が異なると解釈できないことはありません。
なので返り値を明示的に指定してその結果を比較されていかがでしょうか? 
 
以下はgrokに聞きました

Q)pascal(free pascal)を使用して、windows(dos)上で動作するコンソールアプリを作成します
そのコンソールアプリの返り値を指定するにはどうしたらいいですか

A) by grok
Free Pascalでは、プログラムの終了コードをHalt手続きやExitCode変数を使用して設定できます。以下に具体的な手順とサンプルコードを示します。

<<sample1>>
program ExitCodeDemo;
begin
WriteLn('プログラムが正常に終了しました');
Halt(0); // 終了コード 0 を返す
end.

<<sample2>>
program ExitCodeDemo;
begin
WriteLn('プログラムが実行中...');
ExitCode := 42; // 終了コード 42 を返す
end.
2025/10/14(火) 19:14:39.90ID:QTjOk1jf
>>990
989ですが、今となっては当初デバッガが動作しなかった理由はわかりません
その後簡単なテストプログラムで問題なくエラー行は検知されました
ちなみにFree Pascalのプログラムではエラーの時に返り値を設定する以外に特に返り値の指定は不要で、
正常終了すればゼロになります
992デフォルトの名無しさん
垢版 |
2025/11/12(水) 01:21:59.39ID:oQstHhSD
Lazarus 4.4が出ました
https://forum.lazarus.freepascal.org/index.php/topic,72707.0.html
2025/11/12(水) 09:15:18.55ID:JDphJLx0
バージョンアップする必要性を感じなくなって2.2.4のまま使っている
fpcはunicode不完全対応の3.2.2でずっと変わらないし過去作成したプログラムを修正する必要が発生するかもしれないのもいやだしね
レスを投稿する

レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況