RGB-Dez nach RGB-Web umwandeln: Wie ersetze ich sprintf mit std::String?
-
C++ Kritiker schrieb:
also sollte ein guter Programmierer immer davon ausgehen,
Der gute Softwarearchitekt hingegen denkt etwas über den Gesamtzusammenhang nach, erkennt dass bei einer HTML-Ausgabe noch mehr Text als <10 Zeichen anfällt, sieht dass ein std::stringstream einen hervorragenden Puffer abgibt den man mehreren Funktionen nacheinander per Referenz übergeben kann und sieht sich deshalb veranlasst in einem C++ Forum auch eine Lösung vorzuschlagen die die Features von C++ auch nutzt.
Damit's insgesamt kürzer, schneller und besser wartbar wird.
Grüsse
*this
P.S.: Und wer jetzt mit sowas wie MAX_BUF_SIZE ankommt hört den Gong nicht mehr; dafür sorg ich persönlich!

-
@Gast++
Was meinste wohl wieso sprintf_s und sonstige Secure Funktionen eingeführt wurden? Bestimmt nicht aus langeweile.
-
sprintf-user schrieb:
@Gast++
Was meinste wohl wieso sprintf_s und sonstige Secure Funktionen eingeführt wurden? Bestimmt nicht aus langeweile.Damit C Programmierer auch nachts ruhig schlafen können ...
Einen C++ler interessieren die C-Funktionen eigtl. relativ wenig. Ich habe außer memcpy noch nie ne C-Funktion benutzt, das heißt halt malloc und free bei der mal Mikrocontrollerprogrammierung mit nem gcc, wo new und delete nicht implementiert waren.
-
Gast++ schrieb:
Der gute Softwarearchitekt hingegen denkt etwas über den Gesamtzusammenhang nach, erkennt dass bei einer HTML-Ausgabe noch mehr Text als <10 Zeichen anfällt, sieht dass ein std::stringstream einen hervorragenden Puffer abgibt den man mehreren Funktionen nacheinander per Referenz übergeben kann und sieht sich deshalb veranlasst in einem C++ Forum auch eine Lösung vorzuschlagen die die Features von C++ auch nutzt.
Damit's insgesamt kürzer, schneller und besser wartbar wird.
Grüsse
*this
P.S.: Und wer jetzt mit sowas wie MAX_BUF_SIZE ankommt hört den Gong nicht mehr; dafür sorg ich persönlich!

Na klar, was ein echter CPlusplusler ist, der schreibt gleich eine ganze Klasse, am besten gleich mit Templates im STL-Style, wenn es darum geht bei einem Farbwert der 6 bis 8 Zeichen hat, vier Zeichen zu vertauschen.
-
C++ Kritiker schrieb:
Und effektiv ist beim programmieren immer: Performance und Größe.
Und Sicherheit. Die sich leider in fast allen Faellen mit Performance und Groesse kneift. Denn Sciherheitsrisiken in Kauf zu nehmen heisst auch, ungewolltes oder undefiniertes Verhalten und Programmabstuerze in kauf zu nehmen. Dann doch lieber ne Handvoll Byte Speicherbelegung und einige Microsekunden mehr...
-
proggingmania schrieb:
Na klar, was ein echter CPlusplusler ist, der schreibt gleich eine ganze Klasse, am besten gleich mit Templates im STL-Style, wenn es darum geht bei einem Farbwert der 6 bis 8 Zeichen hat, vier Zeichen zu vertauschen.
Nö, solange nichts gegen eine der allgemein verfügbaren, excellenten C++ Lösungen, wie zum Beispiel boost::format spricht:
int farbe_dez = 8421631; string farbe_html = str(format("#%x%x%x") % (farbe_dez&0xff) % ((farbe_dez>>8)&0xff) % ((farbe_dez>>16)&0xff));
-
pumuckl schrieb:
C++ Kritiker schrieb:
Und effektiv ist beim programmieren immer: Performance und Größe.
Und Sicherheit. Die sich leider in fast allen Faellen mit Performance und Groesse kneift. Denn Sciherheitsrisiken in Kauf zu nehmen heisst auch, ungewolltes oder undefiniertes Verhalten und Programmabstuerze in kauf zu nehmen. Dann doch lieber ne Handvoll Byte Speicherbelegung und einige Microsekunden mehr...
ja, grösse und performance beissen sich manchmal, z.b. sind grössere codes oft performanter, weil sie keine schleifen und sprünge enthalten.
aber mit der sicherheit ist es ein anderes thema. ich denke, wenn ausgeschlossen ist, dass gewisse dinge passieren können, braucht man sich auch nicht davor zu schützen.
wie etwa bei dem sprintf: wenn man davon ausgeht, dass sprintf nicht selber buggy ist, sollte es in unserem fall immer konstant 8 bytes beschreiben, d.h. man braucht eigentlich keine 'angstbytes' anzuhängen oder irgendwelche bereichsüberprüfungen zu machen, etc.format0r schrieb:
Nö, solange nichts gegen eine der allgemein verfügbaren, excellenten C++ Lösungen, wie zum Beispiel boost::format spricht:
int farbe_dez = 8421631; string farbe_html = str(format("#%x%x%x") % (farbe_dez&0xff) % ((farbe_dez>>8)&0xff) % ((farbe_dez>>16)&0xff));die %x müssten doch wohl %02x heissen, oder?
aber, hähä, ich fress' meinen computer wenn boost::format kein verstecktes 'sprintf' ist.
-
pale dog schrieb:
aber, hähä, ich fress' meinen computer wenn boost::format kein verstecktes 'sprintf' ist.

Guten Appetit.

