Wie macht man dies: array<String^ mit variabler Dimension als Funktionsparameter ?



  • Hallo zusammen!

    Ich habe ein Klasse mit einigen Grundfunktionen geschrieben, in der es je eine Funktion für das Füllen eines ein-dimensionalen und zwei-dimensionalen Arrays gibt.
    Jetzt bräuchte ich dies auch für ein drei-dimensionales Array.

    Da ich ungern drei Funktionen dafür haben möchte, gibt es eine Möglichkeit die Dimension des Array-Zeigers in den Funktionsparametern variabel zu machen, und somit eine Funktion für mehrere Dimensionen nutzen zu können?

    Folgendes gibt leider einen Fehler aus:

    Int32 3DArray(const Int32 iDimension,array<String^, iDimension>^ arr)
    {...}
    

    Fehlermeldung:

    error C2971: 'cli::array': Vorlagenparameter 'dimension': 'iDimension': Eine lokale Variable kann nicht als Nichttyp-Argument verwendet werden
    error C2739: "0": Explizite verwaltete Arraydimensionen müssen zwischen 1 und 32 liegen.
    

    Habt ihr einen Lösungansatz?

    Gruß,
    Daniel



  • array<array<Int32>> ??



  • Damit habe ich jetzt folgendes gemacht:

    Int32 Connection::Abfrage_3DArray(String^ aCmd,array<array<String^>^>^ arr)
    

    Nun ist der Schreibzugriff fehlerhaft:

    arr[j,i]=aBuf;
    

    Fehlermeldung:

    error C2440: '=': 'System::String ^' kann nicht in 'cli::array<Type> ^' konvertiert werden
    

    Wo ist mein Verständnisproblem?



  • Du hast jetzt kein 2 Dimensionales Array mehr, sondern ein Array welches andere Arrays enthält.
    Zugriff: arr[j][i]=aBuf



  • Ok, danke.

    Wie lege ich jetzt ein dementsprechendes 'Array im Array' an, so dass ich es als Parameter übergeben kann?

    Bisher hab ich das so gemacht:

    array<String^,2>^ aTestArray = gcnew array<String^,2>(50,2);
    


  • Warum ist die Dimension eigentlich nicht bekannt?
    Die ist doch bekannt für den Funktionsaufruf, wo ist also das Problem?
    Simon



  • Ich hab das Array jetzt folgendermaßen angelegt:

    array<array<String^>^>^ test = gcnew array<array<String^>^>(100);
    for(Int32 i=0;i<100;i++)
    	test[i] = gcnew array<String^>(3);
    

    Lässt es sich so wieder vollständig löschen?

    for(Int32 i=0;i<100;i++)
    {	for(Int32 j=0;j<3;j++)
    		delete test[i][j];
    	delete test[i];
    }
    delete test;
    


  • Du musst es nicht löschen in C++/CLI. Wir haben hier Garbage Collection.

    delete macht nicht was Du denkst. delete ruft Dispose() auf für Klassen die IDisposable implementieren.

    Simon



  • Garbage Collection hab ich schonmal gehört...

    Die deletes sind Gewohnheit.
    Wann räumt die Garbage Collection statt manueller deletes denn auf?
    Werden die deletes direkt nach dem Schließen einer Form für diese selbst und die in ihr genutzten anderen Klassen aufgerufen?

    Gruß,
    Daniel



  • Das ginge hier jetzt zuweit wann, warum und wie der GC auräumt.

    Falls es dich wirklich interessiert rate ich Dir zum Buch:
    Microsoft .NET Framework-Programmierung in C#. Expertenwissen zur CLR und dem .NET Framework 2.0
    http://www.amazon.de/gp/product/3860639846/ref=sib_rdr_dp

    Und wie gesagt, die deletes in deinem Code machen nicht das was Du denkst.

    Simon


Anmelden zum Antworten