1)при помощи какой функции в С++ создать переменную, либо массив, с произвольным именем ? Может В с++ есть аналог функции execute() как в vbscript ?
2) как обращаться к переменным или массивам, передав AnsiString с частью имени ?
Примечание:
если что, книги у меня есть. Две. Подскажите может быть тему, где копать.
Примечание:
в общем суть вот в чем: я сделал функцию, которая читает текст из текстового файла. Текст представляет собой имена параметров и их значения.
одна функция читает текст, делит его на части: имена параметров и значения, другая делает execute(Param = Value), либо если это массив, то действие чуть посложнее.
на vbscript я реализовал подобную функцию за полчаса.
как можно на С++ реализовать чтение параметров из файла и раздачу значений ? Подкиньте хотяб идею, потому что в С я новичок
Примечание:
Чтение на С++ я уже сделал, а вот с присвоением значений чтото задумался.
Примечание:
Спасибо за хорошие ответы, жаль это не совсем то, что мне нужно.
Я сделал на С функцию чтения данных из текстового файла.
Мой файл очень прост:
------------------------------------------------------------------------
menuThisChoice = "главное меню, 2параметр"
menuThisIndex = "0"
filterChoice = "все"
sortingChoice = "по дате добавления"
------------------------------------------------------------------------
В нем содержатся некоторые переменные, которых я даже не создавал в программе. Дальше есть функция <Read> которая читает файл и мои комманды.
Весь текст считывается по одному знаку и помещается в массив Words в элемент под номером WordsIndex. Каждый символ сравнивнивается с массивом ключевых символов, при совпадении с которыми происходит действие: объявление типа данных (слова или символы разметки). Если тип отличается от предыдущего, получается изменение типа данных и WordsIndex увеличивается на единицу. Все последующие считываемые символы присваиваются в words[wordsArray+1], т.е. следующий элемент массива words. Таким образом происходит разделение нужных мне слов и не нужных знаков разметки. Все слова в итоге оказываются друг от друга через один индекс и символы разметки также. Т.е. если все слова находятся в четных элементах массива, то символы разметки в нечетных.
Применительно к моему файлу получается следующее:
------------------------------------------------------------------------
<menuThisChoice> < = "> <главное меню> <, > <2параметр> <"
><menuThisIndex> < = "> <0> <"
>filterChoice> < = "> <все> <"
>sortingChoice> < = "> <по дате добавления> <">
------------------------------------------------------------------------
Примечание:
вот реализация функции
char s[2]; //временный контейнер для считанных знаков
AnsiString letter; //контейнер для того же
AnsiString lettersProfile[6][10][3]; //профили шаблонов знаков, для выполнения действий
int lettersProfileIndex; //индекс для зменения профилей
AnsiString lettersType; //текущий тип: слово или знаки разметки
AnsiString lettersLastType; //предыдущий тип
AnsiString words[10000]; //массив для разделенного текста, нечетных элементах знаки разметки, в четных слова.
int wordsIndex; //индекс массива слов для управления разделением
//профили определения типов данных
//1. Знаки разметки
lettersProfile[1][1][1] = "\n";
lettersProfile[1][1][2] = "symbols";
lettersProfile[1][2][1] = " ";
lettersProfile[1][2][2] = "symbols";
lettersProfile[1][3][1] = "=";
lettersProfile[1][3][2] = "symbols";
lettersProfile[1][4][1] = "/";
lettersProfile[1][4][2] = "symbols";
lettersProfile[1][4][3] = "4";
lettersProfile[1][5][1] = "|";
lettersProfile[1][5][2] = "symbols";
lettersProfile[1][5][3] = "3";
lettersProfile[1][6][1] = '"';
lettersProfile[1][6][2] = "symbols";
lettersProfile[1][6][3] = "2";
lettersProfile[1][7][1] = "$";
lettersProfile[1][7][2] = "symbols";
lettersProfile[1][7][3] = "5";
lettersProfile[1][8][1] = " ";
lettersProfile[1][9][1] = "anything else";
lettersProfile[1][9][2] = "words";
//2. слова
lettersProfile[2][1][1] = ",";
lettersProfile[2][1][2] = "symbols";
lettersProfile[2][2][1] = " ";
lettersProfile[2][2][2] = "symbols";
lettersProfile[2][3][1] = '"';
lettersProfile[2][3][2] = "symbols";
lettersProfile[2][3][3] = "1";
lettersProfile[2][4][1] = " ";
lettersProfile[2][5][1] = "anything else";
lettersProfile[2][5][2] = "words";
есть и еще профили для комментариев, гиперпараметров, сложных комманд, но это не суть важно.
Примечание:
Дальше сама функция:
void TForm1::read(AnsiString filename)
{
lettersProfileIndex = 1;
wordsIndex = 0;
FILE *F;
F = fopen("D:/MyProjects/actions.txt", "rt");
do
{
letter = fgets(s, 2, F);
if (feof(F)) break;
//блок распознавания типов данных
for (int i = 1; i <= 10; i++) {
if (letter == lettersProfile[lettersProfileIndex][i][1] || lettersProfile[lettersProfileIndex][i][1] == "anything else") {
if (lettersProfile[lettersProfileIndex][i][2] != "") {
lettersType = lettersProfile[lettersProfileIndex][i][2];
}
if (lettersProfile[lettersProfileIndex][i][3] != "") {
lettersProfileIndex = StrToInt(lettersProfile[lettersProfileIndex][i][3]);
}
break;
}
}
//блок расшифровки комманд
if (lettersType != lettersLastType) {
wordsIndex++;
words[wordsIndex] = "";
}
lettersLastType = lettersType;
words[wordsIndex] = words[wordsIndex] + letter;
}
while (true);
lettersType = "";
lettersLastType = "";
fclose(F);
}
В общем я получаю words[i] = имя переменной которую нужно создать
И words[i+1] = значение которое нужно присвоить
В vbscript у меня был ехеcute(words[i]& “ = “ words[i+1]) и все присваивалось и создавалось очень просто.
Как в С можно реализовать такую автоматизацию ?, потому что присваивать вручную значения тысячам переменных как то даже стыдно. Ведь есть компьютер, пусть он сам за меня все делает.
PS. Я конечно понимаю, что в С++ так функции не пишут, и здесь неканает vbscriptовская логика, но я еще только учусь. А еще странно что на задрипаном vbscript есть возможность такой абстрактизации, а в С++ нету.