Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » leere, nicht definierte Werte

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.05.2006, 20:16 Uhr
flappinski



Hallo,
wie kann ich einer Variable ein "not defined" zuteilen. Zum Beispiel brauche ich das bei einem Integer-Array, den ich einer Tab-delimited-Datei auslese. Wenn zum Beipiel der String leer ist bringt atoi immer 0 und das ist nicht gerade das, was ich will. Im Moment speicher ich einfach einen Wert ab, der bei meinen Daten unwahrscheinlich ist (z.B. -999), aber das ist nicht gerade sauberes Programmieren. Also, wie geht es, NAN, NA, oder so?
Danke schon mal,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.05.2006, 20:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


na dir bleibt nichts anderes übrig als entweder einen int-wert zu reservieren (und vor atoi zu checken obs denn auch ne zahl ist oder einfach atoi nicht verwenden und statt dessen sscanf oder strtod) oder du speicherst zusätzlich für jeden wert im intarray noch einen wert ab der angibt ob er gülitg ist...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.05.2006, 22:16 Uhr
Spacelord
Hoffnungsloser Fall


Ne saubere Variante wäre es auf den nächst größeren Datentyp zurückzugreifen.
In dem Fall also long.Dann kannst du z.B. numeric_limits<int>::max()+1 als Repräsentation für nen undefinierten Wert wählen.

Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.05.2006, 08:21 Uhr
flappinski



Danke ihr beiden, gerade letztere Variante gefällt mir sehr. Was hälst Du von numeric_limits<int>::min() ? Zumindest praktisch kein Unterschied. Oder nochmal anders numeric_limits<int>::max()*(-1), denn hier kann ich dann einfach <double> für entsprechende fehlende Werte von FLOAT nehmen, oder?
Schöne Grüsse,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.05.2006, 12:51 Uhr
stephanw
localhorst


@Spacelord: warum max() + 1 ? Ist das nicht ein simpler Überlauf ?

Warum nicht z.B. numeric_limits<int>::infinity() oder numeric_limits<int>::quiet_NaN() ?
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.05.2006, 15:00 Uhr
Bruder Leif
dances with systems
(Operator)


Korrigiert mich, wenn ich falsch liege, aber wäre das nicht gefährlich (kann int nicht auf manchen Systemen gleich long sein)?
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.05.2006, 17:23 Uhr
0xdeadbeef
Gott
(Operator)


NaN gibts nur für Fließkommazahlen, also float, double und long double. Ansonsten musste auf nen reservierten Wert (z.B. INT_MIN bzw. numeric_limits<int>::min()) oder eine Wrapper-Klasse mit Statusinformation zurückgreifen:

C++:
class nullable_integer {
public:
  nullable_integer() : val_(0), isnull_(true) { }
  nullable_integer(int val) : val_(val), isnull_(false) { }

  bool is_null() const throw() { return isnull_; }
  int value() const throw() { return val_; }

  // Zuweisungsoperatoren u.ä. hier einfügen

private:
  int val_;
  bool isnull_;
};


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.05.2006, 17:49 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von Bruder Leif:
Korrigiert mich, wenn ich falsch liege, aber wäre das nicht gefährlich (kann int nicht auf manchen Systemen gleich long sein)?


Ne ist prinzipiell schon richtig.Es kommt aber ja auch darauf an welchen Zahlenbereich flappinski mit seinem Programm abdecken möchte.Wenn die Daten aus ner Datei ausgelesen werden muss er sich ohnehin im Vorfeld mit der plattformabhängigen Größe der Datentypen auseinandersetzen.
Wenn int auf Windows langt heißt das ja noch nicht dass die gleiche Datei auch auf nem anderen OS eingelesen werden kann.
Wenn ich z.B. unter Windows sicherstellen möchte dass aus der Datei Werte im Bereich von -2147483648 bis 2147483647 eingelesen werden können und ich aber noch nen Wert brauche mit dem ich einen undefinierten Wert darstellen kann wäre es z.B. möglich long long zur Speicherung zu benutzen.
Also ich denke plattformabhängig ist ne mögliche Lösung aufgrund der benötigten Grösse der Ganzzahlvariablen ohnehin.

@Barney:
std::numeric_limits<int>::max()+1 war ja nur nen Beispiel.Das wäre aber der erste Wert den nen long (long) im Gegensatz zu int aufnehmen könnte.
Das Problem bei quiet_NaN und infinity ist halt dass beide für int mit 0 repräsentiert werden und nen Vergleich von quiet_NaN gegen 0 true ist.Somit sind beide Werte nicht von dem gültigen Wert 0 zu unterscheiden.

Für Windows z.B. :

C++:
    long long ll = std::numeric_limits<int>::max()+1;
    cout<<std::numeric_limits<int>::max()<<' '<<sizeof(int)<<endl;
    cout<<ll<<' '<<sizeof(long long)<<endl;
    int z = std::numeric_limits<int>::quiet_NaN();
    if(z==0)
        cout<<"Ungueltiger Wert?"<<endl;



Unterm Strich war es halt nur ne Idee....

Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 17.05.2006 um 17:59 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: