Laden...

Array in Methode auslagern

Erstellt von Zottel822 vor 3 Jahren Letzter Beitrag vor 3 Jahren 463 Views
Z
Zottel822 Themenstarter:in
5 Beiträge seit 2021
vor 3 Jahren
Array in Methode auslagern

Hallo zusammen,
Ich habe ein Programm geschrieben, indem zweimal auf ein Array zugegriffen wird.
Das Programm besteht insgesamt aus 3 Methoden
In den ersten 2 Methoden wird das Array benötigt.
Die dritte Methode ist das Array selbst.

Meine Frage ist:
Wie ist es möglich das bestehende Array welches in der dritten Methode generiert wird, in den anderen beiden Methoden an einer bestimmten Stelle aufzurufen, sodass es in der ersten und zweiten Methode möglich ist, die Werte des Arrays der dritten Methode zu verarbeiten?

16.834 Beiträge seit 2008
vor 3 Jahren

Die dritte Methode ist das Array selbst.

Eine Methode kann kein Array sein.
Eine Methode ist eine Methode.

Arrays sind Referenzen, sodass Du diese einfach als Parameter übergeben kannst.
[Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)

Ich vermute, dass Du einen klassischen Anfängerfehler hast, dass Du verschiedene Referenzen hast; also mehrere Arrays.
Aber Du zeigst leider kein Code.

Z
Zottel822 Themenstarter:in
5 Beiträge seit 2021
vor 3 Jahren

