2015-09-23 4 views
1

Я определил в моих foo.h следующих переменныхC++ Установка значений для членов структуры **

#define APILONG   long 
#define APIDOUBLE  double     
#define APISTRING  const char* 

А также следующую структуру

struct SetupData 
{ 
    APISTRING customerName; 
    APIDOUBLE quantity; 
    APILONG startDate; 

}; 

Теперь в моем foo.cpp я есть следующий метод, когда мне нужно назначать значения членам структуры, которые вытягиваются из файла .config.

APILONG doSomething(APISTRING* setupOrder, APILONG* setupActive, struct SetupData** setupData) 
{ 
//load config file 
Config config("rommel.config"); 

//assign a string value to APISTRING* (No issue here.) 
*setupOrder= config.pString("setupOrder").c_str(); 

//assign a value (No issue here, atleast not that I know of..) 
*setupActive = config.pDouble("setupActive"); 

//assign values to members of struct** 
(*setupData)->customerName = config.pString("setupDataCustomerName").c_str(); 
(*setupData)->quantity = config.pDouble("setupDataQuantity"); 
(*setupData)->startDate = config.pDouble("setupDataStartDate"); 

//do other stuff.. 
} 

Когда я компилирую и перестраиваю, он не дает мне никаких сообщений об ошибках. Но когда я пытаюсь запустить настоящую программу, она сработает. (Я использую Dev-C++, Visual Studio вызывал проблемы ..) Однако у меня есть шанс увидеть значения, назначенные до того, как он сработает, и похоже, что значения не назначаются (нулевые или странные символы).

Я пробовал вариацию линии (*setupData)->startDate .. , а также я попытался объявить структуры в методе, как в дальнейшем, но безрезультатно.

struct SetupData stpData; 
    *setupData = &stpData; 

Любая помощь была бы принята с благодарностью. Ранее я опубликовал еще один вопрос, связанный с этим, он содержит также довольно полезную информацию. Я оставлю ссылку на случай, если это поможет. "C++ Set value for a char**"

+0

Что возвращает 'config.pString'? Уверен, что это временная строка 'std :: string'. –

+0

Во-первых, вам нужно исправить ваше правописание «ApiLongstocking». –

+2

Зачем использовать '# define'? Что он добавляет? Просто делает код менее удобочитаемым –

ответ

0

Объект config является локальным для функции doSomething.

Указатель setupOrder указывает на то, что кажется членом объекта config.

Объект config будет удален из области действия в конце функции doSomething и может быть выделен в этой точке.
В этот момент, что указывает setupOrder указатель «указывает» на , может быть и недействительным.

Это хорошая идея, чтобы убедиться, что после вызова doSomething заканчивается , что все указатели все еще указывают на объекты, которые все еще существуют.

Возможно, вы уже это сделали, но я просто хотел проверить.

+0

Да, ну, я присвоил значения другие объекты в других методах, как я делаю в этом методе без каких-либо проблем, проблема в том, что я пытаюсь присвоить значения членам структуры ** –

+0

@DavidA. - Нет, если описание A B верное, проблема в том, что иногда код * работает *. Значение 'c_str()' действует только в том случае, если строка 'std :: string', которая была ему предоставлена, не изменяется. Если строка изменена или уничтожена, вы попадете в висячий указатель. –

+0

@BoPersson Я считаю, что понимаю, что вы говорите, это просто то, что меня отталкивает, это то, что это происходит только с членами структур данных. Любые предложения о том, как обойти это? Может быть, сначала назначить значения другим переменным в области, а затем назначить их членам структуры? –

Смежные вопросы