PDA

Visualizza la versione completa : [C++] Chiamata a system() e individuazione di errori


fausto
27-02-2007, 20:58
Ciao a tutti.
Sto davvero impazzando.
Mi succede la seguente cosa: ho un eseguibile che si chiama GMLP. Accetta due parametri: la dimensione e un seed.
per ogni dimensione >= 29 le due chiamate system(comando) non funzionano, mi restituiscono -1.

E non ho la piu' pallida idea del perché. L'unica cosa che so è che il programma occupa molta memoria.

La parte dove uso le system è questa:

int ATSP_Concorde::Solve()
{
string remove ("rm -f ");
remove.append(FILETSP SOLEXT);
cerr << remove << endl;
if (system ("rm -f file_tsp_temp.sol"))
// if (system(remove.c_str()) != 0)
{
cerr << "norimozione "<< "FILE SOLEXT" << endl;
exit(-1);
}

printTSPLIB(FILETSP);
string concorde(getenv("WHICH_CONCORDE"));

if (concorde.empty())
{
cerr << "WHICH_CONCORDE=NULL: dov'e' concorde?\n";
exit(-1);
}
concorde.append(FILETSP);
cerr << "aspett 5 secondi\n";
sleep(5);
cerr << "eseguo " << concorde << endl;
// int check =
system(concorde.c_str());
/* if (check != 0)
{
cerr << "CONTROLLA WHICH_CONCORDE, errore: " << check << endl;
exit(1);
}
*/
cerr << " aspetto altri 5 secondi\n";
sleep(5);
cerr << "estraggo soluzione";
extractSol();
return 1;
}

Come vedete, nella parte incriminata, non entrano nemmeno le dimensioni.
Eppure è cosi': il codice gira, l'unica cosa che si blocca e la funzione system ();
infatti se per esempio la prima system la sposto dopo la funzione printTSPLIB,
quest'ultima viene eseguita correttamente.
Se la dimensione che gli do è inferiore a 29 allora il codice gira perfettamente.


Vi prego, datemi unaiuto. Ormai sono all'esaurimento!

MItaly
27-02-2007, 21:54
A return value of – 1 indicates an error, and errno is set to one of the following values:
E2BIG
Argument list (which is system dependent) is too big.
ENOENT
Command interpreter cannot be found.
ENOEXEC
Command-interpreter file has invalid format and is not executable.
ENOMEM
Not enough memory is available to execute command; or available memory has been corrupted; or invalid block exists, indicating that process making call was not allocated properly.

Verifica il valore di errno per individuare l'errore.

fausto
28-02-2007, 01:08
grazie!

ecco, il codice dell'errore è 12 ovvero ENOMEM.

Cosa vuop dire? che effettivamente ho occupato tutte le possibili risorse di memoria?
ma allora, perché le altre funzioni vengono eseguite mentre system no?

Grazie comunque per il suggerimento,

f

MItaly
28-02-2007, 14:47
Non so cosa dirti: probabilmente il programma che tenti di lanciare occupa veramente troppa memoria... ma è solo una mia supposizione...

oregon
28-02-2007, 14:50
Ma >=29 significa che varia l'occupazione di stack del programma in qualche modo (ha funzioni ricorsive pesanti)?

fausto
28-02-2007, 15:36
No, non ho funzioni ricorsive pesanti.
>=29 è la dimensione di un grafo.
Il programma risolve un rilassamento lagrangiano tramite un algoritmo di Bundle di cui ho instanziato alcune classi.
I sottopoblemi sono un TSP di dimensioni 3*dimensione e un numero dimensione*(dimensione-1) di problemi di cammino minim su un grafi di N=dimensione.

Ho idea che fra vettori dei costi, vettori dei moltiplicatori lagrangiani, vettori per la gestione dei grafi, vettori delle suluzioni, dimensione del budle ecc ecc la memoria va a palla.

Comunque si, il problema è di memoria: ho fatto prove su una macchina con piu' memoria e riesco ad andare oltre i 30. Ma top mi dice che occupo 12 giga di memoria virtuale: una pura follia.

Adesso cerchero' risparmiare un po' di memoria.



:master:

Loading