Aufgabe 2 - wsort

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 2 - wsort
Hallo miteinander,

ich werkel derzeit an dem code für die wsort aufgabe und bin gerade dabei mein geschriebenes compilierfähig zu machen…

… jedoch muss ich zugeben bin ich blutiger anfänger in C und habe hier und da mal Probleme, derzeit scheiter ich an folgender Fehlermeldung in meinem Programm welches ich einfach mal „mywsort“ genannt habe… die Funktion compare habe ich eigentlich 1:1 aus der "man qsort " und eben mit meinen Parametern wie in der Übungsfolie 3 ersetzt.

:[quote]

gcc -std=c99 -pedantic -Wall -Werror -D_XOPEN_SOURCE=700 -o mywsort mywsort.c
mywsort.c: In function ‘compare’:
mywsort.c:12:6: error: implicit declaration of function ‘strcmp’ [-Werror=implicit-function-declaration]
return strcmp(* (char * const *) p1, * (char * const *) p2);
^
cc1: all warnings being treated as errors

[/quote]

kann mir jemand verraten was das genau heißt bzw. an was das liegen könnte? … ist schon recht ärgerlich wenn ich nichtmal meinen code kompilieren kann <_<


Dein Fehlermeldung wurde in der ersten Übung angesprochen.

error: implicit declaration of function ‘strcmp’ [-Werror=implicit-function-declaration]

Der Compiler findet die Funktion strcmp nicht. In der Manual von strcmp
sieht man dann auch, dass string.h includiert werden muss.

Gruß Christian


jooo das hat scheinbar gefehlt! Danke! :slight_smile:

ganz rund läuft mein programm leider aber nicht, weiter werkeln ist wohl angesagt <_<

Abspeichern und Sortieren der einzelnen Wörter
Hallo zusammen!

Ich hätte eine Frage bezüglich des Abspeicherns und Sortierens der eingelesenen Wörter:
Mein erster Gedanke war, ein zweidimensionales Char-Array anzulegen und jedes Wort einzeln darin abzulegen.

Dann - so denke ich zumindest - kann man qsort auf das Array anwenden.
In der Doku zu qsort steht folgendes:
“The qsort() function sorts an array with nmemb elements of size size. The base argument points to the start of the array.”

Kann qsort mit dem zweidimensionalen Array umgehen?
Und müsste ich dann jede “Zeile” des Arrays gleich lang machen (“[…] elements of size size […]”)?

Vielen Dank für eure Hilfe! :slight_smile:


Gutern Morgen.

Da hast du die Manual falsch verstanden. Du musst die länge des Typs angeben. Also welchen Typ deine Elemente
haben.

qsort(ptr_to_start_of_list, members, sizeof(myType), myCompareFkt);

Mach das nicht, das klingt nach „ich belege für jedes Wort nochmal extra Speicher und für die Sortierte Liste auch nochmal“.

In der Übung sagen sie dir (denke da warst du noch nicht), dass du am besten das Pointer-Array argv umsortierst. Das sind dann nur 8 bzw. 16 Byte pro Pointer, anstatt sizeof(char)*100 Byte.


Warum willst du das argv Array umsortieren? Da ist außer dem Programmnamen nichts drinnen.
hjks Ansatz ist schon ok.

1 Like

Achso, die kommen ja aus ner Datei. Dann natürlich nicht argv, aber es ist trotzdem sinnvoller die Zeiger zu sortieren, als den kompletten Speicher umzuschreiben.

1 Like

Ja, ich werde wohl besser erst einmal die Übung abwarten :slight_smile:

Aber schon einmal so viel:
Wie soll ich denn die Länge des Typen angeben, wenn die Wörter unterschiedlich lang sind?
Wenn ein Wort der Länge vier „ankommt“, dann lege ich doch eine Zeile im Array für 4(+1) Byte an.
Falls dann ein Wort der Länge zehn kommt eben 10(+1) Byte. Die Einträge haben ja dann keine einheitliche Länge.

