Форум программистов, компьютерный форум CyberForum.ru

Динамическое приложение с использованием шаблонов/конфигов - C++

Восстановить пароль Регистрация
 
 
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
29.07.2016, 12:00     Динамическое приложение с использованием шаблонов/конфигов #1
Есть файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    int number;
    std::cin >> number;
 
    if(number == 1)
        // read file First.cfg
    else if(number == 2)
        // read file Two.cfg
    else
        // write error
 
    MYTYPE variable = myData;
    std::cout << variable << std::endl;
    return 0;
}
и есть так называемые конфиг файлы
Цитата Сообщение от First.cfg
MYTYPE = int
myData = 1234567
Цитата Сообщение от Two.cfg
MYTYPE = unsigned char
myData = 15
Как можно организовать данную затею?

з.ы. для полноты картины:
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    /*
        здесь код для получения нужных значений из конфига
    */
    struct Character {
        TYPE_HEALTH hp;
        TYPE_ARMOUR ap;
        TYPE_MONEY money;
    };
    struct modules { unsigned long health, armour, money, magazine, ammo, gren; };
 
    DWORD offsetsHealth[] = { OFFSETS_HEALTH };
    DWORD offsetsArmour[] = { OFFSETS_ARMOUR };
    DWORD offsetsMoney[] = { OFFSETS_MONEY };
    modules module;
 
    module.health = getModule(MODULE_HEALTH, pId);
    module.armour = getModule(MODULE_ARMOUR, pId);
    module.money = getModule(MODULE_MONEY, pId);
 
    ptr.health = getPointer(module.health, ADR_HEALTH, offsetsHealth, cnt.health);
    ptr.armour = getPointer(module.armour, ADR_ARMOUR, offsetsArmour, cnt.armour);
    ptr.money = getPointer(module.money, ADR_MONEY, offsetsMoney, cnt.money);
 
    /*
        здесь остальной код программы
    */
 
    std::cin.get();
    return 0;
}

gtavc.cfg
Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ //
GAME_PROCESS = "gtavc.exe"
TRAINER_TITLE = "GTA Vice City Trainer +3"

// x86 = 32
// x64 = 64
CPU_BIT = 32
// +++++++++++++++++++++++++++++++ //

// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
TYPE_HEALTH =  int
ADR_HEALTH = 0x00168A4C
MODULE_HEALTH = "Core.dll"
OFFSETS_HEALTH = 0x480

TYPE_ARMOUR = float
ADR_ARMOUR = 0x00168A4C
MODULE_ARMOUR = "Core.dll"
OFFSETS_ARMOUR = 0x774

TYPE_MONEY float
ADR_MONEY = 0x1498EA2
MODULE_MONEY = "gtavc.exe"
OFFSETS_MONEY = 0x3b4

hl.cfg
Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ //
GAME_PROCESS = "hl.exe"
TRAINER_TITLE = "Half-Life Trainer +3"

// x86 = 32
// x64 = 64
CPU_BIT = 32
// +++++++++++++++++++++++++++++++ //

// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
TYPE_HEALTH = unsigned char
ADR_HEALTH = 0x00768B4C
MODULE_HEALTH = "hl.exe"
OFFSETS_HEALTH = 0x123

TYPE_ARMOUR = short
ADR_ARMOUR = 0x00668A42
MODULE_ARMOUR = "hl.dll"
OFFSETS_ARMOUR = 0x5a0

TYPE_MONEY = float
ADR_MONEY = 0x2428EA1
MODULE_MONEY = "hl.exe"
OFFSETS_MONEY = 0x3b4


Добавлено через 6 минут
На данный момент использую подключение файла config.h с таким вот содержимым
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma once
#ifndef SETTINGS_H
#define SETTINGS_H
 
 
// +++++++++++++++++++++++++++++++ //
#define GAME_PROCESS "KFGame.exe"
#define TRAINER_TITLE "Killing Floor 2 Trainer +3"
 
// x86 = 32
// x64 = 64
#define CPU_BIT 64
// +++++++++++++++++++++++++++++++ //
 
// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x021817C8
#define MODULE_HEALTH "KFGame.exe"
#define OFFSETS_HEALTH 0x714,0x0,0x68,0x460,0x384
 
#define TYPE_ARMOUR unsigned char
#define ADR_ARMOUR 0x021817C8
#define MODULE_ARMOUR "KFGame.exe"
#define OFFSETS_ARMOUR 0x714,0x0,0x68,0x460,0xb40
 
