Thread Merkwürdiges Verhalten von "split()" (20 answers)
Opened by hlubenow at 2017-07-29 19:59

hlubenow
 2017-07-31 18:22
#187067 #187067
User since
2009-02-22
876 Artikel
BenutzerIn
[default_avatar]
2017-07-31T11:20:33 Raubtier
Daran verstehe ich so einiges nicht.
1. Listen haben normalerweise eine Liste und dann ListNodes als Elemente. Dann kannst du dir die beiden Sentinels sparen.

Aber wenn ich nicht nur "next", sondern "next" und "previous" haben will, muß ich die doch auch irgendwie bei einer leeren Liste verketten.
Raubtier
2. Sehr verwirrende typedefs. "string" und "stringpointer" sind beide dasselbe wie char*. Lass die typedefs lieber weg.

Ja, das ist natürlich Eigengebräu. Irgendwie finde ich "string" aber viel aussagekräftiger als "char *", denn letzteres kann ja auch ein Zeiger auf char, also ein Zeiger auf einen einzelnen char sein. Bei "string" weiß man gleich, was gemeint ist. Wenn man sich daran gewöhnt hat.
Und "stringpointer" ist dann eben ein Zeiger, der irgendwo im String herumspringt, und für den auch nicht extra Speicher angefordert wurde.
Während "string" immer auf den Anfang zeigt, so daß man ihn an Stringfunktionen übergeben kann oder den String zurückgeben kann.
Raubtier
3. Das abweichende Verhalten für strings in der Liste ist merkwürdig (strings werden kopiert, die anderen Typen aber nicht?)

betterworld
Ich denke mal, das Ziel ist, dass man auf den Rückgabewert immer free() anwenden kann/soll.

Genau, das ist der Plan. Sollte natürlich irgendwie einheitlich sein.
Raubtier
4. malloc+realloc für das getNodeDataAsString? würde man nicht eher einen Buffer von außen dazugeben? Ansonsten nur malloc, gleich mit der richtigen Größe

Ach, getNodeDataAsString() ist sowieso nicht optimal. Ich wollte halt gern, daß man verschiedene Datentypen in der Liste speichern kann. Nicht so leicht umzusetzen, wie ich dachte.
Raubtier
5. Das split free't den Eingabestring?!

Ja. Normalerweise will man danach ja eben die Liste haben und nicht mehr den String.
Raubtier
6. Überhaupt linked lists - warum, was haben die für einen Vorteil, außer dass sie langsam sind und so die CPU bzw. den Cache schön beschäftigen?

Denselben Vorteil wie Perl: Sie sind für den Programmierer leichter zu benutzen als die Rückgabe von strtok().
Genaugenommen sehe ich in leicht zu benutzenden, dynamischen Listen, gemischt für alle Datentypen, sogar den größten Vorteil von Perl. Auf Hashes kann ich verzichten, aber auf Listen nicht. Deshalb: Wenn ich die auch in C hätte, könnte ich mich mit C vielleicht besser anfreunden.
Raubtier
Zumal du auch ein "push" benutzt, das erst noch ganz die Liste durchlaufen muss - also du nutzt die langsamst mögliche Operation auf deiner Liste in einer Schleife!

Richtig, natürlich habe ich auch noch "unshift()", aber wenn man ehrlich ist, will man meistens "push()". Wegen der Geschwindigkeit hab' ich noch eine Idee: Ich könnte noch zwei Zeiger in die List-struct aufnehmen: "to_border_first" und "to_border_last". Dann kann man von jedem Knoten aus unmittelbar auf die Sentinels springen. Dann wäre push() schneller.

Manchmal, etwa für die Länge der Liste oder die Größe aller Strings in der Liste (z.B. für join()) muß man die Liste aber trotzdem ganz durchlaufen. Da kommt man manchmal schlecht drumrum, auch wenn's ärgerlich ist.
Leider macht es auch nicht viel Sinn, den Index des Knotens in diesem zu speichern. Denn wenn man einen neuen in der Mitte einfügt, müßte man alle nachfolgenden neu durchnummerieren.
In den Sentinels hätte ich noch Platz für zwei int. Darin könnte ich vielleicht die Länge der Liste speichern. Hmmm, mit einem String könnte ich auch noch mehr Informationen speichern.

Edit: Ja, das wäre cool: Eine CSV-Zeile als String in "border_first", und dann eine Funktion "listStat()".

Liste in einer Liste hab' ich mich noch nicht 'rangetraut. Später vielleicht. Ab Version 5. ;)
Raubtier
7. in main: string a = malloc(100); strcpy(a, "The black cat climbed the green tree"); - warum würde man das so tun wollen, warum nicht direkt den string verwenden? Ach ja, geht ja nicht, weil split nur mit ge"malloc"ten Strings funktioniert!

Hatte ich ehrlich gesagt gar nicht groß drüber nachgedacht.
Raubtier
8. list=initList(); list=was_anderes; scheint mit ein Speicherleck zu sein!

Edit: Stimmt, wenn eine Funktion die Liste anlegt, muß ich in "main()" nicht nochmal "initList()" aufrufen. Ist so ein Reflex: Neue Liste -> "initList()". Gut, muß ich vorsichtiger mit sein.
Raubtier
Quote
Soll keine Angeberei sein, aber hier ist mal mein Machwerk.

Damit wirst du auch wohl kaum angeben können...

C ist eben schwer. Willst Du mich jetzt entmutigen und sagen, ich soll auf der Skriptsprachenebene bleiben? Ich war eigentlich ganz zuversichtlich, weil ich schon weiter vorgedrungen war als beim letzten Versuch.
Vielleicht hast Du bei Dir ja auch eine fertige Library für sowas rumliegen?
Last edited: 2017-07-31 18:47:13 +0200 (CEST)

View full thread Merkwürdiges Verhalten von "split()"