http://boost.org/libs/format/ schrieb:
The format library provides a class for formatting arguments according to a format-string, as does printf, but with two major differences :
* format sends the arguments to an internal stream, and so is entirely type-safe and naturally supports all user-defined types.
* The ellipsis (...) can not be used correctly in the strongly typed context of format, and thus the function call with arbitrary arguments is replaced by successive calls to an argument feeding operator%=> 'boost::format' ist typ- und overflowsicher.
-
Konrad Rudolph schrieb:
pale dog schrieb:
aber, hähä, ich fress' meinen computer wenn boost::format kein verstecktes 'sprintf' ist.

Guten Appetit.

schluck

ich hab's gerade selber gesehen: http://www.boost.org/boost/format/parsing.hpp

-
proggingmania schrieb:
Na klar, was ein echter CPlusplusler ist, der schreibt gleich eine ganze Klasse, am besten gleich mit Templates im STL-Style, wenn es darum geht bei einem Farbwert der 6 bis 8 Zeichen hat, vier Zeichen zu vertauschen.
Häh?!? Wo Du wolle?
Bei allen Compilerpaketen die ich so kenne ist std::stringstream schon mit dabei...
Allerdings mach mir meist einen eigenen typedef in einem eigenen namespace damit ich mich UNICODE/MBCS in den Griff kriege und es später erweitern könnte wenn's unbedingt sein muss.Was nutzt ich dabei? Richtig - ein C++ Feature, nämlich namespaces!
Schon wieder solch eine Koinzidenz...
Grüsse
*this
-
format0r schrieb:
int farbe_dez = 8421631;
string farbe_html = str(format("#%x%x%x") %
(farbe_dez&0xff) %
((farbe_dez>>8)&0xff) %
((farbe_dez>>16)&0xff));[/cpp]Ausgesprochen schöne Lösung,vielen Dank!
-
Mondmann schrieb:
format0r schrieb:
int farbe_dez = 8421631;
string farbe_html = str(format("#%x%x%x") %
(farbe_dez&0xff) %
((farbe_dez>>8)&0xff) %
((farbe_dez>>16)&0xff));[/cpp]Ausgesprochen schöne Lösung,vielen Dank!
Was man so unter "schön" verstehen mag.
Die "schönsten", also besten sind doch wohl immer noch:((farbe_dez&0xff)<<16)|(farbe_dez&0xff00)|((farbe_dez&0xff0000)>>16);und:
sprintf (array, "#%02x%02x%02x", wert&0xff, (wert>>8)&0xff, (wert>>16)&0xff);
-
Schonwieder sprintf. Was soll an sprintf so schön sein?
-
David_pb schrieb:
Schonwieder sprintf. Was soll an sprintf so schön sein?
Aach, der Nohlgenormte wollte doch nur ein bissl trollen.
-
David_pb schrieb:
Schonwieder sprintf. Was soll an sprintf so schön sein?
Es schiesst nicht mit Kanonen ( Boost ) auf Spatzen.

Und die Funktion dadrüber kommt sogar gänzlich ohne Bibliotheksfunktionen aus.MfG Der Wohlgeformte
-
sprintf() ist schön - solange du dich mit C beschäftigst. In C++ Programmen hat es eher wenig zu suchen, das verwendet man stringstreams.
-
meine schoenste und "schnellste" loesung
(der verstaendniss wegen hab ich das anfangs-shifting nicht im rest vermischt)int64_t a=((farbe_dez&0xff)<<16)|(farbe_dez&0xff00)|((farbe_dez&0xff0000)>>16); a=(farbe_dez&0xf)| ((farbe_dez&0xf0)<<4)| ((farbe_dez&0xf00)<<8)| ((farbe_dez&0xf000)<<12)| ((farbe_dez&0xf0000)<<16)| ((farbe_dez&0xf00000)<<20)| ((farbe_dez&0xf000000)<<24)| ((farbe_dez&0xf0000000)<<28); a+=0x3030303030303030; const char* pStr=&a;
-
rapso schrieb:
meine schoenste und "schnellste" loesung
(der verstaendniss wegen hab ich das anfangs-shifting nicht im rest vermischt)int64_t a=((farbe_dez&0xff)<<16)|(farbe_dez&0xff00)|((farbe_dez&0xff0000)>>16); a=(farbe_dez&0xf)| ((farbe_dez&0xf0)<<4)| ((farbe_dez&0xf00)<<8)| ((farbe_dez&0xf000)<<12)| ((farbe_dez&0xf0000)<<16)| ((farbe_dez&0xf00000)<<20)| ((farbe_dez&0xf000000)<<24)| ((farbe_dez&0xf0000000)<<28); a+=0x3030303030303030; const char* pStr=&a;Krass

-
Der Wohlgeformte schrieb:
David_pb schrieb:
Schonwieder sprintf. Was soll an sprintf so schön sein?
Es schiesst nicht mit Kanonen ( Boost ) auf Spatzen.

Und die Funktion dadrüber kommt sogar gänzlich ohne Bibliotheksfunktionen aus.MfG Der Wohlgeformte
Ich denke boost ist in diesem fall nicht mehr eine Kanone, sondern eine ICBM mit mehreren Nuklearsprengköpfen um eine Ameise (diese billige Umwandlung da) zu bombadieren.

Dazu ist sprintf schneller, übersichtlicher und man muss den PräProzessor mit einem Inklude weniger belasten und zu guter Letzt: Man muss keinen fremden Code benutzen!
-
C++ Kritiker schrieb:
Ich denke boost ist in diesem fall nicht mehr eine Kanone, sondern eine ICBM mit mehreren Nuklearsprengköpfen um eine Ameise (diese billige Umwandlung da) zu bombadieren.

LOL
