LOC-Zähler für C++



  • Hallo

    Kennt jemand von euch ein Programm, dass die Anzahl logischer Zeilen Code berechen kann und bei dem man einen Ordner als Ziel angeben kann (und nicht einzelne Dateien)? Ich habe mit Google zwar schon gefunden aber ich weiss nicht ob die Tools meine Voraussetzungen erfüllen.

    MfG, EOutOfResources



  • Das kann man sich als nette Übung auch kurz selber schreiben.



  • Ich finde LinesOfCodeWichtel sehr gut, ein kleines Java-Programm. Es wurde zwar schon lange nicht mehr geupdatet, funktioniert bei mir aber bis heute problemlos. Es kann auch Leerzeilen und Kommentare zählen, man kann sogar eigene Dateitypen und Kommentarsymbole angeben.

    Falls du unter Unix arbeitest stehen viele Kommandozeilen-Tools zur Verfügung wie z.B. find:

    find /path/to/dir -name "*.cpp" -o -name "*.hpp" | xargs wc -l | tail -1
    

    oder cloc



  • was sind denn die logischen Code-Zeilen?



  • Antoras schrieb:

    oder cloc

    also was auch immer da gezählt wird, ich kann mir keinen Verwendungszweck vorstellen



  • DrGreenthumb schrieb:

    was sind denn die logischen Code-Zeilen?

    Schätze was genau es ist ist Definitionssache. Aber wird wohl vermutlich Kommentare und Leerzeilen ignorieren, evtl. auch Zeilen die nur aus ner öffnenden Klammer bestehen etc.
    Dafür könnte man Zeilen die mehr als eine Anweisung enthalten als mehrere logische Zeilen zählen.

    DrGreenthumb schrieb:

    Antoras schrieb:

    oder cloc

    also was auch immer da gezählt wird, ich kann mir keinen Verwendungszweck vorstellen

    Ich finde es ganz praktisch, wenn man die Grösse eines Projekts grob abschätzen will. Natürlich kann ein bestimmtes 10 KLOC Projekt wesentlich komplizierter sein als ein anderes 30 KLOC Projekt. Aber man bekommt zumindest mal eine Vorstellung, wie viel Code es inetwa ist.

    Auf jeden Fall besser als einfach Files zählen, Bytes zählen oder Klassen/Funktionen zählen.

    Interessanter sind aber Tools die detailiertere Infos ausspucken, z.B. wie viel Zeilen eine Funktion im Schnitt enthält, wie viele Funktionen eine Klasse (jeweils Average und Median), wie viele Funktionen nicht kommentiert sind etc.



  • hustbaer schrieb:

    Aber wird wohl vermutlich Kommentare und Leerzeilen ignorieren, evtl. auch Zeilen die nur aus ner öffnenden Klammer bestehen etc.
    Dafür könnte man Zeilen die mehr als eine Anweisung enthalten als mehrere logische Zeilen zählen.

    das habe ich auch vermutet. Aber Sinnvoll finde ich das trotzdem nicht. Besonders in C++, wo 70% aus Boilerplate besteht. Das ist trotzdem wichtiger Code der zum Projekt gehört. Genau wie Makefiles und andere Scripte.

    Da erscheint mir wc -l das einzige zu sein, um einen echten groben Eindruck zu bekommen.



  • DrGreenthumb schrieb:

    was sind denn die logischen Code-Zeilen?

    Vielleicht Code-Zeilen mit einem logischen Ausdruck wie if(...)? 😕 Hätte auch gerne gewusst, wozu das gut sein soll! Soll der Programmierer nur nach der Anzahl 'inhaltsvoller' Zeilen bezahlt werden? Also: Kommentare, Leerzeilen und { } zählen nicht? 😕 😃



  • berniebutt schrieb:

    DrGreenthumb schrieb:

    was sind denn die logischen Code-Zeilen?

    Vielleicht Code-Zeilen mit einem logischen Ausdruck wie if(...)? 😕 Hätte auch gerne gewusst, wozu das gut sein soll! Soll der Programmierer nur nach der Anzahl 'inhaltsvoller' Zeilen bezahlt werden? Also: Kommentare, Leerzeilen und { } zählen nicht? 😕 😃

    Schätzomativ handelt es sich dabei um Code, der tatsächlich übersetzt wird. Also kein Kommentarzeilen, Leerzeilen o.ä.

    Ich glaube aber kaum das Programmierer nach den Codezeilen bezahlt werden.
    Denn gute Programmierer erzeugen einen kompakteren Code als schlechte, und würden dafür aber dann schlechter entlohnt!? Mhh...das wäre ja echt blöd von der Geschäftsführung. Vor allem ist es den Kunden ja ziemlich egal, wie das Programm intern ausschaut, so lange es seine Aufgabe erfüllt.



  • Glutamat schrieb:

    Denn gute Programmierer erzeugen einen kompakteren Code als schlechte.

    Schlechter Programmierer: (LOC=7)

    unsigned long fibonacci(unsigned long on) {
        if(on <= 1) {
            return on;
        } else {
            fibonacci(on-1) + fibonacci(on-2);
        }
    }
    

    Guter Programmierer: (LOC=12)

    unsigned long fibonnaci(unsigned long on) {
        if(on <= 1) {
            return on;
        } else {
            unsigned long result, f1 = 0, f2 = 1;
            for(unsigned long i = 2; i < on; ++i) {
                result = f1 + f2;
                f1 = f2;
                f2 = result;
            }
        return result;
    }
    

    ERGO: Gute Programmierer schreiben verlässlichen Code.



  • Ausnahmen bestätigen die Regel.
    Insgesamt ist der Code von erfahrenen Programmieren kürzer als der von Anfängern.
    Das ist mir bei so ziemlich allen Projekten bis jetzt aufgefallen.

    Und ein Zusammenhang mehr Zeilen = mehr erbrachte Leistung stimmt schon mal garnicht.



  • AmITrolling? schrieb:

    Guter Programmierer: (LOC=12)

    unsigned long fibonnaci(unsigned long on) {
        if(on <= 1) {
            return on;
        } else {
            unsigned long result, f1 = 0, f2 = 1;
            for(unsigned long i = 2; i < on; ++i) {
                result = f1 + f2;
                f1 = f2;
                f2 = result;
            }
        return result;
    }
    

    Und nach dem "Guten Programmierer" muß dann wieder ein Externer kommen zum Aufräumen, hihi.

    Falscher Name.
    fibonacci statt fibonnaci.

    Falsche Rechnung. Zum Beispiel repariert mit.

    unsigned long result=0, f1 = 0, f2 = 1;
    		for(unsigned long i = 1; i < on; ++i) {
    

    Wenn man Pech hat, bleibt sowas übrig:

    unsigned long fibonacci(unsigned long on) {
        unsigned long result = on, f1 = 1, f2 = 0;
        for(unsigned long i = 0; i < on; ++i) {
            result = f1 + f2;
            f1 = f2;
            f2 = result;
        }
        return result;
    }
    

    Und dann kommt Glutamat und schreibt einfach

    unsigned long fibonacci(unsigned long on) {
        double w5=std::sqrt(5);
        return (pow((1+w5)/2,on)-pow((1-w5)/2,on))/w5;
    }
    

    LOC sind ohne weitere Angaben zum Code ein extrem unsinniges Maß.

    Man darf sich auch nicht dazu verleiten lassen, von der Kürze auf irgendwelche Codequalität schließen zu lassen. Das wird nichts.

    unsigned long fibonacci(unsigned long on) {
        return on>1?fibonacci(on-1)+fibonacci(on-2):on;
    }
    


  • 👍

    volkard, bin erstaunt:

    volkard schrieb:

    unsigned long fibonacci(unsigned long on) {
        double w5=std::sqrt(5);
        return (pow((1+w5)/2,on)-pow((1-w5)/2,on))/w5;
    }
    


  • [quote="volkard"]

    AmITrolling? schrieb:

    unsigned long fibonacci(unsigned long on) {
        double w5=std::sqrt(5);
        return (pow((1+w5)/2,on)-pow((1-w5)/2,on))/w5;
    }
    

    Sowas hab ich bisher aber nur für die fibonacci reihe gesehen, gibts das öfter/immer? Und gibts nen ausdruck dafür?



  • imbanacci schrieb:

    Sowas hab ich bisher aber nur für die fibonacci reihe gesehen, gibts das öfter/immer? Und gibts nen ausdruck dafür?

    Formel von Moivre-Binet

    Außerdem gibt es noch einen schnelleren anderen Weg mit Ringen über sqrt(5).
    http://news.ycombinator.com/item?id=2538724



  • @volkard: Welcher gute Programmierer schreibt in einer Zeile std::sqrt, um dann in der nächsten Zeile pow ohne std:: zu verwenden? 😃


Anmelden zum Antworten