Newsgroup: it.comp.lang.c++
Titolo: FAQ del gruppo it.comp.lang.c++, rev. 1.2 - 26/05/2000

========================================================================
                  F.A.Q. UFFICIALI DI IT.COMP.LANG.C++
                      revisione 1.2  -  26/5/2000
           a cura di diversi partecipanti di it.comp.lang.c++
========================================================================
Indice delle domande:
0) Vorrei imparare il C++, e` necessario conoscere prima qualche altro
   linguaggio oppure posso imparare direttamente questo?
1) Che differenza esiste tra C++, Visual C++, Borland C++ Builder...?
2) Che differenza c'e` tra C e C++?
3) Dove posso trovare un compilatore C++ freeware?
4) Quale editor posso utilizzare per scrivere i miei programmi?
5) Dove posso trovare della documentazione sul C++ e lo standard?
6) Quali libri mi consigliate per imparare il C++ o perfezionare le
   mie conoscenze?
7) Che cosa e` la memoria dinamica? Come si usa?
8) Come posso allocare dinamicamente una matrice a piu` dimensioni e 
   utilizzare la notazione M[i][j]?
9) Che cosa e` un header? Come si creano e come si usano?
10) Se separo le definizioni di un template dalla sua dichiarazione
    ponendole in file separati (.h e .cpp) non riesco ad istanziarlo.
    Come posso risolvere il problema?
11) Come si passa un array ad una funzione in C++?
12) Come posso generare numeri casuali?
13) Come mai ottengo sempre la stessa sequenza di numeri casuali?
14) La sequenza generata da rand() non e` molto buona, dove posso
    trovare generatori di numeri casuali piu` validi?
15) Che differenza c'e` tra STL e la libreria standard del C++?
16) Lavorando con i numeri in virgola mobile, non riesco ad ottenere
    risultati precisi, perche`?
========================================================================
0) Vorrei imparare il C++, e` necessario conoscere prima qualche altro
   linguaggio oppure posso imparare direttamente questo?
R) Il C++ e` un linguaggio estremamente ricco e complesso, e come
   tale puo` non essere il piu` adatto da imparare come primissimo
   linguaggio di programmazione; esso e` stato progettato (come il
   suo precursore "C") per l'uso da parte di programmatori esperti e
   "scafati". Molti altri linguaggi sono stati progettati
   specificamente per insegnare ai principianti a programmare: alcuni,
   come il Pascal, guidano molto il principiante obbligandolo ad
   imparare ed applicare una rigorosa disciplina; altri, come Rexx,
   Python, e Basic, sono invece (in diversa misura e con diverse
   filosofie) "tolleranti" e "di manica larga". L'uno, l'altro, o
   entrambi questi approcci potrebbero essere piu` produttivi per
   imparare a programmare che non tuffarsi alla "nuotare o affogare"
   nel pelago del C++.
   Per chi gia` sa programmare (in qualsiasi altro linguaggio, Pascal,
   Basic o altro) il C++ e` un ottimo "secondo passo" nel mondo della
   programmazione.  In particolare non e` certo il caso di vedere come
   propedeutici al C++ altri linguaggi simili ma diversi (come Java,
   Objective C, Eiffel, Smalltalk...), se l'obbiettivo e` il C++,
   meglio allora studiare il C++.
   C'e` un diffuso e stranissimo mito che il linguaggio C sia
   propedeutico al C++, poiche` storicamente ne fu la radice. Questo
   equivale a dire che, per chi voglia imparare l'Inglese, sarebbe
   furbo cominciare con il Sassone basso-medievale [1].
   In pratica i modi di programmare in C e in C++ sono talmente
diversi
   che e` meglio passare direttamente al C++ e non acquisire idiomi
   tipici del C e del tutto superati e/o controproducenti nel C++.
   [1] Consulenza sul Sassone basso-medievale di Alex Martelli! :-)
1) Che differenza esiste tra C++, Visual C++, Borland C++ Builder...?
R) Il C++ e` il linguaggio definito dallo standard ANSI/ISO.
   Lo standard ne definisce la sintassi e la semantica dei costrutti,
   le regole che lo governano e la libreria standard. Di questo
   linguaggio esistono poi diverse implementazioni per le varie
   piattaforme (DOS, Linux, Windows, Mac...), alcune sono freeware
   (GNU gcc, CygwinB20...) altre commerciali (Visual C++, Borland C++
   Builder). Queste implementazioni sono tutte piu` o meno aderenti
allo
   standard, alcune offrono oltre al compilatore anche strumenti quali
   debugger e profiler, e/o delle estensioni non standard o
particolare
   supporto ad una certa piattaforma. Ad esempio il Borland C++