#define TYPE_MONEY float
#define ADR_MONEY 0x021817C8
#define MODULE_MONEY "KFGame.exe"
#define OFFSETS_MONEY 0x714,0x0,0x68,0x254,0x244
 
#endif

Это работает, но:
-Каждый раз нужно менять содержимое этого файла под конкретную игру
-Каждый раз после внесения изменений в этот конфиг нужно снова компилировать приложение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 12:00     Динамическое приложение с использованием шаблонов/конфигов
Посмотрите здесь:

C++ Cоздание итератора с использованием шаблонов
Программирование задачи на двумерные и одномерные массивы с использованием шаблонов C++
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 2
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 3
Задача с использованием шаблонов классов в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 12:57  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #21

Не по теме:

Ferrari F1,
спасибо, очень ценная информация

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
твоего чита в сетке
эм...
Цитата Сообщение от dailydose Посмотреть сообщение
с друзьями на разных машинах в сингл-плеере тестили - всё ок


Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Может я Вас разочарую, но этого не всегда достаточно
а что еще может понадобиться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ferrari F1
Нарушитель
294 / 280 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
30.07.2016, 13:05     Динамическое приложение с использованием шаблонов/конфигов #22
При всем при том, игра написана на UnrealScript, а в нем стандартные типы, как я понял реализованы через классы (как в C#), ковырялся я как-то ради интереса отладчиком в игре, так там вся инфа численная проходит через сопроцессор, т.е. что int , что double - все вычисляется в сопроцессоре. Пытался-пытался, да и плюнул я на все это, мутно там все...

Добавлено через 5 минут
Цитата Сообщение от dailydose Посмотреть сообщение
а что еще может понадобиться?
чтобы реально нормальные читы писать нужно уметь дизассемблировать, потому что взлом игр - это частный случай крекинга, нужно знать win api, также если разрабы предоставляют sdk по игре, можно писать читы и с его помощью (например всякие валхаки, аимы, спидхаки в контре пишутся с использованием вызовов функций source sdk)
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 14:01     Динамическое приложение с использованием шаблонов/конфигов #23
Кстати, по теме вашего вопроса: я тут подумал, а почему бы не сделать так:
1) создаем класс, в котором изначально все поля имеют максимальный тип (double)
2) создаем функцию - конвертор. в нее передаем 2 параметра: считанный тип переменной, в которую нужно перевести (int) , например, и т.д. и второй аргумент - сама переменная, обязательно передавать по ссылке, не по значению.
в теле функции конвертируем: если первый аргумент double - т.е. совпадает с максимальным, просто возвращаем, ничего не делая.если там другое слово - ну тут уже без if не обойтись, хотя типов переменных сравнительно немного.
далее читаем файл, после прочтения каждой строки вызываем нашу функцию преобразователь с соответствующими параметрами. почему бы и нет?
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,798
Завершенные тесты: 1
30.07.2016, 15:11     Динамическое приложение с использованием шаблонов/конфигов #24
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от minore Посмотреть сообщение
Кстати, по теме вашего вопроса: я тут подумал, а почему бы не сделать так:
не расширяемый говнокод.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 15:18  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<Windows.h>
 
#define TYPE_HEALTH int
#define TYPE_ARMOUR float
 
struct Hero
{
    TYPE_HEALTH hp;
    TYPE_ARMOUR ap;
};
 
int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5892);
    Hero hero;
 
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA480, &hero.hp, sizeof(TYPE_HEALTH), NULL);
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA774, &hero.ap, sizeof(TYPE_ARMOUR), NULL);
 
    std::cout << "Your health = " << hero.hp << std::endl;
    std::cout << "Your armour = " << hero.ap << std::endl;
    return 0;
}
Миниатюры
Динамическое приложение с использованием шаблонов/конфигов  
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 15:21     Динамическое приложение с использованием шаблонов/конфигов #26
зато рабочий и пишется за 2 секунды.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 15:27  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #27
minore,
Цитата Сообщение от minore Посмотреть сообщение
) создаем класс, в котором изначально все поля имеют максимальный тип (double)
пробовал заменить TYPE_HEALTH и TYPE_ARMOUR на double... в итоге ReadProcessMemory неправильно считывает инфу

Цитата Сообщение от main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<Windows.h>
 
//#define TYPE_HEALTH int
//#define TYPE_ARMOUR float
 
struct Hero
{
    double hp;
    double ap;
};
 
