globales Array einer Struktur erstellen



  • Hi,

    ich habe ein Problem damit, ein globales managed Array eines structs zu erstellen. Also folgendes habe ich bereits:

    über der Klassendeklaration:

    enum TIdentType{itConstant,itVariable,itProcedure};
    
    ref struct TIdent
    {
    	System::String^ Name;
    	TIdentType Kind;
    };
    
    typedef array<TIdent^> TIdentList;
    

    innerhalb der Klasse:

    static TIdentList^ Table=gcnew TIdentList(999);
    

    mit dem vorliegenden Code gibt es zwar keine Fehler aber in dem Moment, wo ich in ein Arrayelement was reinschreiben möchte:

    Table[index]->Name="ABC";
    

    gibt es den Fehler:

    "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Man sieht auch schon beim debuggen, dass innerhalb des Arrays bei allen Elementen "undefined value" steht, verstehe aber nicht warum... muss ich noch die einzelnen structs irgendwie erstellen?
    Vielleicht hat jemand von Euch einen Rat, vielen Dank im Voraus und viele Grüße

    DeckCain



  • Du kannst keine globalen Dinge im Managed Code anlegen.

    Du kannst höchstens in einer *Klasse* eine Static Field/Property machen!

    Auch würde ich kein *array* verwenden, sondern eine Liste!

    System::Collections::Generic::List<TIdent^>
    

    Das ist dynamisch und Du bist vom Platz her nicht im voraus festgelegt!



  • Erstmal Danke für die Antwort.
    Frage mich allerdings wie es nun möglich sein soll, dass verschiedene Funktionen mit demselben Array/Liste arbeiten können, wenn es nicht global existieren kann???



  • Prinzipielle muss der Benutzer deines Objekts (hier dein Array) Zugriff via einer Managed Referenz (o.ä) haben. Gib diese Referenz den Benutzern deines Objektes bekannt (Setter/Getter, Konstruktoren, etc.).



  • Was meinst du denn konkret mit einer managed Referenz, das Trackinghandle?



  • Abgesehen davon dass es globale Variablen in .Net nicht gibt, ist das aber nicht der eigentliche Fehler. Du erstellst ein Array wo du mit gcnew auch brav dein Arrayobjekt erstellst. Da die Arrayelemente aber ein Referenztyp sind, musst du bevor du darauf zugreifst natürlich auch mit gcnew das entsprechende Objekt erstellen. Das tust du nicht, sondern versucht gleich drauf zuzugreifen und das haut er dir natürlich berechtigterweise mit einer NullReferenceException um die Ohren.



  • DeckCain schrieb:

    Was meinst du denn konkret mit einer managed Referenz, das Trackinghandle?

    Die Idee ist ja Sprach und Platform unabhängig.
    Konkret für dein Fall: ^



  • Stimmt Talla, daran hat es gelegen. Erstelle nun erstmal mit gcnew eine Struktur und kann diese dann in die Liste hinzufügen. Die Liste bleibt auch für andere Funktionen zugänglich.
    Vielen Dank für den Tip 😉


Anmelden zum Antworten