Builder
   e` anche uno strumento R.A.D.
2) Che differenza c'e` tra C e C++?
R) Spesso si dice che il C++ e` una estensione del C, ovvero un
   "C + AltraRoba". Questa affermazione e` corretta ed errata allo
   stesso tempo. La correttezza sta nel fatto che effettivamente il
   C++ da un punto di vista sintattico e` un sovrainsieme del C,
   tuttavia queste sue estensioni modificano totalmente il modo in cui
   si programma in C++, al punto che l'approccio C e` totalmente
   diverso e superato.
3) Dove posso trovare un compilatore C++ freeware?
R) In rete e` possibile reperire diversi prodotti gratuiti, molti sono
   basati sul compilatore GNU gcc. Ecco un breve elenco di
possibilita`:
   GNU gcc   -   
http://gcc.gnu.org
   L'ottimo compilatore GNU, uno dei piu` aderenti allo standard,
   fornito di serie sui sistemi Linux e di cui esistono porting molto 
   validi per DOS e Windows. E` possibile trovare anche molti tool a
   supporto di questo compilatori, in particolare l'ottimo debugger
GNU 
   gdb ed il profiler GNU gprof.
   DJGPP   -   
http://www.delorie.com/djgpp
   E' il porting per MS-DOS del compilatore GNU gcc e viene aggiornato
   abbastanza frequentemente (almeno finora, ma la cosa potrebbe
   cambiare in futuro dato che l'MS-DOS tende sempre più
   all'obsolescenza).
   E' ottimo per imparare il C/C++ in quanto non mette troppa carne al
   fuoco (tipo programmazione Windows con finestre e bottoncini) ma
   offre compilatore e librerie con una buona aderenza allo standard.
   In più fornisce anche una nutrita serie di funzioni non standard,
   praticamente le stesse fornite con i compilatori Borland sempre
   per MS-DOS.
 
 
   CygWinB20   -   
http://sourceware.cygnus.com/cygwin/
   Basato su un porting dell'ottimo GNU gcc, fornisce un ambiente unix
   like su piattaforma windows. Sono compresi diversi tool utili, in
   particolare anche gdb il debugger GNU, ma manca di un editor di
   risorse.
   Altre utili informazione per questo compilatore si possono trovare
su
 
http://www.remotepoint.com/~jordanh/personal/cygwin/cygwin.html
   Mingw   -   
http://www.xraylith.wisc.edu/~khan/software/gnu-win32/
 
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/
   Sempre gcc per windows, anch'esso dotato tra l'altro di un
   debugger (GNU gdb) ed un profiler (GNU gprof). A differenza del
   precedente non offre un ambiente unix like.
4) Quale editor posso utilizzare per scrivere i miei programmi?
R) Qualunque editor ASCII va bene, anche il semplice Edit del DOS o
   il Vi di Linux, tuttavia e` possibile trovare editor specializzati
   con syntax hilight (che usano cioe` colori diversi per i vari 
   elementi del linguaggio). Eccone una nutrita lista:
   QEdit
   E' un vecchio editor per MS-DOS molto snello ma potente e
totalmente
   configurabile. Contiene anche un ricco macro-linguaggio. Ora e'
   sostituito dal successivo.
 
   The SemWare Editor   -   
http://www.semware.com
   E' il successore di QEdit con molte caratteristiche in più, una
delle
   quali e' di utilizzare la memoria estesa per permettere l'editing di
   files molto grossi. Esiste anche in versione Windows ma sempre con
   interfaccia a caratteri.
   WinEdit   -   
http://www.winedit.com
   E' un editor per Win32 che offre buona configurabilità ed ottime
   caratteristiche tra le quali il WIL (Windows Interactive Language),
   un linguaggio molto ricco e potente che permette di creare
   praticamente qualsiasi comando di cui si può aver bisogno allo
   interno dell'editor stesso.
   UltraEdit   -   
http://www.ultraedit.com
   E' un altro editor per Win32 molto simile al precedente che manca
   però del linguaggio WIL, ma offre in più la possibilità di editing
   esadecimale.
   MultiEdit   -   
http://www.multiedit.com
   Un altro editor ancora per Win32 (ma esiste anche la versione per
   Win16). Rispetto ai precedenti offre in più la possibilità di
   configurare perfino i bitmap della toolbar per quanto riguarda i
   pulsanti definiti dall'utente. Per il resto sembra comunque
inferiore
   ai due precedenti in quanto non offre editing esadecimale, il
   linguaggio macro sembra meno potente del WIL e, a differenza degli
   altri due, non presenta la classica struttura con tree delle
cartelle
   sulla sinistra e finestra di editing sulla destra.
   EditPlus   -   
http://www.editplus.com
   E` un ottimo editor di testo, con sistemi di high-lighting
   personalizzabili e, sul sito, ci sono i plug-in per gestire quasi
   tutti i linguaggi (alcuni sono presenti con l'installazione di
base).
   Solo per piattaforma Win32.
   PFE   -   
http://www.lancs.ac.uk/people/cpaap/pfe/
   Freeware per win32, con una serie notevole di personalizzazioni
   possibili (macro, file salvati in formato *unix*, cattura
dell'output
   dei comandi batch, e cosi' via). Esiste anche una vecchia versione
a
   16 bit. Manca solo la sintassi colorata per raggiungere la 
   perfezione. 
   KDevelop   -   
http://www.kdevelop.org
   Non e` un semplice editor, ma un IDE (un ambiente di sviluppo
   integrato) freeware per Linux con class tree, gestione di progetti,
   tool di sviluppo RAD per KDE, integrazione con debugger, browser
   integrato per la documentazione.
   CForge   -   
http://www.codeforge.com
   Altro IDE per Linux ed altri SO molto completo. E` disponibile in
   una versione free (no opensource) per uso personale e piccoli
   progetti e varie versioni commerciali a prezzi contenuti.
   Infine e` utile ricordare Emacs uno dei piu` potenti editor, dotato
   di mille funzionalita` e disponibile per molte piattaforme (Unix,
   Linux, Windows...). Lo si trova facilmente con una piccola ricerca
in
   rete.
5) Dove posso trovare della documentazione sul C++ e lo standard?
R) Per lo standard ci sono 2 possibilita`, puoi comprarne una copia
   sotto forma di file pdf (Acrobat reader) all'indirizzo
 
http://webstore.ansi.org/product.asp?sku=ISO%2FIEC+14882%2D1998
   per soli 18 US$, oppure puoi comprare la versione cartacea
   (molto piu` costosa) all'indirizzo 
http://www.ansi.org/
   Per altra documentazione sul C++ eccoti nutrito elenco di indirizzi
   utili, la maggior parte dei quali riferisce per ovvie ragioni a
   risorse in lingua inglese: 
 
http://www.icce.rug.nl/docs/cplusplus/cplusplus.html
   C++ annotation, annotazioni per programmatori C che desiderano
   imparare il C++. In inglese.
 
http://www.cs.bham.ac.uk/~jdm/CPP/index.html
   Faq del NG comp.lang.c++. In inglese
 
http://www.programmazione.it
   E` un sito dedicato alla programmazione in generale, ma contiene
   molto materiale relativo al C++ compreso un tutorial in italiano
   che pero` richiede delle conoscenze di base in materia di
   programmazione.
 
http://www.bruceeckel.com
   A partire da questo indirizzo e` possibile scaricare liberamente la
   nuova edizione di "Thinking in C++", l'ottimo libro di Bruce Eckel.
   In inglese, molto valido.
 
http://www.programmingtutorials.com/
 
http://packetstorm.securify.com/programming-tutorials/
 
http://cs.nmhu.edu/personal/curtis/cs1htmlfiles/Cs1text.htm
 
http://www.cprogramming.com/
 
http://www.cyberdiem.com/vin/learn.html
 
   Su questi siti e` possibile trovare diversi tutorials ed altro
   sul C++ (ed anche sul C).
 
http://www.accu.org/
 
   Association of C and C++ users
 
http://www.utu.fi/~sisasa/oasis/oasis-cc++.html
 
http://www.la-online.com/cprog.htm
   link per C e C++ anche a documentazione varia
   Ecco dei link in cui si trova documentazione sulla
   libreria standard del C++ e su STL (vedere faq N. 15):
 
http://www.sgi.com/Technology/STL
 
http://www.dinkum.com/refstl.html
 
http://www.dinkum.com/htm_stl/index.html
 
http://www.cs.rpi.edu/~musser/stl.html
 
http://www.developer.com/reference/r_library.html
 
http://cgi.cs.rpi.edu/pub/stl/
   Alcuni Link sull'Object Oriented in generale:
 
http://www.cetus-links.org/
 
http://www.cpsc.ucalgary.ca/~gao/60903/paper.htm
6) Quali libri mi consigliate per imparare il C++ o perfezionare le
   mie conoscenze?
R) Tra le risposte alla precedente domanda trovi un link da cui
   scaricare l'ottimo libro di Bruce Eckel, adatto sia per i
   principianti che per quelli che gia` conoscono molti aspetti del
C++.
   Al momento attuale (gennaio 2000) questo libro e` in fase di
   pubblicazione. Altri testi sono elencati di seguito, di alcuni di
   essi potrebbe essere disponibile la traduzione in italiano che
pero`
   potrebbe non essere all'altezza dell'originale.
   Lippman e Lajoie, "C++ Primer" 3 ed. - Addison Wesley
   Ottimo libro per chi vuole imparare il C++. Esiste anche la
   traduzione in italiano, intitolata "C++ Corso di Programmazione".
   B. Stroustrup, "The C++ programming language" 3 ed. - Addison
Wesley
   E` il libro del padre del C++, non e` molto valido per chi deve
   iniziare, ma e` sicuramente un buon reference ed un approfondimento
   per un programmatore C++ con una certa conoscenza del linguaggio.
   B. Stroustrup, "The design and evolution of C++" - Addison Wesley
   E` rivolto a chi vuole approfondire le conoscenze sul perche` delle
   scelte operate nella realizzazione del C++ e sul funzionamento di
   certi meccanismi. Non e` molto aggiornato rispetto allo standard,
ma
   e` tuttora molto valido. Rivolto a conoscitori abbastanza esperti
   del linguaggio.
   S. Meyers, "Effective C++" 2 edizione e "More Effective C++"
   editi da Addison wesley
   Due libri disponibili anche in formato elettronico (CD) ad un
   prezzo conveniente (piu` aggiornati rispetto alle edizioni cartacee
   e con un plus di articoli dell'autore).
   Si tratta di una raccolta di consigli su cosa fare (e come) e cosa
   non fare in C++. Caldamente consigliati a chi vuole fare del C++ un
   utilizzo professionale.
   C. Pescio, "C++ manuale di stile" - Edizioni Infomedia
   L'argomento trattato e` l'importanza dell'uso di uno stile nella
   codifica in C++ e i problemi che possono sorgere quando non si
   usano dei principi precisi e razionali.
   Di facile lettura, molto valido e ad un prezzo abbordabile.
   Renato Conte (
co...@dsi.unive.it
)
   "Il Mondo degli Oggetti: Programmazione in C++"
   Edizioni Progetto - Padova
   Buon libro, adatto a chi ha conoscenza di programmazione in Basic,
   Pascal o altro e vorrebbe imparare da 0 il C++, semplice, con tanti
   esempi, chiaro e bene impaginato. Essendo lo scrittore italiano ed
   essendo disponibile l'indirizzo e-mail e' possibile contattarlo per
   chiarimenti, suggerimenti o altro.
   Nicolai Josuttis, 
   "The C++ standard library, a tutorial and a reference"
   Addison-Wesley
   Un altro ottimo testo.
 
   J.Coplien,
   "Advanced C++ Programming Styles and Idioms"
   Addison Wesley?
   Il breve commento che lo descrive sul sito di Infomedia:
   "Per approfondire le caratteristiche del linguaggio. Tra cui:
   programmazione object oriented, ereditarieta' multipla, tipi di
   dati astratti ed altro".
   In realta' sono trattati argomenti anche un po' distanti dal C++
   (o meglio concetti che derivano da altri linguaggi, come per
   esempio la Programmazione Orientata agli Accessi, tecniche di
   Reflection, ecc.).
   Purtroppo e` molto datato ma puo` essere comunque una lettura
   assai interessante.
   J.Coplien,
   "Multi-Paradigm DESIGN for C++"
 
   E` piu` un libro sul design del software che sulla programmazione,
   d'altronde pero` il design e` importante almeno tanto quanto
   la programmazione.
   E. Gamma, R. Helm, R. Johnson, J. Vlissides
   "Design Patterns, Elements of reusable Object-Oriented Software"
   Addison Wesley
   Una raccolta di pattern molto importanti e di impiego generale, non
   tratta dunque la programmazione in C++, ma ha piu` a che vedere col
   design. Non deve mancare nella libreria (e nella testa) di un
   professionista del C++.
   J. Lakos
   "Large-Scale C++ Software Design"
   Addison Wesley
   Dedicato alla progettazione di applicazioni C++ (molto) grosse!
   E` possibile trovare delle recensioni su questi ed altri libri
   sul sito 
http://www.accu.org/bookreviews/public/index.htm
7) Che cosa e` la memoria dinamica? Come si usa?
R) In C++ e` possibile allocare la memoria solo quando serve, ad
   esempio quando non si sa a priori quanta memoria serve per
   memorizzare una lista di valori di un certo tipo.
   Questa memoria la si alloca e dealloca attraverso l'uso dei
   puntatori e degli operatori new (new[]) e delete (delete[]).
   Ad esempio se vogliamo allocare memoria per una variabile di tipo
   T possiamo scrivere:
 
   T* VarPtr = new T(/* parametri costruttore */);
   Per utilizzare questa variabile basta dereferenziare VarPtr:
   cout << *VarPtr << endl;   // supponendo l'esistenza di
                              // ostream& operator<<(ostream&, T&)
   *VarPtr = NewValue         // assegnamento...
   Per allocare un intero array bisogna utilizzare invece la forma
   T* MyArray = new T[Size];
   cout << MyArray[0] << endl;
   MyArray[5] = NewValue;
 
   E` necessario ricordarsi di deallocare la memoria dinamica
   quando non serve utilizzando sempre e solo l'apposito operatore:
   delete VarPtr;     // per singoli elementi
   delete[] MyArray;  // per gli array
   In C sono poi disponibili anche le funzioni malloc e free, ma il
   loro uso e` sconsigliato in C++.
   Infine e` spesso assai piu` proficuo utilizzare le classi
   fornite dalla libreria standard del C++ che sollevano il
   programmatore dalla necessita` di tenere traccia delle
   allocazioni e delle deallocazioni semplificandone il lavoro.
   Ad esempio std::auto_ptr<> e` una classe che incapsula un
   puntatore intelligente che quando distrutto libera automaticamente
   anche la memoria.
   Un altro approccio si basa sull'uso di classi come std::vector<>
   std::vector<T> vT;
   // un T alla volta...:
   vT.push_back(T());    // con il ctor di default
   // e/o, anche, molti T alla volta...:
   vT.resize(23);           // altri 22 ctor di default
   vT.push_back(T(args));    // con altri ctor
   Questo ha tra l'altro gli stessi vantaggi di std::auto_ptr<>,
   in quanto gli oggetti contenuti in vT vengono automaticamente
   cancellati dal distruttore di vT stesso.
   Esistono anche altri contenitori standard, come std::list<>,
   std::set<>, std::map<>, ..., per esigenze particolari, ma
   std::vector<> e` di gran lunga il piu` utile e comune per
   la semplice allocazione dinamica.  Per il caso particolare,
   molto comune, di stringhe di caratteri di lunghezza dinamicamente
   variabile, std::string (e std::wstring, per usare Unicode) sono
   anche molto, molto pratiche.
   Il C++, essendo un linguaggio adatto anche a "programmazione di
   sistema" (cioe` di bassissimo livello), offre anche delle forme
   alternative di allocazione dinamica, che sono quelle che,
   internamente, strutture come std::vector possono usare per offrire
   la loro comoda ed efficiente funzionalita` (queste funzionalita`
   vanno incapsulate in un oggetto di tipo "allocatore" perche` 
   std::vector e soci possano poi usarle).
   In pratica, non si presenta mai una vera necessita` di
   accedere a queste funzionalita` di bassissimo livello
   (come new[]/delete[], malloc/free, e altre, meno portatili, come
sbrk
   su Unix, VirtualAllocEx su Win32, CoTaskMemAlloc nell'ambito di un
   utilizzo del COM o DCOM, eccetera eccetera), se non per
   compatibilita` con vecchio codice scritto con l'uso di esse, o
   interfacce di sistema di bassissimo livello; infatti, std::vector
   (e gli altri contenitori standard) fanno in pratica tutto quello
   che serve, al limite con l'aiuto di un oggetto allocatore non
   standard per esigenze peculiari.
8) Come posso allocare dinamicamente una matrice a piu` dimensioni e 
   utilizzare la notazione M[i][j]?
R) Ecco alcune possibilita`, alcune richiedono un po' di impegno,
   studiatele bene prima di porre eventuali quesiti sul NG.
   Approccio tradizionale di basso livello:
   #include <iostream>
   #include <iomanip>
   using namespace std;
   int main() {
     int** Matrice = new int* [10];
     // alloca la prima dimensione
     for(int i=0; i<10; ++i)
       Matrice[i] = new int [10];
     // allocazione della seconda dimensione
     // e inizializzazione della matrice
     for(int i=0; i<10; ++i)
       for(int j=0; j<10; ++j)
         Matrice[i][j] = (i+1) * (j+1);
     // visualizza il valore dei vari elementi
     for(int i=0; i<10; ++i) {
       for(int j=0; j<10; ++j)
         cout << setw(3) << Matrice[i][j] << " ";
        cout << endl;
      }
     // Deallocazione della matrice.
     // Notare che la deallocazione avviene in ordine
     // inverso rispetto all'allocazione
     for(int i=0; i<10; ++i)
        delete[] Matrice[i];
     delete[] Matrice;
   }
   Un approccio basato su vector:
   #include <vector>
   template<class T>
   class matrix {
       typedef std::vector<T> riga;
       std::vector<riga> body;
     public:
       void setSize(int x, int y) {
         body.resize(0);    // getta tutto
         body.resize(x);    // riparte
         for(int i=0; i<x; ++i)
           body[i].resize(y);
       }
       void getSize(int &x, int &y) {
         x = body.size();
         if(x) y=body[0].size();
         else y=0;
       }
       matrix() {}
       matrix(int x, int y) { setSize(x,y); }
       // non occorre dtor esplicito, quello di
       // default e` OK
       std::vector<T>& operator[](int i) { return body[i]; }
       const std::vector<T>& operator[](int i) const { return body[i];
}
   };
   Un altro, piu` a basso livello e che presenta eguale
   interfaccia d'uso pur utilizzando in realta` un semplice
   vettore e non una matrice:
   template<class T>
   class matrix {
       T* body;
       int x; int y;
     public:
       void setSize(int x, int y) {
         if(body) delete[] body;    // getta tutto
         body = new T[x*y];         // riparte
         this->x = x;
         this->y = y;
       }
       void getSize(int &x, int &y) {
         x = this->x;
         y = this->y;
       }
       matrix(): body(0) {}
       matrix(int x, int y): body(0) { setSize(x,y); }
       ~matrix() { if(body) delete[] body; }
       T* operator[](int i) { return body+i*y; }
       const T* operator[](int i) const { return body+i*y; }
   };
9) Che cosa e` un header? Come si creano e come si usano?
R) Un header è un file di testo (con estensione .h o .hpp o altro)
   contenente normalmente dichiarazioni di funzioni, tipi, classi...
   Lo scopo principale di un header file è quello di raggruppare in un
   unico punto del programma tutte le dichiarazioni relative ad un
   certo argomento (ad esempio, parlando di header files standard,
   tutte quelle riguardanti l'I/O su stream o quelle riguardanti il
tipo
   std::vector in vector.h) ed evitare così possibili errori di
   battitura da parte del programmatore e rendere piu` gestibile un
   programma.
   In un file header e` comunque possibile (e in alcuni casi
necessario)
   inserire anche definizioni di funzioni, variabili, costanti...
   Una volta creato un header per utilizzarlo si utilizza la direttiva
   #include "file.h" all'interno dei file che ne fanno uso.
   Per maggiori dettagli si rimanda ad un qualsiasi libro (tutorial)
   su C/C++.
10) Se separo le definizioni di un template dalla sua dichiarazione
    ponendole in file separati (.h e .cpp) non riesco ad istanziarlo.
    Come posso risolvere il problema?
R)  Gli attuali compilatori hanno bisogno di avere completo accesso
    sia alla dichiarazione che alla definizione di un template quando
    questo viene istanziato. Come conseguenza di cio` non e`
    possibile separare le definizioni dalle dichiarazioni, tutto deve
    essere messo in un unico file header (.h).
11) Come si passa un array ad una funzione in C++?
R)  In C++ un array non puo` essere passato come parametro allo
    stesso modo di una struttura o un altro aggregato.
    Sebbene sia possibile dichiarare la funzione nel seguente modo:
    const size_t Size = 100;
    void MyFunc(T array[Size]); 
    in C (e di conseguenza anche in C++) un parametro di tipo array
    di T decade a puntatore a T e Size perde di significato
    cosicche` e` possibile scrivere
    T MyArray[Size/2];
    MyFunc(MyArray);   // con tutte le conseguenze del caso
    Il modo classico in C/C++ di passare un array come parametro
    e` quello di passare un puntatore al primo elemento e la
dimensione
    dell'array:
    void MyFunc(T* Array, size_t ArraySize) {
      for(size_t i=0; i<ArraySize; ++i)
        cout << Array[i] << endl;
    }
    Questo metodo si applica sia ad array statici che array
    allocati dinamicamente:
    int main() {
      const size_t Size = 100;
      T MyArray[Size];
      T* MyDynArray = new T[Size];
      MyFunc(MyArray, Size);
      MyFunc(MyDynArray, Size);
      return 0;
    }
    Una soluzione alternativa ed elegante e` quella di utilizzare i
    template e la deduzione implicita dei parametri, ma richiede un
    compilatore standard (o almeno sufficientemente standard):
    template<typename T, size_t Size>
    void MyFunc(T (&Array)[Size])  {
      for(size_t i=0; i<Size; ++i)
        cout << Array[i] << endl;
    } 
    int main() {
      int Array1[5];
      int Array2[100];
      MyFunc(Array1);
      MyFunc(Array2);
      return 0;
    }
    Infine una soluzione quasi sempre molto valida e` quella di
    utilizzare la classe std::vector<> al posto dei tradizionali
    array:
    typedef std::vector<int> ArrayOfInt;
    void MyFunc(ArrayOfInt& array);
    ArrayOfInt MyArray;
    MyFunc(MyArray);    // passaggio di un array
12) Come posso generare numeri casuali?
R)  La libreria standard del C (e quindi del C++) prevede le
    funzioni srand() e rand().
    La prima serve a inizializzare il generatore di numeri casuali,
    la seconda invece restituisce un numero casuale nell'intervallo
    0..RAND_MAX. Se vuoi ottenere valori inferiori a RAND_MAX
    e` importante non utilizzare l'operatore di modulo:
    int random_fra_0_e_99() {
      return rand() % 100;
    }
    poiche` in questo modo otterresti una sequenza di qualita`
    assai scarsa... molto meglio utilizzare
    int un_po_meglio_fra_0_e_99() {
      static const double divisore = (1.0 + RAND_MAX)*100.0;
      return static_cast<int>(rand()/divisore);
    }
    RAND_MAX, srand() e rand() sono dichiarate in stdlib.h
