Source lesen und verstehen lernen
-
ZSchneidi schrieb:
Ui so eindeutige Meinungen zu +fricky, sollte ich da was wissen ?
wegen dem werden die c++ flamethreads immer so lang.
-
ZSchneidi schrieb:
Ok, ich konnts nicht lassen und habs mir doch mal angesehen.
Und muss sagen is ziemlich simple ... ^^
Ne spaß beiseite, ich konnte damit jetzt nicht wirklich viel anfangen.Hab mir die Referenz zur Hand genommen, aber selbst die konnt mir jetzt nicht wirklich weiter helfen. Es ist noch nichtmal unbedingt das semantische, sondern geht schon beim Syntaktischen los.
void scan(std::deque<Point>& set) { std::sort(set.begin(), set.end(),SortPred()); std::deque<Point>::iterator new_end = std::unique(set.begin(),set.end());
Hier beispielsweise : "deque<Point>" hab ich auch noch nicht gesehen sowas.
Mir fehlt auch noch der Ansatz was set an dieser stelle ist. Kann kann ich alles noch nicht so ganz nachvollziehen.Was würdest du selbst sagen, welchen grad an Schwierigkeit die Source aufweist ?
Wenn du mir jetz sagst, das is Kinderkram und sollte keine Probleme machen, sollte ich mir ernsthaft gedanken machenSyntaktisch ist der Code sehr leicht zu verstehen, vorausgesetzt man beherrscht C++
Die Semantik ist natürlich etwas ganz anderes, und ich habe zwar eine starke Vermutung was der Code macht, aber habe es noch nicht verifiziert (kann man ja einfach mit ein paar Zahlenbeispielen überprüfen, ob man recht hatte).
Wer allerdings noch nie solche Algorithmen studiert hat wird wohl eher keine Chance haben darauf zu kommen.
-
@ZSchneidi: In der Signatur steht, dass eine Menge (deswegen der Name set (eng.)) von Punkten (2D) als In/Out-Parametern der Funktion uebergeben wird. Der verwendete Container ist halt std::deque. In der ersten Zeile der Funktion werden die Punkte gemaess dem Praedikat (erst nach X, dann nach Y Koordinate, siehe SortPred::operator()( ...) ) sortiert. Danach werden alle doppelten Punkte mittels unique und Vergleichsoperator (Point::operator==( ... ) ) entfernt. Danach ist die Vorverarbeitung abgeschlossen.
Zum Schwierigkeitsgrad: ist schon fortgeschritten. Aber in Anwendungssoftware wirst du hauptsaechlich fortgeschrittenen Code oder schwieriger finden.
PS: Ich kann dir ja mal etwas Zeit geben und loese es dann naechste Woche oder so auf.
Wer allerdings noch nie solche Algorithmen studiert hat wird wohl eher keine Chance haben darauf zu kommen.
Gimp wurde mal als Beispiel genannt. Deswegen dachte ich, ein algorithmisches Beispiel ist nicht schlecht (und es war mein einziges weniger umfangreiches).
-
knivil schrieb:
Gimp wurde mal als Beispiel genannt. Deswegen dachte ich, ein algorithmisches Beispiel ist nicht schlecht (und es war mein einziges weniger umfangreiches)
wenn du den gimp-code nimmst, sind verzeichnisnamen und namen der source-files, funktionen, structuren, variablen, etc. schon mal wichtige hinweise. wenn du dann noch mit 'nem reverse-enigneering tool rübergehst und siehst, welche funktionen welche aufrufen, wie was benutzt wird usw, dann haste schon viele informationen. bei deinem code sieht man z.b. nicht, in welchem zusammenhang er verwendet wird. das macht es etwas schwieriger. ausserdem ist gimp leichter zu lesen, weil in C geschrieben. *grins*
-
welchem zusammenhang er verwendet wird.
straight forward wird scan verwendet. Die Punkte werden in der main eingelesen und ausgegeben.
-
Ehrlich gesagt, wen interessiert schon was der Code tut?
Wozu sollte ich mich durch etwas nicht dokumentiertes durchkämpfen wollen, vor allem wenn das Original a) bessere Namen und b) Kommentare enthält???Davon abgesehen hat das nichts mit Software-Design oder sonstwas zu tun, das ist schlicht und ergreifend ein Algorithmus.
Wieso ich den verstehen wollen würde, wenn ich bloss das Design einer grösseren Anwendung verstehen möchte, entzieht sich mir grad vollkommen.
-
Davon abgesehen hat das nichts mit Software-Design oder sonstwas zu tun, das ist schlicht und ergreifend ein Algorithmus. Wieso ich den verstehen wollen würde, wenn ich bloss das Design einer grösseren Anwendung verstehen möchte, entzieht sich mir grad vollkommen.
Sag das nicht mir, sondern ZSchneidi. Denn genau darum geht es. Auch verweise ich auf den Threadtitel. Der Source ist nicht fuer dich oder sonst wen gedacht, sondern einzig und allen fuer ZSchneidi. Er war der Meinung mittels Sourcecode (Implementation) zu lernen, wie es die "Grossen" so machen. Das hier dient als Beispiel, wie man schwerlich von Sourcecode auf Implementationsideen schliessen kann. Auch sind Kommentare in realen Projekten recht rar, die Funktion scan haette ich auch nicht benennen brauchen, sondern alles gleich in die main hauen koennen.
-
Aber ich habs rausgefunden.
*hüpf*
*meld*
Jetzt lobe mich doch mal.
*hüpf*
*meld*
-
Da's bis jetzt noch niemand erwaehnt hat, tu ich's mal:
Code Reading | ISBN: 9780201799408
enthaelt ein paar praktische Tipps (& IIRC sogar Uebungen), wie man sich in fremden Code einliest.
EDIT: ich hab das Buch seinerzeit aber nur ueberflogen, k.A. wie gut es wirklich ist!
-
volkard schrieb:
Aber ich habs rausgefunden.
*hüpf*
*meld*
Jetzt lobe mich doch mal.
*hüpf*
*meld*Du hast gegoogelt, gib 's zu!
Zum Buch: Ich habe mal Chapter 2: Basic Programming Elements ueberflogen. Es ist eine Art Uebeungsbuch, um kleine Codeabschnitte (Basics) besser zu verstehen, aber seinen eigenen Codestil lesbarer zu machen.
-
knivil schrieb:
volkard schrieb:
Aber ich habs rausgefunden.
*hüpf*
*meld*
Jetzt lobe mich doch mal.
*hüpf*
*meld*Du hast gegoogelt, gib 's zu!
Klar. Aber dazu mußte ich doch aus dem Code erst eine googlebare Vermutung herauslesen. Die erste Vermutung wars auch schon. Ich schätze, daß google bei sowas echt nur zum Bestätigen taugt und gar nicht zur Suche, denn dein Code ist ja anhand des Algos selbergebaut (evtl anhand einer Beispielimplementierung, die aber am Ende keine suchbare Zeile mehr mit Deinem Code gemeinsam hat).
-
Aber ich habs rausgefunden.
*hüpf*
*meld*
Jetzt lobe mich doch mal.
*hüpf*
*meld*Heh, das freut sich ja einer richtig schön
hustbaer : du magst sicher recht haben, das ein einzelner Algo noch kein Designstil vermittelt, aber ich fand es ganz interessant, da ich vieles was knivil an Sprachelementen verwendet noch nicht so gut beherrsche, wie gesagt, ich bin noch nicht so lange im Geschäft.
Beispiel: Ich hab hier auf arbeit leider überwiegend mit php Code zu tun, der zwar auch von nem Fähigen Programmierer entwickelt wurde, aber nicht annährend an die Komplexität von solchen Sourcen wie dem von knivil ranreicht.
Selbst mit meinen eingeschränkten Fähigkeiten, kann ich den Code hier sehr schnell zurückverfolgen. Ich fand an dem Beispiel gut, mal zu sehen, wie etwas fortgeschrittenerer Code aussehen kann, um zu sehen, was ich noch zu lernen habe.
Wie ich schon gesagt hab, die Semantik von Code kann ich erst verstehen, wenn ich den Code von der Syntax her überhaupt lesen kann, das war hier schon etwas schwieriger.Hab mir jetzt mal mein anderes C++ Buch geschnappt, des is schon ein wenig fortgeschrittener, da hoffe ich, dass ich noch ein wenig mehr draus lerne.
Vielleicht sollte ich ein Buch auch mal bis zu ende lesen
Komm meist nur so weit, bis ich das gelesene selbst probieren will, dass halte ich mich meist so lange mit proggen auf, dass ich vergesse, wo ich zum letzten mal gelesen hab. Nicht das ich auf die Idee kommen würde mir mal marker ins Buch zu klemmen
-
ZSchneidi schrieb:
Vielleicht sollte ich ein Buch auch mal bis zu ende lesen
In der Annahme, daß das dein erstes besseres C++-Buch ist:
Ja, Leg die Tastatur beiseite und zieh das Buch rein. Ganz oberflächlich nur, aber es ist notwendig, daß Du einen Überblick gewinnst. Versuche beim ersteb "Lesen" nicht, den Code zu verstehen, halte nicht an, wenn Du was nicht verstehst.
Danach lies es nochmal, und tobe Dich aus und probiere alles aus. Steck keinen Marker rein. Wenn Du was erneut liest, was Du gerade ausprobiert hast, verstehst Du schon wieder ein wenig mehr. Beim Ausprobieren eines Tricks wirst Du jetzt nicht mehr für Nebenprobleme irgendwelchen Scheiß benutzen, sondern den fürs Nebenproblem angemessenen Trick, auch wenn der im Buch ganz woanders steht. (Außerdem bräuchtest Du drei Marker und wüßtest nie, welcher gilt.)
-
Ja das sollte ich mir wirklich mal vornehmen, meist bin ich aber zu vorschnell. Ich lese was, probiers aus, habs auch kappiert. Hab dann meist aber noch so viel anderes Zeug um die Ohren, dass ich beim nächsten mal nicht mehr im detail weiß, was ich da eigentlich gelesen hab.
Is bei mir momentan auch so, dass sich vieles überschlägt. Hatte nu mit C angefangen, war dann kurz an Java dran, wollte das aber nich weiter vertiefen, nebenbei noch php, auch wenns da nicht so viel zu lernen gibt ^^
Jetzt lerne ich parrallel zu C++ noch QT, Webdesign, Flash, Flex und wat nich noch alles. Ich sollte da wirklich mal prioritäten setzen ^^ und die sind für mich erstmal C++ und QT.
Werd mir deinen Rat aber mal zu herzen nehmen und nen Buch wirklich erstmal aufmerksam durcharbeiten. Ich muss jetz erstmal die Syntax nahtlos drauf kriegen.
-
ZSchneidi schrieb:
Werd mir deinen Rat aber mal zu herzen nehmen und nen Buch wirklich erstmal aufmerksam durcharbeiten.
Komisch. Ich wollte gerade nicht, daß Du es aufmerksam durchliest, sondern schnell bis zu Ende durchliest, damit Du weniger zum Frickeln gezwungen bist.
-
Problem is, wenn ich das schnell durchgehe, hab ich spätestens nach 3 Seiten vergessen, was ich da gerade behandelt hab.
Also muss ich da schon konzentriert und aufmerksam an die sache gehen. So wars eher zu verstehen. Bezog sich dann auch darauf, dass ich es lese und nicht versuche das gleich umzusetzen, also direkt einmal durchgehe.
-
^^volkard hat garnicht so unrecht. du solltest das buch besser auch nicht von vorn bis hinten durchlesen, wie einen roman, sondern such dir irgendwelche kapitel raus, die dich interessieren. dinge die einen nicht interessieren und die man auch nicht lernen muss (z.b. um 'ne prüfung zu bestehen oder so), vergisst man schnell wieder (jedenfalls die feinheiten).
-
#fricky schrieb:
du solltest das buch besser auch nicht von vorn bis hinten durchlesen, wie einen roman, sondern such dir irgendwelche kapitel raus, die dich interessieren.
ich meinte vorn bis hinten zum überblickgewinnen.