C-generische Programmierung
Zunächst, ich bin ein Anfänger-Programmierer (immer noch viel zu lernen).
In einem meiner kleinen Schule Projekte, die ich geschrieben habe, einen Stapel für eine Struktur . Jetzt habe ich eine etwas andere Struktur und ich brauche einen Stapel für diese ein.
Sollte ich schreiben, andere Daten-Struktur [stack] (sehr ähnlich wie der erste), oder versuchen zu erreichen, dass einige der generischen Programmierung...
Kennen Sie eine gute Allgemeine Programmier-Strategien, (online-Ressourcen schließlich) in C ? Ich habe google, aber ich habe nicht gefunden, nichts zufriedenstellend, da die meisten Ergebnisse sind über die C++ - Strategien.
Dank!
SPÄTER EDIT:
Nach einigen Lesen und erleben, schließlich habe ich zwei Lösungen für mein problem.
Ich habe dokumentiert Sie hier: http://andreinc.net/2010/09/30/generic-data-structures-in-c/ . Artikel könnten Fehler enthalten oder inexactitudes, noch es zusammenzufassen, was ich bisher wissen.
- also beides, void* & marco kann verwendet werden zum implementieren der generischen Programmierung, welche ist besser? Oder welche würden Sie empfehlen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suche nach Gemeinsamkeiten und die Schaffung von Abstraktionen ist eine der wertvollsten Fähigkeiten, die für einen Programmierer. Sie sind immer noch lernen, würde ich vorschlagen, dass du folgende Dinge tun:
(1) Implementieren Sie den stack für die andere Struktur. Ja, es ist doppelte Arbeit, sondern auf die Bühne jedes funktionierende Programm zählt. Baut Erfahrung.
(2) Vergleichen Sie die Programme. Was sind die Teile, die Sie gemeinsam haben? Was sind die Teile, die sich voneinander unterscheiden? Ihr Ziel ist, trennen Sie die Teile, die üblich sind, von der Teile, die anders sind. Was bedeutet, dass diese beiden Gruppen verwenden, um zu kommunizieren? Die Teile, die Sie gemeinsam haben, gehen in einem Teil des Systems (stack.h/stack.c) die Teile, die anders sind, gehen in Ihre eigenen Dateien (Konto.h/c, person.h/c, etc.). Und der Teil, in dem Sie kombinieren, Sie sollten tun, eine include-stack.h und die Parametrierung Einheit.
(3) Versuchen Sie, alle Möglichkeiten, die Sie wissen, dass die Sprache bietet, die Sie verwenden können, um die Umsetzung der abstrakten Struktur, die Funktionalität. Auf den ersten, es scheint immer, als ob es nur einen Weg, aber für jeden nicht-triviale problem gibt es alsway mehrere Ansätze. Im Stapel-Gehäuse, mit standard C, zum Beispiel, zou können void-Zeiger, die Sie verwenden können, Präprozessor-Makros, die Sie in Aussehen sollte-token einfügen können, können Sie verwenden Sie Funktionszeiger plus-struct-Zeiger, etc.
(4) Umzusetzen, als viele von Ihnen wie möglich. Wieder, dies ist für die Lernerfahrung. C hat so viele fallen, und je früher Sie in die Arme laufen, desto besser.
(5) Nachdem Sie aufgezählt habe und implementiert alle diese verschiedenen Ansätze, sollten Sie diese bewerten: Die war am einfachsten zu verwenden? Welche war am einfachsten zu implementieren? Welche ist die Schnellste? Welche ist am einfachsten zu Debuggen?
Ich nicht viel tun, der C-hacking, aber ich denke der Weg zu gehen mit diesem ist
void*
.So, nur schreiben Sie Ihre Stapel von push/pop
void*
stattsome_struct*
. Es wird Ihr problem zu halten, die Arten richtig, aber das ist nur ein Preis, den Sie zahlen für die Verwendung von derart niedrigen-Niveau,* Programmiersprache.*Nicht zu implizieren, dass dies eine schlechte Sache.
Ich glaube, dass Abstraktion ist meist im Auge des Programmierers. Ein großartiger Programmierer kann sich sehen Muster in einfache Aussagen, auch in einem low-level-Sprache wie C. Sprache und Ihre syntax kann sicherlich helfen, aber wie Anweisungen und Ausdrücke sind endlich geschrieben sind, etwas, was differenzieren guten Programmierer von den schlechten. Das heißt, wie kann dieser helfen? Naja, mein Punkt ist, vertraut zu werden mit den Konstrukten in C, so dass Sie Sie kennen, wenn Sie Sie sehen, und die
void*
wie Kevin Montrose erwähnen, ist ein Allgemeines. Strategien, die ich denke, sind gut denke überstdlib
wie hat die Dinge schon dort gelöst? und spiegeln in großen-code, wenn Sie sehen, einige.Dh eine gemeinsame Muster in
stdlib
ist auf null (0) repräsentiert OK. Oder zu reflektieren, wie gut eine filedescriptors arbeiten mit allenread
,write
etc Funktionen unabhängig seiner Herkunft (socket -, Datei -, pipe, etc). Dieser Frage ALSO (link) hat einige gute links zu tollen code zu Lesen.(Quelle: skitch.com)
Bild von Denken Her, einem großen, alten Buch über Programmierung, unabhängig von der Sprache.
Für die Produktion code, den ich in der Regel lieber C++. Auch wenn Sie nicht Vorhaben, zu gehen alle aus mit OO, Generika und metaprogramming, können Sie die Verwendung von C++ als besseres C (in diesem Fall, nur um std::stack kostenlos).
Wenn Sie C verwenden, versuchen Sie es einfach zu halten und stellen Sie pragmatische Entscheidungen basierend auf Ihre besonderen Umstände. Zum Beispiel, wenn Sie wissen, für sicher, dass dein stack ist begrenzt auf einige kleine begrenzen und die Daten, die Sie in Händen halten, ist einfach, dann ist dein stack code könnte so einfach sein wie
stack[tos++] = x;
undreturn stack[--tos]
ohne eine wiederverwendbare Bibliothek. Die Antworten, die darauf hindeutet, eine Bibliothek basierend aufvoid*
auch geeignet sind, unter verschiedenen Umständen. C++'s std::stack ziemlich viel löst dieses problem ein für alle mal; C nicht ganz Ihnen, dass Luxus.Legte ich ein Beispiel hier von der generischen Programmierung in C. Obwohl seine nicht eine Datenstruktur, Algorithmus, einer Art kann es aber geben Ihnen einige Hinweise zu diesem Thema. Ich hoffe es kann dir helfen.
Den nachstehenden Algorithmus ist eine generische Implementierung des bubble-sort-Algorithmus. Ich bin mit void-Zeigern und wandeln Sie die Daten auf byte-Ebene. Auch ich benutze einen externen Vergleich-Funktion, ist der einzige code, der weiß, dass der Typ der zu sortierenden Daten. Diese Vergleichs-Funktion übergeben wird als parameter an die sort-Algorithmus.
Ein weiterer wichtiger Punkt ist, dass die erste Algorithmus braucht, um zu wissen, die Größe in bytes, die Daten manipuliert, um zu wissen, wie viele bytes, die notwendig sind, um diese Daten auf eine neue position im array. Es schafft auch einen Puffer zum speichern einer Instanz dieser Daten (k-variable in der bubleSort-Funktion).
C ist ein ziemlich low-level-Programmiersprache, die mit nur ein wenig Abstraktion der Maschine wird der code ausgeführt, aber fast nichts in der Abstraktion von der sprachlichen Sicht. C++ hat Vorlagen für Allgemeine Programmier aber in C Sie don ' T haben etwas ähnliches.
Die beste Sache, die Sie tun können, ist schreiben Sie Ihre Daten-Strukturen immer
void*
und verlassen jeden allocation/deallocation - /casting-an den Aufrufer. Es ist chaotisch und fehleranfällig, aber.Während ein Großteil der Beratung hier ist stellar (ich fordere Sie auf, versuchen Sie, eine Menge verschiedener Methoden, um Erfahrung zu sammeln), ich empfehle die Verwendung von C++. Die stack-Vorlage zu erstellen, die Implementierung, dann die Verwendung von extern "C" so erstellen Sie ein set von C-api-Funktionen zu verwenden.
müssten Sie ein
Den letzten 3 Funktion würde einen Zeiger auf das Objekt als Ihr erstes (void *) parameter.
Innerhalb der Funktion, der Zeiger wäre typecast auf den stack-Objekt geben, dann in
normale c++ - Mode.
Versuchen, die Umsetzung würde einen anderen Pfeil in Ihrem Köcher, damit Sie jagen konnten größere Spiel.