Newsgroup: it.comp.lang.c++
Titolo: gcc e std::vector

Ho appena notato che gcc 2.95 non mi riconosce la funzione
std::vector::at,
mentre non crea problemi con std::vector::operator[] (che pero` non ha
proprio la stessa semantica).
Mi pare molto strana la cosa... Cosa vi risulta in merito?
E` un problema della mia installazione o no.
Segue un frammento di codice che riproduce il problema:
#include <vector>
#include <string>
using std::vector;
using std::string;
int main() {
  vector<string> v(5);
 
v.at
(2) = "test";
}
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

]

 
No, non è un problema tuo. La GNU Standard C++ Library distribuita con il
gcc 2.95 non fornisce il metodo at per vector.
La versione più recente della libraria, invece, sì.
 
http://sourceware.cygnus.com/libstdc++/
Max

 std::vector::at,
Neanche il mio DJGPP. Quel cavolo di libreria standard fa proprio
schifo... :-(
EMG

 proprio la stessa semantica).
Il problema e' non di gcc in se, ma della vecchia libreria (libstdc++
versione 2).  gcc con la nuova libreria (libstdc++ versione 3) e KCC
compilano senza difficolta'.
Colgo l'occasione per dire che della nuova libreria (versione 3) e'
stata appena rilasciata una nuova versione, l'ottava (la 2.90.8); che
questa libreria e' matura e ben fatta (io ho rilevato solo qualche
idiosincrasia rimasta per gli string streams) e che e' banale
istallarla al posto della vecchia (magari in un differente albero se
si vuole mantenere la backward compatibility).  Verra' fornita di
serie col futuro gcc 3, ma si puo' usarla anche col gcc 2.
Quello che bisogna fare per istallarla e' chiaramente descritto nella
documentazione; e sono disposto a dare istruzioni passo passo se
qualcuno trovasse un inglese, pur cosi' semplice, ostico da capire
(ricordo pero' che lavoro solo sotto Unix).
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

1) Prelevare le distribuzioni e metterle in una apposita directory
   (per me /usr/archive/dist/):
$ cd /usr/archive/dist/
$ ftp 
ftp.funet.fi
                                                        [1.1]
Name (ftp.funet.fi:loreti): anonymous
Password: il_mio_indirizzo_email
ftp> bin
ftp> cd /pub/mirrors/
ftp.gnu.org/pub/gnu/gcc
ftp> get gcc-g77-2.95.2.tar.gz
ftp> cd /pub/mirrors/
sourceware.cygnus.com/pub/libstdc++
ftp> get libstdc++-2.90.8.tar.gz
ftp> quit
Note:
[1.1] Il sito ufficiale per gcc e' 
ftp.gnu.org
; quello per libstdc++ e'
 
sourceware.cygnus.com
 .  Entrambi i siti sono lenti dall'Italia,
      ed entrambi accettano fino ad un massimo di 30 connessioni (e sono
      sempre saturi).  
ftp.funet.fi
 e' un mirror veloce di entrambi i siti,
      ma voi potete ovviamente sceglierne un altro.  Per la documentazione,
      guardare 
http://gcc.gnu.org/
 per gcc; e, per le librerie,
 
http://sourceware.cygnus.com/libstdc++/
 .
2) Spacchettare le distribuzioni in un'altra directory (per me
   ~/work/) E LEGGERSI *CON* *CURA* LE ISTRUZIONI:
$ cd ~/work
$ gzip -dc /usr/archive/dist/gcc-2.95.2.tar.gz | tar xof -
$ cd gcc-2.95.2
$ more README
$ cd install
$ more CONFIGURE BUILD TEST FINALINSTALL SPECIFIC
3) Sostituire alla libreria c++ versione 2 quella versione 3 (vedere
   per i particolari 
http://sourceware.cygnus.com/libstdc++/configopts.html
   e 
http://sourceware.cygnus.com/libstdc++/install.html
) :
$ cd ~/work/gcc-2.95.2/
$ rm -rf libio/ libstdc++/
$ gzip -dc /usr/archive/dist/libstdc++-2.90.8.tar.gz | tar xof -
$ mv libstdc++-2.90.8/ libstdc++/
4) Costruirsi il compilatore e le librerie, nel processo a tre stadi
   consigliato:
$ cd ~/work
$ mkdir objdir
$ cd objdir
$ ../gcc-2.95.2/configure i686-pc-linux-gnu --prefix=/usr/local/libv3     [4.1]
$ make bootstrap                                                          [4.2]
$ make info                                                               [4.3]
Note:
[4.1] Il mio compilatore con la libreria versione 2 e' in un altro albero
      di files (/usr/soft : gli eseguibili sono quindi in /usr/soft/bin).
      Il compilatore verra' configurato per l'albero /usr/local/libv3 ,
      dunque con gli eseguibili in /usr/local/libv3/bin .  A seconda di
      quale directory (tra /usr/soft/bin e /usr/local/libv3/bin) venga
      prima nel PATH, verra' usata la libreria relativa.  Se si vuole
      ricreare solo il compilatore C++ e non l'intera suite, si puo'
      aggiungere alla fine l'opzione --enable-languages=c++ .
[4.2] La suite dei compilatori viene creata correttamente, ma il
      processo abortisce in seguito creando le librerie runtime.  Il
      motivo e' che il compilatore viene richiamato con l'opzione
      -Werror (vuol dire: anche se c'e' un semplice warning, trattalo
      come se fosse un errore e termina); e viene generato, appunto, un
      warning quando il compilatore si rifiuta di "inlinare" una
      procedura dichiarata "inline", compilando stringMAIN.cc.  Bisogna
      allora vedere dove e' contenuta l'opzione -Werror:
      $ find . -name Makefile -exec grep -l Werror {} \;
      ed editare il Makefile, cambiando la riga che contiene il testo
      "WERROR = -Werror" in una che contenga invece "WERROR = "; e poi
      ricominciare il processo.
      $ vi i686-pc-linux-gnu/libstdc++/src/Makefile
      ...
      $ make
[4.3] Solo se si desidera la documentazione sotto forma di info files
5) Istallazione (come superuser)
$ su
$ make install
$ exit
6) Uso
$ cat foo.cxx
#include <iostream>
int main() { std::cout << "Hello, world" << std::endl; }
$ g++ -ansi -Wall -fhonor-std -o foo foo.cxx
$ ./foo
L'opzione "-pedantic", cosi' cara a chi compila codice ANSI C, e' il
default per il compilatore C++ (per disabilitarla, -fpermissive).  Il
compilatore inoltre (g++ versione 2.95.2) come default ignora le
specifiche std:: , a meno che non compaia l'opzione -fhonor-std ; ma i
nomi della libreria versione 3 sono "manglati" (sp?) tenendone conto,
per cui se non si usa -fhonor-std dara' poi errore il linker.


 ftp> get gcc-g77-2.95.2.tar.gz
       ^^^^^^^^^^^^^^^^^^^^^^^^^
       get gcc-2.95.2.tar.gz


compilano senza difficolta'.
Grazie al tuo link ho scaricato la nuova libreria, conto di installarla 
e provarla al piu` presto.


 e provarla al piu` presto.
Se qualcuno dovesse compilarsi tale libreria standard aggiornata con il
DJGPP avrebbe poi la gentilezza di inviarmi il file libstdcxx.a cosě
ottenuto?
Grazie.
EMG