Newsgroup: it.comp.lang.c++
Titolo: il nullo per gli interi?

salve ragazzi,
domanda banale (come sempre!): esiste un valore nullo per gli int? tipo lo 0
o il NULL per i puntatori o il /0 per i char.
grazie
ivan

domanda banale (come sempre!): esiste un valore nullo per gli int?
Aspetta.... fammi pensare.... può essere che sia lo zero ?
No trolls, please.
-- 
Andrea Laforgia
#exclude <windows.h>

1
"Ivan Sofa n.1" <dromeda...@inwind.itDELETE> wrote in message
news:aP71a.96140$ZE.26...@twister2.libero.it...

Prima di fare certe domande ed inviare il post e' opportuno fare un
sospirone e contare fino a 10.
Eddai su! :-)
Maurus

 ha scritto nel messaggio
news:b232hq$18aik1$1...@ID-125555.news.dfncis.de...

calma! io intendo dire come potrei dire che in un lista di int un valore non
appartiene alla lista. 0 può appartenere, è cmq un elemento della lista.
insomma l'int vuoto come lo "delineo"?
ivan

"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:0c2a4vkgbjd9k20h8...@4ax.com...
| On Sat, 08 Feb 2003 13:42:30 GMT, "Ivan Sofa n.1"
| <dromeda...@inwind.itDELETE> wrote:
|
| >domanda banale (come sempre!): esiste un valore nullo per gli int?
|
| Aspetta.... fammi pensare.... può essere che sia lo zero ?
|
| No trolls, please.
|
io troll? sarò inesperto ma non troll e che diamine.
ivan

 
Penso di no, non mi sembra che la domanda sia cosě banale, forse solo un 
po' OT, perchč non č specifica di C++ ma riguarda una problematica un 
po' piů generale.
Per i puntatori il valore 0 o NULL č "speciale" nel senso che indica 
chiaramente un puntatore che non punta ad alcun oggetto.
Per i char lo '\0' č anche lui "speciale" perchč pensando alle stringhe 
(in senso c terminate da '\0') č riservato ed ha un signifcato particolare.
Per gli interi non vedo una corrispondenza diretta, lo 0 č un valore 
ammissibile del tutto analogo agli altri valori.
Problemi di questo tipo (differenza tra intero 0 e "null", tra stringa 
vuota (con 0 caratteri) e "null") si vedono purtroppo molto spesso in 
programmi che si interfacciano con database (che solitamente prevedono 
il concetto di null anche per i tipi base) realizzati un po' di corsa.

 ha scritto nel messaggio
news:Hm81a.95408$YG2.2...@twister1.libero.it...
| Andrea Laforgia ha scritto:
| > On Sat, 08 Feb 2003 13:42:30 GMT, "Ivan Sofa n.1"
| > <dromeda...@inwind.itDELETE> wrote:
| >
| >
| >>domanda banale (come sempre!): esiste un valore nullo per gli int?
| >
| >
| > Aspetta.... fammi pensare.... puň essere che sia lo zero ?
| >
| Penso di no, non mi sembra che la domanda sia cosě banale, forse solo un
| po' OT, perchč non č specifica di C++ ma riguarda una problematica un
| po' piů generale.
| Per i puntatori il valore 0 o NULL č "speciale" nel senso che indica
| chiaramente un puntatore che non punta ad alcun oggetto.
| Per i char lo '\0' č anche lui "speciale" perchč pensando alle stringhe
| (in senso c terminate da '\0') č riservato ed ha un signifcato
particolare.
| Per gli interi non vedo una corrispondenza diretta, lo 0 č un valore
| ammissibile del tutto analogo agli altri valori.
bravissimo, hai centrato perfettamente il mio problema!
come potrei risolverlo?
nel programmino che sto preparando mi limito a usare un -1 per considerarlo
fuori dalla lista degli int ma solo perchč la mia lista accetta solo int
positivi.
e se dovessi esser costretto ad accettare anche i negativi?
grazie mille per l'attenzione e per la corretta interpretazione del mio
problema! :-)
ivan

 e se dovessi esser costretto ad accettare anche i negativi?
