Przepisanie tablicy między klasami

0

Witam wszystkich serdecznie. Jestem początkujący więc proszę o wyrozumiałość.

Moja aplikacja posiada kilka klas. Tak jak w temacie chcę przepisać tablice z klasy 1 do tablicy w klasie 2

Z grubsza aplikacja wygląda tak

Form 1
{
                Klasy.Selekcja selekcja = new Klasy.Selekcja();
                Klasy.Krzyzowanie krzyzowanie = new Klasy.Krzyzowanie();

                krzyzowanie.Zmienne(rozmiar_populacji);
                krzyzowanie.UtworzTablice();
                selekcja.PrzepiszTabliceDoKrzyzowania();
}


Class1
{
Klasy.Krzyzowanie krzyzowanie = new Krzyzowanie();

public void PrzepiszTabliceDoKrzyzowania()
        {
            for (x = 0; x < rozmiar_populacji; x++)
            {
                krzyzowanie.DodajDoReal(x, tablica_real[x]);
            }
        }
}


Class2
{
   public double[] tablica_real1;

        int rozmiar_populacji;

        // ----------------------------------------------------->>


        public Krzyzowanie()
        {
        }

        public void Zmienne(int rozmiar_populacji)
        {
            this.rozmiar_populacji = rozmiar_populacji;
        }

        public void UtworzTablice()
        {
            tablica_real1 = new double[rozmiar_populacji];
        }

        public void DodajDoReal(int index, double wartosc)
        {
            tablica_real1[index] = wartosc;
        }
}

Schemat jaki jest powyżej taki musi być, ze względu na finalny kształt i działanie programu. Nie chcę tworzyć kolejnej klasy która by tylko przechowywała tablice, gdyż moim zdaniem mija się to kompletnie z celem.
Oczywiscie w Class2 tablica jest w pełni tworzona o odpowiedniej wielkości (rozmiar identyczny jak tablicy w Class1). Obie tablice są typu double.
W Class2 zmienna 'wartosc' przyjmuje przekazana wartość, natomiast już " tablica_real1" wyrzuca mi null i otrzymuje komunikat "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu." Posiadam Visual Studio w języku angielskim i nie rozumiem czemu wyrzuca komunikat w języku polskim, ale to już mniejsza o to.
Kombinowałem na różne sposoby i efekt końcowy problemu był ten sam. Będę serdecznie wdzięczny za pomoc w rozwiązaniu mojego problemu.
Jeśli jest taka konieczność, to mogę ew. wrzucić całą aplikację.

Pozdrawiam
tMDshenk

0

Sprawa jest bardzo prosta. Chodzi o to że w Class1 w metodzie PrzepiszTabliceDoKrzyzowania() operujesz na nowej instancji obiektu krzyzowanie ktorą tworzysz w klasie. Niestety w konstruktorze klasy krzyzowanie nie inicjujesz tablicy real. Stąd ten błąd. poza tym jeżeli chcesz żeby to zadziałało tak jak masz to napisane w klasie Form1 to musisz do metody PrzepiszTabliceDoKrzyzowania() przekazać referencje obiektu Krzyzowanie i na nim pracować.

Swoją drogą można to rozwiązać dużo prościej niż przepisywanie tablicy za pomocą metody :)

0

Ok to już wiem co robiłem źle.
Będę wdzięczny za fakt podzielenia się wiedzą, jak to można zrobić prościej. Zależy mi na zdobywaniu rzetelnej wiedzy jak również na optymalizacji kodu.

Pozdrawiam
tMDshenk

0

