020
10.09.2003, 14:29 Uhr
virtual
Sexiest Bit alive (Operator)
|
Eigentlich ist durch C++ im Vergleich zu C einiges einfacher und nicht schwerer geworden. Im speziellen Fall streams muß ich Dir aber recht geben, daß Streams ein - zumindestens für Anfänger - recht gewöhnungsbedürftig sind.
So einfache Aufgaben, wie einen String + int zusammen in einen neuen String zu packen sind ohne zweifel komplizierter geworden, wenn man die reine C++ Leere nimmt. Die Ausgabe ganzer Datenstrukturen auf einen rutsch, bzw. die Konstruktion von Instanzen mit Hilfe von streams dafür umso einfacher.
Bezogen auf Dein Problem täuscht der Eindruck aber vielleicht auch ein wenig, daß C wirklich einfacher sei: nehmen wir mal folgenden Input:
C++: |
char* string = "Irgendwas"; int zahl = 100;
|
Du willst nun in C etwas schreiben, was die beiden Dinge zu einem Text zusammenfügt, also zu "Irgendwas 100" macht. Der naive Ansatz wäre:
C++: |
char buffer[23]; /* Hier kommt das Resultat hin */ sprintf(buffer, "%s %d", string, zahl);
|
Lustig. funktioniert. buffer hat genau die richtige Größe. Jetzt gehst Du hin änderst den String in der Länge, der Buffer wird also plötzlich zu klein. Du musst also neben dem string auch die Buffergröße ändern. Folglich wirst Du früher oder später auf die Idee kommen, den Buffer immer so groß zu wählen, daß auch alles reinpasst. Der etwas weniger naive Ansatz sieht also schon deutlich komplizierter aus:
C++: |
char* buffer = malloc(strlen(string)+13); if (NULL == buffer) { /* Fehler */ } sprintf(buffer, "%s %d", string, zahl); /* buffer verwenden */ ... free(buffer);
|
Für die nächste zwei Jahre wärst Du damit auf der sicheren Seite, aber die 64 Bit generation der rechner wartet ja schon, also kann das int plötzlich mehr als 11 Stellen (1 Stelle für vorzeichen!) haben. Also kommtz man schnell zum schluß, daß das noch immer nicht das gelbe vom Ei ist und erweitert:
C++: |
char* buffer = malloc(strlen(string)+4+log(CHAR_BIT*sizeof(int))/log(10)); if (NULL == buffer) { /* Fehler */ } sprintf(buffer, "%s %d", string, zahl); /* buffer verwenden */ ... free(buffer);
|
Jetzt ists zwar halbwegs für die Zukunft sicher, aber was ist, wenn wir uns plötzlich entscheiden, daß das "int zahl" eigentlich ein "long long zahl" sein soll? - Schwups, dann haben wir plötzlich neben der Deklaration von zahl selbst zwei zusätzliche Stellen, wo wir das einpflegen wollen.
Für deine sehr speziellen Bedürfnisse mögen die og Erwägungen keine roll Spielen: Die Zahl ist vielleicht immer nur postiv und <100, nimmt also immer nur 2 Zeichen ein. Der Text ist auch nur 4 Zeichen lang. Und daher ist das ja alles in Butter bei Dir. Aber es ist eben eine sehr spezielle Lösung. Ein C++
C++: |
std::stringstream s; s<<a<<b<<c; s.str();
|
Wandelt Deinen Kram immer richtig um, ganz unabh. davon, was Du rein tust (einzige Voraussetzung: für die Objekte a, b, und c müssen entsprechende Operatoren da sein. Dies ist für die Standardobjekte stets gegegeben). Diese Flexibilität läßt meines Wissen Sprachen wie Pascal/Delphi und andere weit hinter sich: Ein immer passendes Konzept, was man sich nur einmlig merken muß und vor allem - das ist aus meiner Perspektive schon fast am wichtigsten - jederzeit auf eigene Datentypen ausweitbar ist. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 10.09.2003 um 14:30 Uhr von virtual editiert. |