Mehrdimensionale Arrays indexgleich kopieren

DeepComputer

Banned
Registriert
Apr. 2020
Beiträge
266
Hallo,

Gibt es eine Funktion wo er ein Array genau so kopiert,
mit den gleichen Indexen, wie im Source Array? Er soll 1,0 -> 1,0 kopieren und nicht 1,0 -> 0,2
Code:
                        if (notfall > 1)
                        {
                            byte[,] tempRr = rr;
                            Array.Copy(rr, tempRr, rr.Length);
                            rr = new byte[2, notfall];
                            Array.Copy(tempRr, rr, tempRr.Length);
                            tempRr = null;
                        }
1650262262527.png
 
Afaik nein, das Speicherlayout des Arrays gibt das auch nicht her (wie du schon selber gesehen hast). Also selber schreiben oder eine andere Datenstruktur nutzen.
 
  • Gefällt mir
Reaktionen: tollertyp
Wozu das Ganze überhaupt?

Bitte mal genauer beschreiben, was die Anforderungen sind.
 
Durchlaufe das gesamte Array mit einer For-Schleife und schreibe Wert für Wert in ein neues Array, das Du vor Beginn der For-Schleife definiert hast mit den Merkmalen des Arrays, das Du kopieren willst.

Bedenke, daß ein mehrdimensionales Array ggf. auch mehrere For-Schleifen benötigt.
 
  • Gefällt mir
Reaktionen: kuddlmuddl
Er will halt das mehrdimensionale Array resizen.

Aber er nutzt Array Copy falsch, weil das kopiert halt quasi ja nur die "erste Dimension" (also betrachtet nur die). Und wenn dann die Größe dessen abweicht, was in der ersten Dimension steht (in diesem Fall also das Array der zweiten Dimension), dann kann nur Müll rauskommen (bzw. wenn man es absichtlich macht dann kann auch das gewünschte Ergebnis rauskommen).

In dem Fall würde eine for-Schleife reichen, wenn man immer Array-Copy der zweiten Dimension machen würde... aber ob das nun sinnvoll ist?

Generell würde auch die Empfehlung machen, eventuell auch einfach über eine sinnvolle Datenstruktur nachdenken, die die gewünschte Flexibilität hat, wenn solche Änderungen häufiger kommen.
 
tollertyp schrieb:
Er will halt das mehrdimensionale Array resizen.
Ja genau. Ich muss da eine blöde Hausaufgabe machen, deshalb mach ich das.
Ich hab's aber eh klassisch gelöst.
Code:
for (int j = 0; j < notfall-1; j++)
{
    RR[0, j] = tempRR[0, j];
    RR[1, j] = tempRR[1, j];
}

Jetzt aber das nächste "Problem".
Wenn ich zB den/das(?) Temp Array nicht extra deklarieren will, kann ich das irgendwie so machen?
Code:
Array.Copy(blutZucker, new short[blutZucker.Length], blutZucker.Length);
blutZucker = new short[notfall];
Array.Copy("new short[blutZucker.Length]", blutZucker, "new short[blutZucker.Length],Length");
Wie kann ich sozusagen auf den/das Zielarray vom ersten Kopiervorgang zugreifen. Komm nicht drauf
wie ich dem einen Namen vergeben kann. Der string ist nur zum verdeutlichen
 
Zuletzt bearbeitet:
Du willst auf das in der ersten der drei Zeilen mittels "new short[blutZucker.Length]" deklarierte Array zugreifen? Das geht nicht. Das Array wird innerhalb von Array.Copy() deklariert und existiert nach jenem Befehl nicht mehr.

Das Array kann man vor Array.Copy() als separaten Befehl deklarieren.
 
Sind die drei Zeilen aus Posting #6 äquivalent zu Folgendem oder vestehe ich das falsch?

C++:
Array.Resize(ref blutzucker, notfall);
 
@dvor: Kann Array.Resize mehrdimensionale Arrays resizen?
Nein, ist für eindimensionale Arrays, zumindest bei der Microsoft-Dokumentation in .NET 6: https://docs.microsoft.com/de-de/dotnet/api/system.array.resize?view=net-6.0

Das Problem, warum die ganzen Array-Methoden scheitern, weil sie alle nur von der ersten Dimension ausgehen. Deren Dimension soll aber gar nicht geändert werden im Übrigen, sondern die Größe der Elemente selbst. Hier liegt nunmal das Problem begraben.
 
Dein Code erstellt eine shallow copy, also flache Kopie.
Was du suchst ist aber eine deep copy, also tiefe Kopie.
Deep copy gibt es als Funktion in Computersprachen oder Bibliotheken nicht fuer alle Einsatzzwecke. Die muss man dafür selbst schreiben.
 
tollertyp schrieb:
@dvor: Kann Array.Resize mehrdimensionale Arrays resizen?

Natürlich nicht aber "new short[blutZucker.Length]" ist ein eindimensionales Array. Deshalb kann es in den drei Zeilen aus Posting #6 nur um ein eindimensionales Array gehen.
 
  • Gefällt mir
Reaktionen: tollertyp
Okay, ja, du hast recht. Der TE schreibt leider etwas verwirrend und das eindimensionale Array kam etwas aus dem Nichts. :-) Und das Temp-Array benötigt er ja beim mehrdimensionalen auch, deshalb fiel mir das nicht so ganz auf.
 
Multidimensionales Array und Reize? :confused_alt:

Yeah, don't. Die schöne Laufzeit!

Okay, diesmal war es wohl eine Hausaufgabe, aber für alle anderen Fälle, wenn man an so eine Stelle kommt:

1. Da gesamte Modell neu überdenken, ob man d > 1 wirklich braucht und wenn ja, dann das d so klein wie möglich halten. (Normalerweise reicht d <= 2 und selbst die 2 ist schon vergleichsweise selten.)

2. Von Arrays weggehen und in Richtung Liste gucken, wenn man seinen Hypercube nicht statisch definieren kann.
 
Du, ich bin auch froh wenn wir endlich Listen machen. Unser Lehrer hat eh gemeint wir machen 2 Wochen Arrays, danach nie wieder.
 
So groß sind die Unterschiede zwischen List und Array nicht.

Die Implementierung von System.Collections.Generic.List<T> in mscorlib.dll speichert die Listenelemente in einem Array und der Setter für List.Capacity verwendet Array.Resize().
Deshalb funktionieren List.ToArray() und this[int index] so einfach.
 
Das angenehmste an Listen ist, dass man eben die Größe nicht deklarieren muss (weils implizit stattfindet). Das ist etwas was mich bei Arrays besonders nervt. Listen sind soviel dynamischer und leichter handzuhaben - purer Luxus.
Die nehmen einem schon ordentlich arbeit ab.
 
Leichter zu handhaben: Ja. Deutlich. Doch die zusätzlichen List-Aufrufe die ihrerseits Array-Methoden aufrufen gehen auf Kosten der Laufzeit.

Edit:
Bei laufzeitkritischen Anwendungen ist List.Add() totaler Mist. Es sei denn man kennt bei der Definition der Liste bereits die Anzahl der benötigten Elemente. Dann kann das "Hintergrundarray" im Kontruktor groß genug angelegt werden.
 
Zuletzt bearbeitet:
Zurück
Oben