Dies hier ist mein Code.
Mit dem Programm soll Ein Wort in Zahlen verschlüsselt werden.
Die erste Methode ist für das Verschlüsseln zuständig.
Die zweite Methode ist für das Entschlüsseln zuständig.
Bis hierhin funktioniert das ganze einwandfrei.
In der ersten Methode verschlüsseln habe ich manuell ein Array angelegt welches Buchstaben in Zahlen umwandelt. Dieses soll ersetzt werden.
Die dritte Methode (das Array) bietet dem Nutzer die Möglichkeit ein Schlüsselwort einzugeben welches später in das Array geschrieben wird. Danach werden die restlichen Buchstaben des Alphabets dem Array hinzugefügt. Dieses Array soll dann zum Verschlüsseln und Entschlüsseln verwendet werden.


        //Hier sind meine Variablen für das verschlüsseln
        string v_klartext;
        int v_Wortlaenge;
        int v_max_cut;
        int v_array_laenge = 33;
        string v_verschluesselter_text;
        string v_Buchstaben_cutter;
        string v_Textzahl;

        //Variablen welche zum Entschlüsseln benötigt werden   
        string v_Zahlencutter;
        int v_verschluesselte_zahl;
        string v_entschluesselter_Text;

        //Variablen für das Array
        string v_Schluesselwort;
        int v_Keyword_laenge;
       
        

        //Dies verschlüsselt den Text
        public void Crypt()
        {
            //Eingabe des Users in die Variable v_Klartext schreiben
            v_klartext = txt_Klartext.Text.ToLower();
            //Hier wird festgestellt wieviel Zeichen das Wort hat
            v_Wortlaenge = v_klartext.Length;
            v_max_cut = v_Wortlaenge - 1;



            for (int durchlauf = 0; durchlauf <= v_max_cut; durchlauf++)
            {

                v_Buchstaben_cutter = v_klartext.Substring(durchlauf, 1);
                
               
                verschluesselungs_Array();
                
                ////Dieses Array hat alle Buchstaben und dazugehörige Nummern gespeichert
                String[] uebersetzer_Liste = new string[v_array_laenge];
                uebersetzer_Liste[0] = "l";
                uebersetzer_Liste[1] = "a";
                uebersetzer_Liste[2] = "t";
                uebersetzer_Liste[3] = "e";
                uebersetzer_Liste[4] = "r";
                uebersetzer_Liste[5] = "n";
                uebersetzer_Liste[6] = "b";
                uebersetzer_Liste[7] = "c";
                uebersetzer_Liste[8] = "d";
                uebersetzer_Liste[9] = "f";
                uebersetzer_Liste[10] = "g";
                uebersetzer_Liste[11] = "h";
                uebersetzer_Liste[12] = "i";
                uebersetzer_Liste[13] = "j";
                uebersetzer_Liste[14] = "k";
                uebersetzer_Liste[15] = "m";
                uebersetzer_Liste[16] = "o";
                uebersetzer_Liste[17] = "p";
                uebersetzer_Liste[18] = "q";
                uebersetzer_Liste[19] = "s";
                uebersetzer_Liste[20] = "u";
                uebersetzer_Liste[21] = "v";
                uebersetzer_Liste[22] = "w";
                uebersetzer_Liste[23] = "x";
                uebersetzer_Liste[24] = "y";
                uebersetzer_Liste[25] = "z";
                uebersetzer_Liste[26] = " ";
                uebersetzer_Liste[27] = ".";
                uebersetzer_Liste[28] = "?";
                uebersetzer_Liste[29] = "ä";
                uebersetzer_Liste[30] = "ö";
                uebersetzer_Liste[31] = "ü";
                uebersetzer_Liste[32] = "ß";



                int Zahl = 0;

                for (int i = 0; i < v_array_laenge; i++)
                {
                    if (uebersetzer_Liste[i] == v_Buchstaben_cutter)
                    {

                        // Wenn die Zahl kleiner als 10 ist so wird eine 0 vorgeschrieben
                        Zahl = i;
                        if (i < 10)
                        {
                            v_Textzahl = $"0{i.ToString()}";
                        }
                        else
                        {
                            v_Textzahl = i.ToString();
                        }
                        break;
                    }

                }

                if (durchlauf == 0)
                {
                    v_verschluesselter_text = v_Textzahl;
                }
                else
                {
                    v_verschluesselter_text = string.Concat(v_verschluesselter_text, v_Textzahl);
                }



            }

            //Hier wird der verschlüsselte Text dem Nutzer ausgegeben.
            txt_verschluesselt.Text = v_verschluesselter_text;
        }
        //Dies entschlüsselt den Text
        public void Decrypt()
        {

            //Verschlüsselten Text in die Variable v_verschlüsselter Text schreiben und die Länge Zahlen feststellen
            v_verschluesselter_text = txt_verschluesselt.Text;
            v_Wortlaenge = v_verschluesselter_text.Length;

            //Wenn die Zahlenanzahl ungerade ist ist der verschlüsselte Text nicht vollständig
            if (v_Wortlaenge % 2 != 0)
            {
                MessageBox.Show("Dein verschlüsselter Text ist nicht vollständig!", "Achtung");
                goto exit;
            }


            v_Wortlaenge = v_Wortlaenge / 2;
            int v_cutter = 0;
            for (int durchlauf = 0; durchlauf < v_Wortlaenge; durchlauf++)
            {
                if (v_cutter == 0)
                {
                    v_Zahlencutter = v_verschluesselter_text.Substring(0, 2);
                }
                else
                {
                    v_Zahlencutter = v_verschluesselter_text.Substring(v_cutter, 2);
                }
                v_cutter = v_cutter + 2;

                //Hier wird der entsprechende Buchstabe aus dem Array herausgesucht
                v_verschluesselte_zahl = Convert.ToInt32(v_Zahlencutter);
                String[] uebersetzer_Liste = new string[33] { "l", "a", "t", "e", "r", "n", "b", "c", "d", "f", "g", "h",
                    "i", "j", "k", "m", "o", "p", "q", "s", "u", "v", "w", "x", "y", "z", " ", ".", "?", "ä", "ö", "ü", "ß" };

                v_klartext = uebersetzer_Liste[v_verschluesselte_zahl];
                v_entschluesselter_Text = string.Concat(v_entschluesselter_Text, v_klartext);
            }

            txt_Klartext.Clear();
            txt_Klartext.Text = v_entschluesselter_Text;

        exit:;

        }
        //Hier wird das Array gebaut
        public void verschluesselungs_Array()
        {

            v_Schluesselwort = txt_schluesselwort.Text.ToLower();
            v_Keyword_laenge = v_Schluesselwort.Length;

            string[] Cryptkey = new string[33];
            //Hiermit schreiben wir Buchstaben
            //Cryptkey[0] = "a";
            //Cryptkey[10] = "b";

            string[] abc_Rest = new string[] {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
                                              "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
                                              "u", "v", "w", "x", "y", "z", " ", ".", "?", "ä",
                                              "ö", "ü", "ß" };

            int n = 0;
            for (int i = 0; i < v_Keyword_laenge; i++)
            {
                int v_doppelter_Buchstabe = Array.IndexOf(Cryptkey, v_Schluesselwort.Substring(i, 1));
                if (v_doppelter_Buchstabe < 0)
                {
                    Cryptkey[n] = v_Schluesselwort.Substring(i, 1);
                    n = n + 1;
                }
            }

            for (int i = 0; i < abc_Rest.Length; i++)
            {
                int v_doppelter_Buchstabe = Array.IndexOf(Cryptkey, abc_Rest[i]);
                if (v_doppelter_Buchstabe < 0)
                {
                    Cryptkey[n] = abc_Rest[i];
                    n = n + 1;
                }
            }

          
            MessageBox.Show("Ende", "Achtung");

        }


