Size: 6556
Comment:
|
← Revision 715 as of 2010-06-19 23:54:11 ⇥
Size: 2777
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
== Fragen und Kommentare zur 7. Vorlesung / zum 7. Übungsblatt == @Martin das ganze funktioniert mit {{{ fprintf(yourfile, "The string to be added") }}} Beachte dabei dass wenn die Datei bereits vorhanden ist sie mit den neuen Werten überschrieben wird. Der Code drumrum hat da Ähnlichkeiten mit dem von FILE* inputFile... und ich glaub wenn der Pfad nicht angegeben ist wird standardmäßig der aktuelle Pfad des Programms benutzt. '''fry (UTC+2:00) 1276355745 UTS <<BR>>''' |
== Fragen und Kommentare zur 8. Vorlesung / zum 8. Übungsblatt == |
Line 9: | Line 3: |
Ich habe noch eine Frage: Ich weiß leider noch nicht so richtig, wie ich meinem Programm sagen soll, dass es, falls die -o=file.txt Option angegeben ist, keine Standard ausgabe macht, sondern in die Datei file.txt schreibt. Geht das irgendwie mit fwrite? '''MartinW 12Jun10 15:50<<BR>>''' | Auf vielfachen Wunsch haben wir jetzt statt dem Wiki ein ... [trommelwirbel] ... [[http://stromboli.informatik.uni-freiburg.de/teaching/cplusplus-ss2010/forum|Forum]] !!! |
Line 11: | Line 5: |
Wie sollen wir eigentlich die input und output Optionen testen? Und: Sollen wir die findMatches Methode testen? Im ersten Teil gibt es ja eine Abbruchbedingung, aber ich wüsste nicht, wie man die mit ASSERT_DEATH testen soll. ''' MartinW 12Jun10 15:40''' | @Dario + Alle: Ich bitte sehr darum, hier nichts mehr reinzuschreiben. Die Mehrheit der TeilnehmerInnen hat sich ein Forum gewünscht (teilweise sehr), und deswegen haben wir jetzt ein Forum. Wiki und Forum zur gleichen Zeit ist nicht praktikabel. Es ist auch keinen Deut schwieriger oder mehr Arbeit eine Frage auf dem Forum zu posten als auf dem Wiki. '''Hannah 20Jun10 00:53''' |
Line 13: | Line 7: |
@Fabian: Sie haben völlig Recht, habe ich vergessen, 1/2 Punkt Abzug für mich :-( Ich habe es jetzt im SVN korrigiert. '''Hannah 10Jun10 14:31''' | @Es funktioniert auch mit leerzeichen.Die sache mit der Menge habe erst heute morgen mit dem Set.h Datei bemerkt, davor habe ich eine andere Implementierung benutzt.. Naja die lange Seite ist effizienter als 200 Topics in einem Forum.Und was ich auch nicht verstehe ist warum weil ein paar Leute das Forum wollen , dann müssen auch die andere sich anpassen. Ich bin dabei bei der Petition gegen das Forum oder zumindest schlage eine demokratische Lösung vor ,beides laufen lassen. |
Line 15: | Line 11: |
@Hannah: Noch eine Frage zu Ihrer Musterlösung zum letzten Blatt: Ist die Musterlösung const-korrekt? Meiner Meinung nach müsste hinter ''find'' noch ein const, da ja nichts an dem Objekt verändert wird. '''Fabian 10Jun10 14:18''' | '''Dario''' |
Line 17: | Line 13: |
@Martin: Stimmt + super, dass Sie das rausgefunden haben, ein wirklicher gemeiner und schwer zu findender Bug, ich würde sagen das ist (mindestens) einen Bonuspunkt wert! Ich habe da beim Erklären nicht dran gedacht, weil man ja normalerweise die Kommandozeilen-Parameter nur einmal parsed. Aber bei mehreren Tests hintereinander halt öfter, und dann muss man ''optind'' in der Tat von Hand zurücksetzen. Ich habe das jetzt auch in der ''vorlesungen/vorlesung-7/Grep.cpp'' geändert und kommentiert, einfach ''svn update'' machen. '''Hannah 10Jun10 12:43''' | @Dario. Also mich stören erstmal die Leerzeichen zwischen ''array'' und ''_bits''. Das klappt so und ist richtig hier reinkopiert? |
Line 19: | Line 15: |
Habe den Fehler durch merkwürdige Fehlermeldungen von GTest gefunden. Ich hatte in GrepTest die drei Tests mit Optionen als den für das input file, output file und case insensitive match hintereinander. Zuerst war der Fehler beim output file test. Nachdem ich den mal auskommentiert hatte war er im case insensitive match test. Dann habe ich mal die Reihenfolge vertauscht. Der Fehler trat also immer in dem Test '''nach''' dem ersten Test mit Option auf. Dies ließ sich dann beheben indem ich die Variable "optind" vor der while Schleife auf 1 gesetzt habe. '''optind''' ist eine externe Variable von getopt die auf den Index des nächsten zu prozessierenden Eintrags im Feld argv zeigt. Diese wird vom System standardmäßig auf 1 gesetzt und läuft hoch, wenn die Optionen geparsed werden (siehe man 3 getopt). Wenn man jetzt den nächsten Test aufruft, steht diese Variable immer noch auf dem letzten Element des argv Zeigers. Das hießt c wird gleich auf -1 gesetzt und verlässt die Schleife und setzt auch _outputFileName nicht. Es ist also sinnvoll vor jedem Durchlauf der Parsingschleife optind auf 1 zu setzen. Eine Lösung wäre also: | Zweitens implementieren wir die ''Set''-Klasse. Soll imo heissen, dass wenn ein Element bereits in der Menge ist, dass es dann nicht mehr ein zweites Mal am Ende aufgenommen wird. Ich kenne deine Implementierung hier nicht, aber ''array._bits[2]'' sollte sinngemäß zu einem "ungültigen" Speicherzugriff führen, da für die ''Set<bool>'' Variante zwei Felder ja schon reichen für alle Elemente. Ja, das Forum hat auch Nachteile, aber ich finde es auch besser, als hier auf einer langen Seite zu suchen, ob jemand schon mein Problem in irgendeiner Form vorgetragen hat. '''Dominik 19June 15:38''' Hallo ich möchte mein bool pushBack testen aber irgendwie klappt´s es noch nicht. z.B. wenn ich so teste |
Line 22: | Line 21: |
optind = 1; while (true) { int c = getopt_long(argc, argv, "ioc", options, NULL); if (c == -1) break; switch (c) ... |
Set<bool> array; array.pushBack(true); array.pushBack(false); // array.pushBack(false); // array.pushBack(true); ASSERT_EQ(true, array. _bits[0]); ASSERT_EQ(false, array. _bits[1]); // ASSERT_EQ(true, array. _bits[2]); |
Line 30: | Line 30: |
Beim Aufruf machen "--output-file=out.txt" und "--output-file out.txt" keinen Unterschied. Sowohl im Test als auch beim Aufruf der GrepMain direkt. Es funktioniert beides. '''MartinS 10Jun10 11:21''' | läuft es, aber wenn ich die kommentierten Zeilen hinzufüge dann klappt es nicht mehr. |
Line 32: | Line 32: |
In der Vorlesung wurde gesagt, dass die Parameterwerte mit einem {{{=}}} direkt an ihre Schalter angehaengt werden. | P.S. Auf dem Forum möchte ich nicht schreiben, da ich es zeitaufwändiger und unoriginell finde und zweitens habe ich es nie gewollt. |
Line 34: | Line 34: |
{{{ argv[0] = const_cast<char*>(""); argv[1] = const_cast<char*>("--output-file=out.txt"); argv[2] = const_cast<char*>("P"); }}} Sollte dann richtig funktionieren. '''AxelLehmann 10Jun10 11:03''' |
'''Dario 18Jun 21:30''' |
Line 41: | Line 36: |
@Martin: Was passiert, wenn Sie in in Ihrem Test schreiben | Bitte Ihre Fragen in Zukunft dort stellen, unter der Rubrik "Aktuelles Übungsblatt". Das meiste dort sollte selbst erklärend sein. Sie können sich auf dem Forum registrieren (das macht die Benutzung komfortabler), müssen es aber nicht. |
Line 43: | Line 38: |
{{{ int argc = 3; char* argv[3]; argv[0] = const_cast<char*>(""); argv[1] = const_cast<char*>("--output-file=out.txt"); argv[2] = const_cast<char*>("P"); }}} Läuft der Test dann durch? '''Hannah 10Jun10 10:39''' Bin gerade dabei die parseCommandLineArguments Funktion mit den Optionen input-file und output-file zu testen. Hock' jetzt schon 'ne Weile dran und find' den Fehler nicht. Vielleicht hat jemand gerade mehr Gehirnschmalz, als ich. Hier das Codestück in der Grep.cpp (Ich hoffe, dass ist OK, wenn ich das hier rein Stelle, ist ja nicht wirklich viel mehr als das von der Vorlesung): {{{ // First parse the options. struct option options[] = { {"input-file" , 1, NULL, 'i'}, {"output-file" , 1, NULL, 'o'}, {"case-insensitive-match", 0, NULL, 'c'}, {NULL , 0, NULL, 0 } }; while (true) { int c = getopt_long(argc, argv, "ioc", options, NULL); if (c == -1) break; switch (c) { case 'i': _inputFileName = optarg; break; case 'c': _caseSensitiveMatch = false; break; case 'o': _outputFileName = optarg; break; default: printUsage(); exit(1); } }}} Mein Test: {{{ Grep grep; int argc = 4; char* argv[4]; argv[0] = const_cast<char*>(""); argv[1] = const_cast<char*>("--output-file"); argv[2] = const_cast<char*>("out.txt"); argv[3] = const_cast<char*>("P"); grep.parseCommandLineArguments(argc, argv); ASSERT_EQ(0, grep._inputFileName[0]); ASSERT_EQ('P', grep._pattern[0]); ASSERT_EQ(0, grep._pattern[1]); ASSERT_EQ('o', grep._outputFileName[0]); ASSERT_EQ('u', grep._outputFileName[1]); ASSERT_EQ('t', grep._outputFileName[2]); ASSERT_EQ('.', grep._outputFileName[3]); ASSERT_EQ('t', grep._outputFileName[4]); ASSERT_EQ('x', grep._outputFileName[5]); ASSERT_EQ('t', grep._outputFileName[6]); }}} Fehlermeldung: {{{ Value of: grep._outputFileName[0] Actual: '\0' (0, 0x0) Expected: 'o' Which is: 'o' (111, 0x6F) }}} Den Test für das input file hab' ich im Prinzip analog dazu gemacht. Der funktioniert. '''MartinS 10Jun10 10:34''' @Simson: Indeed, da fehlt ein Punkt, danke für den Hinweis! Habe ihn jetzt gerade noch zugefügt und die neue Version committed. Machen Sie einfach ''svn update'', dann bekommen Sie ihn auch :-) '''Hannah 10Jun10 00:14''' Sollte {{{isMatch("This is just a line", "a..ne$")}}} wirklich wahr zurückgeben? Fehlt da nicht ein {{{.}}} ? '''Simson 10Jun10 00:09''' |
'''Hannah 18Jun10 1:17''' |
Fragen und Kommentare zur 8. Vorlesung / zum 8. Übungsblatt
Auf vielfachen Wunsch haben wir jetzt statt dem Wiki ein ... [trommelwirbel] ... Forum !!!
@Dario + Alle: Ich bitte sehr darum, hier nichts mehr reinzuschreiben. Die Mehrheit der TeilnehmerInnen hat sich ein Forum gewünscht (teilweise sehr), und deswegen haben wir jetzt ein Forum. Wiki und Forum zur gleichen Zeit ist nicht praktikabel. Es ist auch keinen Deut schwieriger oder mehr Arbeit eine Frage auf dem Forum zu posten als auf dem Wiki. Hannah 20Jun10 00:53
@Es funktioniert auch mit leerzeichen.Die sache mit der Menge habe erst heute morgen mit dem Set.h Datei bemerkt, davor habe ich eine andere Implementierung benutzt.. Naja die lange Seite ist effizienter als 200 Topics in einem Forum.Und was ich auch nicht verstehe ist warum weil ein paar Leute das Forum wollen , dann müssen auch die andere sich anpassen. Ich bin dabei bei der Petition gegen das Forum oder zumindest schlage eine demokratische Lösung vor ,beides laufen lassen.
Dario
@Dario. Also mich stören erstmal die Leerzeichen zwischen array und _bits. Das klappt so und ist richtig hier reinkopiert?
Zweitens implementieren wir die Set-Klasse. Soll imo heissen, dass wenn ein Element bereits in der Menge ist, dass es dann nicht mehr ein zweites Mal am Ende aufgenommen wird. Ich kenne deine Implementierung hier nicht, aber array._bits[2] sollte sinngemäß zu einem "ungültigen" Speicherzugriff führen, da für die Set<bool> Variante zwei Felder ja schon reichen für alle Elemente.
Ja, das Forum hat auch Nachteile, aber ich finde es auch besser, als hier auf einer langen Seite zu suchen, ob jemand schon mein Problem in irgendeiner Form vorgetragen hat. Dominik 19June 15:38 Hallo ich möchte mein bool pushBack testen aber irgendwie klappt´s es noch nicht. z.B. wenn ich so teste
Set<bool> array; array.pushBack(true); array.pushBack(false); // array.pushBack(false); // array.pushBack(true); ASSERT_EQ(true, array. _bits[0]); ASSERT_EQ(false, array. _bits[1]); // ASSERT_EQ(true, array. _bits[2]);
läuft es, aber wenn ich die kommentierten Zeilen hinzufüge dann klappt es nicht mehr.
P.S. Auf dem Forum möchte ich nicht schreiben, da ich es zeitaufwändiger und unoriginell finde und zweitens habe ich es nie gewollt.
Dario 18Jun 21:30
Bitte Ihre Fragen in Zukunft dort stellen, unter der Rubrik "Aktuelles Übungsblatt". Das meiste dort sollte selbst erklärend sein. Sie können sich auf dem Forum registrieren (das macht die Benutzung komfortabler), müssen es aber nicht.
Hannah 18Jun10 1:17