C++ライブラリに対​するMATLABイン​ターフェイスにおける​「const wchar_t*」の扱いに関して

https://jp.mathworks.com/help/matlab/matlab_external/generate-interface-to-matrixoperations-library-windows-shared-library.html の手順を参考にC++自作ライブラリを作成しております。その際、cont wchar_t* を引数に持った関数をコールしたいのですが、期待した値がC++ライブラリ側に渡されません。どのように設定すればよいでしょうか?
<TestClass.cpp>
#include "TestClass.h"
TestClass::TestClass(int inp, const wchar_t* inpStr)
{
member1 = inp;
member2 = inpStr;
member3 = L"dummy text";
}
TestClass::~TestClass()
{
}
int TestClass::addOne()
{
return member1 + 1;
}
<TestClass.h>
class TestClass
{
public:
TestClass(int inp, const wchar_t* inpStr);
~TestClass();
int addOne();
public:
int member1;
const wchar_t* member2;
const wchar_t* member3;
};
<ライブラリ呼び出し部と実行結果>
addpath("TestClass")
capObj = clib.TestClass.TestClass(3, "text")
capObj =
TestClass のプロパティ:
member1: 3
member2: "뚨ⶮ翼"
member3: "dummy text"
member2の変数は実行の度、値が変化します。
2022/06/03追記
コード生成に使用したコードは下記になります。
% mex -setup cpp
hppFile = "TestClass.h";
cppFile = "TestClass.cpp";
clibgen.generateLibraryDefinition(hppFile, ...
"SupportingSourceFiles", cppFile, ...
TreatConstCharPointerAsCString=true, ...
OverwriteExistingDefinitionFiles=true, ...
ReturnCArrays=false);
defineTestClass;
summary(defineTestClass)
build(defineTestClass)
定義ファイルは生成されたものを変更せず使用しております。

4 个评论

member3 = L"dummy text";
ワイド文字列リテラル L"dummy text" の型がconst wchar_t*であるのに対し、
capObj = clib.TestClass.TestClass(3, "text")
のナロー文字列リテラル "text" の型がconst char *で、
const char *をconst wchar_t*で受けるからmember2の変数がおかしくなるのではないでしょうか?
capObj = clib.TestClass.TestClass(3, L"text")
とすれば解決するのではないでしょうか? なんかもう答えを書いているような...
ご回答いただき誠にありがとうございます。
capObj = clib.TestClass.TestClass(3, L"text")
では、MATLAB側でエラー(演算子の使用が無効です)と表示されてしまいます。
を確認してみたところ
wchar_t* は Stirngと対応付けられると認識しておりました。
以上、よろしくお願いします。
ドキュメントを参考にされたとのことですが、
clibgen.generateLibraryDefinitionにはどんなオプションを指定していますか?
こちらでも再現ができるようにclibgen.generateLibraryDefinitionのコードと、自動生成されるdefinetestlib.mlxの<shape>の部分をどのように変更されたのか、中身を見せていただけるとスムーズです。
追記ありがとうございました。
文字化けなのでエンコードが怪しいと思われるのですが、
capObj = clib.TestClass.TestClass(3, "あいうえお") を何度か実行するとたまにうまく行くときがあるので、根本原因がまだ分からない状況です。

请先登录,再进行评论。

回答(1 个)

Teppei Iwata
Teppei Iwata 2022-6-3

0 个投票

本文内に追記いたしました。ご確認よろしくお願いいたします。

类别

帮助中心File Exchange 中查找有关 Matrix Indexing 的更多信息

产品

版本

R2022a

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!