PDA

Visualizza la versione completa : [c++] problema debug esempi xerces


tina8
15-02-2010, 00:32
Ciao, sto cercando di eseguire il seguente esempio relativamente a xerces c++(scaricato da http://xerces.apache.org/xerces-c/samples-3.html), ho inserito le classi da testare in un progetto console win32 di visual c++ 2008 express edition. La classe principale Ŕ la seguente:



#include "stdafx.h"
#include "SAXCount.hpp"

#if defined(XERCES_NEW_IOSTREAMS)
#include <fstream>
#else
#include <fstream.h>
#endif
#include <xercesc/util/OutOfMemoryException.hpp>

// ---------------------------------------------------------------------------
// Local helper methods
// ---------------------------------------------------------------------------
void usage()
{
XERCES_STD_QUALIFIER cout << "\nUsage:\n"
" SAXCount [options] <XML file | List file>\n\n"
"This program invokes the SAX Parser, and then prints the\n"
"number of elements, attributes, spaces and characters found\n"
"in each XML file, using SAX API.\n\n"
"Options:\n"
" -l Indicate the input file is a List File that has a list of xml files.\n"
" Default to off (Input file is an XML file).\n"
" -v=xxx Validation scheme [always | never | auto*].\n"
" -n Enable namespace processing. Defaults to off.\n"
" -s Enable schema processing. Defaults to off.\n"
" -f Enable full schema constraint checking. Defaults to off.\n"
" -locale=ll_CC specify the locale, default: en_US.\n"
" -? Show this help.\n\n"
" * = Default if not provided explicitly.\n"
<< XERCES_STD_QUALIFIER endl;
}


// ---------------------------------------------------------------------------
// Program entry point
// ---------------------------------------------------------------------------
int main(int argC, char* argV[])
{

// Check command line and extract arguments.
if (argC < 2)
{
usage();
return 1;
}

const char* xmlFile = 0;
SAXParser::ValSchemes valScheme = SAXParser::Val_Auto;
bool doNamespaces = false;
bool doSchema = false;
bool schemaFullChecking = false;
bool doList = false;
bool errorOccurred = false;
bool recognizeNEL = false;
char localeStr[64];
memset(localeStr, 0, sizeof localeStr);

int argInd;
for (argInd = 1; argInd < argC; argInd++)
{
// Break out on first parm not starting with a dash
if (argV[argInd][0] != '-')
break;

// Watch for special case help request
if (!strcmp(argV[argInd], "-?"))
{
usage();
return 2;
}
else if (!strncmp(argV[argInd], "-v=", 3)
|| !strncmp(argV[argInd], "-V=", 3))
{
const char* const parm = &argV[argInd][3];

if (!strcmp(parm, "never"))
valScheme = SAXParser::Val_Never;
else if (!strcmp(parm, "auto"))
valScheme = SAXParser::Val_Auto;
else if (!strcmp(parm, "always"))
valScheme = SAXParser::Val_Always;
else
{
XERCES_STD_QUALIFIER cerr << "Unknown -v= value: " << parm << XERCES_STD_QUALIFIER endl;
return 2;
}
}
else if (!strcmp(argV[argInd], "-n")
|| !strcmp(argV[argInd], "-N"))
{
doNamespaces = true;
}
else if (!strcmp(argV[argInd], "-s")
|| !strcmp(argV[argInd], "-S"))
{
doSchema = true;
}
else if (!strcmp(argV[argInd], "-f")
|| !strcmp(argV[argInd], "-F"))
{
schemaFullChecking = true;
}
else if (!strcmp(argV[argInd], "-l")
|| !strcmp(argV[argInd], "-L"))
{
doList = true;
}
else if (!strcmp(argV[argInd], "-special:nel"))
{
// turning this on will lead to non-standard compliance behaviour
// it will recognize the unicode character 0x85 as new line character
// instead of regular character as specified in XML 1.0
// do not turn this on unless really necessary
recognizeNEL = true;
}
else if (!strncmp(argV[argInd], "-locale=", 8))
{
// Get out the end of line
strcpy(localeStr, &(argV[argInd][8]));
}
else
{
XERCES_STD_QUALIFIER cerr << "Unknown option '" << argV[argInd]
<< "', ignoring it\n" << XERCES_STD_QUALIFIER endl;
}
}

//
// There should at least one parameter left, and that
// should be the file name(s).
//
if (argInd == argC)
{
usage();
return 1;
}

// Initialize the XML4C2 system
try
{
if (strlen(localeStr))
{
XMLPlatformUtils::Initialize(localeStr);
}
else
{
XMLPlatformUtils::Initialize();
}

if (recognizeNEL)
{
XMLPlatformUtils::recognizeNEL(recognizeNEL);
}
}

catch (const XMLException& toCatch)
{
XERCES_STD_QUALIFIER cerr << "Error during initialization! Message:\n"
<< StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER endl;
return 1;
}

//
// Create a SAX parser object. Then, according to what we were told on
// the command line, set it to validate or not.
//
SAXParser* parser = new SAXParser;

parser->setValidationScheme(valScheme);
parser->setDoNamespaces(doNamespaces);
parser->setDoSchema(doSchema);
parser->setHandleMultipleImports (true);
parser->setValidationSchemaFullChecking(schemaFullChecking );

//
// Create our SAX handler object and install it on the parser, as the
// document and error handler.
//
SAXCountHandlers handler;
parser->setDocumentHandler(&handler);
parser->setErrorHandler(&handler);


//
// Get the starting time and kick off the parse of the indicated
// file. Catch any exceptions that might propogate out of it.
//
unsigned long duration;

XERCES_STD_QUALIFIER ifstream fin;

// the input is a list file
if (doList)
fin.open(argV[argInd]);

if (fin.fail()) {
XERCES_STD_QUALIFIER cerr <<"Cannot open the list file: " << argV[argInd] << XERCES_STD_QUALIFIER endl;
return 2;
}

while (true)
{
char fURI[1000];
//initialize the array to zeros
memset(fURI,0,sizeof(fURI));

if (doList) {
if (! fin.eof() ) {
fin.getline (fURI, sizeof(fURI));
if (!*fURI)
continue;
else {
xmlFile = fURI;
XERCES_STD_QUALIFIER cerr << "==Parsing== " << xmlFile << XERCES_STD_QUALIFIER endl;
}
}
else
break;
}
else {
if (argInd < argC)
{
xmlFile = argV[argInd];
argInd++;
}
else
break;
}

//reset error count first
handler.resetErrors();

try
{
const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
parser->parse(xmlFile);
const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
duration = endMillis - startMillis;
}
catch (const OutOfMemoryException&)
{
XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl;
errorOccurred = true;
continue;
}
catch (const XMLException& e)
{
XERCES_STD_QUALIFIER cerr << "\nError during parsing: '" << xmlFile << "'\n"
<< "Exception message is: \n"
<< StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl;
errorOccurred = true;
continue;
}

catch (...)
{
XERCES_STD_QUALIFIER cerr << "\nUnexpected exception during parsing: '" << xmlFile << "'\n";
errorOccurred = true;
continue;
}


// Print out the stats that we collected and time taken
if (!handler.getSawErrors())
{
XERCES_STD_QUALIFIER cout << xmlFile << ": " << duration << " ms ("
<< handler.getElementCount() << " elems, "
<< handler.getAttrCount() << " attrs, "
<< handler.getSpaceCount() << " spaces, "
<< handler.getCharacterCount() << " chars)" << XERCES_STD_QUALIFIER endl;
}
else
errorOccurred = true;
}

if (doList)
fin.close();

//
// Delete the parser itself. Must be done prior to calling Terminate, below.
//
delete parser;

// And call the termination method
XMLPlatformUtils::Terminate();

if (errorOccurred)
return 4;
else
return 0;

}



nessun problema relativamente alla compilazione, i problemi si riscontrano in due casi:

1. se eseguo il debug ricevo il seguente output:

'prova4.exe': caricato 'C:\Documents and Settings\User\Documenti\Visual Studio 2008\Projects\prova4\Debug\prova4.exe', Simboli caricati.
'prova4.exe': caricato 'C:\WINDOWS\system32\ntdll.dll'
'prova4.exe': caricato 'C:\WINDOWS\system32\kernel32.dll'
'prova4.exe': caricato 'C:\Documents and Settings\Alessandra\Documenti\Visual Studio 2008\Projects\prova4\Debug\xerces-c_3_1D.dll', Simboli caricati.
'prova4.exe': caricato 'C:\WINDOWS\system32\advapi32.dll'
'prova4.exe': caricato 'C:\WINDOWS\system32\rpcrt4.dll'
'prova4.exe': caricato 'C:\WINDOWS\system32\secur32.dll'
'prova4.exe': caricato 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc 8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcr90d.dll'
'prova4.exe': caricato 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc 8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll'
Il programma '[4688] prova4.exe: Nativo' Ŕ terminato con il codice 1 (0x1).

2. Se eseguo avvia senza eseguire debug mi viene visualizzata la console con il contenuto della funzione usage() presente nel codice sopra citato che termina con la seguente stringa "premere un tasto per continuare" ma non mi permette di eseguire alcuna operazione, ma alla pressione di qualsiasi tasto (anche -) la finestra viene chiusa.

Accetto suggerimenti..grazie..ciao ciao

oregon
15-02-2010, 09:30
Il programma ha dei parametri obbligatori (mi pare di capire dall' Usage) ... li hai dati?

tina8
15-02-2010, 13:42
No non ho impostato nessun parametro, perchŔ non ho capito dove li devo impostare, a dir la veritÓ pensavo me li chiedesse a tempo d'esecuzione.

oregon
15-02-2010, 14:05
No ... i parametri sono su linea di comando, come espressamente suggerito dall'Usage

SAXCount [options] <XML file | List file>

tina8
15-02-2010, 14:12
Allora avevo capito bene, come ti dicevo quando si apre la console con il testo contenuto in Usage(), viene visualizzato il seguente messaggio "premere un tasto per continuare" e quando vado ad inserire ad esempio -l per specificare il file la finestra si chiude.

oregon
15-02-2010, 14:18
Appunto ... non devi inserire nulla da tastiera ...

L'Usage ti indica che il programma non Ŕ stato avviato correttamente (e che quindi si chiuderÓ subito dopo) perchŔ non hai indicato i correti parametri nella linea di comando ...

tina8
15-02-2010, 15:34
Dove vanno indicati i parametri dal momento che io faccio il debug direttamente da visual c++ 2008?

oregon
15-02-2010, 15:45
Dalle ProprietÓ del Progetto ... c'Ŕ un campo apposito per indicare i parametri di linea di comando ...

tina8
15-02-2010, 16:04
Perfetto ora funziona..grazie ;)

Loading