dynamiczna zmiana rozmiaru tablicy

Odpowiedz Nowy wątek
2011-08-31 22:51
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?


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 3x, ostatnio: maszynaz, 2011-08-31 23:26

Pozostało 580 znaków

2011-08-31 23:34
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? ;)


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
dodam, że tablica StringBuilderów trochę dziwnie wygląda jak dla mnie - po co komu taki twór? - Misiekd 2011-09-01 00:14
No jakbyś miał tyle literków, że się w jednym nie zmieszczą, to trzeba mieć tablicę. ;) - somekind 2011-09-01 00:25

Pozostało 580 znaków

2011-09-01 00:39
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ł...

"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 1x, ostatnio: maszynaz, 2011-09-01 00:41

Pozostało 580 znaków

2011-09-01 00:58
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++ ;)

edytowany 1x, ostatnio: byku_guzio, 2011-09-01 00:58
teraz wszystko jasne - maszynaz 2011-09-01 01:21

Pozostało 580 znaków

2011-09-01 01:23
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.blogsp[...]osc-w-c-typ-referencyjny.html


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-09-01 01:41
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ć.


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 1x, ostatnio: maszynaz, 2011-09-01 01:43

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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