c 字符串到 specman e 代码
c string to specman e code
我有一个 returns 一个 const char *
的 c 方法,我将这个函数导入到我的 specman 代码中。在 "e" 中执行更多语句后,字符串中的值已损坏。我猜可能是因为它指的是 C space.
中的指针
C签名:
const char* myFun(const char* key)
{
static string myVal;
myVal = myDictionary[key];
return myVal.c_str();
}
在电子:
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.
关于这段代码有什么问题的想法?
因为字符串是不可变的,所以没有合法的方法来改变它的内容。我认为您需要查看您的 C 代码 - 它可能会重用它在上一次调用中发送给 e 的字符串的内存。如果指向 C 字符串的指针被传递给 e 而不是立即在 e 代码中处理,作为预防措施,例如可以使用 .copy() 复制它。
一般来说,将 C 字符串直接传递给 e 不是一个好主意,因为这样的字符串不会被 Specman 的内存管理机制(如垃圾回收)正确处理,即使没有通过C 代码本身。
虽然使用 .copy()
确实是一个可能的解决方案,但一个不同的解决方案是在 C 函数内部使用 SN_STRING_COPY
宏,它复制一个字符串并使用 Specman 内存分配为新字符串分配内存机制。但这仅在编写 C 函数时考虑到与 e 的接口时才相关,而不是作为不知道 e 的通用 C 实用程序。
我有一个 returns 一个 const char *
的 c 方法,我将这个函数导入到我的 specman 代码中。在 "e" 中执行更多语句后,字符串中的值已损坏。我猜可能是因为它指的是 C space.
C签名:
const char* myFun(const char* key)
{
static string myVal;
myVal = myDictionary[key];
return myVal.c_str();
}
在电子:
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.
关于这段代码有什么问题的想法?
因为字符串是不可变的,所以没有合法的方法来改变它的内容。我认为您需要查看您的 C 代码 - 它可能会重用它在上一次调用中发送给 e 的字符串的内存。如果指向 C 字符串的指针被传递给 e 而不是立即在 e 代码中处理,作为预防措施,例如可以使用 .copy() 复制它。
一般来说,将 C 字符串直接传递给 e 不是一个好主意,因为这样的字符串不会被 Specman 的内存管理机制(如垃圾回收)正确处理,即使没有通过C 代码本身。
虽然使用 .copy()
确实是一个可能的解决方案,但一个不同的解决方案是在 C 函数内部使用 SN_STRING_COPY
宏,它复制一个字符串并使用 Specman 内存分配为新字符串分配内存机制。但这仅在编写 C 函数时考虑到与 e 的接口时才相关,而不是作为不知道 e 的通用 C 实用程序。