Pagina 3 di 5 primaprima 1 2 3 4 5 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 45
  1. #21
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ma

    Ma scusate un attimo!

    Come ho già detto in un post in questa discussione, c'è

    GetModuleFileName(NULL, __out LPTSTR lpFilename, __in DWORD nSize);

    definita in Windows.h Passando come primo parametro NULL si dice alla funzione che si vuole la path del processo corrente.

    Usaggio:

    codice:
    #include <windows.h>
    
    //blablabla
    char percorso_eseguibile [1000];//così non abbiamo problemi di spazio!
    GetModuleFileName(NULL,   percorso_eseguibile,sizeof(percorso_eseguibile));
    
    
    //blablabla

  2. #22
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    mmm

    dovrebbe funzionare anche su mac su linux non sono sicuro, prova al massimo.

    Allora fai così:

    se è sotto windows: //ovviamente defi usare i #define:

    codice:
    #ifdef USA_WINDOWS
    
    //blabla
    
    #endif
    
    #ifdef USA_MAC
    
    //etc etc etc
    
    #endif
    
    #ifdef USA_LINUX
    
    //etc
    
    #endif
    
    //ci sono poi define già definiti da compilatore WIN_32 mi pare sia uno di quelli, quindi se metti quelli giusti non serve che stai a inizio programma a scrivere
    #define USA_WINDOWS
    
    ma li definisce già il compilatore
    ma
    Guarda sopra,

    se è sotto machintosh

    codice:
    Bundle = CFBundleGetMainBundle();
    path = CFBundleCopyBundleURL(Bundle);
    se è sotto linux ho trovato questo codice (che da prima occhiata mi sempre codice standard che va bene per tutti gli OS!)

    codice:
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[]) 
    {  
    char path[256];  
    char id[256];  
    sprintf(id, "/proc/%d/exe", getpid());  
    readlink(id, path, 255);  
    path[255] = '\0';  
    printf("%s\n", path);  
    return 0;
    }
    Non sei ancora soddisfatto?

    Usa le funzioni fornite dalla BOOST:

    codice:
    boost::filesystem::path curPath = boost::filesystem::current_path();
    std::string strPath = curPath.string();
    std::cout<<strPath;
    e potrei stare qui a elencarti ancora metodi, provali e scegli quello che ti piace di più, la cosa certa è che argv[0] e tutto meno che portabile, quindi se lo vuoi usare, a tuo rischio, io di metodi migliori te ne ho mostrati tanti.

  3. #23
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Sono tutte soluzioni system-dependent quelle che hai elencato, e del resto soluzioni portabili non sembrano esserci (a meno ovviamente di differenziare il codice con le varie direttive #ifdef ecc.). Quel codice che "sembra standard" in realtà non lo è perché ci sono funzioni come getpid() e readlink() che sono conformi solo allo standard POSIX, senza contare che poi va a leggere il contenuto della directory /proc, per cui tutto è tranne che portabile. Per quanto riguarda la libreria Boost, sta parlando di C, non di C++.
    every day above ground is a good one

  4. #24
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Si infatto YuYevon ha ragione alla grande,ho provato da terminale e non funziona,in realtà ti dice il nome della directory da cui viene lanciato.
    E' pur vero che da terminale sai sempre in che directory lavori,ma per conoscere il path vero non saprei fare.
    Poi all' università mi hanno spiegato che i parametri di ingresso sono quelli,argc è il numero di processi,argv è una matrice,ma in genere è composto solo da un elemento,cioè il processo attuale.
    Poi per il resto non è che ci sono trucchi,resta da scoprire come ottenere il path vero.
    Non ho ancora provato il codice di kirakira.

  5. #25
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Comunque per quello che cercava lui magari può anche andare,ma la cosa mi ha incuriosito.
    Però ovviamente la soluzione non è portabile.
    Ecco cosa ho trovato per windows:
    http://stackoverflow.com/questions/1...h-from-its-pid
    Poi bisognerebbe metterci le mani dentro ma sinceramente le funzioni di windows.h le odio.

  6. #26
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    278
    Scusate, ma non inserendo l'indirizzo in cui creare il file (cioè mettendo solo il nome) e quindi con un classicissimo:

    fopen("miofile.txt","w");

    Il file viene creato nella home, perché la home è la current work directory di questo caso, è corretto?

  7. #27
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Chi setta la directory corrente iniziale è di solito il programma che lo fa partire, ovvero quello che crea il processo..
    Tu avvii il programma dall'IDE?

    per esempio con vc++ quando fai partire il file compilato dall'apposito pulsante esegui (con o senza debug) setta come directory corrente quella del progetto e non quella dove risiede l'eseguibile..
    (riquardo a xcode non so niente)


    Comunque per quello che cercava lui magari può anche andare,ma la cosa mi ha incuriosito.
    Però ovviamente la soluzione non è portabile.
    Ecco cosa ho trovato per windows:
    http://stackoverflow.com/questions/...th-from-its-pid
    Poi bisognerebbe metterci le mani dentro ma sinceramente le funzioni di windows.h le odio.
    Su windows è semplice.. basta fare come aveva detto kirakira93

  8. #28
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Alla fine quel programma che ho fatto serve solo se il path lo vuoi manipolare e ad esempio salvare in un' altra cartella.
    Per il resto lo so che è automatico che il file lo salva da dove fai partire l' eseguibile.
    Ho anche provato a spostare l' eseguibile in altre directory,alla fine il file lo crea sempre da dove lo fai partire.

  9. #29
    Io ragazzi continuo a non capire bene... il contenuto di argv[] è variabile quindi? e da cosa dipende?

    Ho fatto una prova semplicissima, stampare a video l'elenco degli argomenti passati al main... Compilando e lanciando da terminale con il comando (l'eseguibile si chiama 'prog'):

    codice:
    ./prog o
    la stampa a video è:

    codice:
    ./prog2.  o
    e a me sembra che abbia poco di "percorso dell'eseguibile".... perchè poi 'prog2.'? e non 'prog'?

    p.s. probabilmente sono domande davvero da novellino
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  10. #30
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    278
    argv e' un array di puntatori a char. Ogni puntatore referenzia un singolo parametro della linea di comando sottoforma sempre di stringa.
    In altri termini, i parametri inseriti nella linea di comando vengono sempre acquisiti dal programma come stringhe, anche nel caso che questi rappresentino dei valori numerici.
    Il significato dell'array di puntatori e' il seguente:
    argv[0] e' il nome del programma ed e' sempre presente.
    argv[1] e' il primo parametro (se esistente) digitato dopo il nome del programma.
    argv[argc-1] e' l'ultimo parametro passato al programma.
    argv[argc] e' uguale a '\0' (puntatore nullo).

    Fonte http://digilander.libero.it/uzappi/C/C-main.html
    Io sinceramente non conosco bene il perché esistano questi argomenti nel main. Qual è il loro scopo nel programma o per il compilatore.

    Mettendo argv[0] nel codice precedente recuperi il nome del programma (intero con tutto l'indirizzo).

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.