O to przykładowy kod na szybko napisany.

   class Program
    {
        private static int count = 5;

        static void Main(string[] args)
        {
            Selekcja selekcja = new Selekcja(count);
            Krzyzowanie krzyzowanie = new Krzyzowanie(count);
            Array.Copy(selekcja.tablica, krzyzowanie.tablica, count);

            #region TEST
            for (int i = 0; i < selekcja.tablica.Length; i++)
                selekcja.tablica[i] = i;
            for (int i = 0; i < krzyzowanie.tablica.Length; i++)
                krzyzowanie.tablica[i] = 2 * i + 1;

            
            Console.WriteLine("-----------------SELEKCJA----------------");
            for (int i = 0; i < selekcja.tablica.Length; i++)
                Console.WriteLine(selekcja.tablica[i] + "");
            Console.WriteLine("-----------------KRZYZOWANIE----------------");
            for (int i = 0; i < krzyzowanie.tablica.Length; i++)
                Console.WriteLine(krzyzowanie.tablica[i] + "");

            Console.ReadKey();
            #endregion
        }
    }

    class Krzyzowanie
    {
        public int[] tablica { get; set; }

        public Krzyzowanie(int count)
        {
            tablica = new int[count];
        }
    }

    class Selekcja
    {
        public int[] tablica { get; set; }

        public Selekcja(int count)
        {
            tablica = new int[count];
        }
    }

To co jest w regionie TEST to jest test żeby ci pokazać że rzeczywiście tablica została skopiowana. Więc można zmieniać niezależnie tablice.
W razie problemów pisz :)

0

Fakt można to zrobić właściwościami. Aczkolwiek względem mojego projektu myślę, że to mogłoby być trudne.
Appka posiada klasy do bindowania wartości w DataGridView w głównej formatce. Do tego zrobiona jest klasa z dwoma metodami ogólnymi. Dodatkowo jest klasa Konwertowanie która przerabia liczby real->int, int-> bin itp., itd. Po wszystkich przekształceniach jedna z tablic jest potrzebna w klasie Selekcja. W ów klasie wykonywane są kolejne metody. Jest ich kilka/kilkanaście oraz 8 tablic (choć to przerobię na jedną tablice [x,8], bo wszystkie są tego samego typu). I dalej jedna z tablic z klasy Selekcja jest potrzebna w klasie Krzyzowanie i dalej będą wykonywane inne metody). Myślę, że można było pójść ciut prościej i zrobić jedną klasę która przechowywała by tylko tablice z różnych działów programu, oraz klasę z samymi metodami, ale chcąc analizować jedną sekcję np Selekcja byłoby to mało czytelne. Dlatego moim zamysłem (który chcę zachować do końca) jest oddzielenie każdej sekcji w oddzielnej klasie.

Jeśli ktoś posiada ciekawe pomysły na znaczne uproszczenie aplikacji z chęcią przyjmę każdą sugestię. Dla ułatwienia (być może komuś to uprości obraz), aplikacja wykonuje działania klasycznego algorytmu genetycznego.

0
tMDshenk napisał(a):

Posiadam Visual Studio w języku angielskim i nie rozumiem czemu wyrzuca komunikat w języku polskim, ale to już mniejsza o to.

Skoro już o tym wspomniałeś... Za komunikaty odpowiada nie Visual Studio, lecz .NET Framework. Skoro masz je po polsku, to znaczy, że zainstalowałeś (zapewne jako aktualizację z Windows Update) coś o nazwie mniej więcej takiej: "Polski dodatek językowy dla .NET Framework". Odinstaluj go i ciesz się errorami w zrozumiałym języku. ;)

0

Cześć, tak trochę z innej beczki ale w temacie.
Twój program wygląda mi na algorytm ewolucyjny i z tego co pamiętam to krzyżowanie odbywa się na wektorach int, a jedynie ocena poszczególnych wektorów (osobników) jest na double.
Jeżeli to nie ten algorytm chodzi to przepraszam za zamieszanie.
Pozdrawiam

0

Tak, są to algorytmy ewolucyjne. Z wytycznych które dostałem od wykładowcy, krzyżowanie odbywa się dla pary wartości binarnych, dla której losowany jest punkt krzyżowania w którym dokonuje się krzyżowania. Możliwe, że powinno to fachowo wyglądać inaczej, lecz wszystko jest robione pod wytyczne wykładowcy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1