Array Operation



  • Hallo Community,

    wie kann ich ein Array, daß in einer Funktion wie. z.B.

    private: void Form1::func(){
    array<Byte>^ _array = gcnew array<Byte>(){};
    ...
    }
    

    erzeugt wird, in einer anderen Funktion wie etwa

    private: System::void button1_Click(system::Object^ sender, System::EventArgs^e
    ```){}
    

    verwenden?
    Das Array soll dort als Kopie oder Template Verwendung finden und soll nicht verändert werden.

    Array::Copy(TemplateArray, NewArray, TemplateArray->Length);
    

    Es muß irgenwie als global und static definiert werden, oder als 'indexed property'. Ich habe keine Lösung.
    Vielleicht hat jemand eine Methode.
    VG



  • Dann deklariere es als Klassenmember:

    private:
      array<Byte>^ _array;
    
      void Form1::func()
      {
        _array = gcnew array<Byte>(){};
      }
    

    PS: C++/CLI solltest du nicht für GUI-Anwendungen nutzen, s.a. Windows Forms und Visual C++ MACHT KEINEN SINN! -> entweder natives C++ mit einem reinen C++ UI-Framework (wie Qt, wxWidgets, ...) oder aber C# als Programmiersprache (mit WinForms oder WPF).



  • Danke, aber das hilft mir nicht wirklich weiter, denn wenn ich jetzt dieses Array woanders verwenden will, z.B. hier;

    private: System::void button1_Click(system::Object^ sender, System::EventArgs^e){
    Array::Copy(Form1::_array, narray, Form1::_array->Length);
    ...
    }
    

    wird zwar alles fehlerfrei compiliert und gelinkt aber die Runtime wirft dann einen Error raus:
    "Der Objektverweis wurde nicht ... usw."). Es fehlt eine Instanz! Sollte ich das Array in einer eigenen Klasse unterbringen und dann eine entsprechende Instanz erzeugen? Hat jemand dazu eine Idee?
    VG



  • Dann solltest du ersteinmal die Grundlagen der OOP-Programmierung (Stichwort: Objekterzeugung) nachlesen.
    Dafür habe ich ja im obigen Beispiel extra die Methode func() so geschrieben (du hattest ja extra geschrieben, daß du das Array in einer Funktion erzeugen und in einer anderen Methode benutzen möchtest).

    PS: Außerdem solltest du _array (und nicht Form1::_array) benutzen.
    Oder sind die beiden Methoden etwa in unterschiedlichen Klassen?



  • @Th69
    Genauso, wie Du es skizziert hast, hatte ich es ja ursprünglich und funktionierte nicht.
    Genau so:

    public ref class Form1 : public System::Windows::Forms::Form
    {
    ...
    private: array<Byte>^ _array;
    ...
    private: void Form1::func()
    {
    ...
      auto kwrite = gcnew List<Byte>();
      kwrite->AddRange(myData);
      _array = kwrite->ToArray;
    ...
    }
    
    private: System::void button1_Click(system::Object^ sender, System::EventArgs^e){
      array<Byte>^narray = gcnew array<Byte>(){};
      Array::Copy(_array, narray, _array->Length);
    ...
    }
    };
    

    Alles befindet sich in der Klasse 'Form1'. Mir ist halt nicht klar, wie ich das Array _array in einer Instanz unterbringen kann, um es dann in einer Methode zu verwenden.



  • Wird denn die Funktion func auch immer vor button1_Click aufgerufen (z.B. im Konstruktor)? Weil sonst ist das Array selbstverständlich nicht initialisiert.

    Aber warum verwendest du denn nicht direkt myData (anstatt den Inhalt erst in ein anderes Array zu kopieren)?

    Und du solltest func einen sinnvolleren Namen geben (damit jeder versteht, was diese Funktion macht).



  • @Th69
    Das Array, das ich dort übergeben will, darf nicht verändert werden. Es wird in der Methode func() in einem Thread verwendet, um ein TCP-Frame sequentiell zu versenden. Es führt zu weit, wenn ich die ganze Methode hier darstelle. Ich muß also das Array erst kopieren, damit ich es danach in einigen Elementen verändern kann, also einen neuen Frame bauen und mit dem Button->Click versenden.
    VG



  • Wurde Dir nicht schon gesagt daß außer für Glue-Code C++/CLI eine bescheuerte Wahl ist?



  • @Swordfish
    Habs jetzt, wenn auch etwas verbogen.

    public ref class Form1 : public System::Windows::Forms::Form
    {
            array<Byte>^ _array;
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			_array = gcnew array<Byte>(54);
    			//
    		}
    

    Die Anzahl der Elemente in dem Array kann sich ändern.
    Danke für die Hilfe!


Anmelden zum Antworten