Entwickler-Ecke
C# - Die Sprache - Unerklärliche Wertzuweisungen
TOM9973 - So 21.06.09 22:10
Titel: Unerklärliche Wertzuweisungen
Hallo ich hoffe, das mir jemand bei meinem Problem helfen kann.
Bei folgendem Quelltext, sollte nach dem Ausführen ja eigentlich die Zahl 2 im Label stehen, tut sie aber nicht.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| public Form1() { InitializeComponent();
double[] temp = new double[4]; temp[0] = 2; temp[1] = -5; temp[2] = 2; temp[3] = 1; double[] c = Methode(temp); this.label1.Text = temp[0].ToString(); } public double[] Methode(double[] m) { double s = 1; double[] p = m; double[] e = new double[3]; for (int i = 3; i > 0; i--) { e[i - 1] = p[i]; p[i - 1] += s * e[i - 1]; } return e; } |
Im Label erscheint eine 0, das Ergebnis der Funktion "Methode(double[])" wird aus irgendwelchen Gründen in das Feld temp geschrieben, ich weis nicht warum und auch nicht wie ich das verhindern kann. Eigentlich geht das doch garnicht was da passiert?
Ich hoffe, das Jemanden dieses Problem bekannt vorkommt und es doch eine einfache Lösung gibt.
MfG
Moderiert von
Christian S.: C#-Tags hinzugefügt
gfoidl - So 21.06.09 22:29
Hallo,
ich weiß zwar nicht was der Algorithmus bewirken soll aber das Verhalten ist meiner Meinung nach korrekt.
Warum?
double[] ist ein Verweistyp.
In der Methode verweist "p" via Übergabeparameter auf "temp".
"p" wird in der Schleife geändert so dass "p[0] = 0" drin steht.
Deshalb steht auch in "temp[0] = 0" drin.
Das Ergebnis der Methode wird gar nicht verwendet?! (wie gesagt ich weiß nicht was der Algo. tut.)
mfG Gü
TOM9973 - So 21.06.09 22:42
Das Ergebnis soll im weitern Kontext verwendet werden, ich habe das Programm so weit runtergeschrumpft, daß nur noch das Proplem erhalten bleibt ohne den Text ringsrum.
Die double-Felder beinhalten die Koeffizienten von Polynomen und die Schleife führt eine Polynomdivision mit (x-1) aus.
Das mein Ursprüngliches Polynom, was in temp steht, dabei vernichtet wird ist natürlich fatal da es für weiter Rechnungen benötigt wird.
TOM9973 - So 21.06.09 22:48
Das Stichwort Verweistyp ist die Antwort. Nach folgender Änderung funktioniert alles perfekt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public Form1() { InitializeComponent(); double[] temp = new double[4]; temp[0] = 2; temp[1] = -5; temp[2] = 2; temp[3] = 1; double[] c = Methode(temp); this.label1.Text = temp[0].ToString(); } public double[] Methode(double[] m) { double s = 1; double[] p = new double[m.Length]; for (int i = 0; i < m.Length; i++) { p[i] = m[i]; } double[] e = new double[3]; for (int i = 3; i > 0; i--) { e[i - 1] = p[i]; p[i - 1] += s * e[i - 1]; } return e; } |
Ich muß halt den Umweg über die einzelnen skalaren Werte machen, weil dort eine wirkliche Wertzuweisung geschieht und nicht nur ein Verweis.
Danke für die schnelle und vorallem hilfreiche Antwort.
Moderiert von
Christian S.: C#-Tags hinzugefügt
gfoidl - So 21.06.09 23:26
Aha - Horner-Schema :idea: (war schon ein wenig verstaubt oder durch die Zahl der Algorithmen in meinem Kopf an hintere Stelle verdrängt :wink: )
C#-Quelltext
1: 2: 3: 4: 5:
| double[] p = new double[m.Length]; for (int i = 0; i < m.Length; i++) { p[i] = m[i]; } |
kann durch
C#-Quelltext
1: 2:
| double[] p = new double[m.Length]; m.CopyTo(p, 0); |
vereinfacht werden.
mfG Gü
PS: CopyTo wird auf Speicherebene ausgeführt und ist dadurch vor allem bei großen Vektoren effizienter. Bei kleinen könnte der Overhead die Effizienzsteigerung durch das Kopieren im Speicher wettmachen.
TOM9973 - So 21.06.09 23:45
Mit CopyTo(), funktioniert wunderbar, danke für den Tip und die Hilfe.
Eine gute Nacht dann noch.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!