13) Come mai ottengo sempre la stessa sequenza di numeri casuali?
R)  Ti sei ricordato di effettuare l'inizializzazione del generatore
    di numeri casuali? Hai evitato di inizializzarlo sempre con
    lo stesso seme? Un buon modo di fare tutto cio` e`:
    #include <stdlib.h>
    #include <time.h>
    /* ... */
    srand(static_cast<unsigned>(time(0)));
14) La sequenza generata da rand() non e` molto buona, dove posso
    trovare generatori di numeri casuali piu` validi?
R)  Il generatore fornito dalla libreria standard non e` solitamente
    di alta qualita`, anche se ha il pregio di essere veloce... Se hai
    esigenze piu` spinte, questo piccolo elenco comprende sia testi
    di teoria, sia software gia` fatto, sia informazioni sui
generatori
    hardware (non pseudo, ma VERI numeri casuali) accessibili via
rete.
 
http://csep1.phy.ornl.gov/rn/rn.html
 
http://random.mat.sbg.ac.at/
 
http://www.math.keio.ac.jp/~matumoto/emt.html
 
http://nhse.npac.syr.edu/random/
 
http://www.taygeta.com/random.xml
 
http://lavarand.sgi.com/
 
http://www.fourmilab.ch/hotbits/
 
http://www.ncsa.uiuc.edu/Apps/CMP/RNG/mascagni/www-rng.html
 
