Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ist mein Code zu "simple"?

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 < [ 2 ]
000
08.06.2006, 20:55 Uhr
FunnyDingo



Hallo zusammen,

also ich versuche mich nun seit ca. 3 Monaten intensiv an C++ und dachte ich wäre schon recht weit gekommen.

Heute habe ich dann mit Hilfe des Internets versuche eine urldecode()-Funktion zu finden die mit C++-Strings umgehen kann. Besonders weit bin ich nicht gekommen, aber ich bin über dies hier gestolpert:

C++:
#define H2B(a) ((a) <= '9' ? (a) - '0' : (a) - 55);
#define ISXDIGIT(a) (((a) >= '0' && (a) <= '9') || ((a) >= 'A' && (a) <= 'F') || ((a) >= 'a' && (a) <= 'f'))

int
url_decode(const char *src, const char *slim, char *dst, char *dlim)
{
    int state = 0, code;
    char *start = dst;

    if (dst >= dlim) {
        return 0;
    }
    dlim--; /* ensure spot for '\0' */

    while (src < slim && dst < dlim) {
        switch (state) {
            case 0:
                if (*src == '%') {
                    state = 1;
                } else {
                    *dst++ = *src;
                }
                break;
            case 1:
                code = H2B(*src);
            case 2:    
                if (ISXDIGIT(*src) == 0) {
                    errno = EILSEQ;
                    return -1;
                }
                if (state == 2) {
                    *dst++ = (code * 16) + H2B(*src);
                    state = 0;
                } else {
                    state = 2;
                }
                break;
        }
        src++;
    }
    *dst = '\0'; /* I'll be back */

    return dst - start;
}

Parallel dazu möchte ich euch mal eine Funktion zeigen, die ich selbst geschreiben habe. Sie zerlegt einen HTTP (nicht ganz Protokoll konform) in ein Strukt. Das Strukt selbst spielt nun keine Rolle, sondern es geht ja eher um den Stil des Codes.

C++:
bool netlib::parse_http_header(string &header_s, struct http_request *httpreq) {
    
    
    ///////////////////////////////////
    //  Explode the header string
    ///////////////////////////////////
    
    vector<string> header = explode(header_s, "\r\n");
    
    
    ///////////////////////////////////
    //  Check the first line
    ///////////////////////////////////
    
    // The first line ist the request (GET or POST). If it isn't, return false
    if (header[0].substr(0, 3) == "GET" || header[0].substr(0, 4) == "POST") {
        
        if (header[0].substr(0, 3) == "GET")
            httpreq->method = HTTP_METHOD_GET;
        else
            httpreq->method = HTTP_METHOD_POST;
        
        // Split the line to get
        // REQUEST_TYPE URI HTTP_VERSION
        // (e.g. GET / HTTP/1.1)
        int pos1 = header[0].find_first_of(" ", 0);
        int pos2 = header[0].find_first_of(" ", pos1+1);
        string tmp = header[0].substr(pos1+1, pos2 - pos1 - 1);
        
        // Split the tmp URI to get the GET-Params
        pos1 = tmp.find_first_of("?", 0);
        if (pos1 == string::npos) {
            
            // There are no params. Save the
            // tmp uri as uri
            httpreq->uri = tmp;
        } else {
            
            // Save everything bevor ? as uri
            httpreq->uri = strToLower(tmp.substr(0, pos1));
            string params_s = tmp.substr(pos1+1);
            
            // Explode the params by &
            vector<string> params = explode(params_s, "&");
            for (int i = 0; i < params.size(); i++) {
                int pos1 = params[i].find_first_of("=");
                switch(pos1) {
                    case string::npos:
                        httpreq->params[params[i].substr(0, pos1)] = "";
                        break;
                        
                    case 0:
                        continue;
                        
                    default:
                        httpreq->params[params[i].substr(0, pos1)] = params[i].substr(pos1+1);
                        break;
                }
            }
        }
    } else {
        return false;
    }
    
    
    ///////////////////////////////////
    //  Check all other lines
    ///////////////////////////////////
    
    httpreq->content_length = 0;
    for(int i = 1; i < header.size(); i++) {
        string lower_line = strToLower(header[i]);
        if (lower_line.substr(0, 11) == "user-agent:") {
            httpreq->user_agent = header[i].substr(12);
            continue;
        }
        if (lower_line.substr(0, 5) == "host:") {
            httpreq->host = header[i].substr(6);
            continue;
        }
        if (lower_line.substr(0, 15) == "content-length:") {
            string tmp = lower_line.substr(16);
            httpreq->content_length = atoi(tmp.c_str());
            continue;
        }
        if (i == (header.size() - 1) && httpreq->content_length > 0 && httpreq->method == HTTP_METHOD_POST) {
            // Explode the params by &
            vector<string> params = explode(header[i], "&");
            for (int x = 0; x < params.size(); x++) {
                int pos1 = params[x].find_first_of("=");
                switch(pos1) {
                    case string::npos:
                        string key = url_decode(params[x].substr(0, pos1));
                        httpreq->params[key] = "";
                        break;
                        
                    case 0:
                        continue;
                        
                    default:
                        string key = url_decode(params[x].substr(0, pos1));
                        string value = url_decode(params[x].substr(pos1+1));
                        httpreq->params[key] = value;
                        break;
                }
            }
        }
    }
    
    return true;
} // EndFunc netlib::parse_http_header()

