Home フォーラム AZ-Prologサポート掲示板 assertz使用時に0xc0000005が発生します

  • このトピックには8件の返信、1人の参加者があり、最後にマキにより7年、 6ヶ月前に更新されました。
5件の返信スレッドを表示中
  • 投稿者
    投稿
    • #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 );
        */
      }
      
    • #58215
      マキ
      ゲスト

      失礼しました。文面が非常に読みにくいですね。改行がなくなってしまいまして・・・。

      ビジュアルタブで編集すれば改行できるでしょうか。

      この返信をもって確認させてください。

      改行できていた場合は、追加の返信により再投稿いたします。

    • #58216
      マキ
      ゲスト

      だめでした。何度もすみません。<br />
      htmlタグなら使用可能であるかどうかを確認します。<br>
      <p>段落タグでも使えるなら使います。</p>

      • 最悪でも箇条書きは使えると思いますが・・・
      • #58225
        WEBサイト管理者
        キーマスター

        掲示板不具合ため、お手数おかけいたしました。
        ご報告ありがとうございます。

        こちら、改行できるよう仕様を変更致しましたので今後も宜しくお願いします。

    • #58217
      マキ
      ゲスト

      一旦投稿を諦めます。
      どうしても読みにくい場合にその旨返信いただければ、メールをお送りします。

      申し訳ございませんが、よろしくお願いします。

    • #58233
      稲葉輝
      ゲスト

      マキさま、AZ-Prologをお使いいただきありがとうございます。

      また、貴重な情報感謝します。

      Visual Studio 2015につきましては問題が多く、HPーマニュアルに記載されているように未サポートです。

      対応予定でありますが、当面はVS-2013をお使いいただきますようおねがいします。

      https://www.az-prolog.com/manual/manuals/manual_compiler.html#compiler

      • #58234
        マキ
        ゲスト

        ご回答ありがとうございます。
        申し遅れましたが、Visual Studio 2015 について、未対応である旨は承知しておりました。
        しかし、型推論・ラムダ式にかかる新機能を取り入れたく(かつ、AZ-Prologも活用したく)前述のような環境を模索している次第であります。
        簡単に対応いただけるようならばと軽い気持ちで投稿しましたが、難しそうですね。
        今思えばタイトルの付け方が悪く、ご迷惑をおかけしました。

        現状は2013でコンパイルできないソースがそれなりにあるため、大きく影響しないうちはそっとしておくつもりです。
        対応時にはお知らせいただければ幸いです。よろしくお願い致します。

    • #58558
      稲葉輝
      ゲスト

      大変遅れましたが、2017年3月22日、Version9.61でVS2015,VS2017の対応版をリリースしましたのでお試しください。

      • #58624
        マキ
        ゲスト

        ありがとうございます。確認させていただきます。

5件の返信スレッドを表示中
  • トピック「assertz使用時に0xc0000005が発生します」には新しい返信をつけることはできません。
上部へスクロール