__Дмитрий__
1

Как по ссылке передать массив из экселя в dll?

04.08.2012, 12:49. Показов 832. Ответов 0
Метки нет (Все метки)

Добрый день,

Я в основном все примочки к экселю пишу естественно на VBA, но недавно столкнулся с необходимостью ускорить вычисления. Первую пробную функцию написал при помощи XLW (xlw.sourceforge.net), но на больших объёмах данных функция сильно подвисает. Вот она:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <math.h>
#include<cppinterface.h>
#pragma warning (disable : 4996)
 
double STDEVIF(const CellMatrix& Range, std::string Sign, double Number) {
 
    double sum = 0, sq_sum = 0, val;
    unsigned long n = 0;
    bool cond = false;
 
    unsigned long rows = Range.RowsInStructure();
    unsigned long cols = Range.ColumnsInStructure();
 
    for (unsigned long i = 0; i < rows; i++) {
        for (unsigned long j = 0; j < cols; j++) {
            if (Range(i,j).IsANumber()) {
                val = Range(i,j).NumericValue();
                if (Sign.compare("<") == 0) {
                        cond = (val < Number);
                } else if (Sign.compare(">") == 0) {
                        cond = (val > Number);
                } else if (Sign.compare("<=") == 0) {
                        cond = (val <= Number);
                } else if (Sign.compare(">=") == 0) {
                        cond = (val >= Number);
                } else if (Sign.compare("<>") == 0) {
                        cond = (val != Number);
                } else {
                        cond = false;
                }
                if (cond) {
                    sum += val;
                    sq_sum += val * val;
                    n += 1;
                }
            }
        }
    }
 
    if (n > 1) {
        return sqrt((n * sq_sum - sum * sum) / (n * (n - 1)));
    } else {
        throw("ERROR: There are less than 2 numbers matching the criteria.");
    }
}
Сначала я грешил на алгоритм, но потом я на большом объёме данных засёк время исполнения кода C++ и отдельно время обновления формулы в экселе. Оказалось, что передача данных из экселя в dll и обратно заняла 15 секунд, а исполнение кода С++ всего 1.8 секунды. Нашёл пример в интернете, как можно избежать использования тяжёлого XLW и прочих подобных оболочек и передать массив с данными типа Variant в С++ по ссылке. Код приведён тут: http://stackoverflow.com/quest... ba-and-dll . Но в силу своих слабых познаний я не могу сам совместить свой код с приведённым там, я просто не понимаю что я делаю, когда дело касается вещей вроде TLB, SAFEARRAY и т.д. Буду крайне признателен, если кто-нибуть мне на пальцах объяснит, как мне изменить свой код, чтобы принять массив variant минуя XLW. Мой код сделан под XLL, но меня вполне устроит и DLL, на случай, если это что-то меняет.

Буду благодарен за любую помощь, убил на это уже 3 дня.

Добавлено через 16 часов 18 минут
Опять же если это что-то меняет, то я использую Excel 2010 32 bit и Visual C++ 2008.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2012, 12:49
Ответы с готовыми решениями:

Как передать массив по ссылке?
Как в Си передать массив в функцию по ссылке ( не через указатель ) ?

Как можно передать массив по ссылке в функцию?
Привет всем! приведу пример вот функция fill заполняет массив a и извлекает 3-элемент public...

Как передать двухмерный массив в функцию по ссылке?
Преподаватель в универе просит написать функцию вида void st3(&amp;array, &amp;n, &amp;m). Бьюсь головой об...

Как передать в функцию двухмерный динамический массив по ссылке?
как передать в функцию двухмерный динамический массив по ссылке?

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2012, 12:49

Составить прототип функции: Как правильно передать динамический массив по ссылке
В dll библиотеке на экспорт имеется прототип следующей функции: extern &quot;C&quot; __declspec(dllexport)...

Как передать массив из проекта на C# в библиотеку dll на С++?
Подскажите как точно передать в dll-ку на C++ два массива из C# проекта? Код на C#: ...

Передать массив в функцию по ссылке
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int FindMax(int *Arr,int...

Не получается передать массив по ссылке
Хочу передать в функцию массив char, передать хочу по ссылке. Делаю так: void func(char&amp; arr) {...

Передать массив указателей в функцию по ссылке
Здравствуйте. Подскажите пожалуйста как передать массив указателей в функцию так, чтобы при...

Передать в dll указатель на массив
У меня есть DLL которая записывает массив в файл Для этого ей нужно передать указатель на этот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru