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.
ich habe bemerkt, dass bei Aufgabe 1 bei den vorgegebenen Funktionssignaturen der Zeiger auf meine Liste fehlt. Nun habe ich das so gelöst, dass ich erst eine allgemeine Listenimplementierung geschrieben habe, mein main allokiert mir dann meine Liste global und die beiden Funktionen machen dann nichts anderes, als meine allgemeinen Funktionen aufzurufen, die dann den Listenzeiger übergeben bekommen. Ist das in Ordnung so?
Ich rufe von der main eine Hilfsfunktion auf, die den ganzen Allokationskram macht und mir dann einen Zeiger zurückgibt.
Nein, meine ist am Donnertag und die fällt ja anscheinend aus, und es gibt noch viele weitere Donnerstage die ausfallen…Kann ich an den Tagen dann einfach in eine andere Übung gehen? Schließlich muss man dort ja auch seine Lösung vortragen.
Ja. Dennoch ist damit ein Teil der Listenfunktionalitaet in der main()-Funktion. Wenn du es unbedingt mit einem „Listen-Objekt“ machen willst, dann lege dies als modul-globale Variable an.
Ich moechte dich nicht davon abhalten, dich mit der Aufgabe zu beschaeftigen. Aber generell solltest du dir die Tafeluebung vor der Bearbeitung anhoeren, da du dort noch einige Informationen zur Aufgabe bekommst.
Irgendwann muss ich ja malloc aufrufen. Wenn ich das weder in der main()-Funktion noch in irgendeiner anderen Funktion darf, wo dann?
Meine Liste ist eine Blackbox, die main()-Funktion macht nichts weiter, als irgendwelche Funktionen aufrufen, welche die Liste manipulieren, d.h die ganze Funktionalität steckt in diesen Funktionen. Schon in der Vorlage wird von main() insertElement und removeElement aufgerufen. Das wäre dann ja auch verboten.
Danke, hatte ich noch nicht entdeckt.
Ich wollt mal meine guten Vorsätze einhalten und die Aufgabe nicht in der Nacht vor der Abgabe machen
Achso, du willst, dass insertElement und removeElement garantiert funktionieren, der Aufrufer also nichts voher initialisieren muss. Na gut, dann mach ich eben lazy initialization.
mein Programm ended immer auf “Program ended with exit code: 0” was bedeutet das?
ich hab jetzt schon mal contains Methode geschrieben um zu schauen ob er die wäret einfügt, aber in die geht er gar nicht erst…
Exit code 0 heißt, dass das Programm fehlerfrei durchgelaufen ist, != 0 wäre ein Fehler (nach den C-Konventionen). Bei mir wird das aber nicht angezeigt, weil ich auf der Konsole arbeite. Manche IDEs zeigen das aber an, du hast da nichts falsch gemacht.
ah super vielen dank für die Info. ich arbeite beim mac mit Xcode, aber vlt lass ich es jetzt in Zukunft über die Konsole laufen. Ist irgendwie sauberer
Du darfst (und solltest) natuerlich malloc() benutzen (free() nicht vergessen). Es geht hier eher darum, dass du soetwas wie Bibliotheksfunktionen schreiben sollst. Die komplette Funktionalitaet soll also in insertElement() und removeElement() stecken, sodass du dieses geschriebene Modul auch in zukuenftigen Projekten benutzen kannst.
Somit entspraeche haendisches Allokieren von Speicher in der main() - damit deine insertElement() und removeElement() ueberhaupt erst funktionieren - nicht der Aufgabenstellung.
Natuerlich kannst du die main() anpassen und erweitern wie du willst. Das ist ganz gleich. Hier solltest du aber nur Code hinzufuegen, der deine zwei implementierten Funktionen testet.
Soweit ich weiß nutzt XCode Clang und nicht GCC als Compiler, daher solltest du tatsächlich die Konsole benutzen oder halt XCode so konfigurieren, dass GCC mit den richtigen Flags benutzt wird.
Auf aktuellen Versionen von OS X gibt es keinen GCC mehr. Das, was dort unter [m]/usr/bin/gcc[/m] liegt ist auch nur ein clang. Macht aber nix, oft sind die Fehlermeldungen von clang hilfreicher und es gibt mehr hilfreiche Warnungen, so dass sich mal mit clang kompilieren auch im CIP lohnen kann. Die passenden Flags kann clang übrigens auch alle.
Yup, clang funktioniert hier (Fedora) auch mit der Aufgabe. Ist vielleicht eine ganz gute Idee, mit mehreren Compilern zu testen, ob man nicht aus Versehen irgendwelche compiler-spezifischen Funktionen verwendet hat.
Allerdings würde es mich ziemlich verwirren, wenn durch einen Aufruf von gcc plötzlich der clang startet. Am Ende ist Safari in Wirklichkeit der Internet Explorer
Ich wäre da etwas vorsichtiger. Also natürlich schadet es nicht, mit verschiedenen Compilern zu testen, aber vor nicht standardkonformen Compiler-Funktionen wird es dich nicht schützen, da clang so einige GCC-Features nachimplementiert. Und vor Verwendung nicht-POSIX-konformer Funktionen wird es dich nicht schützen, erst Recht nicht bei Funktionen, die für manche Eingabewerte undefiniertes Verhalten haben, die glibc da aber ein bestimmtes Verhalten spezifiziert, das dir gerade gefällt.