int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5892);
    Hero hero;
 
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA480, &hero.hp, sizeof(int), NULL);
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA774, &hero.ap, sizeof(float), NULL);
 
    std::cout << "Your health = " << hero.hp << std::endl;
    std::cout << "Your armour = " << hero.ap << std::endl;
    return 0;
}
Your health = -9.25596e+61
Your armour = -9.25596e+61
Для продолжения нажмите любую клавишу . . .

Добавлено через 5 минут
кстати, была похожая идея, но вместо double использовать void*
C++
1
2
3
4
5
struct Hero
{
    void* hp;
    void* ap;
};
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 15:30     Динамическое приложение с использованием шаблонов/конфигов #28
я про cin.getline говорил. в переменной double или float мы можем хранить 4, а в переменной int - 3.2456 никак. ну если разобрались - хорошо.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 15:32  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #29
Собственно вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<Windows.h>
 
//#define TYPE_HEALTH int
//#define TYPE_ARMOUR float
 
struct Hero
{
    void* hp;
    void* ap;
};
 
int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5892);
    Hero hero;
    int iTmp;
    float fTmp;
 
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA480, &iTmp, sizeof(int), NULL);
    hero.hp = &iTmp;
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA774, &fTmp, sizeof(float), NULL);
    hero.ap = &fTmp;
 
    std::cout << "Your health = " << *((int*)hero.hp) << std::endl;
    std::cout << "Your armour = " << *((float*)hero.ap) << std::endl;
    CloseHandle(hProc);
    return 0;
}
Your health = 69
Your armour = 60.25
Для продолжения нажмите любую клавишу . . .
Не знаю что из этого выйдет... Позже отпишусь
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 15:53     Динамическое приложение с использованием шаблонов/конфигов #30
Повторюсь, Моя версия подходит к первоначальным заданным вами условиям: имеем конфигурационный файл, каждая запись которого состоит из 2 строк:
тип переменной
значение.
чтение файла происходит с помощью библиотеки <iostream>.
и желание сделать так, чтобы h файл не трогать, и программу не собирать каждый раз.
поскольку сначала определяется тип переменной, а уж потом присваивается значение, этот "говнокод" становится универсальным. при использовании другого подхода к извлечению данных из файла данный метод может оказаться абсолютно не работоспособным.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 16:00  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #31
Цитата Сообщение от minore Посмотреть сообщение
Повторюсь, Моя версия подходит к первоначальным заданным вами условиям: имеем конфигурационный файл, каждая запись которого состоит из 2 строк:
тип переменной
значение.
чтение файла происходит с помощью библиотеки <iostream>.
и желание сделать так, чтобы h файл не трогать, и программу не собирать каждый раз.
поскольку сначала определяется тип переменной, а уж потом присваивается значение, этот "говнокод" становится универсальным. при использовании другого подхода к извлечению данных из файла данный метод может оказаться абсолютно не работоспособным.
похоже вы единственный, кто понял суть задачи

Добавлено через 29 секунд
но как реализовать ваш вариант с использованием double - не понял...

TYPE_HEALTH int
TYPE_ARMOUR float
из конфига получаю тип переменной, а потом читаю в неё из памяти
TYPE_HEALTH health;
TYPE_ARMOUR armour;
readprocessmemory(....&health...);
readprocessmemory(....&armour...);
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,798
Завершенные тесты: 1
30.07.2016, 16:02     Динамическое приложение с использованием шаблонов/конфигов #32
Цитата Сообщение от dailydose Посмотреть сообщение
этот "говнокод" становится
не универсальным.
когда нужно поиметь строку в качестве значения.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 16:05  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #33
Цитата Сообщение от hoggy Посмотреть сообщение
когда нужно поиметь строку в качестве значения.
повторюсь, проблемы нет прочитать строку из файла, нужно прочитать строку и создать переменную. допустим прочитали "int" создаем int var; прочитали "float" - создаеём float var;

Добавлено через 1 минуту
было бы круто вот так
C++
1
2
3
4
5
6
7
8
9
10
if(...)
{
     int health =100;
}
else if(...)
{
     short health =100;
}
 
