Laden...

Net, C# Programmierung, Arrays

Erstellt von ShadownightProgramming vor 4 Jahren Letzter Beitrag vor 4 Jahren 3.254 Views
S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren
Net, C# Programmierung, Arrays

Sehr geehrte Mitglieder,

Ich wende mich an dieses Forum, da ich nirgends, 2 Tage erfolglose Websuche, eine passende Lösung zu meinem Problem gefunden habe. Ich schreibe an einem, zugegeben, etwas komplexerem Programm in C# unter Bezug des Nu-Get-Paketes TAlex.MathCore.LinearAlgebra.CMatrix, wobei ich eine Komplexe matrix erstelle, um die Farbenlehre der Quantentheorie zu überprüfen, was einem Teil meines Privatprojektes zur Erforschung der manyWOrlds-Theorie (bei jedem Quantensprung entsteht eine neue Parallelwelt) darstellt. Ich komme bei folgendem Punkt nicht weiter:


{     
   class GFG     
      {          
         // rowa and cola are no of rows           
         // and columns of matrix A          
         // rowb and colb are no of rows          
         //  and columns of matrix B          
         static int cola = 3, rowa = 3;         
         static int colb = 3, rowb = 3;          
         // Function to computes the Kronecker           
         // Product of two matrices          
         static TAlex.MathCore.LinearAlgebra.CMatrix  Kroneckerproduct(TAlex.MathCore.LinearAlgebra.CMatrix[,] A, TAlex.MathCore.LinearAlgebra.CMatrix[,] B)         
            {              
               TAlex.MathCore.LinearAlgebra.CMatrix C;                               
               // i loops till rowa              
               for (int i = 0; i < rowa; i++)             
                  {                  
                      // k loops till rowb                  
                      for (int k = 0; k < rowb; k++)                 
                         {                      
                             // j loops till cola                      
                             for (int j = 0; j < cola; j++)                     
                                {                          
                                    // l loops till colb                          
                                    for (int l = 0; l < colb; l++)                         
                                      {                             
                                           C = new TAlex.MathCore.LinearAlgebra.CMatrix(new double[i + l + 1, j + k + 1] =                                                                   
                                                                                                                        A[i, j] * B[k, l]);                              
                                           //Das stand normalerweise drin                             
                                           // Each element of matrix A is                             
                                           // multiplied by whole Matrix B                              
                                           // resp and stored as Matrix C                              
                                           //C[i + l + 1, j + k + 1] = A[i, j] *                            
                                           //                          B[k, l];                             
                                           //Console.Write(C[i + l + 1,                             
                                           //               j + k + 1] + " ");                              
                                           //}                             
                 //                    }                             
                //                    //Console.WriteLine();                             
               //                }                             
              //            }                             
             //        }                             
            //    }                             
//}                         
                                  }                     
                             }                 
                        }             
                    }             return C = new TAlex.MathCore.LinearAlgebra.CMatrix(new double [3,3]);                   }     
            } 
}

Meine Frage lautet nun: bei der Zeile:

C = new TAlex.MathCore.LinearAlgebra.CMatrix(new double[i + l + 1, j + k + 1] =
A[i, j] * B[k, l]);
innerhalb der vielen for-Schleifen spuckt er folgenden Code und Fehler-Meldung aus:

Fehlermeldung:
"Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS0131 Die linke Seite einer Zuweisung muss eine Variable, eine Eigenschaft oder ein Indexer sein. ManyWorldsTheory M:\Dokumente\Visual Studio 2019\Projects\ManyWorldsTheory\ManyWorldsTheory\GFG.cs 42 Aktiv
"

Die Quellen der Berechnungen sind folgende:
Kronecker Product of two matrices
und
Farbladung von Quanten - Wikipedia

Dort wo der Kommentar in der angehängten Datei ist soll die Ausgabe sein. 😃

Bitte um Lösungsvorschläge (KEINE Lösungen, sonst wird das Thema gelöscht!) 😃

C# best ...

16.806 Beiträge seit 2008
vor 4 Jahren

Was ist Deine Frage? Selbst der Thementitel oder die Kommentare im Quellcode enthalten keine.
Siehe auch [Hinweis] Wie poste ich richtig?

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Habe es ausgebessert und die Quellen hinzugefügt 😃 für ein Gesamtverständis und denFehlercode angegeben / die Meldung kopiert und eingefügt. 😃

C# best ...

T
2.219 Beiträge seit 2008
vor 4 Jahren

Direkte Suche bei Google mit dem Fehlercode CS0131 liefert direkt den Treffer in der Doku.

Doku

Welche Zeile genau verursacht diesen Fehler?
Dieser Part wäre entscheident und müsste angepasst werden.
Ich vermute aber mal, die Zeile mit dem new double.
Du legst dort ein Array an, gibst aber die Indexe für Zugriffe als Dimensionen an und willst dann noch einen Wert zuweisen.
So funktionieren Arrays nicht.
Diese musst du erst mit der passenden Größe dimensionieren und erst dann kannst du Werte zuweisen.
Wenn du aber hier schon die Werte in ein Double Array packen kannst, warum dann ein neues Array erzeugen und nicht direkt die Werte mitgeben?

Ansonsten solltest du deinen Code anpassen.
Du berechnest viel zu häufig die immer gleichen Werte für deine Index Zugriffe bei deinen Arrays.
Das sind unnötige mehrfach Berechnungen für die CPU, hier die Ergebnise einmal in Variablen vorberechnen und dann die Variablen verwenden.

Ansonsten sieht ein Teil deines Codes unsinnig aus.
Das return macht so keinen Sinn.
Du kannst dir die Zuweisung von C= sparen, da mit return new ... das neue Objekt direkt geliefert wird.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Diese Zeile wird markiert!

