1

a を返す ac メソッドがあり、const char *この関数を specman コードにインポートしました。「e」でさらにいくつかのステートメントを実行した後、文字列の値が壊れています。C空間のポインタを参照しているためだと思います。

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.

このコードの何が問題なのか考えていますか?

4

2 に答える 2

1

一般に、C 文字列を e に直接渡すことはお勧めできません。そのような文字列は、C コード自体によるメモリの再利用がなくても、ガベージ コレクションなどの Specman のメモリ管理メカニズムによって適切に処理されないためです。

使用.copy()は確かに可能な解決策ですが、別の解決策はSN_STRING_COPYC 関数内でマクロを使用することです。これは、文字列をコピーし、Specman メモリ割り当てメカニズムを使用して新しい文字列にメモリを割り当てます。ただし、これは、C 関数が e を認識しない汎用 C ユーティリティではなく、e とのインターフェイスを念頭に置いて作成されている場合にのみ関連します。

于 2016-10-23T09:08:18.733 に答える