Datenstrukturen



  • Hallo,

    hab vor ca. 2 Wochen C angefangen zu lernen. Nun hab ich ein paar Fragen zu Datenstrukturen und auch wiederverwendbare Programmierung.

    C hat leider nicht so eine gute Code API wie z.B Java. Deshalb verzeiht, wenn ich eine dumme Frage stelle.

    Für mein Programm benötige ich einen Buffer. (Kleine Funktionsweise: Ein Buffer ist praktisch ein Array, das man nach belieben Teilen kann. Man kann ein Limit setzten und ein Start Position und bekommt den Teil zwischen start position und limit wieder. Wenn sich dieser Teil ändert, ändert sich das Hauptarry natürlich auch).

    Gibt es so was schon in C ? Wenn nicht wäre das ja mithilfe von Pointern relativ schnell implementiert. Dazu hätte ich Folgende Frage: Ist es möglich sich bei einer Bibilothek nicht auf einen bestimmten Datentypen festzulegen? Also ein Array eines Typen void? In Java würde man Generics nehmen, bzw. ein Array vom Typ Object.

    Die Nächste Frage ist, gibt es eine gute Hashmap implementation in C? Eine Datenstruktur die einen Key bzw. eine Value beinhaltet und der Key in der ganzen Map nur einmal vorkommt.

    Wäre nett, wenn ihr mir die 2 Fragen beantworten könntet.



  • C_QuestionX schrieb:

    Gibt es so was schon in C ?

    Nein. Muttu selbst schreiben oder ne Lib benutzen.

    C_QuestionX schrieb:

    Ist es möglich sich bei einer Bibilothek nicht auf einen bestimmten Datentypen festzulegen? Also ein Array eines Typen void?

    Ja. Ja.

    C_QuestionX schrieb:

    Die Nächste Frage ist, gibt es eine gute Hashmap implementation in C?

    http://igtfy.com/?q=hashmap+ ansi+c

    C_QuestionX schrieb:

    Wäre nett, wenn ihr mir die 2 Fragen beantworten könntet.

    Ähm. Ich zähle vier.



  • C_AnswerY schrieb:

    C_QuestionX schrieb:

    Ist es möglich sich bei einer Bibilothek nicht auf einen bestimmten Datentypen festzulegen? Also ein Array eines Typen void?

    Ja. Ja.

    Totaler Quatsch.
    Es gibt in C keine Objekte vom Typ void.



  • Aber es gibt Zeiger auf void.



  • Wutz schrieb:

    C_AnswerY schrieb:

    C_QuestionX schrieb:

    Ist es möglich sich bei einer Bibilothek nicht auf einen bestimmten Datentypen festzulegen? Also ein Array eines Typen void?

    Ja. Ja.

    Totaler Quatsch.
    Es gibt in C keine Objekte vom Typ void.

    Du hast vom Tuten und Blasen keine Ahnung.
    Wohl noch nie was von void Zeigern gehört.
    http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_011.htm#mj73b6b10a1e5c84bb6227972822059e40
    Ich empfehle ein gutes Grundlagenbuch.



  • Wutz ist immer so.
    TE fragte nach einem Array vom Typ void, was du mit ja beantwortet hast.
    Das heißt, es muss Objekte vom Typen void geben, was nicht stimmt.
    Ist klar, dass du void-Zeiger meintest, aber ... 🙄



  • Also ich werde dir jetzt nicht in 2 Sätzen alle Nachteile von Java gegenüber C aufschreiben (können, wobei können nicht an mir sondern an der Vielzahl der Unzulänglichkeiten der Deppenprogrammiersprache Java scheitert). Siehe auch meinen Footer.
    Nein, es gibt keinen "anonymen" Datentyp in C und somit ist auch ein Array daraus unmöglich. Wenn du sowas willst, musst du eine typenlose Sprache nehmen, alles andere wäre immer nur Rumgefrickel, wie bei deinem Javazeugs.
    Es gibt lediglich Tricks, bei dem man sich die Adresse des Objektes merkt (void*) UND eine irgendwie gelagerte Typinformation, um bei Bedarf dereferenzieren zu können.
    Und sowas gibts im C Standard nicht, sicher aber irgendwo irgendwelche C-Libs, von denen ich dir aber jetzt keine empfehlen werde.

    "Gute" Hashmap ist auch die falsche Fragestellung, nahezu alleinentscheidend ist die verwendete Hashfunktion, prinzipiell gibts bei Hashmaps/tables nur 2 Arten, entweder dynamisch oder statisch bei kollidierenden Eimern.
    Aber das ist auch der große Vorteil einer Hashmap, über die Hashfunktion bestimmst du selbst die Selektivität, d.h. du kannst für jeweils unterschiedlich vorkommende Datenstrukturen immer selbst die Qualität deiner Hashmap bestimmen.
    Es gibt bekannte "Universal"-Hashfunktionen, mit denen du erstmal loslegen kannst (um dann anschließend u.U. selbst eine zu schreiben, denn du kennst deine Daten am besten).

    einfache Hashtable-Implementierung:
    http://troydhanson.github.com/uthash/userguide.html

    einfache 32-Bit Hashfunktion nach Jenkins: (wird z.B. in o.g. Lib als Default genutzt)

    unsigned long jenkins_one_at_a_time_hash(const unsigned char *key, size_t len)
    {
        unsigned long hash, i;
        for(hash = i = 0; i < len; ++i)
        {
            hash += key[i];
            hash += (hash << 10);
            hash ^= (hash >> 6);
        }
        hash += (hash << 3);
        hash ^= (hash >> 11);
        hash += (hash << 15);
        return hash;
    }
    


  • C_AnswerY schrieb:

    Du hast vom Tuten und Blasen keine Ahnung.
    Wohl noch nie was von void Zeigern gehört.
    http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_011.htm#mj73b6b10a1e5c84bb6227972822059e40
    Ich empfehle ein gutes Grundlagenbuch.

    Also das gab es hier auch noch nicht: mir Pfuscher JW zu empfehlen.
    Du bist es, der von Tuten und Blasen keine Ahnung hat.
    Du bist es, der von Deutsch keine Ahnung hat und nicht lesen kann.
    Du bist es, der von C keine Ahnung hat, weil du Pfuscher JW propagierst und als "gutes Grundlagenbuch" bezeichnest.
    Du hast keine Ahnung, wovon du redest. Troll dich.



  • Wutz schrieb:

    Es gibt lediglich Tricks, bei dem man sich die Adresse des Objektes merkt (void*) UND eine irgendwie gelagerte Typinformation, um bei Bedarf dereferenzieren zu können.

    Was du "Tricks" nennst, ist in der C Programmierung gängige Praxis.

    Wutz schrieb:

    Und sowas gibts im C Standard nicht, sicher aber irgendwo irgendwelche C-Libs, von denen ich dir aber jetzt keine empfehlen werde.

    void* gibts im Standard nicht?
    🤡

    Wutz schrieb:

    Also das gab es hier auch noch nicht: mir Pfuscher JW zu empfehlen.

    Ich kenne keinen Pfuscher JW. Interessiert mich auch nicht.
    Der Link dient lediglich dazu dir zu zeigen, das void* Zeiger existieren. 🙂
    Auf den Rest deines Beitrags, das prepubertäre Getrolle, einzugehen, schenke ich mir.



  • Danke an alle die geantwortet haben.

    Ich weiß nicht ob man Java so pauschalisieren kann, indem man sagt es wäre nur "Rumgefrickel" dafür wird es einfach zu häufig verwendet.

    Habe schon einen konkreten Plan wie ich mein Projekt umsetzen kann (hab es schon mal in Java geschrieben, will es nun testweise in C schreiben).

    Werde mich aber nochmal in die Grundlagen einlesen, ich denke noch zu objektorientiert 😃



  • Dann nimm doch C++.
    OOP, generische Datenstrukturen, gute Lowlevel-API...



  • C_QuestionX schrieb:

    Werde mich aber nochmal in die Grundlagen einlesen, ich denke noch zu objektorientiert 😃

    Mit der Denkweise fährst du auch in C sehr gut, die Umsetzung sieht dann natürlich anders als in Java etc. aus.



  • C_QuestionX schrieb:

    Werde mich aber nochmal in die Grundlagen einlesen, ich denke noch zu objektorientiert 😃

    Wenn du konsequent objektorientiert denken würdest, stellt sich deine Typen-Frage auch nicht, denn bei konsequenter OOP gibt es nur Objekte und eben gerade keine (nativen) Datentypen wie in Java,C++,..., für die man dann jeweils immer aufwändige Sonderbehandlungen supporten muss.



  • Von C++ wurde mir abgeraten, außerdem wollte ich beide Seiten der Medallie sehen. Eine sher crossover fähige OOP Sprache wie Java und eine sehr hardware nahe prozeduale Sprache wie C.

    @ Wutz: Wenn ich etwas wie einen Buffer schreibe, schreibe ich ihn doch lieber gleich generisch damit, egal welcher Type kommt, ich diesen verwenden kann. So muss ich nicht für jeden Typ ein neue Buffer Klasse schreiben. Das erleichtert enorm den Aufwand.

    Natürlich kann ich auch schreiben:

    void buffer* = allocate(size);
    

    Und hätte so praktisch ein Array eines unbestimmten Types.



  • Wutz schrieb:

    Wenn du konsequent objektorientiert denken würdest, stellt sich deine Typen-Frage auch nicht, denn bei konsequenter OOP gibt es nur Objekte und eben gerade keine (nativen) Datentypen wie in Java,C++,..., für die man dann jeweils immer aufwändige Sonderbehandlungen supporten muss.

    Selbstverständlich stellt sich gerade für einen C Neuling, der Ahnung von OOP hat, diese Frage.
    Wie sonst soll er denn seine Objekte (Strukturen) in C sonst aufbauen, als mit Standard-Datentypen?



  • Guck dir vielleicht mal Rusty Russels CCAN an. Dort müsstest du, neben anderen Datenstrukturen und Hilfsroutinen, auch eine Hashmap finden. Ist nicht annähernd so umfangreich wie das namensgebende Perl-Äquivalent, die Codequalität dürfte aber stimmen.

    Comprehensive C Archive Network


Anmelden zum Antworten