Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c字符串到规范e代码_C_Specman_E - Fatal编程技术网

c字符串到规范e代码

c字符串到规范e代码,c,specman,e,C,Specman,E,我有一个c方法,它返回一个constchar*,我将这个函数导入到我的specman代码中。在“e”中再执行几条语句后,字符串中的值将被损坏。我猜可能是因为它指的是C空间中的指针 C签名: const char* myFun(const char* key) { static string myVal; myVal = myDictionary[key]; return myVal.c_str(); } 在e中: 在电子邮件使用中: var str : string;

我有一个c方法,它返回一个
constchar*
,我将这个函数导入到我的specman代码中。在“e”中再执行几条语句后,字符串中的值将被损坏。我猜可能是因为它指的是C空间中的指针

C签名:

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

在电子邮件使用中:

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.

关于这段代码有什么问题的想法?

在e字符串中是不可变的,没有合法的方法来更改它的内容。我认为您需要查看您的C代码——它可能会对在上一次调用中发送给e的字符串的内存进行一些重用。如果指向C字符串的指针被传递给e,而不是立即在e代码中处理,则可以使用.copy()等作为预防措施对其进行复制。

通常,将C字符串直接传递给e不是一个好主意,因为这样的字符串不会被Specman的内存管理机制(如垃圾收集)正确处理,即使C代码本身没有重用内存


虽然使用
.copy()
确实是一种可能的解决方案,但另一种解决方案是在C函数中使用
SN\u STRING\u copy
宏,它复制字符串并使用Specman内存分配机制将内存分配给新字符串。但这仅在编写C函数时考虑到与e的接口,而不是作为一个不知道e的通用C实用程序时才相关。

将C函数显示为显示问题的MCVE。添加了C函数@WeatherVaneYou know的代码,方法是声明
静态字符串myVal
myVal
在对
myFun
的各种调用中被保留,每次返回它时,您都返回相同的指针。我怀疑每次调用
myFun
时,您只是在覆盖相同的字符串。删除
静态
并将
字符串myVal
作为参数传递。(需要完整的代码来进一步帮助)@DavidC.Rankin:如果是这样的话,我应该看到str和str2的值是相同的,但事实并非如此:(很难说你发布了什么。看来你正在使用某种类型的复制构造函数,
myVal=myDictionary[key];
如果是这样,那么每次调用
myFun
时,
myVal
的内存都会被覆盖。如果您发布了MCVE,我们可以进一步帮助您(而不是猜测),请参阅:。
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.