Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/ckdu: Unterschied zwischen den Versionen

(Vorgabe: Link einfügen)
K (linkfix)
 
(14 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Diese Aufgabe ist eine besondere Aufgabe. Sie wird(wurde) in der 7.Vorlesung fast komplett Implementiert. Da dies sehr viel ist - und damit wichtige Fragen dort geklaert werden koennen, probiert diese Aufgabe zu Hause uebers Wochenende doch schon mal selbst zu implementieren.
+
Diese Aufgabe ist eine besondere Aufgabe. Sie wurde in der 7. Vorlesung des C-Kurs 2010 live fast komplett implementiert.
  
 
= Aufbau dieser Seite =
 
= Aufbau dieser Seite =
Es gibt mehrere Stufen. D.h. wir haben diese grosse Aufgabe schon fuer euch in kleine Happen geteilt. Wenn ihr also _wirklich_ nicht weiterkommt, koennt ihr euch in der Vorgabe (base) der naechst hoeheren Stufe angucken wie wir es geloest haben. Aber bedenke: Jede Stufe wird anspruchsvoller!
+
Es gibt mehrere Stufen. Das heißt wir haben diese große Aufgabe schon für euch in kleine Happen geteilt. Wenn ihr also ''wirklich'' nicht weiterkommt, könnt ihr euch in der Vorgabe (base1.c bis base 3.c) der nächst höheren Stufe angucken wie wir es gelöst haben. Aber bedenke: Jede Stufe wird ein bisschen anspruchsvoller!
  
 
= Funktion =
 
= Funktion =
ckdu soll wie das Tool ''du'' auch, eine Auflistung aller Dateien/Ordner und deren Groesse. Zusaetzlich soll ckdu diese Liste auch sortieren und menschlich Lesbar gestalten (in KB,MB,GB).
+
ckdu soll wie das Tool ''du'' auch, eine Auflistung aller Dateien/Ordner und deren Größe. Zusätzlich soll ckdu diese Liste auch sortieren und menschlich Lesbar gestalten (in KB, MB, GB).
 +
 
 +
= Vorgaben =
 +
Für jede Stufe findet ihr eine eigene Vorgabe (falls ihr irgendwo gar nicht weiter kommt).
 +
Um diese Vorgaben kurz zu halten, haben wir das error_handling ausgelagert:
 +
 
 +
* base[1-3].c findet ihr weiter unten..
 +
* [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2010/aufgaben/ckdu/error_handling.c Download (error_handling.c)]
 +
* [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2010/aufgaben/ckdu/error_handling.h Download (error_handling.h)]
  
 
= Stufen =
 
= Stufen =
 
== 1. Stufe ==
 
== 1. Stufe ==
 
Ordnerinhalt einlesen und ausgeben.
 
Ordnerinhalt einlesen und ausgeben.
Aehnliche wie:  ls -1s
+
Ähnliche wie:  ls -1s
  
 
<u>''so koennte das dann aussehen:''</u>
 
<u>''so koennte das dann aussehen:''</u>
Zeile 21: Zeile 29:
  
 
=== Vorgabe ===
 
=== Vorgabe ===
* [http://git.goodpoint.de/?p=ckdu-live.git;a=blob_plain;f=base1.c;hb=HEAD Download (base1.c)]
+
* [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2010/aufgaben/ckdu/base1.c Download (base1.c)]
  
 
== 2. Stufe ==
 
== 2. Stufe ==
Refactoring !
+
Refactoring - zu: <br>
Eingelesene Inhalte in einer Liste speichern.
+
Eingelesene Inhalte in einer Liste speichern.<br>
Diese Liste wieder Ausgaben.
+
Diese Liste wieder ausgeben.
 +
 
 +
Dies soll in den folgenden drei Funktionen geschehen,<br>
 +
so dass die main() diese Funktionen aufruft und somit nur ein paar Zeilen lang wird.
 +
 
 +
Erzeugt ein neuen tree_entry. Die Parameterliste muss um entsprechende Variablen erweitert werden...
 +
void initialize_tree_entry(ckdu_tree_entry * entry /* INSERT CODE HERE */)
 +
 
 +
Speichert alle benoetigten Dateiattribute des als char-array uebergebenen Verzeichnisses unterhalb des mit uebergebenen root-node.
 +
void crawl_tree(ckdu_tree_entry * root, const char * dirname)
 +
 
 +
Gibt alle Dateien unterhalb von uebergebenen root-node auf der console aus.
 +
void print_tree(const ckdu_tree_entry * root)
 +
 
 +
 
 +
 
 +
=== Vorgabe ===
 +
* [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2010/aufgaben/ckdu/base2.c Download (base2.c)]
  
 
== 3. Stufe ==
 
== 3. Stufe ==
Zeile 34: Zeile 59:
 
<u>''so koennte das dann aussehen:''</u>
 
<u>''so koennte das dann aussehen:''</u>
 
<pre>
 
<pre>
153M img/
+
  0.0M HelloWorld.snm
  12,9M img/uebung.png
+
30.0M HelloWorld.pdf
  24,9M img/vortrag.png
+
36.0K HelloWorld.tex
  86,1M img/world2.png
+
153.0M img/
    3,9M img/world.png
+
12.0M  uebung.png
30M HelloWorld.pdf
+
24.0M  vortrag.png
  0 HelloWorld.snm
+
86.0M  world2.png
36K HelloWorld.tex
+
  3.0M  world.png
 
</pre>
 
</pre>
 +
 +
=== Vorgabe ===
 +
* [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2010/aufgaben/ckdu/base3.c Download (base3.c)]
  
 
== 4. Stufe ==
 
== 4. Stufe ==
Zeile 49: Zeile 77:
 
<u>''so koennte das dann aussehen:''</u>
 
<u>''so koennte das dann aussehen:''</u>
 
<pre>
 
<pre>
153M img/
+
153.0M img/
  86,1M img/world2.png
+
86.0M  world2.png
  24,9M img/vortrag.png
+
24.0M  vortrag.png
  12,9M img/uebung.png
+
12.0M  uebung.png
    3,9M img/world.png
+
  3.0M  world.png
  30M HelloWorld.pdf
+
  30.0M HelloWorld.pdf
  36K HelloWorld.tex
+
  36.0K HelloWorld.tex
  0 HelloWorld.snm
+
  0.0M HelloWorld.snm
 
</pre>
 
</pre>
 +
 +
=== Vorgabe ===
 +
* ''Absichtlich keine Vorgabe. Bitte erweitert eure Lösung von Stufe 3.''
  
 
== 5. Stufe ==
 
== 5. Stufe ==
 
In dieser Stufe folgen alle wichtigen Sachen, die man noch beachten '''muss''', wenn man auf dem Dateisystem operiert.
 
In dieser Stufe folgen alle wichtigen Sachen, die man noch beachten '''muss''', wenn man auf dem Dateisystem operiert.
Ausserdem bieten wir einige Ideen mit denen du dein ckdu erweiteren kannst :)
+
Außerdem bieten wir einige Ideen mit denen du dein ckdu erweiteren kannst :)
 
 
 
 
* Symlinks nur einmal Folgen (parameter)
 
* Hardlinks nur einmal Folgen
 
 
 
* Fehler-handling
 
  
  
 +
* Symlinks nur einmal folgen (Parameter)
 +
* Hardlinks nur einmal folgen
 +
* Ordentliches Fehler-handling
 
* du-parameter-kompatible:
 
* du-parameter-kompatible:
 
** "--max-depth"
 
** "--max-depth"
** getopt
+
** basierend auf getopt
** device verlassen
+
** Device verlassen verbieten
 +
* Wird nicht von den Betreuern betreut:
 +
** Farbige Ausgabe
 +
** Interaktivität
 +
** Einlesen mit mehreren Threads?
  
 +
=== Vorgabe ===
 +
* ''Absichtlich keine Vorgabe. Bitte erweitert eure Lösung von Stufe 4.''
  
* Wird nicht von den Betreuern betreut:
+
= Kommentare =
** Farbige ausgabe
+
* Wenn ich das richtig verstehe, sollten in der Vorgabe base3.c schon die Verzeichnisse rekursiv dargestellt werden. Das werden sie leider nicht, Unterordner werden nicht durchsucht.
** interaktive
+
** Das soll in Stufe 3 implementiert werden - die Vorgabe kann das mit Absicht noch nicht --[[Benutzer:Pipping|Pipping]] 01:36, 27. Sep. 2010 (CEST)
 +
* Die Beispielausgabe von Stufe4 ist auch nicht bis in jedes Unterverzeichnis sortiert. War das so gewollt?
 +
** Nein, das ist ein Bug. Danke für den Hinweis, sollte nun gefixt sein --[[Benutzer:Pipping|Pipping]] 01:36, 27. Sep. 2010 (CEST)

Aktuelle Version vom 4. März 2015, 11:25 Uhr