Ich finde, das mein Code viel verständlicher aussieht. Denke ich vielleicht (weil ich aus der PHP-Welt komme) zu sehr in "Skript-Sprache"? Ist der Code vielleicht soger ineffektiv? Oder vielleicht glaube ich das auch nur, weil ich den Code selber geschrieben habe und daher besser verstehe was er tut?

Ich würde mich freuen, wenn der ein oder andere da was zu sagen könnte.

lg,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 08.06.2006 um 20:57 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.06.2006, 08:54 Uhr
ao

(Operator)


Hallo Funny,

die Codes sind in verschiedenen Sprachen geschrieben, da ist es klar, dass sie verschieden aussehen.

Dein Code ist C++, d.h. du hast Klassen und Objekte zur Verfügung und - hier von großer Bedeutung - es gibt ein leistungsfähiges Werkzeug zur Zeichenketten-Bearbeitung, nämlich die Klasse std::string.

Der Code aus dem Internet ist C, muss ohne Klassen auskommen und die String-Analyse und -Zerlegung "zu Fuß" machen, d.h. mit Pointern auf einem Array herumrödeln.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.06.2006, 11:47 Uhr
FunnyDingo



Danke, das beruhigt mich ein wenig. Ich dachte zuerst, ich hätte meinen Code sehr einfach aber dafür auch ineffektiv geschrieben. Aber da du nach deinem - ich nehme an, nicht zu intensiven - Blick nichts gesagt hast, wird das wohl (für 3 Monate C++) ganz OK sein.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.06.2006, 12:47 Uhr
stephanw
localhorst


Mal was allgemeineres, ohne dass ich den Code wirklich gelesen habe...


Zitat:
Ich finde, das mein Code viel verständlicher aussieht. Denke ich vielleicht (weil ich aus der PHP-Welt komme) zu sehr in "Skript-Sprache"? Ist der Code vielleicht soger ineffektiv? Oder vielleicht glaube ich das auch nur, weil ich den Code selber geschrieben habe und daher besser verstehe was er tut?




Die Leserlichkeit eines Programmes für Menschen hat nichts (oder nur sehr selten) mit der Effizienz des Programmes bzgl. Laufzeit/Speicher zu tun. Oder anders ausgedrückt: "schöner" Code ist nicht automatisch langsam, wild mit Zeigern operierender und unverständlicher Code ist nicht automatisch schnell.

