dynamiczna zmiana rozmiaru tablicy

0

Dlaczego po zmianie rozmiaru tablicy

StringBuilder[] sb = new StringBuilder[1];
 Array.Resize(ref sb, 5);

próba odwołania do sb[0] powoduje błąd "Object reference not set to an instance of an object."? Czy trzeba inicjować każdy element tablicy? Ewentualnie jak hurtowo zainicjować obiekty tej klasy? Dodam, że zmiana rozmiaru STRUKTURY struct działa i nie wyrzuca błędu. Dlaczego struktura działa a klasa nie?

0
maszynaz napisał(a)

Czy trzeba inicjować każdy element tablicy?

Inicjacja to raczej branża dzikich plemion i tańczenie wokół ogniska, zjedzenie worka robaków, upolowanie tygrysa, ewentualnie oddanie się wodzowi.
Co do pytania - inicjalizować elementy tablicy trzeba.

Ewentualnie jak hurtowo zainicjować obiekty tej klasy?

Pętla for.

Dodam, że zmiana rozmiaru STRUKTURY struct działa i nie wyrzuca błędu. Dlaczego struktura działa a klasa nie?

Bo nie jest referencyjna i w momencie deklaracji automatycznie wywoływana jest dla niej inicjalizacja wartością domyślną? Tak strzelam.

Przez 6 lat pisania w C# nie miałem takich problemów. Te pytania to z ciekawości czy coś kombinujesz? Bo może po prostu chcesz zrobić coś, co się robi całkiem inaczej? ;)

0

Te pytania to z ciekawości czy coś kombinujesz? Bo może po prostu chcesz zrobić coś, co się robi całkiem inaczej? ;)

Jak się okazało te pytania to wynik błędów.

  1. Myślałem, że Array.Resize po zwiększeniu tablicy automatycznie inicjuje dodatkowo pola, ale tak nie jest. W efekcie odwoływałem się do elementu tablicy, który nie istniał. Zainicjowałem więc wszystkie elementy po kolei.
  2. Struktura przeszła bo była podana do funkcji przez referencję ref, więc pewnie nie musiała mieć zainicjowanej zawartości albo tak jak mówisz została zainicjowana domyślnie.
  3. Aplikacja po uruchomieniu zaraz się wyłączała bo dałem za mały rozmiar na StringBuildera i pakowało do niego content większy niż mógł przyjąć.
  4. W końcu poszło, ale zamknięcie okna powodowało FATAL ERROR. Jednak przeniesienie kodu z konstruktora Form1() do Form1_load() naprawiło ten błąd.
  5. Wszystko w końcu działa.
  6. Poza tym ciekawe jak działa StringBuilder skoro nie potrzeba dodawać ref by się zmienił...
0
  1. skoro StringBuilder jest typem referencyjnym, więc do funkcji zawsze będzie przekazany jego oryginał(przekazywana jest tylko referencja do niego). ref w tym wypadku spowoduje, że referencja jest przekazywana przez referencję a nie wartość i to ją możesz lub nie zmieniać.
    C# to nie C++ ;)
0
maszynaz napisał(a)
  1. Aplikacja po uruchomieniu zaraz się wyłączała bo dałem za mały rozmiar na StringBuildera i pakowało do niego content większy niż mógł przyjąć.

Jak to za mały rozmiar? StringBuilder ma rozmiar ograniczony dostępną pamięcią procesu, nie gadaj, że całą wykorzystujesz. :)
Wydaje mi się, że jakoś niepoprawnie go używasz, no i wyjaśnij, do czego jest Ci potrzebna tablica StringBuilderów?

  1. Poza tym ciekawe jak działa StringBuilder skoro nie potrzeba dodawać ref by się zmienił...

Poczytaj o typach wartościowych i referencyjnych, na początek może tutaj: http://cezarywalenciuk.blogspot.com/2011/06/kurs-obiektowosc-w-c-typ-referencyjny.html

0
  1. Aplikacja po uruchomieniu zaraz się wyłączała bo dałem za mały rozmiar na StringBuildera i pakowało do niego content większy niż mógł przyjąć.

Już wyjaśniam:
Mam taką funkcję

system.getRecordDriverInfo(x, sb, 256, ref audiodevguid);

która ustawia sb (StringBuilder) na rozmiar 256, do której zostają wpisywane nazwy urządzeń przechwytujących dźwięk. Wcześniej miałem 44 i okazało się za mało na długie nazwy.
Tablicę zrobiłem w drodze przypadku.
Później się okazało, że nie potrzebna jest, ale skoro wynikły błędy to musiałem się nauczyć na przyszłość to robić.

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