use c++11 function to convert strings to numbers

This commit is contained in:
Axel Kohlmeyer
2024-07-30 00:34:12 -04:00
parent d5e57ac02d
commit 361b8c25c4
2 changed files with 36 additions and 19 deletions

View File

@ -799,7 +799,7 @@ int Variable::next(int narg, char **arg)
fclose(fp);
if (strlen(buf) > 0) {
nextindex = atoi(buf);
nextindex = std::stoi(buf);
break;
}
delay = (int) (1000000*random->uniform());
@ -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,8 +3570,9 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow)
*ptr = '\0';
// evaluate index as floating point variable or as tagint via ATOTAGINT()
// evaluate index as floating point variable or as tagint via strtoll()
try {
if (varflag) {
char *id = start+2;
int ivar = find(id);
@ -3577,10 +3582,11 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow)
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);
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)

View File

@ -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)