http://random.mat.sbg.ac.at/ftp/pub/data/winrand.zip
 
http://webnz.com/robert/nzc_nr02.html
 
http://www.math.keio.ac.jp/~matumoto/emt.html
 
http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html
15) Che differenza c'e` tra STL e la libreria standard del C++?
R)  La libreria standard del C++ trae spunto da STL, il lavoro
    sviluppato da Alexander Stepanov. Molte delle funzionalita`
    offerte da STL sono state inserite nella libreria del C++,
    tuttavia la libreria del C++ non e` STL.
    STL rimane un progetto a se stante e in continua evoluzione,
    mentre il contenuto della libreria standard del C++ e` deciso
    unicamente dal comitato ANSI/ISO.
16) Lavorando con i numeri in virgola mobile, non riesco ad ottenere
    risultati precisi, perche`?
R)  E` normale, la rappresentazione dei numeri reali in base (base 10,
    base 2,...) e con un numero finito di cifre comporta inerentemente
    un errore di approssimazione. Ad esempio 1/3 in base 10 non puo`
    essere rappresentato con un numero finito di cifre, 1/10 che in
base
    10 equivale a 0.1, in base 2 e` periodico (proprio come 1/3 in
base
10).
    Infine ci sono anche i numeri irrazionali (es. sqrt(3)) che per
    loro natura non sono mai rappresentabili con precisione in alcuna
base.
    Cio` significa che lavorando con i numeri reali devi sempre
