Wątek przeniesiony 2014-05-13 00:39 z C/C++ przez ŁF.

QVector<T>::operator[]: "index out of range"

0

Witam,
przy wywoływaniu metody:

double codec::count_entrop()

{
    int val=0;
    double entrR=0;

    QVector<int> entropR(256, 0);

    for(int y=0; y<height; y++)
    {
        for (int x=0; x<width; x++)
        {
           entropR[val]=qRed(picture_copy.pixel(x,y));
           val++;
         }
    }

    for(int y=0; y<val; y++ )
    {
        entropR[y]=entropR[y]/(height*width);
    }

    for(int y=0; y<val; y++ )
    {
       entrR+=entropR[y]*qLn(entropR[y])/qLn(2);
    }

    ui->results->append(" entrR: "+QString::number(entrR));

   return 0;

}

działanie programu zostaje przerwane z komunikatem:

ASSERT failure in QVector<T>::operator[]: "index out of range", file C:\Qt\Qt5.2.1\5.2.1\msvc2012_64_opengl\include\QtCore/qvector.h, line 369

Gdzie height i width są odpowiednio wysokością i szerokością obrazka qImage: picture_copy (obrazek na pewno jest "niezerowy").
Bardzo proszę o podpowiedź co robię nie tak (zaznaczę jeszcze, że jestem początkującym programistą więc proszę o wyrozumiałość).

1

A ile wynoszą te height i width?
Jeśli ich iloczyn wynosi więcej niż 256 to oczywiste że wyjedziesz poza zakres przy czymś takim:

    for(int y=0; y<height; y++)
    {
        for (int x=0; x<width; x++)
        {
           entropR[val]=qRed(picture_copy.pixel(x,y));
           val++;
         }
0

Wartości height i width wynoszą po 25.

0

Ok, błąd logiczny znaleziony, należało zamiast:

entropR[val]=qRed(picture_copy.pixel(x,y));
 val++;

zapisać:

           
val=qRed(picture_copy.pixel(x,y));
entropR[val]++;

Azarien, dzięki za naprowadzenie :)

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