Una volta ho per così dire risolto il problema usando INT_MIN
Questo valore è già di per sè brutto perchè è un negativo che non ha un 
positivo corrispondente: se non sbaglio -INT_MIN == INT_MIN, ma non so 
se questo fatto è standard o semplicemente tollerato.
Questo però rende il codice un po' più complicato.
Un' altra soluzione è aggiungere un livello di indirezione e trattare 
tutti gli oggetti (interi o in questo caso qualunque altro) mediante 
puntatori (o collezioni di puntatori). In questo modo si scarica sul 
valore NULL del puntatore la "nullità" attribuita all'oggetto.
Anche in questo caso il codice diventa più complesso (e lento).

(in senso c terminate da '\0') è riservato ed ha un signifcato particolare.
No, per i char, lo '\0' o 0 non è affatto "speciale".
La convenzione usata per rappresentare le stringhe "a-la-C" non fa
parte delle specifiche del _linguaggio_.


come potrei risolverlo?
Non puoi, in C++ standard.
Alcuni sistemi (vedi C++ Builder) mettono a disposizione il tipo
Variant, che è studiato apposta per l'uso con i database e consente di
memorizzare il valore Null, ma l'uso di questo "tipo" è dispendioso.


 Aspetta.... fammi pensare.... può essere che sia lo zero ?
forse intendeva il terminatore di un array di int, che non esiste

 problema! :-)
Usa una classe, oppure un puntatore a un intero (a me piace di più la
classe, dato che poi devi usare il delete per ogni intero che usi e il
codice diventa più "prolisso").

 
Ma delle librerie standard sě !?
Es. il primo parametro del costruttore di std::ofstream č di tipo
const char *
e si suppone che venga passato un puntatore a una sequenza di char 
terminata dal carattere '\0'

Ma delle librerie standard sě !?
Le librerie standard si adeguano, appunto, alla convenzione, ma questo
non vuol dire che la specifica del linguaggio assegni allo 0, per il
tipo "char", un valore speciale.




Devi inventarti qualcosa...potresti utilizzare variabili long e fissare
un tuo limite minimo e massimo, e poi assegnare il valore "nullo" ad un
valore al di fuori del range che hai stabilito...


Hai ragione, non ti  avevo capito io e non avevo contato fino a 10 prima di
risponderti!
Io di solito uso un valore che so che la mia variabile non assumera' mai.
Ma se la variabile intera puo' assumere uno qualunque degli interi
ammissibili sulla piattaforma (ovvero nell'intervallo (INT_MIN, INT_MAX) nel
caso di variabile intera), be' allora non c'e' nessun valore "nullo" che
puoi farle assumere in quanto sono tutti possibili.
Oppure ti fai una tua classe di interi CInt dove definisci le operazioni che
ti servono e ci metti anche il tuo valore nullo.
Maurus

 o il NULL per i puntatori o il /0 per i char.
Il problema e' generale e non ha una soluzione standard. Direi che ci
sono due alternative:
- Il tipo che usi (int nel tuo caso) presenta gia' un valore nullo,
oppure
  puoi individuare, magari limitatamente al contesto specifico, un
valore
  che non usi e che puoi quindi riciclare come valore nullo.
- Rappresenti il valore nullo esternamente. In questo caso ci sono
almeno
  due sotto-alternative possibili:
  - aggiungi un livello di indirettezza, ovvero usi sempre dei
puntatori
    ai tuoi valori, ed usi il puntatore nullo per rappresentare
l'assenza
    di valore.
  - associ ad ogni valore un booleano per indicare se il valore esiste
o no.
Qualunque sia la scelta, ti consiglio di incapsularla in una classe.
Ciao,
Nicola

 accetta solo int positivi.
la soluzione piu` generale al problema potrebbe essere qualcosa di questo 
tipo (codice non testato):
class NullException { };
class NullClass { };
Null = NullClass();
template<class T> class Nullable {
private:
     T value;
     bool isNull_;
public:
     Nullable(): isNull_(true) { }
     Nullable(const T& v): value(v), isNull_(false) { }
     operator T&() {
         if ( isNull() )
            throw NullException();
        else
            return value; 
     }
     Nullable& operator=(const T& other) {
          value = other;
          null = false;
     }
     Nullable& operator=(const NullClass&) { null = true; }
    bool isNull() { return isNull_; }
};
Nullable<int> foo;
std::cout << foo.isNull() << "\n";
foo = 4;
std::cout << foo << " " << foo.isNull() << "\n";
foo = null;
std::cout << foo.isNull() << std::endl;
std::cout << foo; // solleva l'eccezione
ripeto, non ho testato il codice
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra