Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 5 - Crawl
Hallo,
ich habe ein Problem mit [m]opendir(3)[/m], [m]lstat(2)[/m] und [m]closedir(3)[/m]. Wenn ich das folgende Programm mit passenden Parametern ausfuehre, kommt keine Fehlermeldung:
int main(int argc, char **argv) {
DIR *dir = opendir(argv[1]);
struct dirent *dirStruct = readdir(dir);
closedir(dir);
exit(EXIT_SUCCESS);
}
Wenn ich jedoch zwischen [m]readdir[/m] und [m]closedir[/m] noch die noetigen Variablen fuer [m]lstat[/m] anlege und [m]lstat[/m] vor [m]closedir[/m] ausfuehre (was funktioniert), dann liefert mir [m]closedir(dir)[/m] einen Speicherzugriffsfehler. Zwischen [m]readdir[/m] und [m]closedir[/m] greife ich jedoch nicht ein einziges mal auf die Variable [m]dir[/m] zu.
Hat jemand eine Idee, was bei mir falsch laufen koennte?
Bau erst am besten mal Fehlerabfragen ein, um sicherzustellen, dass da nicht schon von Anfang an das z. B. Öffnen des Verzeichnisses fehlschlägt.
Ansonsten gilt der altbewährte Standardtipp: Mit [m]-g[/m] übersetzen und Valgrind draufhetzen.
Vielleicht eine dumme Frage, aber kann mir jemand nen Tipp/Hinweis geben, wofür man bei der Aufgabe genau atoi(3) und basename(3) benötigt?
Mir ist jetzt nach den ersten Implementierungen noch nicht so ganz ersichtlich geworden, wozu man die Methoden nutzen sollte.
EDIT: Muss man in der path-Angabe auch mit Wildcards umgehen können? Oder nur bei der -name-Option?
Vielen Dank!
atoi(3) z.B. um die maximale Suchtiefe zu erhalten, die als Parameter dem Programm mitgegeben wird - geht aber auch mit strtol(3)
und basename(3) habe ich auch nicht gebraucht
Nur bei [m]-name[/m].
ich steh gerade iwie auf dem Schlauch… ich check einfach nicht, was die Methode getValueForOption machen soll -.-
kann mir das mal jemand erklären bitte?
//input for command line:
./argPsr test1 test 12 tets32 -name=Name1 -type=Type -size=1234123213
printf("name Val: %s\n", getValueForOption("name"));
//würde dir dann folgendes ausgeben:
name Val: Name1
d.h. du musst erstmal gucken ob “name” als substr in deinem argv vorkommt und zwar mit einem “-” davor und falls ja musst du alles was nach dem “=” kommt zurückgeben.
Darf in den Argumenten eigentlich irgendwas vorkommen wie “-xyz=abc” wobei xyz keins der vorgegebenen Keywörter ist?
Also im Bereich [arguments…] meine ich. D.h. als Pfad, wenn z.B. ein Ordner so heißt.
Probier es doch einfach mal mit dem vom Lehrstuhl bereitgestellten crawler aus.
Wo du den findest steht auf dem aufgabenblatt.
wie verhält sich c bei kaskadenartigen rekursionen? kann man das so ohne weiteres machen?
also bsp:
int method(int a)
{
if(a == 0)
{ return 1; }
return (method(a-1) + method(a-2));
}
würde das ohne weiteres klappen oder geht da durch die speicherungsstrukturen was kaputt?
Das geht, solang dein Stack nicht ausgeht. Also fuer ausreichend kleine Werte von a.
ok perfekt, danke
In der Aufgabenstellung steht zur Option [m]maxdepth[/m]: “0: Nur die auf der Kommandozeile ubergebenen Pfade selbst werden untersucht (nicht deren Inhalt)”.
Angenommen, ich befinde mich in einem Verzeichnis, das keine Ordner enthaelt. Wenn ich aus diesem Verzeichnis [m]./crawl . -name=.* -maxdepth=0[/m] aufruefe, wird [m].[/m] ausgegeben, da dies der uebergebene Pfad ist und mit den Optionen uebereinstimmt. Wenn ich nun aber [m]./crawl . -name=.* -maxdepth=1[/m] aufrufe, dann muesste doch [m].[/m] nicht mehr ausgegeben werden, da man die rekursive Methode mit [m]maxdepth = 1[/m] und [m]path = “.”[/m] aufruft und es keine weiteren rekursiven Aufrufe gibt. Also gibt es in diesem Fall keine Moeglichkeit, dass die rekursiv implementierte Methode mit den Parametern [m]maxdepth = 0[/m] und [m]path = “.”[/m] aufgerufen wird.
Da in der Aufgabenstellung fuer den Fall [m]maxdepth = 1[/m] nicht steht, dass die uebergebenen Pfaede selbst untersucht werden sollen, sollte man den [m].[/m] nicht ausgeben oder? Die spteam-Implementierung gibt in diesem Fall aber [m].[/m] aus. Wie soll ich es denn implementieren?
Ich faende es sinvoller, den Punkt auszugeben, aber dann wuerde ich mich ja nicht an die Aufgabenstellung halten oder habe ich sie nur falsch verstanden?
maxdepth=0 → nur der übergebene pfad wird ausgegeben, wenn er mit den optionen übereinstimmt.
bei maxdepth=1 → der übergebene pfad und dessen inhalt werden ausgegeben wenn sie mit den optionen übereinstimmen
und die “.” und “…” Ordner sollen immer ignoriert werden
wenn du nicht weißt, wie sich das programm in bestimmten situationen verhält würde ich einfach mal die crawl in /proj/i4sp1/pub/aufgabe5 ausführen.
In der Angabe steht aber: „1: der Inhalt auf der Kommandozeile ubergebener Verzeichnisse wird untersucht, aber nicht der ihrer Unterverzeichniss“. Das beinhaltet meiner Meinung nach nicht den uebergebenen Pfad selbst.
Das habe ich. Deswegen habe ich ja geschrieben, dass die spteam-Implementierung [m].[/m] ausgibt, wenn man [m].[/m] als Wurzelverzeichnis angibt und [m].[/m] mit den Optionen uebereinstimmt. Das passt ja auch, weils so in der Angabe steht. Jedoch weiss ich nicht, wie ich mich jetzt im Fall [m]maxdepth = 1[/m] verhalten soll. Denn in aelteren Threads steht teilweise, dass es Faelle gibt, in denen man sich lieber nicht an die gestellte Implementierung haelt.
Euer Programm soll sich genauso verhalten wie die Musterlösung.
0: Genau die übergebenen Pfade werden ausgegeben, sofern sie die Kriterien erfüllen.
→ kein rekursiver Abstieg
1: Genau die übergebenen Pfade werden ausgegeben, sofern sie die Kriterien erfüllen.
Zusätzlich werden alle übergebenen Pfade, die Verzeichnisse sind, durchsucht und alle ihrer Einträge, die die Kriterien erfüllen, werden ausgegeben.
→ rekursiver Abstieg um maximal eine Ebene
Muss unsere Implemntierung genauso arbeiten?
Zum Beispiel gibt unser Programm noch Fehler wie
/root
/root: Permission denied
aus und die Referenz-Implementierung nicht. Bei der Referenz-Implementierung erscheint die zweite Zeile nicht.
Ist das so okay, oder sollten wir das noch abändern (also die Meldungen rausnehmen)?