我在Eclipse CDT中调试我的模型(用C ++编写)时遇到了问题。问题是,当我通过引用将包含各种成员变量(如string或vector)的结构变量传递给函数时,某些成员变量的值不会在该函数的范围内更新。更多详情如下:
struct ModelConfig {
//... here are some other variables and constructors
vector<int> crop_list;
string path_to_input;
//....
};
现在说我在GDB中开始调试,这是第一个函数调用:
void modelMain::setupModel( const ModelConfig & sim_setting ){
//... some operations to configure the model using 'sim_setting'
/* 1.3 - Initialize the land */
Set_Environment(k_farm_land, sim_setting);
// breakpoint here, printing out the value of 'sim_etting' shows 'sim_setting.path_to_input = "data/"' ; Then I enter into 'Set_Environment' function ...
//...
}
void Set_Environment(vector<Soil> & farm_land, const ModelConfig & sim_setting) {
int EXP_ID = sim_setting.EXP_ID;
string strTmp_a;
strTmp_a = sim_setting.path_to_input + "soil/parameters.txt"; // Problem is here: the GDB shows here that sim_setting.path_to_input = " ". I am expecting strTmp_a = "data/soil/parameters.txt" which now is "soil/parameters.txt" ;
//... operations for reading data
}
sim_setting.path_to_input
变量应该包含名为data/
的字符串值,这在setupModel(...)
中的调用期间是正确的,但在此期间值丢失(或实际更改了地址)拨打Set_Environment(...)
...
在Eclipse中使用GDB调试来跟踪变量的地址时,我注意到sim_setting
和setupModel
中Set_Environment
的地址似乎是正确的,但成员变量是path_to_input
和crop_list
已更改为其他位置,导致数据丢失。使用crop_list
创建.push_back()
的值。
由于我通过引用传递变量,所以我没有明白这一点。我唯一可以想象的是由于字符串和向量的值赋值。谁有理论呢?非常感谢你提前!