use c++11 function to convert strings to numbers
This commit is contained in:
@ -799,8 +799,8 @@ int Variable::next(int narg, char **arg)
|
||||
fclose(fp);
|
||||
|
||||
if (strlen(buf) > 0) {
|
||||
nextindex = atoi(buf);
|
||||
break;
|
||||
nextindex = std::stoi(buf);
|
||||
break;
|
||||
}
|
||||
delay = (int) (1000000*random->uniform());
|
||||
platform::usleep(delay);
|
||||
@ -1115,7 +1115,11 @@ double Variable::compute_equal(int ivar)
|
||||
if (ifunc < 0)
|
||||
print_var_error(FLERR,fmt::format("cannot find python function {}",data[ivar][0]),ivar);
|
||||
python->invoke_function(ifunc,data[ivar][1]);
|
||||
value = atof(data[ivar][1]);
|
||||
try {
|
||||
value = std::stod(data[ivar][1]);
|
||||
} catch (std::exception &e) {
|
||||
print_var_error(FLERR,"has an invalid value", ivar);
|
||||
}
|
||||
}
|
||||
|
||||
eval_in_progress[ivar] = 0;
|
||||
@ -3555,7 +3559,7 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow)
|
||||
} else {
|
||||
varflag = 0;
|
||||
while (*ptr && *ptr != ']') {
|
||||
if (!isdigit(*ptr))
|
||||
if (!(isdigit(*ptr) || (*ptr == '-') || (*ptr == '+') || (*ptr == '*') || (*ptr == '/')))
|
||||
error->all(FLERR,"Non digit character between brackets in variable");
|
||||
ptr++;
|
||||
}
|
||||
@ -3566,21 +3570,23 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow)
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
// evaluate index as floating point variable or as tagint via ATOTAGINT()
|
||||
|
||||
if (varflag) {
|
||||
char *id = start+2;
|
||||
int ivar = find(id);
|
||||
if (ivar < 0)
|
||||
error->all(FLERR,"Invalid variable name {} in variable formula", id);
|
||||
|
||||
char *var = retrieve(id);
|
||||
if (var == nullptr)
|
||||
error->all(FLERR,"Invalid variable evaluation for variable {} in variable formula", id);
|
||||
index = static_cast<tagint> (atof(var));
|
||||
|
||||
} else index = ATOTAGINT(start);
|
||||
// evaluate index as floating point variable or as tagint via strtoll()
|
||||
|
||||
try {
|
||||
if (varflag) {
|
||||
char *id = start+2;
|
||||
int ivar = find(id);
|
||||
if (ivar < 0)
|
||||
error->all(FLERR,"Invalid variable name {} in variable formula", id);
|
||||
|
||||
char *var = retrieve(id);
|
||||
if (var == nullptr)
|
||||
error->all(FLERR,"Invalid variable evaluation for variable {} in variable formula", id);
|
||||
index = static_cast<tagint>(std::stod(var));
|
||||
} else index = static_cast<tagint>(std::stoll(start));
|
||||
} catch (std::exception &e) {
|
||||
error->all(FLERR,"Illegal value in brackets: {}({})", e.what(), start);
|
||||
}
|
||||
*ptr = ']';
|
||||
|
||||
if (index <= 0)
|
||||
|
||||
@ -287,6 +287,7 @@ TEST_F(VariableTest, AtomicSystem)
|
||||
ASSERT_DOUBLE_EQ(variable->compute_equal("f_press[1]"), 0.0);
|
||||
ASSERT_DOUBLE_EQ(variable->compute_equal("c_press"), 0.0);
|
||||
ASSERT_DOUBLE_EQ(variable->compute_equal("c_press[2]"), 0.0);
|
||||
ASSERT_DOUBLE_EQ(variable->compute_equal("c_press[1+1]"), 0.0);
|
||||
ASSERT_DOUBLE_EQ(variable->compute_equal("1.5+3.25"), 4.75);
|
||||
ASSERT_DOUBLE_EQ(variable->compute_equal("-2.5*1.5"), -3.75);
|
||||
|
||||
@ -302,8 +303,18 @@ TEST_F(VariableTest, AtomicSystem)
|
||||
variable->compute_equal("v_self"););
|
||||
TEST_FAILURE(".*ERROR: Variable sum2: Inconsistent lengths in vector-style variable.*",
|
||||
variable->compute_equal("max(v_sum2)"););
|
||||
TEST_FAILURE("ERROR: Mismatched fix in variable formula.*",
|
||||
TEST_FAILURE(".*ERROR: Mismatched fix in variable formula.*",
|
||||
variable->compute_equal("f_press"););
|
||||
TEST_FAILURE(".*ERROR .*Variable formula compute vector is accessed out-of-range.*",
|
||||
variable->compute_equal("c_press[10]"););
|
||||
TEST_FAILURE(".*ERROR: Non digit character between brackets in variable.*",
|
||||
variable->compute_equal("c_press[axy]"););
|
||||
TEST_FAILURE(".*ERROR: Illegal value in brackets: stoll.*",
|
||||
variable->compute_equal("c_press[73786976294838206464]"););
|
||||
TEST_FAILURE(".*ERROR: Index between variable brackets must be positive.*",
|
||||
variable->compute_equal("c_press[-2]"););
|
||||
TEST_FAILURE(".*ERROR: Index between variable brackets must be positive.*",
|
||||
variable->compute_equal("c_press[0]"););
|
||||
}
|
||||
|
||||
TEST_F(VariableTest, Expressions)
|
||||
|
||||
Reference in New Issue
Block a user