vertraktes linked-list problem



  • ok, folgendes problem: ich brauche eine linked list. das besondere: die elemente müssen alle konstanten sein! das führt aber zu einem problem:

    const Anim A1={&A2};
    const Anim A2={&A1};
    

    leider muss eine konstante ja sofort initialisiert werden, sodass ich A2 schon an A1 übergeben müsste, bevor die variable überhaupt existiert. A2 vor A1 deklarieren bringt mich natürlich auch nicht weiter, denn dann fehlt wieder A1 für A2 🙄
    jemand hat mir folgendes vorgeschlagen:

    extern const Anim A2;
    const Anim A1={&A2};
    const Anim A2={&A1};
    

    aber der compiler (gcc) spuckt dazu auch nur eine fehlermeldung aufgrund der doppelten deklaration aus.
    gibt es irgendeinen weg, dieses problem zu umgehen (sollte die lösung c++ statt c spezifisch sein, dann auch her damit)?

    ps: ja, das müssen wirklich konstanten sein 😉



  • gehen linked list's nicht mit zeigern und nicht referenzen?
    versuch mal

    const Anim *A1, *A2;
    A1 = new Anim;
    A2 = A1
    

    gcc spuckt bei mir (-Wall) keine warnings oder fehler aus.



  • also irgendwo versteh ich deinen code nicht. mit dem new legt man doch die variable im heap an, oder? wie kann es dann noch eine konstante sein? und wenn ich dann A2 als pointer draufzeigen lasse hab ich doch keine linked list...A2 müsste doch selbst erstmal erstellt werden und dann an A1 per zeiger "angehängt" werden?

    typedef struct Anim
    {
        const Anim  *nextanim;
    } AnimTag;
    


  • sry ja, da hab ich nicht aufgepasst, auch für's new entschuldigung, ich bin ja im c-forum 😃

    es ist richtig, dass die variable im heap gemacht wird. aber const heist nicht, dass nicht auf m heap liegen darf.
    aber linked lists werden ja gerade desshalb hergenommen, weil du ja beliebig viel benötigst (und mit malloc / new holst), bzw zur compile zeit nicht weist, wie lang die liste ist.
    wenn du also von deiner liste weist wie lang sie ist (zur compilezeit) dann hau den ganzen krempel in ein array.
    schau dir vielleicht nochmal n paar erklärungen zu linked list's durch, falls dir das vielleicht hilft.

    btw: wieso muss das eigentlich const sein?



  • ich will aber kein array, sondern eine linked list und zwar nicht, weil ich eine LL beliebig verlängern könnte (darauf kommts gar nicht an), sondern weil ich mich im gegensatz zu einem array nicht um die länge kümmern muss. ich kann einfach immer die ganze LL durchloopen, darum gehts mir.
    und vielleicht noch eine erklärung, warum das ganze konstant sein muss: ich versuch mich hier in GBA-programmierung, und damit ich die daten im modul halten kann und nicht in den arbeitsspeicher laden muss, müssen sie konstant sein! dh. sie dürfen nicht erst zur leufzeit angelegt werden, weil sie dann logischerweise nicht mehr im ROM des moduls landen können!



  • hm. meine letzte idee:
    mach doch ein array, und dazu gleich ein const int, der dir die anzahl speichert:

    const int AnzahlAnim = 17;
        const Anim[AnzahlAnim] = { ... };
        // wenn du jetzt durchloopen willst:
    void AnimHandler1(const Anim &my_anim);
    void AnimHandler2(const Anim &my_anim); 
    // da musst bei funktionspointern schauen (forum suche)
    // weil ich leider grad nicht parat hab, wie man ne 
    // funktion als parameter übergibt
    void durchloop(const Anim *my_array, int anzahl. &AnimHandler)
    {
        for (int i = 0; i < anzahl; ++i)
            AnimHandler(my_array[i]);
    }
    

    damit kannst belibige Anim Arrays mit eigenen handlern ganz easy durchloopen.
    wenn du das mit den funktionspointern umgehen willst, musst einfach die schleife in den handler mit reinbauen.

    vielleicht hilft dir das, weil ich bei der LL nicht mehr weiterweis



  • Noch besser du machst eine "klassische" Linked List mit einer Struktur als Listen-Object:

    typedef struct l_tag
    {
        const int Konstante;
        l_tag next;
        l_tag previous; //nicht unbdeingt notwendig
    } ListenEintrag;
    

    damit kannst du dann einträge so

    ListenEintrag *element = (ListenEintrag *) malloc(sizeof(listenEintrag));
    

    erstellen. Hatt übrigens auch den Vorteil das deine Konstanten noch nicht initialisiert sind und somit noch Werte zugewiesen bekommen können.

    [ Dieser Beitrag wurde am 02.01.2003 um 11:55 Uhr von sg editiert. ]


Anmelden zum Antworten