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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
__Дмитрий__
Сообщений: n/a
#1

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

04.08.2012, 12:49. Просмотров 547. Ответов 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/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++):

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

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

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

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

Как передать целочисленный параметр в функцию по ссылке при рекурсивном вызове? - C++
void consonant_count(trie*root,trie*parent,int amount_of_consonant,bool found,int *c) { ...

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2012, 12:49
Привет! Вот еще темы с ответами:

Передать переменную типа char по ссылке - C++
доброго времени суток. помогите над очень простым задание из одной книги. Создайте функцию, которая получает аргумент char&amp; и...

Передать указатель в метод по ссылке и подобное - C++
Первая часть: Change(*t1); - это нормальная практика? Тут по сути мы разъименовываем указатель и получаем адрес памяти в куче? Я всё...

Передать константу с одного файла в другой по ссылке - C++
Товарищи, нужна помощь! Хочу передать константу с одного файла в другой. Есть константа в одном файле extern const int size=10; ...

Передать сумму по ссылке и по указателю (перегрузка функций) - C++
Посмотрите пожалуйста правильно ли написала у меня есть значение a и b,мне надо передать сумму по ссылке и по указателю #include...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru