質問

私は思っていた誰かが、私は、この未処理の例外エラーメッセージを取得することを間違ってやっているものを私に言うことができる場合:

0xC0000005: Access violation reading location 0x0000000c.
私の最初のプロローグコード(fid_t)を指す緑色ポインタで

ここに私のヘッダファイルがあります:

class UserTaskProlog
{
  public:
             UserTaskProlog( ArRobot* r );
             ~UserTaskProlog( );
  protected:
             int cycles;
             char* argv[ 1 ];
             term_t tf;
             term_t tx;
             term_t goal_term;
             functor_t goal_functor;
             ArRobot* robot;
             void logTask( );
};
ここで

そして、私のメインのコードです:

UserTaskProlog::UserTaskProlog( ArRobot* r ) : robot( r ), robotTaskFunc( this, &UserTaskProlog::logTask )
{
  cycles = 0;
  argv[ 0 ] = "libpl.dll";
  argv[ 1 ] = NULL;
  PL_initialise( 1, argv );
  PlCall( "consult( 'myPrologFile.pl' )" );
  robot->addSensorInterpTask( "UserTaskProlog", 50, &robotTaskFunc );
}

UserTaskProlog::~UserTaskProlog( )
{
  robot->remSensorInterpTask( &robotTaskFunc );
}

void UserTaskProlog::logTask( )
{
  cycles++;

  fid_t fid = PL_open_foreign_frame( );

    tf = PL_new_term_ref( );
    PL_put_integer( tf, 5 );
    tx = PL_new_term_ref( );
    goal_term = PL_new_term_ref( );
    goal_functor = PL_new_functor( PL_new_atom( "factorial" ), 2 );
    PL_cons_functor( goal_term, goal_functor, tf, tx );
    int fact;
    if ( PL_call( goal_term, NULL ) )
    {
      PL_get_integer( tx, &fact );
      cout << fact << endl;
    }

  PL_discard_foreign_frame( fid );

}

int main( int argc, char** argv )
{
  ArRobot robot;
  ArArgumentParser argParser( &argc, argv );
  UserTaskProlog talk( &robot );
}

ありがとう、

役に立ちましたか?

解決

ここでこの部分は厄介です。

char** argv;
argv[ 0 ] = "libpl.dll";
argv[ 1 ] = NULL;

argvはダングリングポインタである - ないストレージが割り当てられていません。このように変更します:

char* argv[2];
argv[ 0 ] = "libpl.dll";
argv[ 1 ] = NULL;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top