cout << health;
или
C++
1
2
3
4
5
6
7
8
9
10
if(...)
{
     typedef mytype int;
}
else if(...)
{
     typedef mytype short;
}
mytype health =100;
cout << health;
но так переменная создаётся ЛОКАЛЬНО, внутри {}
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,798
Завершенные тесты: 1
30.07.2016, 16:08     Динамическое приложение с использованием шаблонов/конфигов #34
Цитата Сообщение от dailydose Посмотреть сообщение
было бы круто вот так
не нужно.
см #10
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 16:15  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #35
Цитата Сообщение от hoggy Посмотреть сообщение
см #10
C++
1
2
3
4
    tools::ini config("sample.ini");
    const std::string& name = config["name"];
    const int health        = config["health"];
    const float speed       = config["speed"];
то есть по вашему у меня конфиг такой????
Цитата Сообщение от sample.ini
name = dailydose
health = 100
speed = 250.0
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 16:51     Динамическое приложение с использованием шаблонов/конфигов #36
автору темы: киньте мне пример вашего конфига, хотя бы на несколько строк, чтобы мне его не выдумывать. напишу тогда весь код.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
30.07.2016, 22:24  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #37
Цитата Сообщение от minore Посмотреть сообщение
киньте мне пример вашего конфига
Цитата Сообщение от settings.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once
#ifndef SETTINGS_H
#define SETTINGS_H
 
 
// +++++++++++++++++++++++++++++++ //
#define GAME_PROCESS "KFGame.exe"
#define TRAINER_TITLE "Killing Floor 2 Trainer +3"
 
// x86 = 32
// x64 = 64
#define CPU_BIT 64
// +++++++++++++++++++++++++++++++ //
 
// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x021817C8
#define MODULE_HEALTH "KFGame.exe"
#define OFFSETS_HEALTH 0x714,0x0,0x68,0x460,0x384
 
#define TYPE_ARMOUR unsigned char
#define ADR_ARMOUR 0x021817C8
#define MODULE_ARMOUR "KFGame.exe"
#define OFFSETS_ARMOUR 0x714,0x0,0x68,0x460,0xb40
 
#define TYPE_MONEY float
#define ADR_MONEY 0x021817C8
#define MODULE_MONEY "KFGame.exe"
#define OFFSETS_MONEY 0x714,0x0,0x68,0x254,0x244
 
#define TYPE_MAGAZINE short
#define ADR_MAGAZINE 0x021842B0
#define MODULE_MAGAZINE "KFGame.exe"
#define OFFSETS_MAGAZINE 0x8,0x27c,0x470,0x4a4,0x3ac
 
#define TYPE_AMMO int
#define ADR_AMMO 0x021842B0
#define MODULE_AMMO "KFGame.exe"
#define OFFSETS_AMMO 0x8,0x27c,0x7f4,0x4a4,0x558
 
#define TYPE_GREN unsigned char
#define ADR_GREN 0x021842B0
#define MODULE_GREN "KFGame.exe"
#define OFFSETS_GREN 0x38,0x284,0x49c,0x298
 
#endif
это пока формат не конфига, а обычный header файл, который подключаю
вообще конечный вариант думаю будет такой:
Цитата Сообщение от game_name.cfg
Кликните здесь для просмотра всего текста
Код
[BASE]
GAME_PROCESS = "KFGame.exe"
TRAINER_TITLE = "Killing Floor 2 Trainer +3"

[HEALTH]
TYPE_HEALTH = int
ADR_HEALTH = 0x021817C8
MODULE_HEALTH = "KFGame.exe"
OFFSETS_HEALTH = 0x714,0x0,0x68,0x460,0x384

[ARMOUR]
TYPE_ARMOUR = unsigned char
ADR_ARMOUR = 0x021817C8
MODULE_ARMOUR = "KFGame.exe"
OFFSETS_ARMOUR = 0x714,0x0,0x68,0x460,0xb40
Добавлено через 5 часов 17 минут
Впрочем, вот, выложил исходники на pastebin:
http://pastebin.com/u/dailydose

