0

I was wondering if someone could tell me what I am doing wrong that I get this Unhandled Exception error message:

0xC0000005: Access violation reading location 0x0000000c.

with a green pointer pointing at my first Prolog code (fid_t):

Here is my header file:

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( );
};

And here is my main code:

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 );
}

Thank you,

1 Answers1

1

This part here is nasty:

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

argv is a dangling pointer - no storage has been allocated. Change it to this:

char* argv[2];
argv[ 0 ] = "libpl.dll";
argv[ 1 ] = NULL;
Paul R
  • 208,748
  • 37
  • 389
  • 560
  • Thanks Paul. That was a valid point. However, it didn't resolve the situation. I even commented out argv[0]="libpl.dll"; to no avail. I still get the same error message, which apparently points to some null pointer issue... –  Apr 11 '10 at 12:41
  • @Joshua: you should probably edit your question so that it has the latest version of the code (with the argv problem fixed) – Paul R Apr 11 '10 at 19:16
  • The assignment at `argv[ 1 ] = NULL;` means argv should be allocated to at least two elements: `char* argv[2];` – frayser Nov 12 '10 at 00:25
  • @Frayser: good catch - the argv[1] assignment wasn't present in the original question (it got added later) - I've now updated my answer to match the current version of the posted code. – Paul R Nov 12 '10 at 07:57