###前提・実現したいこと
Visual Studio Express 2008でExcel用のdllファイルを作成しています。
プログラミングはほぼ初心者ですので、非常識な質問になっておりましたらすみません。
エクセル側から、x[2]、y[2]という2つの行列の値をdll内の関数に渡し、c++側のEigenライブラリで行列計算を行いたいと考えています。
###発生している問題・エラーメッセージ
c++のコード側で、Excelから読み込む配列が1つのみの時は、問題なく、全ての配列を読み込み、c++のdll側の変数に以下のように値を格納できます。
Matrix Aにx[0]、x[1]の値、Matrix Bにx[2]、x[3]の値。
しかし、配列の数を2つにすると、
Matrix Aにx[0]、x[1]、Matrix Bにy[0]、y[1]の値を格納したいのですが、確認したところ、どうも
Matrix Aにx[0]、0、Matrix Bにy[0]、0が入ってしまうようです。
試しにVBA側のコードを
vba
1 Debug.Print (Mult(x(0),y(1)))
とした所、
Matrix Aにx[0]、0、Matrix Bにy[1]、0が入ったようです。
どうも現状の設定の仕方だと、VBAで指定した先頭の値から、次の配列の値まで動いていないようです。
VBA側で指定した配列を複数dll側に渡すにはどのように設定すれば良いのでしょうか?
ご教授いただければ助かります。
エラーメッセージ:dllが正しくよみこめません
というエラーが発生します。
###該当のソースコード
元々のコード
c++
1double __stdcall Mult(double x[], double y[]) 2{ 3 4 MatrixXd z(1,1); 5 double z2[1]; 6 double z3; 7 8 MatrixXd A=MatrixXd::Ones(1,2); 9 MatrixXd B=MatrixXd::Ones(2,1); 10 11 A(0,0)=x[0]; 12 A(0,1)=x[1]; 13 B(0,0)=y[0]; 14 B(1,0)=y[1]; 15 16 z=A*B; 17 Map<MatrixXd>(&z2[0],1,1)=z; 18 z3=z2[0]; 19 20 return z3;
vba
1Private Declare Function Mult Lib "ExcelLink.dll" (x As Double, y As Double) As Double 2 3 '[1,2]行列 4 x(0) = 3 5 x(1) = 5 6 '[2,1]行列 7 y(0) = 4 8 y(1) = 5 9 10 Debug.Print (Mult(x(0),y(0))) 11
###試したこと
やむを得ないので、現状は以下のように読み込む配列を一つにし、行列Aには0~1の値、行列Bには2~3の値を入力するコードとしています。
c++
1double __stdcall Mult(double x[]) 2{ 3 4 MatrixXd z(1,1); 5 double z2[1]; 6 double z3; 7 8 MatrixXd A=MatrixXd::Ones(1,2); 9 MatrixXd B=MatrixXd::Ones(2,1); 10 11 A(0,0)=x[0]; 12 A(0,1)=x[1]; 13 B(0,0)=x[2]; 14 B(1,0)=x[3]; 15 16 z=A*B; 17 Map<MatrixXd>(&z2[0],1,1)=z; 18 z3=z2[0]; 19 20 return z3;
vba
1Private Declare Function Mult Lib "ExcelLink.dll" (x As Double) As Double 2 3 '[1,2]行列 4 x(0) = 3 5 x(1) = 5 6 '[2,1]行列 7 x(2) = 4 8 x(3) = 5 9 10 Debug.Print (Mult(x(0))) 11
このコードであれば、Matrix A、Bに正しく値を渡して計算することができます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。