Diese Aufgabe ist eine besondere Aufgabe. Sie wurde in der 7. Vorlesung des C-Kurs 2010 live fast komplett implementiert.

Aufbau dieser Seite

Es gibt mehrere Stufen. Das heißt wir haben diese große Aufgabe schon für euch in kleine Happen geteilt. Wenn ihr also wirklich nicht weiterkommt, könnt ihr euch in der Vorgabe (base1.c bis base 3.c) der nächst höheren Stufe angucken wie wir es gelöst haben. Aber bedenke: Jede Stufe wird ein bisschen anspruchsvoller!

Funktion

ckdu soll wie das Tool du auch, eine Auflistung aller Dateien/Ordner und deren Größe. Zusätzlich soll ckdu diese Liste auch sortieren und menschlich Lesbar gestalten (in KB, MB, GB).

Vorgaben

Für jede Stufe findet ihr eine eigene Vorgabe (falls ihr irgendwo gar nicht weiter kommt). Um diese Vorgaben kurz zu halten, haben wir das error_handling ausgelagert:

Stufen

1. Stufe

Ordnerinhalt einlesen und ausgeben. Ähnliche wie: ls -1s

so koennte das dann aussehen:

    4 img
29832 HelloWorld.pdf
    0 HelloWorld.snm
   36 HelloWorld.tex

Vorgabe

2. Stufe

Refactoring - zu:
Eingelesene Inhalte in einer Liste speichern.
Diese Liste wieder ausgeben.

Dies soll in den folgenden drei Funktionen geschehen,
so dass die main() diese Funktionen aufruft und somit nur ein paar Zeilen lang wird.

Erzeugt ein neuen tree_entry. Die Parameterliste muss um entsprechende Variablen erweitert werden...

void initialize_tree_entry(ckdu_tree_entry * entry /* INSERT CODE HERE */)

Speichert alle benoetigten Dateiattribute des als char-array uebergebenen Verzeichnisses unterhalb des mit uebergebenen root-node.

void crawl_tree(ckdu_tree_entry * root, const char * dirname) 

Gibt alle Dateien unterhalb von uebergebenen root-node auf der console aus.

void print_tree(const ckdu_tree_entry * root)


Vorgabe

3. Stufe

Ordnerinhalte rekursiv aufaddieren

so koennte das dann aussehen:

  0.0M HelloWorld.snm
 30.0M HelloWorld.pdf
 36.0K HelloWorld.tex
153.0M img/
 12.0M   uebung.png
 24.0M   vortrag.png
 86.0M   world2.png
  3.0M   world.png

Vorgabe

4. Stufe

sortieren nach Groesse (absteigend)

so koennte das dann aussehen:

153.0M img/
 86.0M   world2.png
 24.0M   vortrag.png
 12.0M   uebung.png
  3.0M   world.png
 30.0M HelloWorld.pdf
 36.0K HelloWorld.tex
  0.0M HelloWorld.snm

Vorgabe

  • Absichtlich keine Vorgabe. Bitte erweitert eure Lösung von Stufe 3.

5. Stufe

In dieser Stufe folgen alle wichtigen Sachen, die man noch beachten muss, wenn man auf dem Dateisystem operiert. Außerdem bieten wir einige Ideen mit denen du dein ckdu erweiteren kannst :)


  • Symlinks nur einmal folgen (Parameter)
  • Hardlinks nur einmal folgen
  • Ordentliches Fehler-handling
  • du-parameter-kompatible:
    • "--max-depth"
    • basierend auf getopt
    • Device verlassen verbieten
  • Wird nicht von den Betreuern betreut:
    • Farbige Ausgabe
    • Interaktivität
    • Einlesen mit mehreren Threads?

Vorgabe

  • Absichtlich keine Vorgabe. Bitte erweitert eure Lösung von Stufe 4.

Kommentare

  • Wenn ich das richtig verstehe, sollten in der Vorgabe base3.c schon die Verzeichnisse rekursiv dargestellt werden. Das werden sie leider nicht, Unterordner werden nicht durchsucht.
    • Das soll in Stufe 3 implementiert werden - die Vorgabe kann das mit Absicht noch nicht --Pipping 01:36, 27. Sep. 2010 (CEST)
  • Die Beispielausgabe von Stufe4 ist auch nicht bis in jedes Unterverzeichnis sortiert. War das so gewollt?
    • Nein, das ist ein Bug. Danke für den Hinweis, sollte nun gefixt sein --Pipping 01:36, 27. Sep. 2010 (CEST)