Home › フォーラム › AZ-Prologサポート掲示板 › assertz使用時に0xc0000005が発生します
- このトピックには8件の返信、1人の参加者があり、最後にマキにより7年、 5ヶ月前に更新されました。
-
投稿者投稿
-
-
2016/04/16 4:11 AM #58214マキゲスト
はじめまして、お世話になります。
AZ-Prolog ver9 for Windows をインストールし、
azp.libを Visual Studio 2015 (C++) で個人開発中のアプリにリンクして使用しています。以下の問題が発生しており、心あたりの範囲で原因を記載しました。
azp.libを Visual Studio 2015 で再コンパイルしていただければ解決するような気がしております。
まずはご検討ください。必要があれば何卒対応をお願いします。■事象
assertzの実行時に、メモリアクセス違反を示す0xc0000005が発生することを確認しました。
このエラーは一回の実行では発生せず、Prolog起動時に設定したヒープメモリがなくなり次第発生しているように見えます
(「■(参考)使用箇所の抜粋」で1024と設定したヒープオプション値を10倍にすると、10倍の回数分だけassertzが成功します)。■原因(検証手段がなく、断定には至っていません)
結果的にはabolishによるヒープ解放がうまくいっていないと思われます。
しかし、abolishコマンドを引数としたaz_execの返却値が1であることから、使用方法に問題があるとは考えていません。
以前 ver7 & Visual Studio 2013 の組み合わせで同じく使用した際には問題が発生しなかったということもあり、
ver9 & Visual Studio 2015 の連携に根本原因があることを疑っています。※Visual Studio 2015 では標準関数のリファクタリングが実施されており、azp.lib をリンクするためには、以下の追加手順が必要でした。
①legacy_stdio_definitions.libを追加リンクすること
②extern “C” { FILE __iob_func[ 3 ] = { *stdin, *stdout, *stderr }; } を定義すること
マイクロソフトの情報では②が伏せられていて、静的ライブラリは最新環境で再コンパイルすることが推奨されています。
https://msdn.microsoft.com/ja-jp/library/bb531344.aspx■ひとまずエラーを回避する方法
・一連の試行ごとに、Prologを再起動する
運用的な回避方法です。オーバーヘッドは大きいですが、この方法しか発見できていません。
起動時にヒープ容量を調節して何サイクルかごとに再起動するのは安全ではないでしょうから、試していません。■(参考)使用箇所の抜粋
#pragma comment(lib,"legacy_stdio_definitions.lib") #pragma comment(lib,"azp.lib") extern "C" { extern int az_init(int argc, char **argv); } extern "C" { extern int az_end(void); } extern "C" { extern int az_exec_unify(char *args, int n, ...); } extern "C" { extern int az_exec(char *goal); } extern "C" { FILE __iob_func[ 3 ] = { *stdin, *stdout, *stderr }; } // Prolog起動 int argcp = 3; char* argvp[] = { "calibration", "-h", "1024" }; char program[] = "['20160413.pl']"; ASSERT( az_init( argcp, argvp ) == 1 ); ASSERT( az_exec( program ) == 1 ); // 全体の繰り返しを何回か実行していると、assertzの実行時にエラーとなります。 while (...) { // assertz実行 while (...) { char goal[ 128 ]; sprintf_s( goal, "assertz(plot(%d,%d))", plot->x(), plot->y() ); ASSERT( az_exec( goal ) == 1 ); } // 目的クエリの実行 char retVar1[ 256 ]; char retVar2[ 256 ]; char retVar3[ 256 ]; char retVar4[ 256 ]; sprintf_s( goal, "query(%d,%d,A,B,C,D,E)", data->x(), data->y() ); if ( az_exec_unify( goal, 4, retVar1, retVar2, retVar3, retVar4 ) ) { ... } else { ... } // abolish実行 sprintf_s( goal, "abolish(plot,2)" ); ASSERT( az_exec( goal ) == 1 ); // Prolog再起動 /* ASSERT( az_end() == 1 ); ASSERT( az_init( argcp, argvp ) == 1 ); ASSERT( az_exec( program ) == 1 ); */ }
-
2016/04/16 4:25 AM #58215マキゲスト
失礼しました。文面が非常に読みにくいですね。改行がなくなってしまいまして・・・。
ビジュアルタブで編集すれば改行できるでしょうか。
この返信をもって確認させてください。
改行できていた場合は、追加の返信により再投稿いたします。
-
2016/04/16 4:35 AM #58216マキゲスト
だめでした。何度もすみません。<br />
htmlタグなら使用可能であるかどうかを確認します。<br>
<p>段落タグでも使えるなら使います。</p>- 最悪でも箇条書きは使えると思いますが・・・
-
2016/04/16 4:47 AM #58217マキゲスト
一旦投稿を諦めます。
どうしても読みにくい場合にその旨返信いただければ、メールをお送りします。申し訳ございませんが、よろしくお願いします。
-
2016/04/21 10:02 AM #58233稲葉輝ゲスト
マキさま、AZ-Prologをお使いいただきありがとうございます。
また、貴重な情報感謝します。
Visual Studio 2015につきましては問題が多く、HPーマニュアルに記載されているように未サポートです。
対応予定でありますが、当面はVS-2013をお使いいただきますようおねがいします。
https://www.az-prolog.com/manual/manuals/manual_compiler.html#compiler
-
2016/04/21 5:09 PM #58234マキゲスト
ご回答ありがとうございます。
申し遅れましたが、Visual Studio 2015 について、未対応である旨は承知しておりました。
しかし、型推論・ラムダ式にかかる新機能を取り入れたく(かつ、AZ-Prologも活用したく)前述のような環境を模索している次第であります。
簡単に対応いただけるようならばと軽い気持ちで投稿しましたが、難しそうですね。
今思えばタイトルの付け方が悪く、ご迷惑をおかけしました。現状は2013でコンパイルできないソースがそれなりにあるため、大きく影響しないうちはそっとしておくつもりです。
対応時にはお知らせいただければ幸いです。よろしくお願い致します。
-
-
2017/04/05 1:18 PM #58558稲葉輝ゲスト
大変遅れましたが、2017年3月22日、Version9.61でVS2015,VS2017の対応版をリリースしましたのでお試しください。
-
2017/06/20 10:51 PM #58624マキゲスト
ありがとうございます。確認させていただきます。
-
-
-
投稿者投稿
- トピック「assertz使用時に0xc0000005が発生します」には新しい返信をつけることはできません。