Object reference not set to an instance of an object.

0

public class Macierz
{
    public float[,] tab;
    public int w;
    public int k;

    public Macierz(int wiersz, int kolumna)
    {
        w = wiersz;
        k = kolumna;
        float[,] tab = new float[w, k];
    }

    public void losuj(ref float[,] tab)
    {
        Random liczba = new Random();

        for (int i = 0; i < w; i++)
        {
            for (int j = 0; j < k; j++)
            {
                tab[i, j] = liczba.Next(1, 10); //BŁAD Object reference not set to an instance of an object.
            }

        }
    }

    public void wyswietl( float[,] tab)
    {
        for (int i = 0; i < w; i++)
        {
            for (int j = 0; j < k; j++)
            {
                Console.Write(" {0}", tab[i, j]);  //BŁAD Object reference not set to an instance of an object.
            }
            Console.WriteLine();
        }
    }
}

namespace zad5csharp
{
    class Program
    {

        static void Main(string[] args)
        {

           string wiersz = System.Console.ReadLine();
           string kolumna = System.Console.ReadLine();
           int b = int.Parse(wiersz);
           int c = int.Parse(kolumna);

           Macierz trn = new Macierz(b,c);
           trn.losuj(ref trn.tab);
           trn.wyswietl(trn.tab);
}
}
}

Z powyższego wynika chyba że macierz która jest tworzona w konstruktorze znika po wyjściu z niego, tylko czemu??
dodam że powyższy przykład zadziała jeśli metody losuj i wyświetl wrzucimy do konstruktora, jednak ja potrzebuje dostępu cały czas do tych macierzy

1

Sorki że nie będę wyrozumiały, ale co to k* jest?

float[,] tab = new float[w, k];

Przecież tworzysz zmienną lokalną w konstruktorze i w życiu nawet nie ocierasz się o pole publiczne tab.
Liczę że to jasne :)

0

DZIĘKI!


tab = new float[w, k];

teraz gra :) właśnie przechodze z C++ na C# i jeszcze nie moge zapamiętać dobrze tej troche zawiłej składni (zawiłej w porównaniu co c++).

0

chodzi mi raczej o składnie np. przy używaniu i deklarowaniu tablic ;p

"Dlatego dobrym nawykiem jest zawsze używać "this". Poza tym dla metod Losuj i Wyswietl nie przekazuj tych tablic, tylko skorzystaj z faktu, że są polami obiektu. - ElevenEleven"

mógłbyś rozwinąć myśl o tych polach obiektu a najlepiej podać stosowny przykład?

0
class Test 
{
    private int pole;

    public Test(int pole) // ojej parametr nazywa się tak samo jak pole klasy, co teraz?
    {
         this.pole = pole; // this.pole, to pole klasy, a pole to argument konstruktora
    }

    public void Metoda(int a, int b)
    {
        this.pole = a + b;  // użyliśmy this, więc na pewno operujemy na polu klasy
    }
}

Co do deklaracji tablic, to składnia jest chyba logiczniejsza. Nazwa zmiennej jest jednoznacznie oddzielona od jej typu.
W C: int tab[5]; - zadeklarowaliśmy inta z klamerkami z tyłu... WTF?
W C#: int[] tab = new int[5]; - tu od razu widać, że zmienna tab jest typu int[].

0

@somekind - trochę napiszę nie na temat, ale...

Składnie w obydwóch przypadkach są równie logiczne:

C#:
int[] tab - można by przeczytać jako zmienna 'tab' typu 'tablica int'.
C:
int tab[5] - to co innego. Trudno to trochę opisać, ale to raczej zmienna tab będąca pięcioma intami ułożonymi po sobie w pamięci.

To co w C# jest pełnoprawną (mającą np. rozmiar) tablicą, w C jest tylko ciągiem zmiennych. Zresztą twórcy C# też tak myśleli i mamy możliwość tworzenia takich cudów przez słówko kluczowe fixed (chociaż tylko w unsafe...)

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