init
Объявление переменных с идентификаторами, формируемыми в тексте программы.
Вызов:
var_by_txt("init", string string_with_varnames, string vartype, string local_or_global, void preset_value);
Здесь:
string_with_varnames - строка, содержащая один или список идентификаторов переменных через запятую ("var1" или "var1,var2,var3").
vartype - тип объявляемой переменной - "string", "int", "double", "bool".
local_or_global - в каком уровне видимости создавать переменные - "global" или "local".
preset_value - значение, присваиваемое переменным по умолчанию.
Глобальные переменные можно создавать в цикле.
Локальные переменные в цикле или в других случаях с применением фигурных скобок, создавать нельзя, т.к. после выхода из понижающей области {} они удаляются.
Это как бы мы написали:
if(...)
{
// объявляем локальную переменную k в пониженной области видимости
int k = 1;
}
// здесь, за пределами фигурных скобок уже локальная переменная k не существует.
Чтобы выполнить массовое объявление локальных переменных - сначала сформируйте строку с идентификаторами через запятую, а затем выполните функцию var_by_txt("init"...).
Повторное объявление глобальных переменных может привести к ошибке.
Чтобы избежать этого используйте var_by_txt("is_exist",...).
Пример.
//************************************************************
// Создание переменных с идентификаторами из текстовой строки
// функция var_by_txt()
// LABPP 2021
//************************************************************
int main()
{
test_global_variables();
test_local_variables();
}
// Сформировать имя для переменной
string make_varname(string base, int ii, int jj)
{
return base + "_" + itoa(ii) + "_" + itoa(jj)
}
int test_global_variables()
{
int i,j;
string basename = "glob_var";
cout << "---------------------------\n";
cout << "test_global_variables\n";
// если ранее не создана переменная с именем "glob_var_0_0", то создать все переменные от "glob_var_0_0" до "glob_var_9_9"
if (var_by_txt("is_exist",make_varname(basename,0,0))==false)
{
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
cout << "объявляем переменную " << make_varname(basename,i,j) << "\n";
var_by_txt("init", make_varname(basename, i, j), "string", "global", "glob value " + itoa(i) + "_" + itoa(j));
}
}
}
string s = glob_var_7_7;
coutvar << s;
glob_var_7_7 = "new value for 7_7";
cout << "Все значения созданных глобальных переменных:\n";
string varname;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
varname = make_varname(basename, i, j);
cout << varname + "="<< var_by_txt("get", varname) << "\n";
}
}
return 0;
}
// тест для локальных переменных
// в отличии от глобальных - локальные переменные должны создаваться в теле функции не глубже других фигурных скобок
// { }
// иначе это понижает область видимости.
// Поэтому для локальных переменных сначала формируем строку с именами переменных через запятую.
// Такой прием возможен и для глобальных переменных.
int test_local_variables()
{
int i, j;
string basename = "local_var";
cout << "---------------------------\n";
cout << "test_local_variables\n";
string string_with_varnames;
cout << "формируем список имен переменных в строку через запятую\n";
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
string_with_varnames += make_varname(basename, i, j) + ",";
}
}
coutvar << string_with_varnames;
// создаем переменные от "local_var_0_0" до "local_var_9_9", инициируем пустой строкой (можно другим значением)
var_by_txt("init", string_with_varnames, "string", "local", "");
// присвоение значений
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
var_by_txt("set", make_varname(basename, i, j), "local value " + itoa(i) + "_" + itoa(j));
}
}
// прямое обращение к переменной
string s = local_var_7_7;
coutvar << s;
local_var_7_7 = "new value for 7_7";
cout << "Все значения созданных локальных переменных:\n";
string varname;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
varname = make_varname(basename, i, j);
cout << varname + "=" << var_by_txt("get", varname) << "\n";
}
}
return 0;
}