Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Индекс массива превышает границу


Автор: greykardinal 5.2.2010, 09:11
Следующий код:
Код

Variant App,sheet,Range,DataArray;
float Ent_Massiv[1600];
....

App.OlePropertyGet("WorkBooks").OleProcedure("Open",dat_file.c_str(),true);
sheet = App.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
//---------------------------------------------------------------------------
for (int Num_Posish=0;Num_Posish<4;Num_Posish++)
{
for (int k=0;k<Channels;k++)
{
Range=sheet.OlePropertyGet("Range","B1:B1600");
DataArray=VarArrayCreate(OPENARRAY(int,(0,1600)),varVariant);
        if(DataArray.IsArray()) 
          { 
             DataArray=Range.OlePropertyGet("Value");
// Определяем число строк
               MaxI=VarArrayHighBound(DataArray,1),
//Считываем элементы и складываем их
              for(int i=0; i<1600; i++)
                  Ent_Massiv[i]=DataArray.GetElement(i+1);

          }
}
}


На что мне идет ругань "VARIANT ARRAY INDEX OUT OF BOUNDS". smile 
Не могу понять в чем дело - величина MaxI раняется 1600.  smile 
Помогите!!!
 smile 

Автор: zim22 5.2.2010, 09:43
Цитата(greykardinal @  5.2.2010,  08:11 Найти цитируемый пост)
На что мне идет ругань "VARIANT ARRAY INDEX OUT OF BOUNDS".

в какой строчке ругань?
индексация у массивов начинается с нуля.

Автор: greykardinal 5.2.2010, 09:57
2 zim22:
Ругань в строке
Код

Ent_Massiv[i]=DataArray.GetElement(i+1);

 Как я думаю, число элементов массива Ent_Massiv и диапазона Range должно быть одинаковым -  по 1600.
Так и есть.
Ничего в голову не лезет(((
 smile 

Автор: zim22 5.2.2010, 10:54
Цитата(greykardinal @  5.2.2010,  08:57 Найти цитируемый пост)
число элементов массива Ent_Massiv и диапазона Range должно быть одинаковым -  по 1600.

ещё раз: к 1600 элементов ты можешь обратиться по индексам 0...1599

Код

for(int i=0; i<1600; i++)
  Ent_Massiv[i]=DataArray.GetElement(i+1);

на последней итерации цикла переменная i будет равна 1599.
значит GetElement(i+1) будет обращаться к 1600 элементу, которого не существует.

Автор: xvr 5.2.2010, 12:24
Зачем в 13й строке создается массив, который тут же (в 16й строке) перезаписывается (при этом оригинальный массив теряется)?

Почему в 20й строке идет перебор до 1600, а не до размера массива, который тем не менее прочли в предыдущей строке (в переменную MaxI) ?

Автор: greykardinal 5.2.2010, 13:01
Не получается.
Ошибка возникает при i=0.
Возникает, даже если перебор вести до 2.
Код

Range=sheet.OlePropertyGet("Range","B1:B16");
DataArray=VarArrayCreate(OPENARRAY(int,(0,1600)),varVariant);

Даже если сделать так, вылетает "VARIANT ARRAY INDEX OUT OF BOUNDS".
Ума не приложу , что за хрень smile 

Автор: xvr 5.2.2010, 13:27
Может он вообще не массив возвращает? А например коллекцию.
Посмотри в отладчике, что лежит в DataArray, сдается мне, что там VT_DISPATCH  smile 

Автор: greykardinal 5.2.2010, 13:43
2 XVR:
А что именно смотреть - Debug показывает там кучу полей. я их не понимаю, увы.
Но вроде как при
Код

DataArray=VarArrayCreate(OPENARRAY(int,(0,1600)),varVariant);

некоторым полям присваивается  адрес какой-то ячейки.

Автор: xvr 5.2.2010, 14:38
Цитата(greykardinal @ 5.2.2010,  13:43)
2 XVR:
А что именно смотреть - Debug показывает там кучу полей. я их не понимаю, увы.

Поле vt. Там должно быть VT_SAFEARRAY (число 27)

Цитата

Но вроде как при
Код

DataArray=VarArrayCreate(OPENARRAY(int,(0,1600)),varVariant);

некоторым полям присваивается  адрес какой-то ячейки.
Это ни на что не влияет. У вас DataArray переписывается новым значением 7ю строками ниже

Автор: greykardinal 5.2.2010, 15:56
Инспектор в поле vt показывает 8204. Это происходит в момент
Код

DataArray=VarArrayCreate(OPENARRAY(int,(0,1600)),varVariant);

До этого в поле был 0.
Не понимаю, что это значит.

Автор: xvr 5.2.2010, 16:16
Цитата(greykardinal @ 5.2.2010,  15:56)
Инспектор в поле vt показывает 8204. 

Это значит VT_ARRAY|VT_VARIANT, т.е. массив вариантов. VarArrayCreate создает SafeArray и прописывает его в VARIANT как простой массив, а не как SafeArray  smile 

Цитата

Это происходит в момент
Код

DataArray=VarArrayCreate(OPENARRAY(int,(0,1600)),varVariant);

Этот момент совершенно неинтересен. (Эта строка кода вообще лишняя.)
Интересно, что там будет после
DataArray=Range.OlePropertyGet("Value");


Автор: greykardinal 5.2.2010, 16:29
Цитата

Интересно, что там будет после
DataArray=Range.OlePropertyGet("Value");

Тоже самое - инспектор показывает 8204.
Можете подсказать, как это исправить smile 

Автор: xvr 5.2.2010, 17:15
Цитата(greykardinal @ 5.2.2010,  16:29)
Цитата

Интересно, что там будет после
DataArray=Range.OlePropertyGet("Value");

Тоже самое - инспектор показывает 8204.

Тогда должно работать
Чему равен MaxI?

Автор: greykardinal 5.2.2010, 17:19
MaxI равняется 1600.

Автор: xvr 5.2.2010, 20:49
Цитата(greykardinal @ 5.2.2010,  17:19)
MaxI равняется 1600.

Увы, тогда только вооружаться дебагером и нырять во внутренности GetElement

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)