Sonntag, Dezember 8, 2019

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?

7 Kommentare

  1. 15

    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?

    • Schön pädagogischen Ansatz.
  2. 13

    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* statt some_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.

  3. 10

    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 über stdlib 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 allen read, write etc Funktionen unabhängig seiner Herkunft (socket -, Datei -, pipe, etc). Dieser Frage ALSO (link) hat einige gute links zu tollen code zu Lesen.

    C-generische Programmierung

    (Quelle: skitch.com)

    Bild von Denken Her, einem großen, alten Buch über Programmierung, unabhängig von der Sprache.

  4. 2

    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; und return stack[--tos] ohne eine wiederverwendbare Bibliothek. Die Antworten, die darauf hindeutet, eine Bibliothek basierend auf void* 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.

  5. 2

    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).

        static int compare(void *menor, void *maior)
    {
    int *pMenor = (int *)menor;
    int *pMaior = (int *)maior;
    return ( *pMenor > *pMaior );
    }
    void bubleSort(void *base, int bWidth, int len, int (*func)(void *key, void *data))
    {
    int i, j;
    char *k=0;
    char *bPtr = (char *)base;         //Points to the beginning of the array 
    char *pi, *pj;
    k = (char *)malloc(bWidth);        //Creates a new var with the size of the data type
    if(!k)
    return;
    for(i = 0; i < len; i++)
    {
    pi = (bPtr + (i*bWidth));
    for(j=i+1; j < len; j++)
    {
    pj = (bPtr+(j*bWidth));
    if( func((void *)pi, (void *)pj) )
    {
    memcpy(k, pi, bWidth);
    memcpy(pi,pj, bWidth);
    memcpy(pj, k, bWidth);
    }
    }
    }
    free(k);
    }
    int main()
    {
    int vet[5] = {4, 1, 3, 5, 2};
    bubleSort((void *)vet, sizeof(int), 5, compare);
    return 0;
    }
    • Danke, ich habe gerade einen ähnlichen code (basierend auf diesem) zu Sortieren, einige Strukturen.
  6. 1

    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.

  7. 1

    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

      o constructor to create the object
    o a destructor to destroy the object
    o a push function
    o a pop function
    o an "is_empty" function.

    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.

    • Leider ist C++ nicht eine option in meinem Fall. Aber danke für deine Antwort :).

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...