2016-08-17 6 views
0

私は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の文字列に文字* +長さを変換する方法はありますか?それとも、私がしようとしていることをするためのより良い方法がありますか?

+0

奇妙なことに、 'length + 1L;'に 'L'があり、Cコードのすべてのキャストがなぜですか? 'i18、length、copyfrom、i、source_str、buf'の定義を投稿して、何が起きているのかを確認する方が良いでしょう。ポストが今立つにつれ、私はそれが不明であることがわかります。 – chux

+0

これはMatlabから生成されたコードです。 LとキャストはMatlabの決定です。私はLが避け、整数のオーバーフローをチェックすることだと思います(私はコード内のいくつかのチェックを削除しました)。 forループが正しく生成されない理由をデバッグする必要がないかぎり、定義は重要ではありません。しかし、以下の答えは働くので、私はそれにもっと時間を費やすつもりはありません。 –

答えて

1

それは少し無駄ですが、あなたはそれにMATLAB charアレイとmemcpyデータを割り当てることができます:

mllen = cast(len,'int32'); % or int64 
mlbuf = blanks(mllen); % allocate character vector 
coder.ceval('memcpy',coder.wref(mlbuf),buf,len); 
use(mlbuf); 

あなたはlenかどうかのカウントに基づいてサイズに+1または-1をすることができNULLターミネータとあなたがそれを望む場合。あなたは何とか_cfunの呼び出しの前lenを把握することができます場合は

その後、あなただけの_cfunmlbufを渡し、コピーを忘れることができます。

コーダーに関する限り、bufは1行1列のcoder.opaqueであるため、生成されたコードは0でインデックス付けされ、無限ループを生成します。 MEXファイルを生成して実行した場合、インデックス外のエラーが発生します。

+0

これは、ありがとう!私は '_cfun'の呼び出しの前に' len'を理解することはできませんが、このように動作するので完璧です。 –

関連する問題