2010-04-10 12 views
0

Je me demandais si quelqu'un pouvait me dire ce que je fais mal que je reçois ce Unhandled message d'erreur d'exception:argv allocation de mémoire

0xC0000005: Access violation reading location 0x0000000c. 

avec un pointage de pointeur vert à mon premier code Prolog (de fid_t):

Voici mon fichier d'en-tête:

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

Et voici mon code principal:

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

Merci,

Répondre

2

Cette partie ici est méchant:

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

argv est un pointeur ballants - pas de stockage a été alloué. Changez-le en:

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

Merci Paul. C'était un point valide. Cependant, cela n'a pas résolu la situation. J'ai même commenté argv [0] = "libpl.dll"; en vain. Je reçois toujours le même message d'erreur, qui pointe apparemment vers un problème de pointeur nul ... – Joshua

+0

@Joshua: vous devriez probablement éditer votre question pour qu'elle ait la dernière version du code (avec le problème argv corrigé) –

+0

'argv [1] = NULL;' signifie que argv doit être affecté à au moins deux éléments: 'char * argv [2];' – frayser