Вопрос

Мне было интересно, может ли кто-то сказать мне, что я делаю не так, что я получаю это необработанное сообщение об ошибке исключений:

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