2016-10-18 7 views
1

나는 const char *을 반환하는 c 메서드를 가지고 있으며이 함수를 내 specman 코드로 가져 왔습니다. "e"에서 더 적은 명령문을 실행 한 후 문자열의 값이 손상됩니다. 그것은 C 공간의 포인터를 참조하기 때문일 수도 있습니다.문자열을 specman 코드로

C 서명 :이 코드에 어떤 문제가 있는지에

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. 

생각 : 전자 사용량

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

:

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

?

+1

C 함수를 문제가있는 MCVE로 표시하십시오. –

+0

은 c 함수 @WeatherVane에 대한 코드를 추가했습니다. – Harish

+0

'static string myVal;을 선언하면'myVal'이'myFun'에 대한 다양한 호출에 걸쳐 보존됩니다. 반환 할 때마다 *** 같은 * ** 포인터. myFun이 호출 될 때마다 동일한 문자열을 덮어 쓰는 것 같아요. 'static'을 제거하고'string myVal'을 매개 변수로 전달하십시오. –

답변

2

전자 문자열이 변경 불가능한 경우 내용을 변경하는 적법한 방법이 없습니다. C 코드를 살펴볼 필요가 있다고 생각합니다. 이전 호출에서 e 문자열로 보낸 문자열을 메모리에 다시 사용합니다. C 문자열에 대한 포인터가 e에 전달되고 e 코드에 즉시 처리되지 않으면 예방 조치로 .copy()와 같이 복사 할 수 있습니다.

+0

, 제안 해 주셔서 고맙습니다. – Harish

1

일반적으로 C 문자열을 전자로 직접 전달하는 것은 좋지 않습니다. 왜냐하면 이러한 문자열은 가비지 수집과 같은 Specman의 메모리 관리 메커니즘에 의해 올바르게 처리되지 않기 때문입니다. C 코드 자체.

.copy()을 사용하는 것이 실제로 가능한 솔루션이지만 다른 해결책은 C 함수에서 SN_STRING_COPY 매크로를 사용하는 것입니다.이 함수는 문자열을 복사하고 Specman 메모리 할당 메커니즘을 사용하여 새 문자열에 메모리를 할당합니다. 그러나 이것은 C 함수가 전자를 인식하지 못하는 일반 C 유틸리티가 아니라 E 인터페이스를 염두에두고 작성된 경우에만 관련이 있습니다.