Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
__Дмитрий__
Сообщений: n/a
04.08.2012, 12:49     Как по ссылке передать массив из экселя в dll? #1
Добрый день,

Я в основном все примочки к экселю пишу естественно на 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/questions/1...en-vba-and-dll . Но в силу своих слабых познаний я не могу сам совместить свой код с приведённым там, я просто не понимаю что я делаю, когда дело касается вещей вроде TLB, SAFEARRAY и т.д. Буду крайне признателен, если кто-нибуть мне на пальцах объяснит, как мне изменить свой код, чтобы принять массив variant минуя XLW. Мой код сделан под XLL, но меня вполне устроит и DLL, на случай, если это что-то меняет.

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

Добавлено через 16 часов 18 минут
Опять же если это что-то меняет, то я использую Excel 2010 32 bit и Visual C++ 2008.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2012, 12:49     Как по ссылке передать массив из экселя в dll?
Посмотрите здесь:

C++ передать переменную char по ссылке
Как передать массив в массив с указателем C++
как передать в функцию двухмерный динамический массив по ссылке C++
C++ Массив и классы (как передаётся объект: по значению или по ссылке?)
Как передавать массив по ссылке, чтобы не работала копия массива? C++
C++ Передать указатель в метод по ссылке и подобное
Составить прототип функции: Как правильно передать динамический массив по ссылке C++
C++ Передать константу с одного файла в другой по ссылке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru