C Hassen...



  • size() von basic_string ist nur deshalb drin, falls man diesen als Container behandelt. Container haben nunmal size() als Funktion um die Elementanzahl abzufragen. Behandelt man basic_string nicht als Container, ist length() fachlich gesehen logischer.



  • Verstehe das Problem nicht so recht?

    time_t t = time(NULL);
    string str(ctime(&t));
    cout << str << endl;
    

    Gute Idee, aber nicht so schnell! 🙂
    ... denn schon motzt MSVC++ 2005:

    warning C4996: 'ctime' was declared deprecated
    Consider using ctime_s instead.

    Verwendet man ctime_s, das völlig anders aufgebaut ist, so hat man als ersten Parameter char* buffer.

    Das gilt auch, wenn man es mit _strtime_s(...) versucht.

    Von time_t und NULL will ich erst gar nicht anfangen. 😉

    Man ist selbst bei Neuerungen ständig umzingelt von char*. Daher benötigt C++ diesbezüglich unbedingt einen Neuanfang, oder man akzeptiert das char-Array und den Zeiger char* als die Repräsentation eines Strings auch in C++.



  • Ja, MSVC8.0 meint es gut, aber ctime ist ISO-konform und ctime_s von MS im Alleingang eingeführt um C-Funktionen sicherer zu machen. Oder sind die Dinger mittlerweile ISO-C?

    It should be noted that in this context, "deprecated" just means that a function's use is not recommended; it does not indicate that the function is scheduled to be removed from the CRT.

    Du kannst die Deprecated Warnings ausschalten, mit _CRT_SECURE_NO_DEPRECATE .
    http://msdn2.microsoft.com/en-us/library/8ef0s5kh.aspx

    Man ist selbst bei Neuerungen ständig umzingelt von char*. Daher benötigt C++ diesbezüglich unbedingt einen Neuanfang, oder man akzeptiert das char-Array und den Zeiger char* als die Repräsentation eines Strings auch in C++.

    Dann hast du meine letzten Postings nicht richtig gelesen... für dich nochmal:
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1981.html



  • Erhard Henkes schrieb:

    warning C4996: 'ctime' was declared deprecated
    Consider using ctime_s instead.

    ctime ist eigentlich harmlos, da braucht der m$ compiler nicht zu meckern. es ist nur nicht so richtig multithreading tauglich

    Artchi schrieb:

    Ja, MSVC8.0 meint es gut, aber ctime ist ISO-konform und ctime_s von MS im Alleingang eingeführt um C-Funktionen sicherer zu machen. Oder sind die Dinger mittlerweile ISO-C?

    also mickrichweich hat die 'safer c library', oder wie das heisst, glaube ich, nicht erfunden. watcom z.b. hat die auch...



  • Dann hast du meine letzten Postings nicht richtig gelesen...

    Doch habe ich. Ich wollte nur zeigen, dass man sich drehen und wenden kann, wie man will, von irgendeiner Seite wird man immer "angemacht". 😉

    Dann hast du meine letzten Postings nicht richtig gelesen... für dich nochmal:
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1981.html

    Danke für den Link.



  • ... und ctime_s von MS im Alleingang eingeführt um C-Funktionen sicherer zu machen.

    Diese Dinger geben dem immer noch üblichen C/C++-Mix jetzt wirklich den Rest. 😃



  • Erhard Henkes schrieb:

    Diese Dinger geben dem immer noch üblichen C/C++-Mix jetzt wirklich den Rest. 😃

    die sind ja eigentlich für 'c' gedacht. c++ user haben doch ihren stl/boost mischmasch und brauchen sowas nicht 😉



  • ..



  • Erhard Henkes schrieb:

    Wie man mit Zeigern und C-casts Blödsinn treiben kann, zeigt dieses berühmte Beispiel:

    // [ c++ objekt nach string gecastet ]
    

    Mit std::string gelingt dies nicht. 👍

    Das Beispiel zeigt, wie man in C/++ direkten Zugriff auf den Speicher hat.
    std::string schützt da überhaupt gar nicht.



  • Dann bastel dieses Beispiel mal mit std::string nach. Mir ist es nicht gelungen.



  • Erhard Henkes schrieb:

    Dann bastel dieses Beispiel mal mit std::string nach. Mir ist es nicht gelungen.

    da hast du:

    #include <string>
    #include <iostream>
    
    class ganz_unsicher {
    
        public:
    
            ganz_unsicher( ) : passwort( "geheim" ) { }
    
        private:
    
            std::string passwort;
    };
    
    int main()
    {
        ganz_unsicher gleich_passierts;
        std::string *boesewicht = reinterpret_cast< std::string* >( &gleich_passierts );
        std::cout << boesewicht->c_str( ) << std::endl;
    }
    

    Greetz, Swordfish



  • Es stimmt schon, als ich anfing C zu lernen ( Erste Seite Tutorial, die Typen ) dachte ich erst: "Oh mein Gott, es gibt keine Strings, nur Zeichen?" Die Erleichterung kam aber mit C++ und std::string.
    Aber trotzdem ist die Sache nicht so doll. Bin wohl etwas verwöhnt, aber die string Funktionalität von Python ist um längen besser. Gerade wenn man lange Zeichenketten durchsuchen, bearbeiten, teilen und umkehren will. Da schlägt Python C und C++ auch in Punkto Effizienz.



  • 1310-Logik schrieb:

    Gerade wenn man lange Zeichenketten durchsuchen, bearbeiten, teilen und umkehren will. Da schlägt Python C und C++ auch in Punkto Effizienz.

    Das wage ich zu bezweifeln. Mir ist schon bewusst, dass die Stringangelegenheiten in Python stark optimiert werden, dennoch glaube ich nicht, dass Python schneller ist. Mit sowas wie Psyco oder IronPython kann es ja von mir aus auf Augenhöhe sein, aber effizienter kann ich mir nicht vorstellen.
    Vielleicht meintest du ja etwas anderes, dann führe doch bitte "Effizienz" näher aus.



  • .filmor schrieb:

    1310-Logik schrieb:

    Gerade wenn man lange Zeichenketten durchsuchen, bearbeiten, teilen und umkehren will. Da schlägt Python C und C++ auch in Punkto Effizienz.

    Das wage ich zu bezweifeln. Mir ist schon bewusst, dass die Stringangelegenheiten in Python stark optimiert werden, dennoch glaube ich nicht, dass Python schneller ist. Mit sowas wie Psyco oder IronPython kann es ja von mir aus auf Augenhöhe sein, aber effizienter kann ich mir nicht vorstellen.
    Vielleicht meintest du ja etwas anderes, dann führe doch bitte "Effizienz" näher aus.

    Muss ja nicht gleich "Laufzeiteffizienz" (1310-Logik hat ja nicht von "Schnelligkeit" geredet) sein. Es ist einfach ein Unterschied ob ich einfach so Regex, Unicode, umfangreiche String-Bibliothek (mit Slicing etc.) direkt bei der Sprache dabei hab, oder ob ich dazu erstmal 2-3 verschiedene Bibliotheken suchen muss, die evtl. auch noch andere Code-Styles verwenden und vielleicht nicht mal auf allen Plattformen zur Verfuegung stehen 😉



  • Naja, ich denke das Thema, dass du Standardbibliothek da zu schmal ist haben wir bereits durch ...
    Python verfolgt dahingehend auch eine andere Philosophie.



  • Doch Laufzeiteffizienz --> weniger CPU time meinte ich
    aber auch Entwicklungszeit --> weniger Code Zeilen
    Regex-DNA Benchmark

    diff program output for this 100KB input file (generated with the fasta program N = 10000) with this output file to check your program is correct before contributing.

    We use FASTA files generated by the fasta benchmark as input for this benchmark. Note: the file may include both lowercase and uppercase codes.

    Each program should

    * read all of a redirected FASTA format file from stdin, and record the sequence length
    * use the same simple regex pattern match-replace to remove FASTA sequence descriptions and all linefeed characters, and record the sequence length
    * use the same simple regex patterns, representing DNA 8-mers and their reverse complement (with a wildcard in one position), and (one pattern at a time) count matches in the redirected file
    * write the regex pattern and count
    * use the same simple regex patterns to make IUB code alternatives explicit, and (one pattern at a time) match-replace the pattern in the redirect file, and record the sequence length
    * write the 3 recorded sequence lengths

    Revised BSD license

    C++ mag mithalten, C auf gcc hat ein Timeout bekommen, tja..

    edit: ja es ist ein gesuchtes Beispiel, da das einzige. Aber ist nunmal mein Hauptanwendungsbereich gewesen, mit den BLAST FASTA etc. rumzuwerkeln



  • Stringmanipulationen sind im ISO-C++ 2003 dürftig, stimmt. Aber bzgl. Regex hat ISO-C++ seit April 2006 kein Defizit mehr, siehe TR1.

    Wer noch mehr Stringmanipultionen benötigt, muß vorerst auf Boost zurück greifen. Halte das aber nicht für schlimm, da Boost einfach auf jede Festplatte eines C++-Entwicklers gehört.
    http://www.boost.org/libs/libraries.htm#String



  • #include <string> 
    #include <iostream> 
    
    class ganz_unsicher { 
    
        public: 
    
            ganz_unsicher( ) : passwort( "geheim" ) { } 
    
        private: 
            int dummy;
            std::string passwort; 
    }; 
    
    int main() 
    { 
        ganz_unsicher gleich_passierts; 
        std::string *boesewicht = reinterpret_cast< std::string* >( &gleich_passierts ); 
        std::cout << boesewicht->c_str( ) << std::endl; 
    }
    

    Schon gehts nicht mehr bzw. seh ich nur noch quatsch zur Laufzeit!

    Also, wenn ich will, kann ich in C++ sowieso vieles machen. Aber wenn das Passwort sooo geheim wäre, würde ich es auch nur verschlüsselt ablegen. 😉 Was sollen diese Beispiele? Wir wissen hier doch alle, das man mit böswilliger Absicht schlimme Dinge erreichen kann. Ich denke nicht, das wir hier jetzt ein "Oh oh!" Erlebnis hatten, oder?



  • 1310-Logik schrieb:

    C++ mag mithalten, C auf gcc hat ein Timeout bekommen, tja..

    und der gewinner ist eine skriptsprache. aber wir wussten's ja schon immer: compilersprachen taugen einfach nix 😃



  • Artchi schrieb:

    Schon gehts nicht mehr bzw. seh ich nur noch quatsch zur Laufzeit!

    #include <string> 
    #include <iostream> 
    
    class ganz_unsicher { 
        public:
            ganz_unsicher() : dummy(2006), passwort("geheim") {}
        private: 
            int dummy; 
            std::string passwort; 
    }; 
    
    int main() {
    	ganz_unsicher gleich_passierts; 
    	int *boesewicht1 = (int*)&gleich_passierts;
    	std::string *boesewicht2 = reinterpret_cast<std::string*>(&gleich_passierts) + 1;
    	std::cout << *boesewicht1 << " und " << *boesewicht2 << std::endl; 
    }
    

    So viel dazu. Diesmal auch ohne hässlichem c_str() 😉


Anmelden zum Antworten