2016-10-18 23 views
1

私はconst char *を返すcメソッドを持っており、この関数をspecmanコードにインポートしました。 "e"で文を実行した後、文字列の値が壊れています。 C空間のポインタを参照している可能性があります。c string to specman code

C署名:電子内

const char* myFun(const char* key) 
{ 
    static string myVal; 
    myVal = myDictionary[key]; 
    return myVal.c_str(); 
} 

:E使用量の

myFun(key : string) : string is foreign dynamic C routine 

:このコードで間違っているものに

var str : string; 
var str2 : string; 
str = myFun("my_test"); 
outf("%s",str) ---> here it gives the correct value 
str2 = myFun("my_test2"); 
---------- 
---------- 
outf("%s",str) ---> here it gives some garbage value, statements in the middle doesn't edit this string in anyway. 

考えですか?

+1

問題を示すMCVEとしてC関数を表示します。 –

+0

はc関数@WeatherVaneのコードを追加しました – Harish

+0

静的な文字列myVal;を宣言することで、 'myVal'は' myFun'へのさまざまな呼び出しで保持されます。返すたびに***同じ* **ポインタ。 myFunが呼び出されるたびに同じ文字列を上書きしていると思われます。 'static'を削除し、' string myVal'をパラメータとして渡します。 –

答えて

2

文字列が不変の場合、その内容を変更する正当な方法はありません。私はあなたのCコードを調べる必要があると思う - おそらく、以前の呼び出しでeに送信した文字列のメモリに再利用します。 Cの文字列へのポインタがeに渡され、eコードにすぐに配置されない場合は、予防策として.copy()などでコピーできます。

+0

、ありがとう – Harish

1

一般に、Cの文字列をeに直接渡すのは良い考えではありません。そのような文字列は、ガベージコレクションなどのメモリの再利用がなくても、Specmanのメモリ管理メカニズムによって適切に処理されないからです。 Cコードそのもの。

.copy()を使用するのは確かに可能ですが、別の解決策は、文字列をコピーして、Specmanメモリ割り当てメカニズムで新しい文字列にメモリを割り当てるC関数内のマクロを使用することです。しかし、これは、C関数がeを意識しない一般的なCユーティリティではなく、Eとのインタフェースを考慮して記述されている場合にのみ関係します。