Dlaczego ujemny indeks tablicy?

0

Hej,
Czy ktoś ma pomysł dlaczego zmienna offset czasem jest ujemna???
Jak na razie wiem tylko, że zależy od danych. Na małej ilości danych działał dobrze i długo (kilka tysięcy przebiegów). Na nowych danych, które wydają się poprawne, od razu był wyjątek (indeks tablicy ujemny, zawsze w okolicy -90, mimo, że dostęp losowy).
Dzięki.

    public double getData(int dataTableIndex, int dataOffsetIndex) {
        assert data.size() >= 0:  "data.size";
        assert maximumOffset >= 0: "maximumOffset";
        int tableIndex = (dataTableIndex < 0 ? -dataTableIndex : dataTableIndex) % data.size();
        int offset = (dataOffsetIndex < 0 ? -dataOffsetIndex : dataOffsetIndex) % maximumOffset;
        assert tableIndex >= 0:  "tableIndex";
        assert offset >= 0: "offset"; // tu wyrzuca assertion error
        if (offset >= data.get(tableIndex).length)
            throw new NotEnoughDataException();
        else
            return data.get(tableIndex)[offset]; // tu był wyjątek jak nie było assertów
    }
0

Zapnij sie tam debugerem i zobacz kiedy taka sytuacja występuje... A tak btw assert z >= dla liczby przez którą dzielisz to słaby pomysł bo wcale cię nie zabezpiecza przed dzieleniem przez zero... ;]

0

Pod debugerem wykonuje się zbyt wolno. Za to po zmianie na:

public double getData(int dataTableIndex, int dataOffsetIndex) {
        assert data.size() >= 0:  "data.size";
        assert maximumOffset >= 0: "maximumOffset";
        int tableIndex = normalize(dataTableIndex,data.size());
        int offset = normalize(dataOffsetIndex,maximumOffset);
        assert tableIndex >= 0:  "tableIndex";
        if (offset >= data.get(tableIndex).length)
            throw new NotEnoughDataException();
        else
            return data.get(tableIndex)[offset];
    }

    private int normalize(int number, int max) {
        int normal = number;
        if(normal < 0)
            normal = -normal;
        if(normal >= max)
            normal %= max;
        return normal;
    }

Dostałem wyjętek Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2147483648
Mam przeczucie, że MIN INT to wskazówka, ale jeszcze nie wiem o co chodzi. Ma ktoś pomysł?
Ł

0

napisz unit testy dla twojej metody testujace rozne wartosci int dataTableIndex, int dataOffsetIndex:
a) 'normalne' dodatnie
b) 'normalne' ujemne
c) zerowe
d) min i max int
od razu zobaczysz co ci sie kaszani, a na przyszlosc bedziesz mial potwierdzenie ze nic nie zepsules np. przy okazji optymalizacji

0

Czy maximumOffset jest innego typu niż int, np. long? Może następuje przepełnienie po konwersji na int i dlatego liczba nagle jest ujemna.

0
Czarny Orzeł napisał(a):

Pod debugerem wykonuje się zbyt wolno.

Uruchom normalnienie pod debuggerem i nie zatrzymuj się w tej funkcji.
Nie pamiętam jak to się ustawia, ale możesz ustawić breakpoint na konkretny exception, więc debugowanie może rozpocząć się dokładnie w momencie wystąpienia problemu.

0

Z min intem sprawa się wyjaśniła:
https://ideone.com/5ZFESr
Rozwiązaniem było zmiana pierwszego argumentu na long (wtedy jest wywoływana Math.abs(long)). Ciągle nie wiem czemu dostawałem -90 wcześniej. Puściłem program od nowa, jeszcze nie wiem czy dobrze działa.

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