Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Индекс массива превышает границу, РАбота с Excel 
:(
    Опции темы
greykardinal
Дата 5.2.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Следующий код:
Код

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 
PM MAIL   Вверх
zim22
Дата 5.2.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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


--------------------
PM MAIL   Вверх
greykardinal
Дата 5.2.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



2 zim22:
Ругань в строке
Код

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

 Как я думаю, число элементов массива Ent_Massiv и диапазона Range должно быть одинаковым -  по 1600.
Так и есть.
Ничего в голову не лезет(((
 smile 
PM MAIL   Вверх
zim22
Дата 5.2.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(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 элементу, которого не существует.


--------------------
PM MAIL   Вверх
xvr
Дата 5.2.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

Почему в 20й строке идет перебор до 1600, а не до размера массива, который тем не менее прочли в предыдущей строке (в переменную MaxI) ?
PM MAIL   Вверх
greykardinal
Дата 5.2.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



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

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

Даже если сделать так, вылетает "VARIANT ARRAY INDEX OUT OF BOUNDS".
Ума не приложу , что за хрень smile 
PM MAIL   Вверх
xvr
Дата 5.2.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

PM MAIL   Вверх
greykardinal
Дата 5.2.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



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

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

некоторым полям присваивается  адрес какой-то ячейки.
PM MAIL   Вверх
xvr
Дата 5.2.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

Цитата

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

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

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

PM MAIL   Вверх
greykardinal
Дата 5.2.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Инспектор в поле vt показывает 8204. Это происходит в момент
Код

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

До этого в поле был 0.
Не понимаю, что это значит.
PM MAIL   Вверх
xvr
Дата 5.2.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(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");


PM MAIL   Вверх
greykardinal
Дата 5.2.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Цитата

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

Тоже самое - инспектор показывает 8204.
Можете подсказать, как это исправить smile 
PM MAIL   Вверх
xvr
Дата 5.2.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(greykardinal @ 5.2.2010,  16:29)
Цитата

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

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

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

PM MAIL   Вверх
greykardinal
Дата 5.2.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



MaxI равняется 1600.
PM MAIL   Вверх
xvr
Дата 5.2.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

Увы, тогда только вооружаться дебагером и нырять во внутренности GetElement
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.