void DisplayConceptInfos(int index, int showExtent, FILE *fp) { REF* ref; // On valide la valeur de l'index if (index>=0 && index<_countCpt) { if (showExtent) { ref = _concepts[index].extent; if (ref) { while (ref) { if (ref->reference) fprintf(fp,"%s ", ref->reference); ref = ref->next; } fprintf(fp,": "); } } ref = _concepts[index].intent; while (ref) { if (ref->reference) fprintf(fp,"%s ", ref->reference); ref = ref->next; } fprintf(fp,"\n"); } }
<Galicia_Document> <Lattice numberObj="4" numberAtt="4" numberCpt="16"> <Name>lattice(Ctx_0)</Name> <Object>3</Object> <Object>2</Object> <Object>1</Object> <Object>4</Object> d b c a <Concept> 1 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> </Concept> <Concept> 16 <Extent> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> d <Concept_Ref>1</Concept_Ref> </Concept> <Concept> 2 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> </Extent> a <Concept_Ref>1</Concept_Ref> </Concept> <Concept> 8 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> c <Concept_Ref>1</Concept_Ref> </Concept> <Concept> 4 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>1</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> b <Concept_Ref>1</Concept_Ref> </Concept> <Concept> 14 <Extent> <Object_Ref>1</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> d b <Concept_Ref>16</Concept_Ref> <Concept_Ref>4</Concept_Ref> </Concept> <Concept> 15 <Extent> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> </Extent> d a <Concept_Ref>16</Concept_Ref> <Concept_Ref>2</Concept_Ref> </Concept> <Concept> 6 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> b c <Concept_Ref>8</Concept_Ref> <Concept_Ref>4</Concept_Ref> </Concept> <Concept> 3 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>1</Object_Ref> </Extent> b a <Concept_Ref>2</Concept_Ref> <Concept_Ref>4</Concept_Ref> </Concept> <Concept> 13 <Extent> <Object_Ref>2</Object_Ref> <Object_Ref>4</Object_Ref> </Extent> d c <Concept_Ref>16</Concept_Ref> <Concept_Ref>8</Concept_Ref> </Concept> <Concept> 7 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> </Extent> c a <Concept_Ref>2</Concept_Ref> <Concept_Ref>8</Concept_Ref> </Concept> <Concept> 10 <Extent> <Object_Ref>2</Object_Ref> </Extent> d c a <Concept_Ref>15</Concept_Ref> <Concept_Ref>13</Concept_Ref> <Concept_Ref>7</Concept_Ref> </Concept> <Concept> 11 <Extent> <Object_Ref>1</Object_Ref> </Extent> d b a <Concept_Ref>14</Concept_Ref> <Concept_Ref>15</Concept_Ref> <Concept_Ref>3</Concept_Ref> </Concept> <Concept> 5 <Extent> <Object_Ref>3</Object_Ref> </Extent> b c a <Concept_Ref>6</Concept_Ref> <Concept_Ref>3</Concept_Ref> <Concept_Ref>7</Concept_Ref> </Concept> <Concept> 12 <Extent> <Object_Ref>4</Object_Ref> </Extent> d b c <Concept_Ref>14</Concept_Ref> <Concept_Ref>6</Concept_Ref> <Concept_Ref>13</Concept_Ref> </Concept> <Concept> 9 <Extent> </Extent> d b c a <Concept_Ref>10</Concept_Ref> <Concept_Ref>11</Concept_Ref> <Concept_Ref>5</Concept_Ref> <Concept_Ref>12</Concept_Ref> </Concept> </Lattice> </Galicia_Document>
DisplayConceptInfos(i, 0,fp);
d
a
c
b
d b
d a
b c
b a
d c
c a
d c a
d b a
b c a
d b c
d b c a
d
a
c
b
d b
d a
b c
b a
d c
c a
d c a
d b a
b c a
d b c
void DisplayConceptInfos(int index, int showExtent, FILE *fp) { REF* ref; REF* ref1; // On valide la valeur de l'index if (index>=0 && index<_countCpt) { if (showExtent) { ref = _concepts[index].extent; if (ref) { while (ref) { if (ref->reference) fprintf(fp,"%s ", ref->reference); ref = ref->next; } fprintf(fp,": "); } } ref = _concepts[index].intent; ref1 = _concepts[index].extent; while (ref) { if (ref->reference && ref1->reference) fprintf(fp,"%s ", ref->reference); ref = ref->next; } fprintf(fp,"\n"); } }
typedef struct { char* reference; // la donnée proprement dite void* next; // pointeur vers la reference suivante (ou 0 s'il n'y a plus de donnée) } REF;
void characters(void* user_data, const xmlChar *ch, int len) {
while(ref->next)
if (ref) { // La liste contient au moins une cellule. // On va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à NULL) while(ref->next) ref = (REF*)ref->next; ref->next = newRef; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question- ref 0xfeeefeee {reference=??? next=??? } REF *
- reference CXX0030: Erreur : impossible d'évaluer l'expression
- next CXX0030: Erreur : impossible d'évaluer l'expression
Exception non gérée à 0x00414d6b dans test.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xfeeefef2.
- ref 0xfeeefeee {reference= ??? next=??? } REF *
- reference CXX0030: Erreur : impossible d'évaluer l'expression
- next CXX0030: Erreur : impossible d'évaluer l'expression
typedef struct REF { char* reference; // la donnée proprement dite struct REF* next; // pointeur vers la reference suivante (ou 0 s'il n'y a plus de donnée) }REF;
void characters(void* user_data, const xmlChar *ch, int len) { if (_inID && len) { // On va enregistrer l'ID, mais en supprimant les espaces qui semblent s'être introduits 5 while(len>1 && *ch ==32) { len--; ch+=sizeof(xmlChar); } // On supprime également les espaces qui suivent la valeur. while(len>1 && *(ch+len-1)==32) len--; _concepts[_currentCpt].ID = (char*)malloc(len+1); strncpy(_concepts[_currentCpt].ID, ch, len); *(_concepts[_currentCpt].ID+len) = 0; _inID = 0; } else if ((_inIntent || _inUpperCovers || _inExtent) && len) { // lien vers les references du concept courant REF** source; REF* ref; REF* newRef; if (_inIntent) source = &(_concepts[_currentCpt].intent); else if (_inUpperCovers) source = &(_concepts[_currentCpt].upperCovers); else if (_inExtent) source = &(_concepts[_currentCpt].extent); ref = *source; // on créé une nouvelle reference newRef = (REF*)calloc(1, sizeof(REF)); // permet de relier la nouvelle reference a la structure (liste chainee) if (ref) { // La liste contient au moins une cellule. // On va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à NULL) while(ref->next) ref = (REF*)ref->next; ref->next = newRef; } else *source = newRef; // Première cellule de la liste chainée // on recopie la donnée newRef->reference = (char*)malloc(len+1); strncpy(newRef->reference, ch, len); // 0 terminal de la chaine de caractères *(newRef->reference+len) = 0; // Remise à 0 des flags de position _inIntent _inUpperCovers _inExtent = 0; } }
while(ref->next)
if (ref) { // la liste contient au moins une cellule. // on va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à null) while(ref->next) ref = (ref*)ref->next; ref->next = newref; }
Il est souvent utile de connaitre le code de memoire en mode debug.
Bien souvent les problemes de bases en C++ sont lie a la manipulation de la memoire (pointer NULL, non initialise, variable effacee mais reutilisee…).
Ceux a connaitre par coeur sont 0xcdcdcdcd qui veut dire non initalise et 0xfeeefeee qui veut dire deja efface.
Passes tu bien par cette instruction ?
lorsque tu tentes d'accéder a ce tableau _concepts, il faut qu'il soit créé, non ?
si ca lève un exception dans characters, ça ne veut en rien dire que le souci viens de characters !
_concepts = (CONCEPT*)calloc(_countCpt, sizeof(CONCEPT));
_concepts 0x00000000 {ID=??? intent=??? upperCovers=??? ...} CONCEPT *
ID CXX0030: Erreur : impossible d'évaluer l'expression
intent CXX0017: Erreur : symbole "" introuvable
upperCovers CXX0030: Erreur : impossible d'évaluer l'expression
extent CXX0030: Erreur : impossible d'évaluer l'expression
_countCpt 4 int
attrs 0x0035f890 const unsigned char * *
0x0035e45c "numberObj" const unsigned char* 110 'n' const unsigned char
attrs[i+1] 0x0035f920 "4" const unsigned char *
52 '4' const unsigned char
i 4 int
_concepts 0x003d2cc0 {ID=0x20632062 incorrect intent=0x000a2064 upperCovers=0xfdfdfdfd ...} CONCEPT *
+ ID 0x20632062 incorrect char *
CXX0030: Erreur : impossible d'évaluer l'expression
+ intent 0x000a2064
{reference=??? next=??? } REF *
reference CXX0030: Erreur : impossible d'évaluer l'expression
next CXX0030: Erreur : impossible d'évaluer l'expression
+ upperCovers 0xfdfdfdfd {reference=??? next=??? } REF *
reference CXX0030: Erreur : impossible d'évaluer l'expression
next CXX0030: Erreur : impossible d'évaluer l'expression
+ extent 0xabababab {reference=??? next=??? } REF *
reference CXX0030: Erreur : impossible d'évaluer l'expression
next CXX0030: Erreur : impossible d'évaluer l'expression
_countCpt 7 int
attrs 0x0035e490 const unsigned char * *
0x0035d5cc "numberObj" const unsigned char *
110 'n' const unsigned char
attrs[i+1] 0x0035e500 "7" const unsigned char *
55 '7' const unsigned char
i 4 int
while(ref->next)de la fonction 'characters'
Exception non gérée à 0x00414e1b dans chabnasri.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xfeeefef2.