C
55 Beiträge seit 2020
vor 3 Jahren

Ist das nur zur Übung gedacht oder soll das Irgendwo eingesetzt werden?
Fals letzteres zutrifft lass es bleiben und setze implementiere z.B. RSA oder AES oder etwas vergleichbares, dafür gibt es fertige Libarys.

Zu deinem Code:
Versuche weniger globale Variablen zu nutzen.
Sowohl die Crypt als auch die Decrypt Methode sollten statt void etwas zurück geben und einen Übergabe Parameter haben.

Hier mal ein Beispiel wie so eine Methode aussehen könnte:


public int Calculate(int x, int y)
{
     return x * y;
}

Die Methode erwartet 2 ints und gibt das Ergebnis zurück.

Z
Zottel822 Themenstarter:in
5 Beiträge seit 2021
vor 3 Jahren

Das ist ausschließlich zu Übungszwecken.

T
2.224 Beiträge seit 2008
vor 3 Jahren

Den Code solltest du dringend kapseln.
Der Teil mit dem Ver-/Entschlüsseln gehört in eine eigene Klasse samt der nötigen Variablen dazu.
Auch sehe ich ein goto, was bei sauberen Code überhaupt nicht nötig wäre.

Alleine das auslagern in eine eigene Klasse dürfte deinen UI wieder wieder ungemein lesbar machen.
Mal davon abgesehen, dass du dann deinen Code auch mal UnitTests durchlaufen lassen kannst.
Das würde dir vermutliche eines an Zeit sparen.

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.

16.834 Beiträge seit 2008
vor 3 Jahren

T-Virus, es ist doch eine Übungsaufgabe mit einem anderen Zweck. Da macht ein Tipp mit Architektur doch wenig sinn und geht am Thema vorbei.
Es macht doch kein Sinn für ihn jetzt zig andere Dinge umzusetzen, wennd er eigentliche Zweck und Lerneffekt ein anderer sein soll.
Daher macht der Tipp ja wenig sinn.
Hier ist es ja einfach nur ein Problem mit den Referenzen. Daher lass uns doch bitte auf dem richtigen Level und beim Thema bleiben.

Zum Code:

Wie ClaraSoft schon gesagt hat ist das Problem die Referenzen und löst Du, dass Deine Methoden entweder Referenzen zurück geben oder annehmen; je nachdem.

Und wenn ich so etwas sehe wie

exit:;

bin ich neugierig und muss fragen: von welcher Programmiersprache kommst Du ? 🙂

T
2.224 Beiträge seit 2008
vor 3 Jahren

@Abt
Bei dem goto und den Variablen Namen riche ich sehr viel C
Kann aber auch Pascal oder C++ sein 😮

Nachtrag:
Zu deiner Antwort:
Ich war wohl etwas übers Ziel hinausgeschossen 🙂
Mein Fehler.

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.

Z
Zottel822 Themenstarter:in
5 Beiträge seit 2021
vor 3 Jahren

bin ich neugierig und muss fragen: von welcher Programmiersprache kommst Du ? 🙂

Ich bin absoluter Anfänger und habe auch sonst noch keine/wenig Erfahrung beim Programmieren.


public int Calculate(int x, int y)
{
     return x * y;
}

Das habe ich soweit verstanden. Aber wie kann man das mit einem Array umsetzen?

5.658 Beiträge seit 2006
vor 3 Jahren

Indem du in der Methode ein Array erstellst, dann mit Werten befüllst, und es zurückgibst:


private string[] CreateArray()
{
    string[] cryptKey = new string[33];
    // ....
    return cryptKey;
}

Und dann kannst du es als Parameter an eine andere Methode übergeben:


var cryptKey = CreateArray();
DoSomething(cryptKey);

Hier gibt es ein paar Links für den Einstieg: [FAQ] Wie finde ich den Einstieg in C#?

Weeks of programming can save you hours of planning

Z
Zottel822 Themenstarter:in
5 Beiträge seit 2021
vor 3 Jahren

@MrSparkle : Danke für deine Hilfe damit bin ich ganz gut weitergekommen.

Danke auch allen anderen für die Hilfe und die Links!