Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адресация в SafeArray 
V
    Опции темы
RastaDja
Дата 22.11.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



здраствуйте, читаю на сервере массив SafeArray таким способом
Код

for(LONG p = 1; p < Dim+1; p++){
    SafeArrayGetLBound(psa, p, &iLBound);
    SafeArrayGetUBound(psa, p, &iUBound);
    
    for (LONG i = iLBound; i < iUBound + 1; i++)
    {                        
        long ip[] = {i, p};
        hr2 = SafeArrayGetElement(psa, ip, &iVal);
        if(FAILED(hr2)){
        dt2 += _com_util::ConvertBSTRToString(iVal);
            dt2 += " ";
        }
    }
}

Dim - размерность
в dt2 (string) записываю данные,

Проблема: входной массив
For i = 1 To 3
    For j = 1 To 3
        myArray2(i, j) = "hello" & j + i
    Next
Next

а получается считать 
hello2 hello3 hello3 hello4 hello5 

в чём ошибка? спасибо
  


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 22.11.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хелп smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 22.11.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ладно, я уже сам разобрался.
Код

BSTR HUGEP *pbstr;
HRESULT hrty;
hrty = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);



--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 22.11.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот это
Код

    SafeArrayGetLBound(psa, p, &iLBound);
    SafeArrayGetUBound(psa, p, &iUBound);
должно стоять перед всеми циклами, и извлекать границы по всем измерениям.
Первый цикл (в строке 1) должен быть по первому измерению, а не по их количеству

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


Опытный
**


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

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



Цитата

Вот это
код C++
    SafeArrayGetLBound(psa, p, &iLBound);
    SafeArrayGetUBound(psa, p, &iUBound);
должно стоять перед всеми циклами, и извлекать границы по всем измерениям.
Первый цикл (в строке 1) должен быть по первому измерению, а не по их количеству


а можно пример для обхода N-мерного массива  smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 25.11.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(RastaDja @  25.11.2010,  11:20 Найти цитируемый пост)
а можно пример для обхода N-мерного массива

В случае N константы (=3):
Код

SafeArrayGetLBound(psa, 1, &iLBound1);
SafeArrayGetUBound(psa, 1, &iUBound1);
SafeArrayGetLBound(psa, 2, &iLBound2);
SafeArrayGetUBound(psa, 2, &iUBound2);
SafeArrayGetLBound(psa, 3, &iLBound3);
SafeArrayGetUBound(psa, 3, &iUBound3);
for(long i1=iLBound1;i1<=iUBound1;++i1)
 for(long i2=iLBound2;i2<=iUBound2;++i2)
  for(long i3=iLBound3;i3<=iUBound3;++i3)
    {
      long idx[]={i3,i2,i1};
      SafeArrayGetElement(psa,idx,&iVal);
      ...
    }


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


Опытный
**


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

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



Цитата

В случае N константы (=3):

это я давно сделал, а как на счёт того, когда не известно N?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 25.11.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(RastaDja @  25.11.2010,  15:48 Найти цитируемый пост)
это я давно сделал, а как на счёт того, когда не известно N? 
Тогда рекурсивно


PM MAIL   Вверх
RastaDja
Дата 26.11.2010, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Тогда рекурсивно

это понятно, вопрос как?

я сделал пл другому, но всёжэ интересно   smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 26.11.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(RastaDja @  26.11.2010,  18:04 Найти цитируемый пост)
это понятно, вопрос как?
Элементарно:
Код

long indexes[128]; // С запасом, или можно сделать динамический массив
long lBound[128];
long uBound[128];

void access_safearray(int dim_n, int max_dim)
{
 if (dim_n<max_dim)
  {
    for(long i=lBound[dim_n];i<=uBound[dim_n];++i)
     {
       indexes[max_dim-dim_n-1]=i;
       access_safearray(dim_n+1,max_dim);
     }
  }
 else
  {
   SafeArrayGetElement(psa,indexes,&iVal);
  }
}


for(int i=1;i<max_dim;++i)
 {
  SafeArrayGetLBound(psa,i,&lBound[i-1]);
  SafeArrayGetUBound(psa,i,&UBound[i-1]);
 }

access_safearray(0,max_dim);




PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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