Newsgroup: it.comp.lang.c++
Titolo: Perche' non funziona ?

Mi sapreste dire come mai questo programmino non funziona ?
#include <stdio.h>
#include <strng.h>
#include <List.h>
int main(void)
    {
    List l;
    String s;
    char c[100];
    int i;
    for (i = 0; i < 5; i++) {
        sprintf(c, "This is string n. %d", i);
        s = c;
        l.add(s);
        }
    l.printOn(cout);
    return 0;
    }
E questo e' l'output che genera (Borland Turbo C++ 3.0) :
List {
    This is string n. 4,
    This is string n. 4,
    This is string n. 4,
    This is string n. 4,
    This is string n. 4 }
Abnormal program termination
Null pointer assignment
Perche' c'e' sempre e solo l'ultimo elemento della lista ?
Qual'e' l'errore che causa il "Null pointer" ?
Come mai questo funziona quasi ? (sparisce l'Abnormal program
termination, gli elementi sono memorizzati giusti, rimane pero' il
Null pointer)
int main(void)
    {
    List l;
    String s1 = "uno";
    String s2 = "due";
    String s3 = "tre";
    String s4 = "quattro";
    String s5 = "cinque";
    l.add(s1);
    l.add(s2);
    l.add(s3);
    l.add(s4);
    l.add(s5);
    l.printOn(cout);
    return 0;
    }
Grazie in anticipo
Bye/ciao
Verno Vito Valerio
ve...@ibm.net
Genoa - Italy

>siano implementati.
Ooops. Io pensavo di si' visto che li ho trovati con il compilatore
(non ci si puo' piu' fidare nemmeno di Borland ?-(( )
Esistono classi standard che implementano il Btree e le liste ?
Posso inviarti i due .h cosi' mi ci dai una controllata (non superano
i 10 K) ?


 [...]
 Dandogli un'occhiata veloce, e facendo qualche assunzione ragionevole
sull' implementazione di list e string (in particolare sull'overload di
operator= di string), si puo' dire (forse) qualcosa:  *se*
String::operator=
_non_ fa una copia del buffer che gli passi, ma assegna semplicemente
un puntatore (che nel tuo caso punta ad un array locale), e ~String
tenta di
disallocare tale memoria, l'errore finale e' dovuto alla sequenza
'uscita da
main' -> deallocazione di c dallo stack -> distruttore di list ->
distruttore
di ciascun elemento (string) -> deallocazione di c (che pero' e' gia'
stato
deallocato, essendo automatic) -> errore.
Senza librerie non si puo' dire molto di piu', al volo. In ogni caso
prova a
dare un'occhiata alla STL, che da' ottime implementazioni di stringhe e
container vari, e pian piano e' sempre piu' supportata dai compilatori.
--
dr. Cristiano Sadun - Software Engineering and Consulting
***********Remove NOSPAM from address to reply***********
*********************************************************
"God is Real - unless declared Integer"

>e pian piano e' sempre piu' supportata dai compilatori.
Ci manca solo comprare un altro compilatore !


Vito,=20
Rispondo al tuo reply a Cristiano senza citarlo perch=E8 =E8 lunghetto.
L'errore =E8 probabilmente nel tuo codice e non in quello Borland. Ma
bisogna sapere come funziona il codice Borland per capire cosa =E8
successo. Cristiano avanza un'ipotesi che anchio avevo fatto (senza
scriverla perch=E8 immaginavo che non ci avresti capito nulla). Il =
codice
che alleghi sembra confermare (vedi il distruttore) una implementazione
per copia incondizionata. Bisogna per=F2 vedere come =E8 implementato =
il
costruttore che prende come parametro un const char * (anche se lo
stesso valore di default assegnato sembrerebbe implicare che tale
parametro va inteso come originale di cui fare una copia dinamica).
Purtroppo tale implementazione ci =E8 ancora oscura dato che non l'hai
inclusa. E non hai detto nulla relativamente alle liste (infatti se =E8
come penso il problema non sta nelle stringhe ma nelle liste).
Dici che il C++ ti delude. Ma ho l'impressione che tu stia tentando di
usare delle classi che fanno parte di una gerarchia Borland =
proprietaria
progettata quando ancora il C++ era in via di definizione. Io non
conosco bene le versioni di Borland, ma sapi che il vero standard C++ =
si
st=E0 chiudendo solo ora e che fino al CD1, nel tardo 1995, il =
linguaggio
=E8 stato molto suscettibile di cambiamenti. Non esiste un compilatore
venduto prima dell'estate 1996 che supporti appena decentemente il
linguaggio C++ cos=EC come lo si intende oggi. E persino gli =
ultimissimi
compilatori non supportano il linguaggio al 100% (soprattutto nell'area
delle caratteristiche avanzate dei templates).
Quando parli di aggiornamento dei compilatori e di compatibilit=E0 con
altre versioni devi sempre tenere presente due cose. Due =
implementazioni
sono compatibili nei limiti della loro corrispondenza allo standard. Lo
standard non esiste ancora (ufficialmente, anche se si sa gi=E0 cosa
dir=E0).=20
STL significa Standard Template Library ed =E8 un subset della libreria
standard ANSI. La libreria standard ANSI =E8 infatti suuddivisa
logicamente in vari gruppi funzionali, di cui STL =E8 forse il pi=F9 =
famoso.
Se i tuoi manuali ed help in linea non citano la STL probabilmente stai
usando un compilatore con pi=F9 di un anno di vita, il che significa =
che
non supporta (almeno non nel senso odierno del termine) il linguaggio
C++. Se vuoi lavorare in C++ non solo devi utilizzare un compilatore
"recente" ma devi anche essere pronto ad upgradare ancora, dato che, =
per
quanto ne so, nessun compilatore esistente supporta ancora al 100% il
linguaggio.
---
     Andrea Ferro
SW.AN. Technologies s.a.s.
Merate (Lc)          Italy

 Ci manca solo comprare un altro compilatore !
Ce ne sono anche gratis! - gcc e la sua versione dos, djgpp, sono trai
migliori disponibili.


>linguaggio.
Come forse ho gia' detto il mio rapporto con il C++ e' molto freddo.
Con il C normale riesco a fare qualcosa ma non sono mai riuscito a
capire il C++. Adesso cercavo di capirci qualcosa visto che ho piu'
tempo e che magari potrebbe venirmi utile per cercare un lavoro (che
tanto non trovero' mai).
Grazie a tutti
