Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294

    c++] system() funziona solo in alcuni casi!!!!

    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!
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  2. #2
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    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
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  4. #4
    Non so cosa dirti: probabilmente il programma che tenti di lanciare occupa veramente troppa memoria... ma è solo una mia supposizione...
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma >=29 significa che varia l'occupazione di stack del programma in qualche modo (ha funzioni ricorsive pesanti)?

  6. #6
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    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:
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.