Array - Anzahl der Elemente



  • Hallo,
    mal angenommen ich lege ein Array an:

    array<objekte ^> ^obj = gcnew array<objekte ^>(20);
    obj[0] = gcnew objekte(10, 20);
    obj[1] = gcnew objekte(30, 40);
    

    kann ich während des Programmablaufes die Anzahl der Array-Elemente
    ändern (also vergrössern / verkleinern), so dass das Array z.B. aus 19 oder
    21 Elementen besteht ?

    Wichtig ist, dass der Inhalt des Arrays nicht verloren geht. Nur wenn das Array um z.B. 1 verkleinert wird, dann darf das letzte Element verloren gehen. Alle anderen Elemente sollten erhalten bleiben.

    Ist so etwas möglich ?

    Danke,
    mfg arena_blau

    -----------



  • Du solltest Dir den System::Collections und System::Collections::Generic Namespace ansehen. Besonders List<T> dürfte interessant sein.
    Simon



  • Hallo,
    ich schau mir gerade dir List(T)-Klasse an bei MSDN. Soweit verstehe ich das ganze auch, nur mit diesen 2 Codezeilen habe ich Probleme:

    dinosaurs->TrimExcess();
    Console::WriteLine("Capacity: {0}", dinosaurs->Capacity);
    

    Könnt ihr mir erklären was genau diese 2 Zeilen machen ?

    Danke,
    mfg arena_blau

    -------------------



  • TrimExcess sets the capacity to the actual number of elements in the List<(Of <(T>)>), if that number is less than a threshold value.

    Will heissen:
    Die Reserve an Elementen die ev. noch vorhanden war wird mit TrimExcess zurückgesetzt.

    Vorallem zu Begin sollte dich das überhaupt nicht kümmern.

    Nimm die Elemente mit Add(..) dazu und entferne sie wider mit Remove(..) und RemoveAt(..).

    Simon



  • # Nimm die Elemente mit Add(..) dazu und entferne sie wider mit Remove(..) und
    # RemoveAt(..).
    Ja, so werd ich das vermutlich auch machen.

    # Die Reserve an Elementen die ev. noch vorhanden war wird mit TrimExcess
    # zurückgesetzt.
    Was genau meinst du mit Reserve an Elementen ?
    Was Capacity bedeutet hab ich auch noch nicht wirklich verstanden.

    Auch wenn ich TrimExcess und Capacity evtl. gar nicht brauchen werde, so interessiert es mich doch was es damit auf sich hat.

    Ich hoffe ihr könnt mir das erklären.

    Vielen Dank,
    mfg arena_blau

    -------------------



  • Die Liste (List<T>) ist intern so aufgebaut, dass sie ein Array von Elementen hat. Wenn Du ein Element hinzufügst, muss das interne Array vergrössert werden und beim entfernen umgekehrt.

    Nun wäre das sehr ineffizient, wenn jedesmal beim einfügen das interne Array vergrössert werden müsste. Desshalb ist das interene Array zunächst grösser als wirklich benötigt. Sagen wir Du hast 5 Elemente mit Add(..) reingelegt, das interne Array hat aber tatsächlich Platz für 8 Elemente, dann muss die nächsten drei Elemente die Du hinzufügst das interne Array nicht neu erstellt werden.

    List<T>::Count gibt die Anzahl Elemente an, die wirklich in der Liste sind.
    List<T>::Capacity gibt die Anzahl Elemente an, die in der Liste Platz habe ohne das interne Array zu vergrösseren.

    Im vorherigen Bsp. wäre Count == 5 und Capacity == 8.

    Simon

    PS: Listen müssen nicht unbedingt so aufgebaut sein, aber die List<T> ist das.



  • Hallo,
    ich arbeite gerade an einem CAD-Zeichenprogramm. Mit diesem Programm soll es später möglich sein Linien zu zeichnen. Jetzt überlege ich mir gerade wie ich diese Linien am besten in meinem Programm verwalten kann.

    Zu jeder Linie sollen folgende Daten abgespeichert werden:
    - Koordinatenpunkt 1 (X/Y)
    - Koordinatenpunkt 2 (X/Y)
    - Linienfarbe

    Immer wenn mit dem Programm eine Linie gezeichnet wird, dann soll diese Linie abgespeichert werden (in einer Liste). Gibt es da eine Listenklasse mit der ich eine solche Linienverwaltung realisieren könnte ?

    Wie würdet ihr die Linien abspeichern ?

    Danke,
    mfg arena_blau

    ---------------------------------------



  • Da könntest Du die List<T> nehemen.
    In die Liste Punkt (Point Klasse). Dann ist eine Liste eine Linie, die aus mehreren Punkten besteht.

    Um mehrere Linien zu speichern, kannst Du einfach eine Liste der Linien machen.

    Simon



  • # Da könntest Du die List<T> nehemen.
    # In die Liste Punkt (Point Klasse). Dann ist eine Liste eine Linie, die aus
    # mehreren Punkten besteht.

    Kann ich mit der List<T> auf eine Liste von Klasseninstanzen anlegen ?
    Ich habe es so versucht:

    List<objekte^> ^linie = gcnew List<objekte^>();
    

    Doch das hat leider nicht funktioniert. Hab ich da was falsch gemacht ?
    Auf diese weise könnte ich die einzelnen Liniendaten in der Klasse objekte speichern. So könnte ich z.B. zu jeder Linie auch noch einen Text, ... speichern.

    Könnt ihr mir da weiterhelfen ?

    Danke,
    mfg arena_blau

    ----------



  • Kleine Korrektur:
    die Zeile:

    List<objekte^> ^linie = gcnew List<objekte^>();

    funktioniert schon. Ich kann nur keine neuen Objekte hinzufügen. So
    habe ich es versucht, aber irgendwas hab ich falsch gemacht:

    linie->Add("eins");

    Danke,
    mfg arena_blau

    ---------



  • 1. Was ist objekte?
    2. objekte ist ziemlich sicher nicht kompatibel zu "ein String Literal".

    Simon



  • Hallo,
    in meinem Programm soll der User Linien zeichnen können. Diese Linien würde ich gerne in einer Liste speichern. Doch wie mache ich das am besten ?

    Zu jeder Linie sollen die zwei Koordinaten gespeichert werden, evtl. möchte ich zu jeder Linie auch noch einen Text oder Farbwerte, ... speichern.

    Gibt es da eine Liste mit der ich ganz einfach ein neues Listenobjekt anlegen kann (z.B. mit Add) ? Dieses neu hinzugefügte Listenobjekt soll dann aus mehreren Speicherbereichen bestehen (z.B. aus 4 double-variablen und einer String-Variable).

    Gibt es eine Liste mit der so etwas möglich ist ?

    Ich hoffe ihr versteht was ich meine.

    Danke,
    mfg arena_blau

    --------------------------------------



  • Ein kleiner Anfang.
    (Beachte, dass eine Referenz auf das Assembly System.Drawing.dll benötigt wird.)

    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Drawing;
    using namespace System::Collections::Generic;
    
    value struct Linie
    {
    	Linie(Point startPunkt, Point endPunkt, Color farbe, String^ kommentar)
    		: _startPunkt(startPunkt)
    		, _endPunkt(endPunkt)
    		, _farbe(farbe)
    		, _kommentar(kommentar)
    	{}
    
    	Point	_startPunkt;
    	Point	_endPunkt;
    	Color	_farbe;
    	String^	_kommentar;
    };
    
    int main(array<System::String ^> ^args)
    {
    	List<Linie>^ linien = gcnew List<Linie>();
    
    	Linie linie(Point(0, 0), Point(5, 10), Color::Black, L"Das ist eine Linie");
    	linien->Add(linie);
    
        return 0;
    }
    


  • arena_blau schrieb:

    Kleine Korrektur:
    die Zeile:

    List<objekte^> ^linie = gcnew List<objekte^>();

    funktioniert schon. Ich kann nur keine neuen Objekte hinzufügen. So
    habe ich es versucht, aber irgendwas hab ich falsch gemacht:

    linie->Add("eins");

    Danke,
    mfg arena_blau

    ---------

    wie wärs mit vectoren anstatt array..? oder versteh ich wat falsch.. (hab seit 1 Jahr nimmer programmiert, bin grad wieder dabei warm zu werden also net fluchen ) ..
    edit ups darunter net gelesen 😉



  • Hallo,
    also der Code von theta ist vermutlich genau das was ich gesucht habe. Gibt es auch eine Möglichkeit diese Liste global gültig zu machen:

    List<Linie>^ linien = gcnew List<Linie>();

    Ich habe versucht die Liste in eine Klasse zu packen und static zu machen, doch das hat leider nicht funktioniert.

    Und noch eine Frage habe ich. Was bedeutet das Wort value ?

    Danke,
    mfg arena_blau

    -----------



  • Was bedeutet das Wort value ?

    http://dict.leo.org/

    Suche doch mal selbst z.B. bei MSDN.



  • Hallo,
    dass das englische Wort value "Wert" bedeuted, das weiss ich. Ich meinte mehr welchen zusammenhang es mit C++ hat ?

    Nochmal zur Liste. Kann ich diese irgendwie global gültig machen ? Bei Variablen funktioniert es ja auch ganz einfach, nur bei der Liste funktioniert es irgendwie nicht.

    mfg arena_blau

    ------------



  • dass das englische Wort value "Wert" bedeuted, das weiss ich. Ich meinte mehr welchen zusammenhang es mit C++ hat ?

    Meine Antwort ist auch mehr als Anregung gedacht.. besonders der 2. Teil mit dem MSDN Hinweis...

    Nochmal zur Liste. Kann ich diese irgendwie global gültig machen ? Bei Variablen funktioniert es ja auch ganz einfach, nur bei der Liste funktioniert es irgendwie nicht.

    Zeige doch mal konkret, wie Du die Liste einsetzen willst (oder wie Du es bis jetzt probiert hast).
    Die Liste als globale Variable zu machen scheint mir keine optimale Lösung.
    Dort wo Du die List brauchst, kannst Du sie ja übergeben als Methoden Parameter.
    Oder die Liste ist in einem "Mutter" Objekt welches Methoden enthält, die die Liste benutzen.

    Simon


Anmelden zum Antworten