C = new TAlex.MathCore.LinearAlgebra.CMatrix(new double[i + l + 1, j + k + 1] =
                                           A[i, j] * B[k, l]);

C# best ...

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Genau das ist meinem Verständinis nach und wenn man sich die Quelle No. 2 anschaut, auch der Sinn und Zweck der Funktion oder verstehe ich da was falsch?
Mfg 😃

C# best ...

16.806 Beiträge seit 2008
vor 4 Jahren

Syntaxfehler des Compiler sind prinzipiell alle sehr gut dokumentiert. [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Was falsch ist, ist offenbar die Zuweisung innerhalb von CMatrix.
Schreib die in ne extra Zeile und verwende dann entsprechend die Referenz.

PS: bitte unterlass die Full Quotes.
Will nicht dauernd Deine Beitrage editieren müssen.
[Hinweis] Wie poste ich richtig?

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

wird gemacht Entschuldige ist mein erster Tag hier ...

C# best ...

16.806 Beiträge seit 2008
vor 4 Jahren

War nur ein Hinweis und eine Bitte 😉

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Wenn ich das return C weglasse, kommt > Fehlermeldung:

CS0161: Nicht alle Codepfade geben einen Wert zurück!

Das geht also nicht.

C# best ...

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Es kommt der Fehler : Die linke Seite einer Zuweisung muss eine Variable, eine Eigenschaft oder ein Indexer sein. ManyWorldsTheory M:...\Projects\ManyWorldsTheory\ManyWorldsTheory\GFG.cs 42 Aktiv
wenn ich die entsprechendeZeile so abändere:

C = new TAlex.MathCore.LinearAlgebra.CMatrix(new TAlex.MathCore.LinearAlgebra.CMatrix(new double[i + l + 1, j + k + 1] = 
                                
                                A[i, j] * B[k, l]));

Also ist wieder die verdächtige Zeile mit dem new double verantwortlich ... Wie bekommt man aus der Matrix den "Gesamt-Kronecker-Wert" heraus?

C# best ...

4.930 Beiträge seit 2008
vor 4 Jahren

Du solltest erst die Grundlagen von C# lernen, bevor du dich an spezifische Algorithmen machst, z.B. mittels des OpenBooks Visual C# (auch hier im Forum links unter "Ressourcen" verlinkt).
Für dich also hier besonders das Kapitel 2.5 Datenfelder (Arrays) ff.

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Ich kann C# nur eben verstehe ich nicht wieso er nicht die Indizies nimmt die man ihm gibt ...

C# best ...

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

hier die mittlerweile umgeschrieben Variante dass ich zuerst das Array initialisiere und danach die Werte zuweise:

 
// l loops till colb 
                        for (int l = 0; l < colb; l++)
                        {
                            double[,] matr;
                            matr = new double[i + l + 1, j + k + 1] = A[i, j] *
                                                      B[k, l];
                            C = new TAlex.MathCore.LinearAlgebra.CMatrix(matr);

                            return C;
                        };

Jetzt stört nur noch die

 matr = new double[i + l + 1, j + k + 1] = A[i, j] *
                                                      B[k, l];

Zeile mit dem Error Code:
CS0131 Die linke Seite einer Zuweisung muss eine Variable, eine Eigenschaft oder ein Indexer sein.

C# best ...

16.806 Beiträge seit 2008
vor 4 Jahren

Naja, offenbar - jedenfalls sieht es nach Deinen Posts einfach auch für uns so aus - verstehst Du eben doch nicht "wie C# funktioniert", wenn Du selbst mit dem Error Code nichts anfangen kannst.
Daher entsprechend die Hinweise; muss ja nicht so sein - aber es wirkt halt so für uns "auf der anderen Seite".

        public Test()
        {
            // Geht
            double[,] array = new double[1,2];
            Do(array);

            // Geht nicht
            Do(double[,] array = new double[1, 2]);
        }

Und auch in Deinem jetzt geposteten Code ist exakt der gleiche Fehler.

5.657 Beiträge seit 2006
vor 4 Jahren

Du hast dort zwei Zuweisungen mit =, deshalb funktioniert es nicht. Probiere mal:

matr = A[i, j] * B[k, l];

Weeks of programming can save you hours of planning

4.930 Beiträge seit 2008
vor 4 Jahren

Ich kann C# ...

Sehe ich...

... nur eben verstehe ich nicht wieso er nicht die Indizies nimmt die man ihm gibt ...

Und genau das ist in meinem Link erklärt, wie man ein Array initialisiert und auf einzelne Datenfelder zugreift (sogar für mehrdimensionale Arrays)...

Aber als Hinweis: du mußt das Array natürlich vor deinen Schleifen deklarieren und initialisieren.
Und die return-Anweisung muß natürlich dann am Schluß der Methode (nach den Schleifen) stehen (daher auch "CS0161: Nicht alle Codepfade geben einen Wert zurück!").
Aber das sind Grundlagen in jeder imperativen Programmiersprache...

S
ShadownightProgramming Themenstarter:in
13 Beiträge seit 2020
vor 4 Jahren

Dankesehr für eure Hilfen 😃 Ich hab nicht richtig mitgedacht 😕 ... DANKI nochmal an alle die sich die Mühe gemacht haben 😃. Wollt Ihr das Endprodukt sehen und Vorschläge zur Laufzeitverbesserung geben? Da meine Berechnungen seehr lange dauern aber im Moment ist das die "schnellste" Lösung für das Testen nach Leben aller möglichen "Universen / Welten". Sehr viele If-Schleifen. Ich würde es in einem anderen Thread posten 😃 "Review" zum Beispliel 😃

C# best ...