Entwickler-Ecke

Basistechnologien - Array als Parameter übergeben


FelixD - Fr 14.01.11 17:33
Titel: Array als Parameter übergeben
Ich habe folgenden Konstrukor gegeben:


C#-Quelltext
1:
2:
3:
4:
5:
public Poly(ModInt[] coef, int deg)
  {
    this.coef=coef;
    this.deg=deg;
    }


Nun möchte ich das Nullpolynom implementieren:


C#-Quelltext
1:
public static Poly Zero = new Poly(-1,{0});                    


Das Problem ist, das der Input Parameter {0} (wie vermutet) zu einem Fehler führt. Nun möchte ich aber nicht umständlich erst ein Array erstellen und damit dann das Nullpolynom erzeugen. Wie löse ich dieses Problem am elegantesten/effizientesten ??

lg


Ralf Jansen - Fr 14.01.11 17:47

Das params [http://msdn.microsoft.com/de-de/library/w5zay9db%28v=VS.100%29.aspx] Schlüsselwort könnte das vereinfachen. Dann kannst du jeden Wert deinen Array einfach so übergeben als wäre es ein weitere Parameter in deiner Methodensignatur.


FelixD - Fr 14.01.11 18:08

Das heißt also ich müsste den Konstruktur umschreiben zu:


C#-Quelltext
1:
2:
3:
4:
5:
public Poly( int deg,params ModInt[] coef)
  {
    this.coef=coef;
    this.deg=deg;
    }


Dann sollte ich wahlweise ein Array als Array oder eben als eine Aufzählung a_1,...,a_n übergeben. Ist das richtig?

Vielen Dank!


Ralf Jansen - Fr 14.01.11 18:11

ja


Th69 - Fr 14.01.11 18:41

Du könntest auch den Parameter "int deg" entfernen und ihn mittels

C#-Quelltext
1:
this.deg = coef.Length - 1;                    

berechnen lassen.

P.S. Dein erster Code konnte doch gar nicht compilieren, da du doch die Parameter in der falschen Reihenfolge übergeben hattest, oder?


Yogu - Fr 14.01.11 23:28

Wie wär's denn mit Überladung?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public Poly(int deg, ModInt[] coef) {
  this.deg = deg;
  this.coef = coef;
}

public Poly() {
  this.deg = 0;
  this.coef = ModInt[];
}

Wahlweise auch mit params.

user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
Nun möchte ich aber nicht umständlich erst ein Array erstellen und damit dann das Nullpolynom erzeugen.

Wenn du die Eigenschaft Zero einmal deklarierst, dann musst du den entsprechenden Aufruf doch nur einmal tätigen. Ist es so schlimm, dann einmal


C#-Quelltext
1:
public static Poly Zero = new Poly(-1new ModInt[] { });                    

zu schreiben? Aber Überladung ist natürlich auch möglich.

Edit: Der erste Code enthält einen Fehler, siehe user profile iconTh69s Post. Danke!


Th69 - Sa 15.01.11 02:49

Wobei die Überladung dann aber so aussehen sollte:

C#-Quelltext
1:
2:
3:
4:
5:
public Poly()
{
  this.deg = 0// bzw. -1
  this.coef = new ModInt[0];
}

um auch den Compiler zufrieden zu stellen ;-)


FelixD - Sa 15.01.11 19:02

Danke für eure Antworten. Was ihr nicht wissen konntet und ich nicht gesehen habe, ist das dieser Code noch aus einem ganz anderen Grund nicht funktionieren kann. 0 ist ein Integer und kein ModInt ...
Es ist mir auch nicht möglich eine 0 und eine 1 für ModInts zu implementieren, da diese immer auch die einen Member p haben, der angibt Modulo welcher Primzahl gerechnet wird.
Aus diesem Grund ist es also gar nicht möglich mein Vorhaben in die Tat umzusetzen :(

@Th69

Im Fall des Nullpolynoms gilt deg=coef.Length - 1 nicht.

@Yogu

Wenn man es so schreibt ist es natürlich schön. Ich dachte nur, dass das nicht funktioniert (warum auch immer).

Danke!

lg


Yogu - Sa 15.01.11 20:59

user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
0 ist ein Integer und kein ModInt ...

Da gibt es eine ganz elegante Abhilfe: Automatische (implizite) und manuelle (explizite) Konvertierung zwischen int und ModInt. In einem anderen Thread hat schon jemand geschrieben, wie das geht:

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Das einzige, was du machen kannst, ist zusätzlich einen expliziten bzw. impliziten Konvertierungsoperator für int nach ModInt anzubieten, s. explicit (C# Referenz) [http://msdn.microsoft.com/de-de/library/xhbhezf4.aspx] sowie implicit (C# Referenz) [http://msdn.microsoft.com/de-de/library/z5z9kes2.aspx].


Kha - So 16.01.11 12:14

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
0 ist ein Integer und kein ModInt ...

Da gibt es eine ganz elegante Abhilfe:[...]
Lies mal einen Satz weiter ;) .


Yogu - So 16.01.11 13:44

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
0 ist ein Integer und kein ModInt ...

Da gibt es eine ganz elegante Abhilfe:[...]
Lies mal einen Satz weiter ;) .

Ich gebe zu, dass ich den Satz nicht ganz verstanden habe. Das heißt also, dass eine Ganzzahl in verschiedene ModInts umgewandelt werden kann? Dann verstehe ich auch, warum keine Konvertierung möglich ist.


Kha - So 16.01.11 18:23

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Das heißt also, dass eine Ganzzahl in verschiedene ModInts umgewandelt werden kann?
Genau, es geht wohl um Polynome über Restklassenkörper.
Aber auf die Ints muss deswegen ja nicht verzichtet werden. Da alle ModInts wohl aus dem gleichen Körper stammen sollten, tut es auch ein Konstruktor Poly(int p, params int[] coef).


FelixD - So 16.01.11 19:54

Zitat:
Genau, es geht wohl um Polynome über Restklassenkörper.
Aber auf die Ints muss deswegen ja nicht verzichtet werden. Da alle ModInts wohl aus dem gleichen Körper stammen sollten, tut es auch ein Konstruktor Poly(int p, params int[] coef).


Das hast du richtig erkannt. Zunächst wollte ich eigentlich eh keine Struktur ModInt implementieren, dachte mir dann aber, dass es auf diese Weise mehr dem Prinzip der objektorientierten Programmierung entspricht und wenn ich es recht bedenke, dann war diese Entscheidung auch ganz gut, da ich mich nicht in den Poly-Methoden mit der Moduloarithmetik herumschlagen muss ...