Объявление переменных с идентификаторами, формируемыми в тексте программы.

Вызов:

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;

}