c строка в коде specman e

У меня есть метод c, который возвращает const char *, и я импортировал эту функцию в свой код specman. После выполнения еще нескольких операторов в «e» значение в строке искажается. Я думаю, может быть, потому что это относится к указателю в пространстве C.

подпись С:

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

in 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.

мысли о том, что не так с этим кодом?


person Harish    schedule 18.10.2016    source источник
comment
Покажите функцию C как MCVE, которая демонстрирует проблему.   -  person Weather Vane    schedule 18.10.2016
comment
добавлен код для c-функции @WeatherVane   -  person Harish    schedule 19.10.2016
comment
Вы знаете, объявляя static string myVal;, myVal сохраняется при различных вызовах myFun. Каждый раз, когда вы возвращаете его, вы возвращаете один и тот же указатель. Я подозреваю, что вы просто перезаписываете одну и ту же строку каждый раз, когда вызывается myFun. Удалите static и передайте string myVal в качестве параметра. (нужен полный код, чтобы помочь дальше)   -  person David C. Rankin    schedule 19.10.2016
comment
@DavidC.Rankin: если это так, я должен увидеть одинаковые значения как для str, так и для str2, что не так :(   -  person Harish    schedule 19.10.2016
comment
Трудно сказать с тем, что вы опубликовали. Похоже, вы используете какой-то тип конструктора копирования с myVal = myDictionary[key];. Если это так, то память для myVal перезаписывается при каждом вызове myFun. Если вы разместите MCVE, мы можем помочь в дальнейшем (а не гадать). См.: < b>Как создать минимальный, полный и проверяемый пример.   -  person David C. Rankin    schedule 19.10.2016


Ответы (2)


В e строки неизменяемы, нет законного способа изменить их содержимое. Я думаю, вам нужно заглянуть в свой код C - он, вероятно, повторно использует память строки, которую он отправил в e в предыдущем вызове. Если указатель на строку C передается в e и не сразу удаляется в коде e, его можно скопировать в качестве меры предосторожности, например, с помощью .copy().

person Rodion Melnikov    schedule 19.10.2016

В общем, не рекомендуется передавать строки C непосредственно в e, потому что такие строки не будут правильно обрабатываться механизмами управления памятью Specman, такими как сборка мусора, даже если нет повторного использования памяти самим кодом C.

Хотя использование .copy() действительно является возможным решением, другим решением является использование макроса SN_STRING_COPY внутри функции C, которая копирует строку и выделяет память для новой строки с помощью механизма выделения памяти Specman. Но это будет иметь значение только в том случае, если функция C написана с учетом взаимодействия с e, а не является универсальной утилитой C, не знающей e.

person Yuri Tsoglin    schedule 23.10.2016