Fragen und Kommentare zur 4. Vorlesung / zum 4. Übungsblatt
(@Hannah:) Zu dem const-Kram: Ja, "const char const *" ergibt keinen Sinn, weil es gleichbedeutend ist mit "const char *" und "char const *", denn das const bezieht sich immer auf das grammatische Element, das links von ihm steht (außer es steht am Zeilenanfang). Was tatsächlich einen Unterschied macht, ist "char const * const", und das braucht man durchaus in der Praxis (auch wenn const references oft die bessere Alternative sind, die jedoch zum Beispiel bei Code, der mit C89/ANSI-C kompatibel sein soll, Probleme bereiten), vor allem solange hier noch mehr C-isms gele(h)r(n)t werden, als wirklich C++. C++ ist übrigens weder eine Obermenge von C, noch ist es eine Erweiterung, es ist eine eigene Sprache, auch wenn die Schnittmenge 95% von C ausmacht (5 != 0, nur so als Hint). Eine gute Daumenregel ist daher auch, nie "const Type identifier" zu benutzen, sondern "Type const identifier", so braucht man sich nur merken, daß const immer für das links con ihm gilt, auch wenn man vom normalen englischen Sprachgebrauch "const char *" für "konstanter Zeichenstring" vielleicht für intuitiver hält (gilt für C und C++). HTH
@Regina: Wie die Warnung sagt, heißt das, dass mit Ihrer Systemuhr etwas nicht stimmt. Oder mit Ihrem Editor, der den Zeitstempel für die Dateien setzt, die er schreibt. Was passiert denn, wenn Sie make clean machen und dann nochmal make build? Wenn das nicht hilft, kopieren Sie die Datei mit der komischen Änderungszeit doch mal woanders hin, löschen Sie dann die ursprüngliche, und kopieren Sie dann die Kopie wieder zurück. Vielleicht stimmt dann der Zeitstempel? Hannah 19Mai10 14:35
@Jens: Ok danke, funktioniert Jan 19.Mai2010 14:31
@Jan: const davor schreiben. Jens 19.Mai2010 13:53
Was kann man eigentlich gegen diese Warnung tuen? Respektive gibt sie Punktabzug?
ListProcessingTest.cpp:12: Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*«
In der Zeile initialisiere ich ein char* mit "text".. Jan 19Mai2010 13:51
Hallo, ich bekomme beim make build immer die Meldung:
make: Warnung: Datei 'ListProcessingMain.cpp' hat Änderungszeit 1,5e+03 s in der Zukunft make: Warnung: Mit der Uhr stimmt etwas nicht. Die Bearbeitung könnte unvollständig sein.
Deshalb kann ich nichts mehr kompilieren. Was soll ich da tun? Regina 19Mai2010 13:41
@Jan + alle: Ein Feld können Sie übrigens in C / C++ wie folgt initialisieren:
const char* daysOfWeek[7] = { "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" }; int firstTenPrimes[10] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
Wenn die Anzahl der Elemente in den { ... } nicht der Größe des Feldes entspricht, meckert der Compiler. Hannah 19Mai10 12:51
@Jan: Das geht am besten so:
const char* longMessage = "This is a really long message that unfortunately" " does not fit into one line. However, it serves" " as a nice example for how to write down a long" " string without cpplint complaining about it.";
Hannah 19Mai10 12:48
Wie kann ich längere char* am besten umbrechen? der linter mag ja keine Zeilen länger als 80 Zeichen.
char* ERROR_CODES[6]; ERROR_CODES[1] = "WARNING: Error in argument %d, at position %d: '%c'.\r\nIllegal char. Only spaces, commata and digits are allowed.\n"; ...
Das hier funktioniert leider nicht... wäre ja auch zu schön.
char* ERROR_CODES[6]; ERROR_CODES[1] = "WARNING: Error in argument %d, at position %d: '%c'.\r\n" + "Illegal char. Only spaces, commata and digits are alowed.\n"; ...
Jan 19Mai10 12:44
@Betim: Ja, Sie können das schon so machen und bekommen dafür keinen Punktabzug, aber wie ich unten gesagt habe würde ich in dem Fall anstelle von dem switch lieber ein if ... else .. if .. usw. verwenden. Und über jedem if bzw else if ein Kommentar der sagt was in dem Fall gemacht wird. Diese Kommentare sollten Sie auch haben, wenn Sie bei dem switch bleiben. Hannah 18Mai10 22:09
Es geht auch so:
switch (listAsString[i]) { case ' ' : break; default: printf("Error: Expected digit or comma, found space.\n"); exit(1); break; }
Daniel 18Mai10 22:06
Mein Code:
switch (listAsString[i]) { case ' ' : if (!digitBegin) { startOfLastNumber = i + 1; break; } else { printf("Error: Expected digit or comma, found space.\n"); exit(1); }
Ich benutz switch schon korrekt, es ist ja nicht so, dass da nur 4 cases stehen. BetimM 18Mai10 21:57
Mein Programm beachtet schon MAX_LIST_SIZE und die Mitteilung auf der Hauptseite habe ich auch beachtet, es ging mir nur darum, dass hier zwischen den verschiedensten Fragen nebenher erwähnt wird, dass zusätzlich noch weitere Meldungen ausgegeben werden müssen, mehr nicht. Es stört mich nicht, dass es gemacht werden muss, es hat mich nur gestört, dass es hier fast untergeht und darum die Bitte, ob man zukünftig solche (meines Erachten) wichtige Sachen nicht auch gleich von Anfang an aufschreiben könnte oder spätestens wenn sie aufkommen direkt auf die Hauptseite packen. Danke Ben 18Mai10 21:45
@Betim 2: Wenn in den case Anweisungen von dem switch größerer Code steht und es wenige cases gibt, sollte das switch auch besser kein switch sein, sondern ein gewöhnliches if (...) { ... } else if (...) { ... } else if (...) { ... } usw. Ein switch ist ja nur eine Abkürzung für so ein if-else-if-usw. und man verwendet es eigentlich nur wenn die Anweisungen für die verschiedenen cases kurz und gleichartig sind. Hannah 18Mai10 21:52
@Betim: Posten Sie doch mal das konkrete Stück Code, was Sie da schreiben wollen. Dann sage ich Ihnen ob das ok ist, oder wie man es besser machen kann. Hannah 18Mai10 21:49
Kriege ich Punkte abgezogen, wenn ich in einem switch-Konstrukt kleinere if-else-Abfragen habe? Z.B.
switch(..) case 1: if(..) { ...} else { ... }
Ich weiss das ist kein guter Programmierstil, aber imho fällt mir nichts besseres ein. BetimM 18Mai2010 21:42
@Ben: Es steht schon in meinem Programm aus der Vorlesung TODO(bast): deal with the case of more than MAX_LIST_SIZE elements. Aber sie haben Recht, ich hätte das auch in der Mitteilung nochmal schreiben sollen. Abgesehen davon habe ich die Aufgabe am Donnerstag nach der Vorlesung auf der Hauptseite präzisiert. Die Mitteilungen auf der Hauptseite sollte selbstverständlich jeder lesen. Danach kamen eigentlich nur noch Nachfragen zu Details. Wer sich an die Präzisierung vom Donnerstag hält bekommt keine Punkte abgezogen, keine Sorge. Ich werde zu dem Thema auch morgen in der Vorlesung noch einmal etwas sagen. Hannah 18Mai10 21:13
Änderen sich die Anforderungen an die Aufgabe noch häufiger? Also weder auf dem Arbeitsblatt noch in der Beschreibung auf der Hauptseite steht, dass man eine Fehlermeldung bei einer zu langen Liste ausgeben muss. Hab das gerade nur hier zwischen dem vielen Text zufällig gefunden. Es wäre gut, wenn solche Anforderungen zumindest immer auf dem Arbeitsblatt stehen würden, damit man nicht die Gefahr läuft, dass plötzlich 2 Tage vor der Abgabe sich wieder etwas ändert. Ich schaue zwar meistens täglich hier ins Wiki, trotzdem finde ich es, so wie es gerade abgelaufen ist, recht unglücklich gelöst. Weil, wie gesagt, man laut Arbeitsblatt keine Fehlermeldung ausgeben muss. Da kann man jetzt nur hoffen, dass jeder das Wiki liest. Danke Ben 18Mai10 20:44
@Jonas: Die Fehlermeldung passt in der Tat nicht zu dem Code den Sie hier gepostet haben. Sind Sie sicher, dass sich die Fehlermeldung auf diese Zeilen in Ihrem Code bezieht? Fall ja, posten Sie doch mal ein minimales Programm, in dem sich dieser Fehler zeigt. Hannah 18Mai10 20:25
@Jonathan: Ja, es ist auch ok, wenn Sie im Falle zu langer Listen einfach exit(1) machen. Und Testen ist auch nicht mandatory, habe ich ja unten schon geschrieben. Wobei es in meinem Code keinen wesentliche Mehrarbeit war diesen Fall auch noch zu behandeln. Hannah 18Mai10 20:22
Hoffe mal die Frage ist nicht zu spezifisch: Ich versuche über die Funktion
bool isValidChar(char n) { ... return true; }
herauszufinden ob das momentane Zeichen legal ist. Das Problem ist aber, dass der Compiler "Invalid converison from 'const char' to 'char*'" ausspuckt, wenn ich die Funktion aufrufe:
isValidChar(listAsString[i])
bzw:
if (isValidChar(listAsString[i]) == true)
und ich eben nicht ganz nachvollziehen kann, warum er überhaupt versucht zu char* zu konvertieren.. JonasH 19:11 18Mai10
Das heißt für zu lange Listen muss ich auch noch eine Fehlermeldung mir aus denken? Denn der Code wächst und wächst, allein meine Datei ListProcessingTest.cpp hat in Zwischenzeit über 100 Zeilen, und es Fehlen noch mindestens 2 Fälle. Denn den Fall zu lange Liste hatte ich verstanden, dass dieser einfach mit exit(1) beendet werden sollte, also in anderen Wörtern soll auch da das Programm weiter laufen und mit interleaveListsOfIntegers fort fahren? JonathanN 18Mai10 16:33
@Hannah: Alles klar, vielen Dank. SebastianS 15:52 18Mai10
@SebastianS: Gute Frage. So ginge es zum Beispiel:
char tooLongList[2 * MAX_LIST_SIZE + 2]; for (int i = 0; i < MAX_LIST_SIZE; ++i) { tooLongList[2 * i] = '0'; tooLongList[2 * i + 1] = ','; } tooLongList[2 * MAX_LIST_SIZE] = '0'; tooLongList[2 * MAX_LIST_SIZE + 1] = 0;
und dann testen ob parseListOfIntegers die Liste abschneidet bzw. die leere Liste zurückgibt, je nachdem wie Sie es implementiert haben. Es gibt aber keinen Punktabzug wenn Sie diesen Fall nicht testen (ist ja schon nicht so einfach, und habe ich auch vorher nicht dran gedacht), aber wenn Sie möchten, gerne, und jetzt habe ich ja schon den halben Code dazu geschrieben. Hannah 18Mai10 15:01
Wie sollen wir eigentlich im Test das Überschreiten von MAX_SIZE_LIST überprüfen? Weil lint wirft da ja immer einen Fehler, dass die Zeile im Test (also die, in der ich den Teststring initialisiere) zu lange wäre ? SebastianS 18Mai10 14:47
@Daniel: Auf jeden Fall eine Warnung ausgeben. Ob Sie die Liste abschneiden oder die leere Liste zurückgeben, sei Ihnen überlassen. Ich habe sie in meiner Lösung einfach abgeschnitten. Das sollte dann auch in der Warnung stehen. Hannah 18Mai10 14:03
Das MAX_LIST_SIZE soll behandelt werden, wie soll das Ergebnis der behandlung aussehen? Warning? Leere Liste zurückgeben? Oder einfach die Liste abschneiden? Daniel 18Mai10 13:56
@Simson: Schauen Sie doch einmal bei einem unserer Fragetermine oder bei Jens Hoffmann vorbei. Das scheint ein nicht-triviales Problem zu sein, das sich am besten mit dem Rechner lösen lässt, sonst schwierig. Hannah 18Mai10 13:55
Habe seit diesem Blatt Probleme mit GTest. Habe meine Fehler unter GTest beschrieben. Vielleicht hat ja wer eine Idee. Simson 18Mai2010 12:05
@Peter + Alle: Ja, wie Dario richtig sagt, beim ersten Mal als const char* deklarieren, und beim zweiten Mal einfach einen anderen Wert an die selbe Variable zuweisen. Das geht deswegen weil das const vor einem pointer nicht etwas heißt, dass man den pointer nicht auf einen anderen Wert (also eine andere Adresse) setzen kann, sondern dass man den Inhalt dessen, worauf der pointer zeigt, nicht verändern kann. Das andere wäre char const *, das gibt es auch, braucht man aber praktisch nie. Und const char const * gibt es auch, braucht man aber auch praktisch nie. Das mit dem const werde ich in einer der nächsten Vorlesungen noch genauer erklären. Hannah 18Mai10 2:27
wenn du das wieder so schreibst const char* deklarierst du dein listAsString 2mal, du musst also ohne const char* schreiben und setzt einfach die neue werte. Dario 18Mai2010 01:52
Ich hab gerade ein paar Probleme mit der Test Datei aus der Vorlesung. Um weitere Randfälle zu testen, müsste man doch den Wert von "const char* listAsString = ... " ändern im Test der Funktion parseListOfIntegers, dies geht aber nicht weil durch const der Compiler sofort meckert, wenn ich ein anderes Szenario testen möchte. Kann mir jemand helfen? Peter 18Mai2010 01:40
@Hannah: Ich habe jetzt die ListProcessing.h Datei in der entsprechenden .cpp includiert und es läuft jetzt alles. Ich dachte das wäre nicht nötig, da es bei den Definitionen für die Funktionen ja auch so klappt. Heinke 17Mai 19:13
@Heinke: Wenn MAX_LIST_SIZE in der .h Datei definiert ist (und das sollte es), müssen Sie diese Datei überall da, wo sie MAX_LIST_SIZE verwenden wollen, includen. Sonst weiß der Compiler nicht, dass es diese Variable gibt. Hannah 17Mai10 18:58
@Hannah: So habe ich es mir auch gedacht und MAX_LIST_SIZE verwendet. Jedoch bekomme ich die Fehlermeldung MAX_LIST_SIZE was not declared in this scope. Woran könnte das liegen? Heinke 17Mai10 18:54
@Dennis: Wenn Sie sich in einer Arbeitskopie aus dem SVN befinden (das sehen Sie daran, ob es einen .svn Unterordner gibt), dann sagt Ihnen cpplint.py wie die header guard aussehen soll. Wenn es den .svn Unterordner nicht gibt, verlangt er den absoluten Pfad. Ich erkläre das in einer der nächsten Vorlesungen. Solange bekommen Sie keinen Punktabzug, wenn das mit den header guards nicht stimmt. Aber wäre nett, wenn Sie's trotzdem versuchen hinzukriegen. Hannah 17Mai10 18:50
@Heinke: Zur ersten Frage: MAX_LIST_SIZE ist eine globale Variable, die brauchen Sie der Funktion nicht extra zu übergeben, Sie können einfach innerhalb der Funktion (und überhaupt überall in Ihrem Code) MAX_LIST_SIZE verwenden. Zur zweiten Frage: Die interleaveListsOfIntegers Funktion soll die beiden Listen schon als int* bekommen (geparsed werden sollen sie vorher). Hannah 17Mai10 18:46
Ich muss die Header Guards an mein Systempfad anpassen damit lint keinen Fehler wirft. Aber wie müssen die dann aussehen, dass das lint auch bei euch auf dem SVN Server keine Fehler wirft? Dennis 17Mai10 18:40
Kann ich der Funktion parseListOfIntegers die Konstante MAX_LIST_SIZE mitgeben, damit ich auf Überlauf testen kann? Und kann ich bei der interleave Funktion davon ausgehen, dass die beiden übergebenen Listen bereits integer sind? Oder müssen sie vorher auch geparsed werden? Heinke 17Mai10 18:40
@Johannes: Siehe dazu mein Kommentar vom 9Mai10 18:54 zum 3. Übungsblatt. Hannah 17Mai10 17:30
@Jonathan: Ja, Fehlermeldungen wie im Beispiel von SebastianS sind perfekt. So viele Fälle sind es nicht. Sobald irgendein Fehler auftritt, können Sie das parsen abbrechen, die entsprechende Fehlermeldung ausgeben und die leere Liste zurück liefern. Sie müssen nichts reparieren oder die wahrscheinlich gemeinte Liste "erraten" und auch nicht alle Fehler finden, der erste reicht. Hannah 17Mai10 17:23
@SebastianD + Alle: Ja, Ihre Fehlermeldungen sind perfekt. Unabhängig davon sollten sie aber noch printListOfIntegers für die beiden Eingabelisten aufrufen, nachdem sie geparsed worden sind (so wie es auch im Code aus der Vorlesung war). Ihre ersten beiden Übungsblätter sollten längst korrigiert worden sein, ich habe Jens Hoffmann Bescheid gegeben, er wird sich darum kümmern und sich bei Ihnen melden. Hannah 17Mai10 17:15
Zitat von Hannah (Hauptseite): "Und vor und nach einem Komma muss eine Zahl kommen", wenn eine Liste mit einem Komma aufhört, ist das also ein Syntaxfehler. Falls es irgendwen interessieren sollte, so sehen meine Fehlermeldungen aus:
PS C:\Dateien\Studium\6. Semester\c++\sd76\uebungsblatt-4> .\ListProcessingMain.exe "1,2,3" "4,n, 5,8" ERROR in list "4,n, 5,8" at position 2: expected digit or space, found 'n' Result list: "1,2,3" PS C:\Dateien\Studium\6. Semester\c++\sd76\uebungsblatt-4> .\ListProcessingMain.exe "1,5,6,8," "4-5" ERROR in list "1,5,6,8,": The last token of your input is ','. ERROR in list "4-5" at position 1: expected comma, digit or space, found '-' Result list: "" PS C:\Dateien\Studium\6. Semester\c++\sd76\uebungsblatt-4> .\ListProcessingMain.exe "1,5,6,8," "4 5" ERROR in list "1,5,6,8,": The last token of your input is ','. ERROR in list "4 5" at position 2: expected comma or space, found '5' Result list: ""
SebastianD 17Mai10 17:04
Dann muss ich ja schon fast für jeden Fehler, eine andere FehlerMeldung ausgeben, also bei folgendem Beispiel an Eingabelisten 1,2,6 4,n , 5,8 müsste ich da als Fehlermeldung ausgeben: Bei der 2 Liste haben Sie als 2. Element ein Buchstaben getippt, oder so genau dann auch wieder nicht? Denn ich habe bisher, nur ne Fehlermeldung wenn in der Liste etwas vorkommt was keine Ziffer, Leerzeichen bzw. Komma ist, gebe ich einfach ne Fehlermeldung, àla : Da ist ein Zeichen was da nicht hin gehört. Dann noch ne Frage, bei Folgender Liste 1,5,6,8, (es geht um das Komma am Ende) soll ich dies als Fehler ansehen, und daraus die leere Liste machen? Oder schluck ich das als das gleiche wie 1,5,6,8 ? Des Weiteren scheint es immer noch welche hier auf der Wiki zu geben die sich nicht an die Konvention halten wie hier unterschrieben werden sollte. Des weiteren, scheint es einig zugeben die sich ein Preis für die meisten Zeilen, bzw die meisten Änderungen erwarten, oder? Mit endlich mal sonnigen Grüßen JonathanN 17Mai10 16:46
Dann muss ich ja schon fast für jeden Fehler, eine andere FehlerMeldung ausgeben, also bei folgendem Beispiel an Eingabelisten 1,2,6 4,n , 5,8 müsste ich da als Fehlermeldung ausgeben: Bei der 2 Liste haben Sie als 2. Element ein Buchstaben getippt, oder so genau dann auch wieder nicht? Denn ich habe bisher, nur ne Fehlermeldung wenn in der Liste etwas vorkommt was keine Ziffer, Leerzeichen bzw. Komma ist, gebe ich einfach ne Fehlermeldung, àla : Da ist ein Zeichen was da nicht hin gehört. Dann noch ne Frage, bei Folgender Liste 1,5,6,8, (es geht um das Komma am Ende) soll ich dies als Fehler ansehen, und daraus die leere Liste machen? Oder schluck ich das als das gleiche wie 1,5,6,8 ? Des Weiteren scheint es immer noch welche hier auf der Wiki zu geben die sich nicht an die Konvention halten wie hier unterschrieben werden sollte. Des weiteren, scheint es einig zugeben die sich ein Preis für die meisten Zeilen, bzw die meisten Änderungen erwarten, oder? Mit endlich mal sonnigen Grüßen JonathanN 17Mai10 16:46
@SebastianD: Ja, so erscheint mir die Fehlermeldung auch. Die Datei existiert jedoch und ich habe den Parameter -lgtest_main dem Compiler-Befehl der Test-Datei beigefügt. Daher verstehe ich nicht, weshalb der Compiler dem Pfad nicht zu folgen können scheint. -- JohannesS 2010-05-17 14:42:22
Ich schätze, es ist nicht normal, dass ich bisher nicht einmal für das erste Übungsblatt Punkte erhalten habe, oder?
@Hannah: Also eine Fehlermeldung, die ich erwarten würde, würde auch die Gesamtposition in der Eingabe ausgeben. Nur lässt sich das mit der aktuellen Methodensignatur nur über eine globale (veränderbare) Variable lösen, in der das Offset gespeichert würde. Das fände ich dann aber wieder zu ekelhaft, vor allem weil die parseListOfIntegers dann für korrekte Funktionsweise direkt von der main-Methode abhängen würde (Offset für Programmbefehl).
@Johannes: Die Fehlermeldung sieht für mich so aus, als ob die Datei libgtest_main.so.0 nicht gefunden wurde. SebastianD 17Mai10 15:33:
Ich schätze, es ist nicht normal, dass ich bisher nicht einmal für das erste Übungsblatt Punkte erhalten habe, oder?
@Hannah: Also eine Fehlermeldung, die ich erwarten würde, würde auch die Gesamtposition in der Eingabe ausgeben. Nur lässt sich das mit der aktuellen Methodensignatur nur über eine globale (veränderbare) Variable lösen, in der das Offset gespeichert würde. Das fände ich dann aber wieder zu ekelhaft, vor allem weil die parseListOfIntegers dann für korrekte Funktionsweise direkt von der main-Methode abhängen würde (Offset für Programmbefehl).
@Johannes: Die Fehlermeldung sieht für mich so aus, als ob die Datei libgtest_main.so.0 nicht gefunden wurde. SebastianD 17Mai10 15:33:
Dann muss ich ja schon fast für jeden Fehler, eine andere FehlerMeldung ausgeben, also bei folgendem Beispiel an Eingabelisten 1,2,6 4,n , 5,8 müsste ich da als Fehlermeldung ausgeben: Bei der 2 Liste haben Sie als 2. Element ein Buchstaben getippt, oder so genau dann auch wieder nicht? Denn ich habe bisher, nur ne Fehlermeldung wenn in der Liste etwas vorkommt was keine Ziffer, Leerzeichen bzw. Komma ist, gebe ich einfach ne Fehlermeldung, àla : Da ist ein Zeichen was da nicht hin gehört. Dann noch ne Frage, bei Folgender Liste 1,5,6,8, (es geht um das Komma am Ende) soll ich dies als Fehler ansehen, und daraus die leere Liste machen? Oder schluck ich das als das gleiche wie 1,5,6,8 ? Des Weiteren scheint es immer noch welche hier auf der Wiki zu geben die sich nicht an die Konvention halten wie hier unterschrieben werden sollte. Des weiteren, scheint es einig zugeben die sich ein Preis für die meisten Zeilen, bzw die meisten Änderungen erwarten, oder? Mit endlich mal sonnigen Grüßen JonathanN 17Mai10 16:46
@SebastianD: Ja, so erscheint mir die Fehlermeldung auch. Die Datei existiert jedoch und ich habe den Parameter -lgtest_main dem Compiler-Befehl der Test-Datei beigefügt. Daher verstehe ich nicht, weshalb der Compiler dem Pfad nicht zu folgen können scheint. -- JohannesS 2010-05-17 14:42:22
Ich schätze, es ist nicht normal, dass ich bisher nicht einmal für das erste Übungsblatt Punkte erhalten habe, oder?
@Hannah: Also eine Fehlermeldung, die ich erwarten würde, würde auch die Gesamtposition in der Eingabe ausgeben. Nur lässt sich das mit der aktuellen Methodensignatur nur über eine globale (veränderbare) Variable lösen, in der das Offset gespeichert würde. Das fände ich dann aber wieder zu ekelhaft, vor allem weil die parseListOfIntegers dann für korrekte Funktionsweise direkt von der main-Methode abhängen würde (Offset für Programmbefehl).
@Johannes: Die Fehlermeldung sieht für mich so aus, als ob die Datei libgtest_main.so.0 nicht gefunden wurde. SebastianD 17Mai10 15:33:
Bedeutung der Fehlermeldung ./ListProcessingTest: error while loading shared libraries: libgtest_main.so.0: cannot open shared object file: No such file or directory? -- JohannesS 2010-05-17 13:56:56
@Dennis: Ja, interleaveListOfIntegers soll drei Argumente haben, genau wie Sie es beschrieben haben. Und ja, wenn Sie die Resultatliste ausgeben, sollen Sie dafür printListOfIntegers mit einem prefix a la Result list : oder so ausgeben. Sinnvolle Fehlermeldung heißt, dass sie nicht einfach schreiben Ein Fehler ist aufgetreten sondern was für ein Fehler, und nett wäre, wenn Sie dann gleich auch dazu schreiben an welcher Stelle in der Liste und was die Liste war, die gerade geparsed wurde. Kurz, die Fehlermeldung die Sie selber gerne bekommen würden, wenn Sie das Programm als user benutzen. Eine Zeile pro Fehlermeldung finde ich ok, wenn die Fehlermeldung den geparseten string enthält, dann kann man das als Benutzer schon zuordnen. Aber printListOfIntegers sollte keine Fehlermeldung ausgeben, wenn die Liste leer ist, eine leere Liste ist ja auch eine Liste und man kann ja auch ganz regulär eine leere Liste als Argument übergeben (durch den leeren string, das soll dann kein Fehler sein, hatten wir ja schon in einer der vorherigen Fragen). Hannah 17Mai10 13:53
Ist es korrekt wenn mein interleaveListsOfIntegers drei Argumente erhält? Zwei Zeiger Zahlenfolgen und, wie parseListOfIntegers auch, einen Zeiger auf die Liste in die das Ergebnis geschrieben werden soll (welche dann zuvor in der Main angelegt wird)? Darf ich in der Main dann printListOfIntegers und ein anderes prefix verwenden um die neue Liste auszugeben? Was genau ist mit einer sinnvollen Fehlermeldung in parseListOfIntegers gemeint. Genügt es eine allgmeine Fehlermeldung für falsche Eingabe zu verwenden oder soll explizit angegeben werden welcher Fehler vorliegt. Das würde jedoch dazu führen, dass da parseListOfIntegers zweimal parallel ausgeführt wird, die Fehlermeldungen relativ unstrukturiert ausgegeben werden. Mein Ansatz ist bis jetzt, dass printListOfIntegers wenn es eine leere Liste erhält nach der leeren List ("") einen Hinweis auf eine falsche Eingabe ausgibt. Wäre das ok? Dennis 17.Mai10 12:31
@Markus: Sie sollten sich auf die Funktionen und Konstrukte beschränken, die wir bisher in der Vorlesung hatten. Hannah 16Mai10 18:26
Ist es eigentlich erlaubt Funktionen aus z.B. cstring und cctype zu verwenden? Oder darf man sich lediglich auf stdio und stdlib beschränken. MarkusN 16Mai 18:18
@Fabian: Danke für den ersten Hinweis, ich habe den exit operator dort verwendet und daher hatte ich so viele Schwierigkeiten. Was die zweite Anmerkung angeht, bin ich nicht soo Anfänger, dass ich das nicht weiß. Evtl. habe ich es falsch ausgedrückt aber es war schon spät und den Compiler oder wie auch immmer hatte mich schon genervt Gruß. Dario 16Mai10 10:48
@Dario: ./ListProcessingMain "" " 1,2,3,4 " soll keine Usage-Info ausgeben, da ja 2 Argumente da sind ("" und " 1,2,3,4 "). Es liegt an dir dafür zu sorgen, dass "" in die leere Liste umgesetzt wird. Außerdem soll das Programm ja selbst bei falschen Zeichen in den Argumenten nicht mit einem exit-code terminieren (die funktion soll schließlich noch die leere Liste zurückgeben), sondern Weiterlaufen, aber den Benutzer darüber in Kenntnis setzen, dass wohl irgendwo im Programm nicht alles nach Plan lief. Wenn ich die Aufgabenstellung richtig verstehe, dann soll selbst ./ListProcessingMain " abc" " 1,2,3,4 " die Liste 1,2,3,4 ausgeben, aber noch zusätzlich noch eine Warnung. Kleine Anmerkung am Rande: Der Compiler gibt die Usage-Meldung nicht aus, sondern dein Programm, falls das mit dem letzten Teil deines Satzes ausgesagt werden sollte. Fabian 16Mai10 9:21
Also dann kann ich gar nicht meine leeren Listen außer mit dem TEST sehen, weil ./ListProcessingMain "" "1,2,3,4" würde mir immer den Compiler Usage info ausgeben, und das Komma ohne Zahl ist ja nicht erlaubt. Dario 15Mai10 00:22
@Dario: Das Programm muss mit genau zwei Argumenten aufgerufen werden (also argc == 3), sonst müssen Sie gar nichts machen und können einfach die usage info ausgeben. Hannah 16Mai10 00:10
Ja meine Frage war wenn ich z.B
uebungsblatt-4$ ./ListProcessingMain 1 Usage: ./ListProcessingMain <list1> <list2>
eine Liste ist leer aber ich kriege den Usagesfehler . deshalb hatte ich mir gedacht die Geschichte mit der Null. Also muss ich diese Meldung ändern. P.S. wegen der Triviale Änderung tut es mir Leid , jedes mal sehe ich nicht dies kleines Kästchen. Dario 15Mai10 00:00
@Dario: Ja, wie Sebastian sagt ist eine Liste in der internen Repräsentation leer, wenn gleich das erste Element schon -1 ist. Beim Aufruf übergeben wird eine leere Liste mit einem leeren string als Argument, also z.B. ./ListProcessingMain "" "1,4,5,546". Noch eine Bitte, Dario, wenn Sie eine Ihrer Fragen im Nachhinein korrigieren oder leicht verändern, setzten Sie doch bitte das Häkchen oben in das Kästchen Triviale Änderung, es kriegen sonst alle, die diese Seite abonniert haben, insbesondere ich, vier Benachrichtigungmails oder so anstatt einer wie es sein sollte. Hannah 15Mai10 23:57
Eine Liste ist leer, wenn sie mit -1 beginnt. SebastianS 15Mai10 23:50
Aber ich habe noch nicht verstanden wann eine Liste leer ist.Ohne Argument oder mit unendlichen vielen Null? Gruß Dario 15Mai10 23:44
@Dario: Die 0 ist erlaubt und muss ja auch gar nicht besonders behandelt werden. Nur negative Zahlen sind nicht erlaubt (weil kein minus erlaubt ist, das würde sonst alles komplizierter machen weil das minus ja nur am Anfang einer Zahl stehen dürfte und da nur einmal). Hannah 15Mai10 23:22
Wenn eine Liste nur die Zahl Null enthält dann ist die Liste leer oder nicht? oder ist die Liste leer wenn ich kein Argument bzw. Zahl schreibe? Ich bin davon ausgegangen, dass wenn die erste zahl null ist,dann ist die Liste leer. sonst wird es schon komplizierter. z.B liste 1{0} aber auch {0,0,0,0,0,0,} ist wieder leer.. aber die Sache mit dem Null ist schon an sich komplieziert weil dann wäre eine so eine List { 0,0, unendliche viele null bis MAX_LIST_SIZE -1 ,1} nicht leer
Noch eine Frage wenn ich so eine Liste habe { 0,1,2,3} oder { 1,2,0,3} oder {0,1,2} der Null müss berücksichtigt werden als Zahl bei der PrintFunktion oder muss einfach weggelassen werden? Dario 15Mai10 22:28
@Fabian + Alle: Ja, so wie Sie es sagen ist es genau richtig. Ich hatte es verkürzt und dadurch nicht ganz korrekt dargestellt. Richtig ist, wie Sie sagen, dass eine Zahl zwischen 231 und 232 - 1 für einen int als negative Zahl aufgefasst wird, und eine Zahl die größer oder gleich 232 ist modulo 232 genommen wird (da ja nur 32 bits zur Verfügung stehen) und der Rest dann entweder als positive Zahl (falls < 231) oder als negative Zahl (falls >= 231) aufgefasst wird. Hannah 15Mai10 12:05
Kleiner Hinweis zu den "int"-s:
1) ints haben einen Wertebereich von -231 bis 231 - 1(, werden somit also warscheinlich als Zweierkomplement-Zahl dargestellt). Zweierkomplementzahl bedeutet, dass die untersten n-1 Bits der Zahl als "normale positive" Binärzahl interpretiert wird und wenn wenn das oberste Bit auf 1 ist, dann wird noch 2(n-1) von dieser Zahl abgezogen. (Integer n=32 für 32 Stellen)
2) wenn eine int-Variable folglich mit 231 -1 (Binärdarstellung: 011111...111(32 Stellen))belegt ist, und man 1 auf diese Variable addiert, so erhält man -231 (Binärdarstellung: 10000...0000 (32 Stellen)). Folglich stimmt das mit dem modulo nicht ganz. Fabian 15Mai10 8:52
@Hannah: Achssooo.. Ich habe die ganze Zeit versucht diesen Fehler zu beheben, danke. Dario 4Mai10 19:40
@Dario: Ein int sind 4 bytes = 32 bits und kann höchstens 231 groß sein. Alles war größer ist (und eine 11-stellige Zahl ist größer), wird dann einfach modulo 231 genommen. Darum brauchen Sie sich aber in Ihrem Programm nicht zu kümmern. Hannah 14Mai10 21:04
Hallo, könnte mir bitte jemand nur einen kleinen Tipp geben warum wenn ich mehr als 11 Ziffern( für ein Zahl z.B- 12345678911,2,4) eintippe dann bekomme ich(erste Zahl, die andere nach der Komma sind richtig) eine Random Zahl? also liegt es an der Größe des Arrays? MAX_LIST_SIZE? Gruß Dario 4Mai10 19:40
@Johannes: Wenn man das Programm z.B. so aufruft ./ListProcessingMain "abc", dann zeigt argv[1] auf die Zeichenkette abc und nicht auf die Zeichenkette "abc". Die Anführungszeichen sind etwas für die Unix/Linux-Shell, aus der heraus Sie das Programm aufrufen, die werden nicht an das Programm übergeben. Sie können das ganz einfach testen indem Sie die Zeichenketten ausgeben, da werden dann keine Anführungszeichen drin sein, selbst wenn Sie beim Aufruf Anführungszeichen um die Argumente geschrieben haben. Wenn Sie wirklich ein Anführungszeichen als Argument übergeben wollten müssten Sie es "escapen", das geht zum Beispiel so ./ListProcessingMain \"abc\". Ok? Hannah 14Mai10 19:40
Folgende 2 Fragen: 1. Es sind ja nur dann Leerzeichen innerhalb der Liste möglich, wenn die Characterkette als String angegeben wird. Das wurde ja weiter unten schon festgestellt (sonst wären die Leerzeichen Argument-Separatoren). In dem Fall müsste man jedoch die Anführungszeichen bei Bearbeitung der Eingabe berücksichtigen. Sollen nun das non-String Eingabe-Format (z.B. 1,2,3) ohne Leerzeichen oder das String Eingabe-Format (z.B. "1, 2, 3") mit mögl. Leerzeichen oder beide Formate behandelt werden? 2. Beim Auftauchen anderer Zeichen soll "eine sinnvolle Warnung" sowie die leere Liste ausgegeben werden. Also nur die Warnung oder sollte sich die "leere Liste" irgendwie in der Ausgabe manifestieren? JohannesS 14Mai10 18:04
Offtopic: Jeder, der Interesse daran hat: Ich habe vor ner Woche ein Forum für alle Informatik-Studenten, die letztes Semester angefangen haben, eröffnet. Wer will, kann sich dort gerne anmelden: http://info-unifreiburg09.forumieren.com/ DavidZ. 14Mai10 15:48
@Dario: In der Deklaration int list1AsString[MAX_LIST_SIZE] wird ja dann soviel Speicher reserviert. Wenn aber so viel Speicher gar nicht da ist, meckert der Compiler, würde ich auch machen an dessen Stelle. Hannah 14Mai10 13:02
Warum kann man nicht die Variable MAX_LIST_SIZE belibig groß machen? also wenn ich 100000000000000= MAX_LIST_SIZE setze dann den Compiler meckert. Dario 14Mai10 11:59'
Der Fehler war eine Zeile darunter printf("%s"...) anstatt printf("%c"...) Ben 14Mai10 02:41
@Ben: In dem Teilstück unten sehe ich keinen Fehler, ich glaube der segmenation fault kommt woanders her. Schreiben Sie doch mal ein vollständiges, aber minimales(!) Programm, wo der segfault auftritt und pasten Sie es hierhin. Hannah 14Mai10 2:38
Hallo, warum liefert ein switch über listAsString[i] in der Funktion parseListOfIntegers() immer einen SegFault, wenn das Zeichen nicht zwischen 0-9 ist (in dem Fall noch als Char gespeichert)? Ich schreibe doch keinen Wert (in einen gesperrten Speicherbereich) sondern will nur den Wert überprüfen
int i = 0; // listAsString == "abcd123"; switch(listAsString[i]) { // gibt sofort einen SegFault case '...': }
Danke Ben 14Mai10 02:13
@Niklas + Alle: Ja, was Florin schreibt ist genau richtig. Sie sollen einfach nur testen ob bei einer nicht zulässigen Liste die leere Liste zurückkommt, wie in Aufgabe 1 gefordert. Wenn man testen wollen würde, ob jede mögliche Art der Fehlformatierungen auch genau als diese erkannt wird, würde man die Funktion parseListOfIntegers einen error code (int) zurückgeben lassen. Das ist auch nicht schwer, aber das ist hier nicht Teil der Aufgabe, ist glaube ich so schon genug Arbeit. Hannah 13Mai10 22:44
@Sebastian: Ja, genau. Ist in der Aufgabe von dem Übungsblatt nicht genau spezifiziert, ich weiß, aber in der Mitteilung auf der Hauptseite habe ich es jetzt glaube ich genau gesagt, was gehen soll und was nicht. Wie gesagt, in kurz: zulässig sind Folgen von Zahlen mit genau einem Komma zwischen zwei Zahlen und beliebig Leerzeichen um die Kommata oder am Anfang und am Ende, alles andere nicht zulässig. So würde man es auch in Wirklicheit machen, weil z.B. bei Ihrem Beispiel 3 4 einfach unklar ist ob man das als 34 interpretieren soll oder als 3,4 und solche ambiguities sollte man immer ausschließen. Hannah 13Mai10 22:40
@Hannah: D.h. "1,2,3 4,5,6" muss einen Fehler werfen? Man darf das nicht einfach als 1,2,34,5,6 interpretieren? Sebastian 13Mai10 22:33
@Florin: Das sind sogenannte header guards, erkläre ich in der nächsten Vorlesung. Kurz gesagt dienen Sie dazu, dass eine .h Datei nicht mehr als einmal included wird, das kann bei größeren Programmen ohne diese guards schnell passieren. Mein Linter hat gemeckert wenn ich die nicht dahin gemacht habe. Wenn Ihrer Ihre .h Datei ohne Meckern akzeptiert, auch gut, das würde mich aber wundern. Hannah 13Mai10 22:31
@Dario: Zum ersten Teil der Frage: Nein, so etwas wie
if ( arcobaleno == 'a' && 'b')
darf man nicht schreiben bzw. es würde nicht das tun was Sie erwarten. Zum zweiten Teil der Frage: Ja, Sie können annehmen dass Sie immer genau zwei Argumente bekommen, also dass immer argc == 3 und die erste Folge in argv[1] steht und die zweite in argv[2]. Wie man ein Programm von der Kommandozeile aufruft mit Argumenten die Leerzeichen erhalten habe ich ja schon vorher erklärt, dazu setzt man einfach Anführungszeichen um das Argument, dann kann man innerhalb des Argumentes so viele Leerzeichen schreiben wie man will und es wird immer noch als ein Argument genommen. Hannah 13Mai10 22:28
@David + Manuel + Alle: Ich habe jetzt auf der Hauptseite unter Mitteilungen noch einmal genau formuliert, welche Eingabeargumente akzeptiert werden sollen und welche nicht. Nochmal in kurz: Folgen von Zahlen mit genau einem Komma zwischen zwei Zahlen und beliebig Leerzeichen um die Kommata oder am Anfang und am Ende, alles andere soll als nicht zulässig erkannt werden. Die Beispielfolgen in Ihren Fragen sind beide nicht zulässig, d.h. das Programm sollte in dem Fall meckern und die leere Folge zurückgeben, und der erweiterte Test sollte solche Fälle auch testen. Hannah 13Mai10 22:21
@Niklas: Du kannst ja auf -1 testen, also ob die leeren Listen zurückkommen. Andere Frage: Was soll das
#ifndef VORLESUNGEN_VORLESUNG_4_LISTPROCESSING_H_ #define VORLESUNGEN_VORLESUNG_4_LISTPROCESSING_H_
in der ListProcessing.h? Florin 13.Mai 22:20
Hallo, haben wir schon eine Möglichkeit kennengelernt mit gtest auf Fehlermeldungen zu testen? Das braucht man ja für die Test für 1.1 und 1.2 Gruß Niklas 13Mai10 22:18
Hallo zusammen, eine technische Frage anstatt immer so zu schreiben char* arcobaleno
if ( arcobaleno == 'a') && (arcobaleno == 'd' ) && (arcobaleno == 'b')
darf man auch so schreiben:
if ( arcobaleno == 'a' && 'b' )
oder gibt´s was um das kürzer und ohne "Wiederholung" zu schreiben? Bei dem Erstem Punkt der 1 Aufgabe ist so wie folgendes gemeint? Also
./ListProcessingMain 1,1,1,1,,1,1,1,1,1, 11111
aber nicht so:
1,0,0, 0000 ,111111
sonst wären ja drei Argumenten gell? Gruß Dario 13 Mai 18:43`
@Sebastian : Besten Dank, ja es war der Zähler, der einen Wert hatte, den er eigentlich nicht haben sollte. Nur bis ich rausgefunden hatte warum. Aber jetzt hab ichs, naja zumindest das. =) JonathanN 13Mai10 16:18
Wie soll dieser String ausgewertet werden? "1 4,3 5" bzw. muss man den Fall auswerten, dass in einer Zahl ein Leerzeichen stehen kann? Manuel 13. Mai 15:43
Soo, ich weiß, ich weiß aber leider haben wir immernoch keine OFF-TOPIC-Section und ich dachte das muss ich mal mitteilen: http://www.youtube.com/watch?v=FIT3WlIyy1Y&NR=1&feature=fvwp. fry UTC+1 1273757790UTS
Wie soll eigentlich genau mit einer Liste umgegangen werden, die Beispielsweiße so aussieht: ",,,5,7 ,3". Soll das Programm dann daraus : 0,0,0,5,7,3,-1 machen, oder die 0er weg lassen? David Z. 13. Mai 15:04
@JonathanN Spontan würde ich dann sagen, dass du entweder die falsche Variable bearbeitest (unwahrscheinlich), oder dein Zähler irgendeinen Wert hat, den er nicht haben sollte. Probier doch mal:
finallist[k] = -1; //Also warum dieser Befehl nicht ausgeführt wird? printf("%d %d",k,finallist[k]);
SebastianS 13Mai10 14:25
@Sebastian, ja was in der Schleife steht wird sauber ausgeführt, nur diese Zeile nach der Schliefe iergendwie nicht. Also habe soeben noch mal was geprüft, er geht raus aus der Schleife, denn wenn ich einen printf befehl dahin setzte, der wird aus geführt, oder ist etwas an der Syntax des Befehls "faul"? JonathanN 13Mai10 14:12
@Hannah: Ah, verstehe, danke @JonathanN: Wird die Schleife ausgeführt? Also kommt er überhaupt zu dem Punkt? Wenn ja, sollte auch die Bedingung ausgeführt werden... Überprüf vlt nochmal deine Klammern SebastianS 13Mai10 13:22
Kann mir jemand erklären warum beim folgenden Code der Letze Befehl nicht ausgeführ wird
while (bedingung) { ein paar berechnungen } finallist[k] = -1; //Also warum dieser Befehl nicht ausgeführt wird?
JonathanN 13Mai10 13:27
@SebastianS: Ok, ich verstehe. Es ist so, Sie dürfen immer annehmen, dass Sie genau zwei Argumente bekommen. In den strings dieser Argumente dürfen allerdings Leerzeichen stehen. Von der Kommandozeile aus geht das zum Beispiel so: ./ListProcessingMain "1,2,3, 5,6 , 7" "8,9,0, 10". Das erste Argument wäre dann 1,2,3, 5,6 , 7 und das zweite Argument wäre 8,9,0, 10. Hannah 13Mai10 13:05
@Hannah: Nunja, ich verstehe Aufgabe 1 so, dass wir auch aus so etwas: 1,2,3, 5,6,7 8,9,0, 10,11 zwei Listen generieren sollen (1,2,3,5,6,7 und 8,9,0,10,11). Allerdings würde argv bei obiger Argumentenübergabe ja folgendes liefern: [1] => "1,2,3,", [2] => "5,6,7", [3] => "8,9,0", [4] => "10,11" Somit erhalten wir ja nicht zwei sondern vier Argumente. An sich kein Problem, nur ist jetzt die Frage, ob wir in main() solche Vorkommnisse überprüfen sollen und die Strings entsprechend "zusammenkleben" sollen, oder ob wir das ganze an die Funktion weiterreichen sollen, damit die das entsprechend verarbeitet. SebastianS 13Mai10 12:50
@SebastianD: Ich würde erstmal gerne verstehen, wofür Sie diesen Rückgabewert brauchen. In meiner Lösung des Übungsblattes brauche ich den nicht. Genau wie die anderen Listen soll ja auch die Ergebnisliste mit einem -1 aufhören, so dass man also immer herausfinden kann wo Sie aufhört. Listen, die Ihre eigene Größe kennen ohne erst einmal durchzulaufen, machen mir in einer späteren Vorlesung. Hannah 13Mai10 9:50
@Jonathan: Ja, genau, man muss die .h Datei in der .cpp includen, das macht man aber auch eigentlich immer so, wir haben es bisher bloß noch nie gebraucht, jetzt brauchen wir es zum ersten Mal. Falls Sie sich fragen, ob es korrekt ist: es ist korrekt, in der .h Datei stehen ja die Deklarationen und in der .cpp Datei die Definitionen. Das ist genauso wie erst int x; zu schreiben und dann später im Programm x = 4;. Zum zweiten Teil Ihrer Frage: Ja, die Funktion soll drei Argumente haben: die beiden Eingabelisten und die Ausgabeliste, alle als int*. Wobei Sie darauf achten müssen die Ausgabeliste vor dem Aufruf als Feld zu deklarieren, genau wie wir das in der Vorlesung vor den Aufrufen von parseListOfIntegers gemacht haben. Hannah 13Mai10 9:48
@SebastianS: Die parseListOfIntegers Funktion soll nur eine Liste bearbeiten. Ich verstehe das Problem, dass sich dann bei Aufgabe 1 stellen soll nicht, erklären Sie es doch bitte nochmal genauer bzw. an einem konkreten Beispiel. Zum zweiten Teil der Frage: Ja, die Konvention ist, dass eine Liste bei -1 zu Ende ist, egal was danach noch kommt. Genauso wie in C / C++ ein string zu Ende ist wenn ein null-character kommt, egal was danach noch kommt. Und genau, die leere Liste ist die, wo gleich als erstes Element die -1 kommt. Hannah 13Mai10 9:44
Spricht irgendetwas gegen eine Änderung des Rückgabetyps der parseListOfIntegers-Funktion? Ich würde die sonst dahingehend ändern, dass ich zurückgebe, wie viele Elemente die Liste enthält. SebastianD 12Mai10 23:59
Guten Abend, dann bring ich mal gleich auch meine Fragen hier rein. Also die Variable MAX_LIST_SIZE kann ich in der .cpp Datei ja nicht nutzen wenn ich die .h nicht include, dies ist ja aber grad, das was nicht passieren soll. Diesen Wert brauch ich ja aber um zuüberprüfen, dass mein i mir nicht zu weit wegläuft, oder? Dann zum AufgabenTeil 2? Soll hier die Funktion diesmal die neue Liste als Ausgabewert haben, oder nehme ich wieder eine Liste, dann als 3. Parameter auf? Da ja die 2 Listen ja schon in der Main aufgeteilt werden, und mir also so schon 2 Parameter liefert? JonathanN 12Mai10 22:23
Ist es zulässig, dass man die parseListOfIntegers Funktion derartig umbaut, dass sie als Argument alle Argumente des Programms entgegen nimmt, und diese selbst in zwei Listen aufteilt? Weil sonst sehe ich nicht, wie man Aufgabe 1 lösen soll, wo doch die Trennung schon in der ListProcessingMain durchgeführt wird? Weitere Frage: Dürfen wir beim Zusammenführen davon ausgehen, dass bei erreichen eines Elementes mit dem Wert -1 abgebrochen werden darf, da Ende der Liste? Eine Liste die mit -1 beginnt ist ja für uns eine "leere" Liste, oder? SebastianS 12Mai10 22:06
Hier und hier. Links sind in den Folien der heutigen Vorlesung entnommen. SebastianS 12Mai10 19:41
Wo kann man denn den Link zu der Erklärung für den verwendeten Make Syntax finden? Daniel 12Mai10 18:43