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 commentaires

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

Connectez-vous pour commenter.

Réponses (1)

Teppei Iwata
Teppei Iwata le 3 Juin 2022

0 votes

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

Catégories

En savoir plus sur データ型の変換 dans Centre d'aide et File Exchange

Produits

Version

R2022a

Tags

Community Treasure Hunt

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

Start Hunting!