mikrocontroller.net

Forum: PC-Programmierung C# Array mit beliebigem Rank an Methode übergeben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier eine Methode, der ich gerne ein Array von Werten des Typs 
Double übergeben möchte.
Prinzipiell sind dabei Ranks von 1 bis 255 möglich und unter Umständen 
auch sinnvoll ;-)
Ist das Array erstmal in der Methode angekommen, könnte ich ja mit Hilfe 
von Arrayname.Rank die Anzahl der Dimensionen bestimmen.
Aber, C# läßt mich immer nur eine in der Parameterliste festgelegte 
Anzahl von Ranks übergeben.
Ich kann die Methode natürlich überladen, was bei der Anzahl an 
Möglichkeiten aber schon ziemlich uncool kommt.
Wie geht es richtig ?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nutze einfach einen Parameter vom Typ System.Array .

Autor: Syntax Error (Gast)
Datum:

Bewertung
-6 lesenswert
nicht lesenswert
fop schrieb:
> Wie geht es richtig ?

Mit einer richtigen Programmiersprache? C# ist was für Spielkinder.

Autor: Egon D. (egon_d)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
fop schrieb:

> Prinzipiell sind dabei Ranks von 1 bis 255
> möglich und unter Umständen auch sinnvoll ;-)

Der Rang einer Matrix ("Rank") ist die (maximale)
Anzahl linear unabhängiger Zeilen bzw. Spalten.

Ist das wirklich gemeint?

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe es jetzt mit System.Array umgesetzt. Nun gut, jetzt erfolgt 
die Prüfung des Typs zur Laufzeit statt zur Compilierzeit, aber es 
funktioniert.

Die Eigenschaft "Rank" eines Array bei C#, wird von Microsoft zwar auch 
mit Rang übersetzt, gibt jedoch vermutlich etwas ganz anderes an, als 
den Rang einer Matrix. Ich habe nur den Anfang der Erklärung von "linear 
unabhängig" gelesen und denke, dass es mir um etwas wesentlich 
Einfacheres geht.

Es geht um die Dimensionen des Array, also wieviele Indizes muss ich 
angeben, um ein Element zu adressieren.

Autor: Keiner N. (nichtgast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wirds wirklich mal Zeit für ein wenig Code um darzustellen, was du 
machen wilst.

Array.Rank gibt dir die Anzahl der Dimensionen zurück, die dein Array 
hat.

also bei

var foo = new Array[3,2]
var bar = new Array[5]

bekommst du für foo.Rank  eine 2 zurück und bei bar eine 1

: Bearbeitet durch User
Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fop schrieb:
> So, ich habe es jetzt mit System.Array umgesetzt. Nun gut, jetzt erfolgt
> die Prüfung des Typs zur Laufzeit statt zur Compilierzeit, aber es
> funktioniert.

Wieso? Es gibt doch den gegnerischen Typen System.Array<T> .

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wieso? Es gibt doch den gegnerischen Typen System.Array<T> .

Klingt erstmal gut. Leider meint der Compiler dazu :

Fehler Typ 'System.Array' ist nicht generisch und kann daher nicht mit 
Typargumenten verwendet werden.

Beitrag #5929407 wurde vom Autor gelöscht.
Autor: Keiner N. (nichtgast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fop schrieb:
>> Wieso? Es gibt doch den gegnerischen Typen System.Array<T> .
>
> Klingt erstmal gut. Leider meint der Compiler dazu :
>
> Fehler Typ 'System.Array' ist nicht generisch und kann daher nicht mit
> Typargumenten verwendet werden.

Die generischen Typen sind in System.Collection.Generic drin. Aber da 
gibts aber kein Array.

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DEN-US%26k%3Dk(System.Collections.Generic);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.7.2);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.8


Wenn man solche Klimmzüge machen muss, sollte man sich immer überlegen, 
ob das Design etwas taugt.

: Bearbeitet durch User
Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
List<T> sollte doch gehen und kannst du genauso wie ein Array  über 
Index zugreifen

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torben schrieb:
> List<T> sollte doch gehen und kannst du genauso wie ein Array  über
> Index zugreifen

Jo, aber nur eindimensionale.

Autor: Yarra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich frage mich gerade wie du die 255 Dimensionen deklarierst und 
initialisierst. Sind die Dimensionen alle gleich groß?

Grüße Yarra

Autor: Alex G. (dragongamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hätte das gleich mit einem Struct gelöst welches das 
individuell dimensionale Array enthält.
Gut möglich dass dies sogar etwas sauberer aussehen würde, da die 
wahrscheinlichkeit hoch ist, dass man die ein oder andere Funktion 
dazuschreiben kann die dieses Array verarbeitet. Eventuell ermöglich 
dies sogar das eher unhandlich anmutende Array sogar komplett von 
anderen Klassen abzukapseln.

Das ist nur dann die schlechtere Lösung wenn es aufs letzte bisschen 
Performance ankommt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.