aspettarti
    risultati affetti da errori di approssimazione. Tali errori
possono
essere
    anche molto significativi poiche` le operazioni aritmetiche
tendono
    ad amplificarli.
    Per maggiori riferimenti, puoi leggere
    "Introduzione alla matematica computazionale"
    di R. Bevilacqua, D. Bini, M. Capovani, O. Menchi
    edito da Zanichelli

 ========================================================================
Scusa, non ti sembra il caso di aggiornare numero di revisione e data se
vengono aggiunte nuove domande/risposte?
EMG

vengono aggiunte nuove domande/risposte?
Scusa per il ritardo di risposta, ma era finito nell'ignore dopo il
supersedes della nuova versione...
Non sono state aggiunte domande/risposte, la rev. 1.2.1 ha invece la
codifica a 7-bit invece di 8 (miglior compatibilita'), per il resto
sono sempre la 1.2.
Il fatto che vengano postate e' che le posto periodicamente (o quasi),
il sabato o, al massimo, come oggi visti i problemi avuto con Winzozz,
alla domenica, qui e su it.faq.
-- 
DGP85
http://daps.cjb.net/
Don't change the address.
No Binaries or HTML at this address.

 wrote :
| Non e' coraggio. Comunque Win32 non e' solo Winzozz 9x, ma anche
| Winodws NT (si', Windows NT, NT si' che e' un sistema operativo).
Se ne potrebbe discutere... ma e' gia' stato fatto :)
Non mi ricordo il link, ma c'e' un bel sito sul confronto tra OS 'seri', in
cui si valutano, oltre ai costi, le prestazioni su macchine equivalenti, e,
be' se non e' ultimo, poco ci manca...

 L'hai mai provato con GNOME?
Scusate se mi intrometto ma pure io sono del parere che non bisogna fare
confronti o comunque bisogna farli sui giusti livelli. Reputo i vari s.o.
(9x, NT, Linux, BeoS, ecc.) validi per il target presupposto.
Trovo a distanza di anni veramente sconcertante sentire ancora di questi
battibecchi scolastici, tantopiù quando tali battibecchi avvengono non tra
ragazzini smanettoni ma tra professionisti con una certa esperienza.
Veramente: non se ne può più.

be' se non e' ultimo, poco ci manca...
Io ho provato sulla mia macchina Mandrake Linux 7.0, WinLinux 2k,
Windows 95 OSR 2, Windows 98 Upgrade, Windows 98 SE e Windows NT 4.0,
NT si classifica ben prima di Winzozz9x.


ragazzini smanettoni ma tra professionisti con una certa esperienza.
Grazie ;-) lo devo prendre come complimento ;-)


NT si classifica ben prima di Winzozz9x.
E se provi W2000 spazzi via tutti, fidati!
Luc.

E se provi W2000 spazzi via tutti, fidati!
Mi pare non abbia il supporto per la 3dfx voodoo banshee, per questo
non lo metto su...
e non so neppure se la stampante Xerox nuova sia supportata...


 sistema.
Proprio per questo il confronto non mi sembra corretto. Analizzare la
complessità senza tenere conto da quali basi si è partiti e quali fini si
tenta di raggiungere mi sembra limitativo.

tenta di raggiungere mi sembra limitativo.
Stai per spezzare una lancia a favore di Linux o di Winzozz?
Per il primo e' quello che sto facendo, per il secondo non capisco
cosa intendi.


 wrote :
| Io ho provato sulla mia macchina Mandrake Linux 7.0, WinLinux 2k,
| Windows 95 OSR 2, Windows 98 Upgrade, Windows 98 SE e Windows NT 4.0,
| NT si classifica ben prima di Winzozz9x.
Ma io parlavo di OS 'seri' :)
Intendevo su server (cosa per cui NT e' nato) che devono lavorare H24, dove
il minimo tempo di downtime crea perdite.
E un SO che non fornisce un MTA, un Internet server, un ftp server, un
telnet server, un benche' minimo server oltre ai messaggi di windows, pur
costando fior di milioni, e che e' nato per dei server aziendali, be', non
mi sembra 'serio'.
Follow up su news:it.comp.os.dibattiti

 cosa intendi.
Hai ragione, diciamo che è a favore dei s.o. Microsoft.
Linux non ha bisogno di essere *difeso* in quanto è un s.o. usato
prevalentemente da professionisti. Personalmente non cambierei il mio
mail/web server su Linux (sono tre anni che marcia come un treno in
discesa), come non cambierei la mia rete aziendale su NT dalla quale riesco
ad ottenere prestazioni inimmaginabili per Linux.

 ad ottenere prestazioni inimmaginabili per Linux.
Cosa intendi per "prestazioni"?
Ciao,
Nicola


La media di tutti i fattori di produttività legati all'utilizzo dei sistemi
informatici per una qualsiasi azienda informatizzata come la nostra.



Primo fra tutti la rapidità/facilità di configurazione del sistema...
Luc.

 Primo fra tutti la rapidità/facilità di configurazione del sistema...
Su questo non sono completamente d'accordo. E' vero che NT nasconde bene
la complessita' dei task di configurazione piu' comuni, aspetto sul
quale Unix e' sempre stato indietro e sul quale a mio avviso si e'
giocato la possibilita' di costituire un alternativa per il desktop, sia
pure di fascia alta.
Passato un livello iniziale pero' configurare un sistema NT diventa
piuttosto complesso, l'interfaccia grafica risulta piu' un impiccio che
un aiuto e l'accesso via linea di comando non e' certo piu' pratico che
su sistemi Unix.
I quali per queste cose sono secondo me un po' piu' uniformi
nell'approccio e quindi piu' intuitivi.
Ci sono poi aspetti assolutamente ridicoli, come la molteplicita' di
casi in cui per attivare una modifica di configuarazione e' necessario
riavviare il sistema.
Ciao,
Nicola

Nicola
Su questo hai ragione, ma lo sanno anche in Microzzoz, infatti con
W2000 le cose sono un po migliorate...
Luc.

tenta di raggiungere mi sembra limitativo.
Ok
Quanto a basi win9x è quello messo peggio di tutti, in quanto supporta ancora
il dos a livello molto basso. Inoltre è troppo complesso (IMHO) per il target
che si propone (e per complessità intendo qualcosa tipo "spaghetti code", con
l'accezione + negativa possibile).
Con win nt invece la compatibilità a basso livello col dos non c'è, ed infatti
è migliore per performace e stabilità (rispetto a win 9x). E' anche più
complesso perchè ha delle funzionalità "evolute" per la gestione delle reti.
Il suo problema + grande è la poca flessibilità di configurazione (IMHO è
difficile fare di meglio senza usare i files di testo). Inoltre è troppo
giovane, almeno rispetto ai sistemi di classe Unix (vedi Linux...).
Questi ultimi hanno dalla loro decenni di esperienza in settori critici.
Poi Linux ha anche un vantaggio rispetto agli altri Unix, poichè, pur rimanendo
saldamente ancorati alle specifiche unix il suo codice è stato riscritto da 0
in tempi relativamente recenti (comunque prima di nt) ed è costantemente
aggiornato (vedi licenza kernel Linux)
Paolo
-- 
La mia chiave pubblica per PGP e GPG la trovi qua:
http://web.tiscalinet.it/paolo_bernardi/pbkey.asc