macos — передача функции dylib c / c ++ с указателем на VBA на mac

Я на самом деле играю с интерфейсом C / C ++ и VBA Excel-2011 для Mac. Как я могу создать в dylib функции, принимающие указатели в качестве параметров или ссылки? Или массивы? Или даже простые структуры? Под окнами, VARIANT давайте сделаем все, но я не могу прибегнуть к этому в OS X (или даже в Linux).

Так же, как комментарий, до сих пор я могу делать такие вещи (включая «простые» типы):

У меня есть следующая конфигурация кода: в tmp3class.h:

class TheClass
{
public:
double mysum(double x ,double y);
};

в tmp3class.cpp:

#include "./tmp3class.h"
double TheClass::mysum(double x ,double y)
{
return x+y ;
}

и в tmp3.cpp:

#include "./tmp3class.h"
extern "C"{
double THESUM(double x, double y)
{
TheClass TheObj ;
double res = TheObj.mysum(x,y);
return res ;
}
}

Я собираю это с:

g++-5.2.0 -m32 -Wall -g -c ./tmp3class.cpp -o ./tmp3obj.o
g++-5.2.0 -m32 -dynamiclib .tmp3.cpp ./tmp3obj.o -o ./tmp3.dylib

а затем в VBA я делаю это:

Declare Function THESUM Lib "/Users/XXXXXX/Documents/GITHUBRepos/DYLIBS/MyFirstDylib/tmp3.dylib" (ByVal x As Double, ByVal y As Double) As Double

Function THESUM_VBA(x As Double, y As Double) As Double
THESUM_VBA = THESUM(x, y)
End Function

и функция THESUM_VBA работает на отлично

0

Решение

Вот ответ (разработан с благодарностью этот) в случае массивов: для передачи массива (двойного) из c ++ в VBA для Excel-2011 (mac) функция c ++ должна иметь в своей сигнатуре a double * представляющий указатель на первый коэффициент массива, int (или long или т. д.) представление размера массива. Например, функция, принимающая массив и умножающая все его коэффициенты на значение параметра, будет закодирована следующим образом: код c ++ имеет вид:

extern "C"{
void multarray(double * array, int size, double coeff)
{
for (int i = 0 ; i < size ; ++i)
{
array[i]*=coeff;
}
}
}

составлено с:

g++ -m32 -Wall -g -c ./tmp4.cpp
g++ -m32 -dynamiclib ./tmp4.o -o ./tmp4.dylib

Теперь VBA должен ссылаться на dylib следующим образом:

Declare Sub multarray Lib "/Users/XXXXXX/Documents/GITHUBRepos/DYLIBS/MyFirstDylib/tmp4.dylib" (ByRef firstcoeff As Double, ByVal size As Long, ByVal coeff As Double)

Первый параметр multarray представляют первый коэффициент массива, и должен быть передан по ссылке. Вот пример использования:

Public Sub DoIt()
Dim multarraofdoubles(3) As Double
multarraofdoubles(0) = -1.3
multarraofdoubles(1) = 4.6
multarraofdoubles(2) = -0.67
multarraofdoubles(3) = 3.13
Dim coeff As Double
coeff = 2#
Call multarray(multarraofdoubles(0), 4, coeff)
End Sub

Вышеупомянутое ссылка на сайт содержит много других интересных примеров, для строк (с BSTRs), массив строк, простые структуры и т. д., которые можно легко адаптировать к gcc и этот контекст Mac OS (/ Linux). Я думаю о разработке простого VARIANTКласс, обрабатывающий все это.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector