"Argument poza granicą tablic" - ale dlaczego?

0

Piszę mały program związany z entropią różnych fragmentów pliku.
Chciałem podzielić wczytywany plik na 128 kawałków, a potem oddzielnie policzyć entropie dla każdego z nich. Przy wykonywaniu funkcji wyrzucany jest jednak wyjątek: 'System.ArgumentOutOfRangeException" związany jak już powiedziałem z "przepełnieniem" tablicy. Tylko dlaczego?

public static double[] EntSectors = new double[128];

        public static void EntropyPoints() 
        {
            FileInfo f = new FileInfo(path);
            long temp1 = 0; long sizeinbytes = f.Length;
            long sizeofpart = sizeinbytes / 128;

            byte[] b = File.ReadAllBytes(path);

            string s = null;
            foreach (byte bb in b)
            {
                string a = bb.ToString();
                s += a;
            }

            long sizeX2 = 2 * sizeinbytes; long temp2 = sizeX2 / 128;
            for (int i = 0; i < 128; i++)
            {
                string temp3 = s.Substring((int)temp1, (int)temp2);
                EntSectors[i] = EntropySh(temp3);
                temp1 = temp2 + 1;
                temp2 += temp2;
            }

        }

Dodatkowo dostaję informację: Additional information: Indeks i długość muszą odwoływać się do lokalizacji w ciągu.

0

Wygląda na to że wywala ci się na string temp3 = s.Substring((int)temp1, (int)temp2);. String to też tablica pewnie temp1 i/lub temp2 wychodzą poza zakres.

0

Do tego konkretnego przypadku wczytuje plik o wielkości 1300 z kawałkiem bajtów, więc podzielone na 128 kawałków --> ~11 bajtów, czyli 22 znaki, a to raczej nie jest overflow. Nie mam pojęcia co zrobić xD

Chyba, że gdzieś w algorytmie się machnąłem.

0

Użyj debuggera i sprawdź.

0

ArgumentOutOfRangeException to raczej z metody Substring(). Z tablicy to IndexOutOfRangeException.
string s = null; s += "cokolwiek"; - jak sądzisz, jaka będzie zawartość s?

Ponadto - w pętli temp2 += temp2; zadziała tak jak myślisz tylko w pierwszej iteracji, po góra ośmiu iteracjach substring od tego wybuchnie.

0

Cześć. Nie wnikając w szczegóły bo nie mam zupełnie w tej chwili nastroju - świeci mi Słońce prosto w oczy - i muszę pilnować aby ludzi nie rozjechać a same mi włażą pod koła... tak więc w temacie to przecież C# miał być uodporniony już na wyjście poza indeks tablicy. Anton

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