Multi-Pointer-Array?



  • Nochmal: Du brauchst dort keine Zeiger auf int oder double in die union zu packen - das bringt dir nur unnötigen Aufwand, weil du sicherstellen mußt, daß diese Zeiger auch immer auf eine gültige Variable verweisen.



  • Also wiso muss ich dort speziell überwachen wenn ich im Union einen Zeiger mache? Das tue ich ja sonst auch nicht. Wäre nett, wenn man mir das erklären könnte.

    Hmm, wenn ich dort einen Zeiger machen könnte der auf eine beliebige schon bestehende Variable im System Zeigt, so wäre das sehr optimal gewesen, da alle diese Konfigurations-Variablen ja schon existieren und ich hätte sie dann nur noch mit dem richtigen Namen im Conf-File verknüpfen müssen (siehe Beispiel von vorher).

    Das scheint ja nicht möglich zu sein, ohne zusätzlichen Aufwand zur überwachung meines Pointer in der Union. Jetzt stellt sich meine Frage, ob ich das ganze dann umgekehrt machen kann.

    Hier der Code:

    typedef struct
    {
        enum
        {
            vINT,
            vLONG,
            vSTR
        }
        var_typ;
    
        union
        {
            char szString[MAX_CHARS];
            int nInt;
            long int lLong;
        }
        value;
    }
    MultiPointer;
    
    typedef struct
    {
        char VarName[MAX_CHARS];
        MultiPointer xValue;
    }
    ConfVar;
    
    ConfVar ConfVariable[MAX_CONF_SIZE];
    int *pfOnOff;
    
    /* Initialisation meiner conf-Variable die im File unter dem Namen "MyIntName"
       anzutreffen ist (könnte so aussehen: MyIntName = 1;). Abspeichern will ich
       den Wert 13 in der Variable fOnOff.                                        */
    strcat(ConVariable[0].VarName, "MyIntName");
    ConfVariable[0].xValue.var_typ = vINT;
    pfOnOff = &ConfVariable[0].xValue.value.nInt;
    
    /* einen Wert in die angelegte Conf-Variable schreiben */
    *pfOnOff = 1;   /* <-- ist das so korrekt? */
    

    Darf ich das so machen und kann jetzt die Variable über pfOnOff ansprechen wie ich das im Beispiel-Code mache?

    Nochmals vielen Dank für eure Geduld (vorallem die von CStoll).

    mfg

    Sputnik



  • den *pOnOff brauchste nicht. geht direkt so:

    ConfVariable[0].xValue.value.nInt = 1;
    

    🙂



  • Apeman schrieb:

    den *pOnOff brauchste nicht. geht direkt so:

    ConfVariable[0].xValue.value.nInt = 1;
    

    🙂

    Das weiss ich. Jetzt musst du dir aber vorstellen, dass ich ja keine Ahnung habe, in welchen Struct in meinem Array jetzt die gesuchte Variable habe. Ich müsste dann jedes Mal wenn ich den wert der Variable ändern will alle meine Structs durchsuche, weil ich die gesuchte Conf-Var ja nur anhand dem String in der Struktur identifizieren kann. Das würde mich jedes mal viel Zeit kosten da ich ja Strings vergleichen müsste und das Ganze ist über String sehr mühevoll zu handeln. Da ist es schon viel einfacher, wenn ich einfach schnell ein Pointer auf das richtige Element in der richtigen Struktur anlege, dann kann ich die Variable in meinem Programm bequem abfragen und bei bedarf auch wieder neu setzte.

    mfg

    Sputnik



  • Sputnik schrieb:

    Also wiso muss ich dort speziell überwachen wenn ich im Union einen Zeiger mache? Das tue ich ja sonst auch nicht. Wäre nett, wenn man mir das erklären könnte.

    In Zeigern steht nichts anderes als eine Speicheradresse. Was konkret in dieser Speicherzelle steht ist wiederum etwas anderes. Falls das, was ursprünglich in dieser Speicherzelle stand, ungültig wird (näheres dazu unten) ist der Inhalt undefiniert. Es kann zufälligerweise noch der alte Wert drinne stehen, muss aber nicht.

    Der Gültigkeitsbereich (Scope) von Variablen ist dir hoffentlich bekannt. Ich hoffe ich mache hier keine Fehler, da ich aus dem C++, nicht dem C-Umfeld komme:

    int main()
    {
      int* pa = 0;
      {
        int a = 4;
        pa = &a;
      }  // a verlässt seinen Gültigkeitsbereich
      // <-- pa zeigt auf ungültigen Bereich
      return 0;
    }
    

    Wenn du wiederum den Speicher über dynamische Speicherverwaltung (malloc...) allozierst, dann bleibt der Wert gültig, muss aber später auch wieder freigegeben werden.

    cu André



  • Mir ist schon klar, dass es solche Scopes gibt. Vorallem das angeführte Beispiel mit der Funktion ist für mich sonnenklar, aber trotzdem danke für die Erklärung.

    Was mich momentan mehr interessiert ist, ob es klappt, wenn ich nacher ein Pointer auf das Element der Union anlege. Ich persönlich sehe keinen Grund, weshalb nicht, da ich ja auch auf ein Element eines Struct problemslos ein Pointer anlegen kann, oder täusche ich mich da? Ich wäre sehr dankbar, wenn jemand mit wirklich Ahnung zu meinem letzten Beispiel-Code stellung nehmen könnte.

    mfg

    Sputnik



  • Sputnik schrieb:

    Ich wäre sehr dankbar, wenn jemand ... zu meinem letzten Beispiel-Code stellung nehmen könnte.

    das geht so. du kannst pointer auf union-elemente zeigen lassen. alles kein problem.
    🙂



  • Hätte mich auch arg gewundert, wenn das anders gewesen wäre. Aber ich musste mich schon ein paar mal in meiner noch jungen "Prigrammiererkarriere" wundern...

    Ich möchte noch einmal allen für ihre Hilfe danken, vorallem CStoll, der mir eine grosse Hilfe war auf dem Weg zu meiner Lösung des Problems. Ich denke, mein Problem hat sich jetzt gelöst, ich werde es jetzt so implemetieren können.

    mit freundlichen Grüssen

    Sputnik



  • Undertaker schrieb:

    ...

    Stimmt es, dass du dich früher mal mis2com genannt hast?



  • @pale dog? schrieb:

    Undertaker schrieb:

    ...

    Stimmt es, dass du dich früher mal mis2com genannt hast?

    nein, wieso? hat der besonders viel dummes zeug geschrieben?
    🙂



  • Stimmt nicht, ich habe mich nie so genannt und war in diesem Forum vorher nie registriert. Auch in keinem anderen Forum habe ich diesen Namen je benutzt. In den meisten von mir besuchten Forums ist mein Alias Sputnik (wenn er nicht schon vergeben war).

    Aber wiso interessiert das? Bin ich euch so auf die Nerven gefallen oder was hat den mis2com verbrochen?

    mfg

    Sputnik



  • Sputnik schrieb:

    Stimmt nicht, ich habe mich nie so genannt und war in diesem Forum vorher nie registriert. Auch in keinem anderen Forum habe ich diesen Namen je benutzt. In den meisten von mir besuchten Forums ist mein Alias Sputnik (wenn er nicht schon vergeben war).

    Aber wiso interessiert das? Bin ich euch so auf die Nerven gefallen oder was hat den mis2com verbrochen?

    mfg

    Sputnik

    Das war doch garnicht auf dich bezogen.



  • Stimmt, das sehe ich jetzt auch (habe nochmals nachgeschaut).

    Hatte schon befürchtet, ich bin euch zu sehr auf den Keks gegangen.

    mfg Sputnik



  • Sputnik schrieb:

    Hatte schon befürchtet, ich bin euch zu sehr auf den Keks gegangen.

    Das geht hier nicht so schnell. Als C-Frickler hat man die Schmerzbefreiung implizit 😉



  • C kann schon eine ganz schöne Frickelei sein, aber ich persönlich liebe die Macht die man mit C hat und was für wunderschön schnelle Programme man schreiben kann. Nach ASM einfach das geilste 😃 (wenn ich mich mal so audrücken darf)

    mfg

    Sputnik


Anmelden zum Antworten