私はMatlabで記述されたコードをMatlab Coderを使用してCコードに変換しています。Matlab Coderを使用してCの文字配列をMatlabの文字列に変換する
生成したCコードから呼び出したいC関数を記述しました。これは、今のところうまくいきます。
問題は、C関数のパラメータの1つが、文字列を出力するために使用されるchar **です。
これを行うには、不透明なchar *を作成し、coder.wrefを使用してchar **を取得します。しかし、私は関数から返すことができるように、どのように不透明なchar *をMatlab文字列に変換するのですか?
コードは次のようなものだ:
function [status,out] = cfun()
buf = coder.opaque('char *', 'NULL');
len = coder.opaque('size_t ', 'NULL');
status = 0;
status = coder.ceval('_cfun', coder.wref(buf), coder.wref(len));
out = buf; % How do I convert buf into a Matlab string here??
end
_cfunはBUFにいくつかのデータを書き込むとlenに長さを書き込みます。
私の現在の解決策は、Matlabで手動で文字配列を作成してデータに転送することです。
これで生成されたCコードは意味を持たなくなり、無限にループしますが、手動で更新することができます。しかし、これはコード生成を再実行するたびに手動で更新する必要があります。 Cのコードは次のようになります
:
i18 = length + 1L;
copyfrom = (int)i18;
i = 1;
while (i <= copyfrom) {
source_str->data[0] = (signed char)(int)buf;
i = 2;
}
私は仕事にそれを更新することができます
i18 = length + 1L;
copyfrom = (int)i18;
i = 1;
while (i <= copyfrom) {
source_str->data[i-1] = (signed char)(int)(buf[i-1]);
i = i+1;
}
ので、Matlabの文字列に文字* +長さを変換する方法はありますか?それとも、私がしようとしていることをするためのより良い方法がありますか?
奇妙なことに、 'length + 1L;'に 'L'があり、Cコードのすべてのキャストがなぜですか? 'i18、length、copyfrom、i、source_str、buf'の定義を投稿して、何が起きているのかを確認する方が良いでしょう。ポストが今立つにつれ、私はそれが不明であることがわかります。 – chux
これはMatlabから生成されたコードです。 LとキャストはMatlabの決定です。私はLが避け、整数のオーバーフローをチェックすることだと思います(私はコード内のいくつかのチェックを削除しました)。 forループが正しく生成されない理由をデバッグする必要がないかぎり、定義は重要ではありません。しかし、以下の答えは働くので、私はそれにもっと時間を費やすつもりはありません。 –