Neben der Wahl der Algorihmen ist manchmal die Variablen-Übergabe per Kopie statt Referenz/Zeiger eine Bremse oder auch die falsche Anwendung mancher Klassen (z.B. Std-Bibliotheks-Container).
Wenn Du aber bereits derart virtuos mit C++/Std-Lib umgehen kannst, wirst Du sicher in fortgeschrittenen Büchern Anregungen und Hinweise zur Effizienz finden ;-)

PS: PHP rulez auch in C++-Code: explode ist wirklich eine angenehme Sache ;-)
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 09.06.2006 um 12:48 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.06.2006, 12:48 Uhr
Helmut



Hi!

Schade dass man wesentliche Teile beider Programme, die Datenstrukturen, hier nicht zu sehen bekommt. Und bei FunnyDingo hät ich sogar gern gewusst welche Headerdateien
benutzt wurden.

Zitat ao "die Codes sind in verschiedenen Sprachen geschrieben"

Ich kann dem nicht folgen. Das Programm aus dem Internet ist von einem Profi
geschrieben - kurz und knapp, (und er zeigt seine Muskeln - Preprozessor-Metaprogramming!) und auch diese Funktion ist eine C++ Funktion!
Sowas lässt sich "nur mit C" nicht programmieren.
Nur der C++ Preprozessor kann diesen Part leisten, das Beispiel aus dem Internet
ist eine C++ Funktion, Profiarbeit!

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.06.2006, 13:55 Uhr
kronos
Quotenfisch
(Operator)



Zitat von Helmut:
Sowas lässt sich "nur mit C" nicht programmieren.
Nur der C++ Preprozessor kann diesen Part leisten, das Beispiel aus dem Internet
ist eine C++ Funktion, Profiarbeit!

Welcher Teil ist deiner Meinung nach nicht als C kompilierbar?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.06.2006, 14:06 Uhr
ao

(Operator)



Zitat von Helmut:
Zitat ao "die Codes sind in verschiedenen Sprachen geschrieben"

Ich kann dem nicht folgen. Das Programm aus dem Internet ist von einem Profi
geschrieben - kurz und knapp, (und er zeigt seine Muskeln - Preprozessor-Metaprogramming!) und auch diese Funktion ist eine C++ Funktion!
Sowas lässt sich "nur mit C" nicht programmieren.
Nur der C++ Preprozessor kann diesen Part leisten, das Beispiel aus dem Internet
ist eine C++ Funktion, Profiarbeit!

Unsinn. url_decode *ist* eine C-Funktion. Weder Muskeln noch Professionalität des Autors ändern etwas daran. Und der Preprozessor ist auch Bestandteil von C.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.06.2006, 14:20 Uhr
Helmut



Es werdend zweimal Zeiger auf const char per Funktionsparameter übergeben und innerhalb der
Funktion derefrenziert. Damit arbeiten dann die Preprozessormakros innerhalb der Funktion
Die Berechnungen erfolgen bevor compiliert wird. (= Preprozessor-Metaprogrammierung).Das geht
nur wenn die Konstanten echte Konstanten im Sinne von C++ sind. In C kann man Variablen
nur das const Attribut geben und es sind immer noch Variablen die im Speicher liegen, worauf
der Preprozesseor vor der Compilierung nicht zugreifen kann. In C++ sind es echte Konstanten und
der Zugriff vor der Compilierung ist möglich!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.06.2006, 14:24 Uhr
(un)wissender
Niveauwart



Zitat von Helmut:

[...] geschrieben - kurz und knapp, (und er zeigt seine Muskeln - Preprozessor-Metaprogramming!) und auch diese Funktion ist eine C++ Funktion! [...]



Preprozessor-Metaprogramming ist das sicher nicht. Und eine Funktion auch nicht, sondern ein Makro, also schlicht nur zu expandierender Code.
Ach ja, das ist eine reine C-Funktion.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.06.2006, 14:29 Uhr
Helmut




C++:
int
url_decode(const char *src, const char *slim, char *dst, char *dlim)
{


das soll ein Makro sein?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: