Autor Beitrag
TOM9973
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 21.06.09 22:10 
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.

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: 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ü

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
TOM9973 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 21.06.09 22:48 
Das Stichwort Verweistyp ist die Antwort. Nach folgender Änderung funktioniert alles perfekt.

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: 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: )

ausblenden 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
ausblenden 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.

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
TOM9973 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 21.06.09 23:45 
Mit CopyTo(), funktioniert wunderbar, danke für den Tip und die Hilfe.
Eine gute Nacht dann noch.