Entschuldigt, falls meine Fragen gerade ein wenig primitiv sind :stuck_out_tongue:


Die maximale Laenge der Woerter steht in der Aufgabenstellung.


Ja. Aber soll dann für jedes Wort eine “Zeile” vom Typ char[101] angelegt werden?


Das ist eine Möglichkeit (aber die schlechte). Das würde nämlich heißen, dass jede Tauschoperation, die [m]qsort(3)[/m] ausführt 101 Bytes kopieren muss. Außerdem belegst du viel mehr Speicher, als du im Normalfall brauchst.

Sinnvoller ist es – wie bereits erwähnt – ein Array von Pointern auf die (so lange wie benötigt allokierten) Strings zu haben und nur diese Pointer zu sortieren. Die Vergleichsfunktion, die du an [m]qsort(3)[/m] übergibst muss dann entsprechend anders aussehen. Ein Tausch beudetet dann nur, dass zwei Maschinenworte (< 101 Bytes) ausgetauscht werden müssen.


Ich habe auch zwei Fragen zu dieser Aufgabe.

  1. Sollen wir das Programm so implementieren, dass wir davon ausgehen, dass wir die zu sortierenden Woerter per argv bekommen? Das wuerde heissen, dass ich das Programm erstmal etwas anders schreiben muesste, um die wlist* Dateien zu testen.
  2. Um z.B. wlist0 zu testen, wuerde ich ein Array anlegen, in dem ich dann die einzelnen Zeilen von wlist0 speichere. Um das machen zu koennen, muss ich dem Array erstmal Speicher mit malloc() geben. Gibt es eine einfache Moeglichkeit, herauszufinden, wie viele Zeilen wilst0 hat, damit ich dem Array genuegend Speicher gebe?

stdin ist nicht argv.

Du musst ggf. dynamisch Speicher nachfordern. Dafür gibt es auch Funktionen. Stehen sogar alle auf dem Angabenblatt. Würde mal zumindest die ersten paar Sätze der Manpages aller in der Angabe erwähnten Funktionen zu lesen.


hallo,
ich habe mir zum einlesen überlegt jede zeile einzulesen, und dann die eingelesen zeile durchzugehen und die einzelnen wörter in mein zweidemensionales char ziel array zu kopieren.
gibt es dafür vlt eine einfachere möglichkeit als immer mit jeweils einem zeiger auf den anfang und das ende eines wortes und strcpy zu arbeiten?
oder ist der grundansatz vlt schon ein wenig aufwendig?


Ich verstehe nicht ganz, was du vor hast? Wozu brauchst du den Zeiger auf das Ende eines Wortes?


ups hatte da die manpage falsch verstanden, naja will eigentlich nur ein ersatz für die strtok finden…
warum ist die gleich nochmal nicht erlaubt?


Ich hab noch ein simples Problem, das ich nicht loesen kann…
Wenn ich ein zweidimensionales char Array (sagen wir [m]char **array;[/m]) und [m]Filfe *f = fopen(“…”);[/m] habe und ich die erste Zeile der Datei ausgeben moechte, auf die [m]f[/m] zeigt, was muss ich dann machen, damit ich bei [m]fgets(*array, 100, f)[/m] keine Fehlermeldung “Speicherzugriffsfehler” bekomme?
Ich habe vorher [m]array = malloc(100sizeof(char))[/m] geschrieben. Da in den Folien steht, dass ein zweidimensionales Array die Daten zeilenweise speichert, muesste doch also der Speicher fuer eine Zeile ausreichen? Irgendwie verstehe ich das ganze noch nicht so ganz…


Ich würde mir einen statischen Buffer zum einlesen machen und dann dynamisch den nötigen Speicher für das Wort/die Zeile anfordern. Den dynamisch angeforderten Speicher dann in die char** array einhängen.

Dein Speicherzugriffsfehler kommt wahrscheinlich daher, dass du für char ** array nichts allokiert hast.