А вот такой код уже будет стыдно выкладывать на pastebin/github
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
    int number;
    Data data;
 
    std::cout << "Write 1 or 2" << std::endl;
    std::cin >> number;
 
    if (number == 1)
    {
        readConfig("cfg/hl.cfg", data);
    }
    else if (number == 2)
    {
        readConfig("cfg/gtavc.cfg", data);
    }
    else
    {
        return 0;
    }
 
    std::string health = data.hp.substr(14);
    std::string armour = data.ap.substr(14);
    std::string money = data.mp.substr(13);
 
    if (health == "int")
    {
        if (armour == "int")
        {
            if (money == "int")
            {
                Character<int, int, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<int, int, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<int, int, float> character;
                character.someActions();
            }
        }
        else if (armour == "unsigned char")
        {
            if (money == "int")
            {
                Character<int, unsigned char, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<int, unsigned char, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<int, unsigned char, float> character;
                character.someActions();
            }
        }
        else if (armour == "float")
        {
            if (money == "int")
            {
                Character<int, float, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<int, float, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<int, float, float> character;
                character.someActions();
            }
        }
    }
    else if (health == "unsigned char")
    {
        if (armour == "int")
        {
            if (money == "int")
            {
                Character<unsigned char, int, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<unsigned char, int, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<unsigned char, int, float> character;
                character.someActions();
            }
        }
        else if (armour == "unsigned char")
        {
            if (money == "int")
            {
                Character<unsigned char, unsigned char, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<unsigned char, unsigned char, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<unsigned char, unsigned char, float> character;
                character.someActions();
            }
        }
        else if (armour == "float")
        {
            if (money == "int")
            {
                Character<unsigned char, float, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<unsigned char, float, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<unsigned char, float, float> character;
                character.someActions();
            }
        }
    }
    else if (health == "float")
    {
        if (armour == "int")
        {
            if (money == "int")
            {
                Character<float, int, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<float, int, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<float, int, float> character;
                character.someActions();
            }
        }
        else if (armour == "unsigned char")
        {
            if (money == "int")
            {
                Character<float, unsigned char, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<float, unsigned char, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<float, unsigned char, float> character;
                character.someActions();
            }
        }
        else if (armour == "float")
        {
            if (money == "int")
            {
                Character<float, float, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<float, float, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<float, float, float> character;
                character.someActions();
            }
        }
    }

Но по крайней мере он позволяет получить необходимое, т.е. создать переменную с типом, который указан в конфиге
Цитата Сообщение от cfg
C
1
2
TYPE_HEALTH = int
TYPE_ARMOUR = float
Цитата Сообщение от cpp
C++
1
2
3
4
5
6
7
std::string health = read("TYPE_HEALTH");
if(health=="int")
   int var;
else if(health=="float")
   float var;
else if(health=="unsigned char")
   unsigned char var;
Это конечно же не выход, но вариант. Причём ужасный(!) вариант
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 22:40     Динамическое приложение с использованием шаблонов/конфигов #38
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну вот на других ресурсах предлагают примерно следующее:
1) забыть про C++ перейти на python с его eval и другими плюшками.
2) создавать неименованные указатели типа void, ну то есть каждую переменную обыграть как структуру:
[cpp]
struct money
{
string type;
void *p;
};
и так описать каждую переменную в проекте. далее читаем конфиг: прочитали строку, получили тип
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (a =="int")
{
money.name ="int"; // сохраняем тип данных
// читаем дальше, получаем значение соответственно в переменную int
int b;
input << b;
money.p = &b;// выделяем необходимую память под указатель
// теперь нам не страшно, что переменная b будет недоступна, когда мы выйдем из этого блока
}
//также проверяем другие условия
// теперь можем обращаться к переменной так:
cout << *((int*)money.p);
еще видел реализации без указателей, но там набор ваших переменных единым массивом представлять надо, что в вашем случае не очень удобно.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
30.07.2016, 23:43     Динамическое приложение с использованием шаблонов/конфигов #39
Цитата Сообщение от minore Посмотреть сообщение
теперь нам не страшно, что переменная b будет недоступна, когда мы выйдем из этого блока
Это еще почему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2016, 23:47     Динамическое приложение с использованием шаблонов/конфигов
Еще ссылки по теме:

C++ Переписать с использованием шаблонов программу поиска заданного слова в файле
Среднее геометрическое с использованием перегруженных функций и шаблонов C++
Структура для хранения массива произвольного типа с использованием шаблонов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
minore
203 / 77 / 18
Регистрация: 05.02.2015
Сообщений: 458
30.07.2016, 23:47     Динамическое приложение с использованием шаблонов/конфигов #40
оптому что значение нам доступно через указатель )
по крайней мере такой код работает и выводит 5:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
struct money
{
    string type;
    void *p;
};
int main()
{
    void *p = NULL;
    int a = 2;
    if (a == 2)
    {
        int b = 5;
        p = &b;
 
    }
    cout << *((int*)p);
    return 0;
}
и в чем подвох?
Yandex
Объявления
30.07.2016, 23:47     Динамическое приложение с использованием шаблонов/конфигов
Ответ Создать тему
Опции темы

Текущее время: 07:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru