Piero V.

Prendere la directory dell'eseguibile in C++

Talvolta può risultare utile sapere il percorso di un programma dal programma stesso. Un esempio pratico è quando bisogna caricare file come quelli di configurazione o risorse del programma.

Purtroppo non esiste un metodo cross-platform per farlo. Molti compilatori usano argv[0], però non è obbligatorio che lo facciano. Poi ogni piattaforma ha il suo metodo.

Purtroppo neanche boost provvede questa funzionalità, sebbene abbia una libreria sul filesystem.

Basandomi su vari metodi trovati su internet (dentro al file cpp ci sono tutti i link), ho fatto una classe, il cui scopo è gestire il filesystem, che, basandosi sul percorso dell’eseguibile, risale alla root dell’applicazione. Per il momento questa è l’unica funzionalità, in seguito ne aggiungerò altre per miei scopi.

Finora l’ho provata solo su Linux, perciò se qualcuno riesce a provarlo su altre piattaforme me lo faccia sapere.

Sono richieste le librerie boot filesystem e boost system, in quanto le uso per fare i controlli e ottenere il percorso assoluto e senza collegamenti.

Sorgente e header li potete scaricare qui: filesystem_cpp.tar.gz.

Lo rilascio in pubblico dominio, non ci dovrebbero essere problemi per questi frammenti di codice.

Piccola guida: innanzitutto c’è da notare che uso il singleton pattern, ovvero un’unica istanza di cui si può prendere il puntatore tramite il metodo statico getSingletonPtr o la reference tramite getSigleton, comunque con il metodo fromArguments(int argc, char **argv) impostate gli argomenti della main, se vi interessa prendere l’eseguibile da lì; invece appRoot restituisce una reference const dell’oggetto boost::filesystem::path con la root dell’applicazione.

Attenzione: si presuppone che l’eseguibile sia in app-root/altra-directory/eseguibile. Se fosse direttamente in app-root dovete modificare LEVELS in 1.

Eclipse

Finalmente mi sono deciso ad usare un IDE per programmare in C++.

Tutto è nato dall’esigenza di provare Ogre, un motore di rendering 3D. Questa volta avevo voglia di fare le cose bene, così ho seguito il consiglio del loro wiki e ho fatto la mia scelta.

I tre candidati erano Eclipse, NetBeans e CodeBlocks.

L’ultimo l’ho escluso a priori perché in realtà l’avevo già provato su Windows e non mi era piaciuto.

Così la sfida è stata tra Eclipse e NetBeans.

Alla fine ho scelto il primo perché occupava meno spazio.

Che dire? È veramente utile e comodo.

Sono 250MB occupati ma in compenso mi risparmia un sacco di fatica e fa già lui dei controlli per me, per esempio sul tipo, sull’esistenza di variabili/funzioni/classi.

Insomma, se state ancora programmando con editor che offrono solo l’evidenziazione del codice vi consiglio di provare anche a voi questo programma.

È libero, multipiattaforma e supporta anche altri linguaggi, Java in primis.

XML e C++

Mi sto divertendo parecchio a lavorare con C++.

Oggi mi sono posto un altro problema: mi serviva un formato abbastanza comodo da leggere con cui si potesse anche dare un certo ordine alle informazioni.

Allora ho pensato che la scelta migliore sarebbe stata l’XML: non è facilissimo da leggere ma esistono parecchie librerie che svolgono questo compito. Da scrivere invece non è il massimo, ma non mi serviva il supporto alla scrittura.

Così mi sono messo a cercare e ho trovato un po’ di informazioni: esistono due tipi di librerie, quelle SAX e quelle DOM.

In realtà conoscevo entrambi questi concetti abbastanza superficialmente, ma in parole povere, se per voi è più importante trovare un certo nodo è meglio il DOM.

Così dopo un po’ ho trovato questa libreria: TinyXML.

Non è affatto male, anzi! Da un primo approccio mi pare anche semplice da usare.

La licenza poi è fantastica, perché è la Zlib/libpng, perciò è molto libera.

E un’altra cosa magnifica è che questa libreria è anche capace di salvare i file XML modificati, perciò penso di estendere il suo uso anche a dove avevo pensato di usare altri sistemi.

Risolviamo i Sudoku... con C++

Da quando ho imparato a fare i Sudoku mi sono sempre chiesto come fare un programma che li risolvesse 😊

La cosa non è difficile, soprattutto per quelli semplici, che ero già riuscito a risolvere con PHP 😊

Tuttavia non ero andato più avanti perché non avevo considerato la risoluzione tramite brute force, invece recentemente, anche per consolidare la mia conoscenza di C++, mi sono messo e ho fatto questo programmino.

In pratica l’algoritmo di risoluzione si divide in due parti: la prima con un loop crea le possibili soluzioni per ogni cella e le inserisce fino a quando il sudoku non viene più modificato. Quindi se ci sono celle ancora vuote (con possibili soluzioni) tenta il brute force, altrimenti esce. Il brute force è implementato tramite ricorsione: prima ordino le soluzioni in modo da partire dalla cella con meno soluzioni possibili, quindi prendo le soluzioni una ad una e provo a vedere se impostandole ce la faccio a risolvere il sudoku. Quando ce l’ho fatta termino il programma.

Se volete il sorgente, eccolo qui: sudoku.cpp.

L’ho provato su Linux e andava.

Penso che si possa migliorare il programma ma per il momento mi va bene così 😊

Aggiornamento 31/05/2012: aggiunto un meccanismo di controllo, perché prima con certi sudoku difficili il brute force falliva.

Panda3D: distribuire giochi in C++ su Windows

Vi ho parlato più di una volta di Panda3D: un motore per giochi libero e multipiattaforma.

Finora però ho sempre parlato di problemi pratici riguardanti la programmazione, ma non ho mai parlato del problema della compilazione e della distribuzione, che invece sono molto importanti.

Le due piattaforme supportate principalmente da Panda sono Windows e GNU Linux.

Per la compilazione su GNU Linux non ci sono problemi, basta avere il compilatore GNU fare copia e incolla dalla pagina di Panda e si è a posto. Non escludo che comunque magari anche altri compilatori funzionino.

Su Windows si è invece costretti a usare Visual C++ 2008. Per usare la versione 2010 bisognerebbe ricompilarsi tutto Panda.

Io l’ho utilizzato per la prima volta ieri, comunque il tutto è abbastanza facile. Anche in questo caso basta seguire le istruzioni di Panda3D. Per le directory comunque vi consiglio di non metterle globali ma solo al progetto. Per farlo bisogna andare su Proprietà, Linker, Generale, Directory di include aggiuntiva (vado a memoria) e mettere C:\Panda3D-vers\python\include e C:\Panda3D-vers\include (sostituendo a vers la vostra versione). Per mettere la directory delle librerie invece dovete avere almeno un file C++ nel progetto, anche vuoto. Allora nella voce delle proprietà diventerà disponibile anche la scheda C/C++, in cui potrete andare ad inserire, mi pare in generale, le directory C:\Panda3D-vers\python\libs e C:\Panda3D-vers\lib. Magari quando ho un po’ di tempo controllo. Per ulteriori informazioni guardate questa pagina. … [Leggi il resto]