671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
1

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

29.07.2016, 12:00. Показов 1851. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть файл 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

Это работает, но:
-Каждый раз нужно менять содержимое этого файла под конкретную игру
-Каждый раз после внесения изменений в этот конфиг нужно снова компилировать приложение
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2016, 12:00
Ответы с готовыми решениями:

Динамическое построение формы из шаблонов
Здравствуйте! По заданию мне необходимо создать программу по составлению отчетности. Шаблонов...

Создание калькулятора с использованием шаблонов
Добрый день! Надо создать калькулятор. Каждую кнопку калькулятора хочу реализовать с помощью...

Переписать код с использованием шаблонов
Помогите переписать код через шаблоны , не совсем ясно понимаю , как их в данном случае...

Задача с использованием шаблонов классов в С++
Помогите пожалуйста подредактировать задачу: Разработайте программу, которая бы выполняла одно из...

45
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
30.07.2016, 12:57  [ТС] 21
Author24 — интернет-сервис помощи студентам

Не по теме:

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

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


Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Может я Вас разочарую, но этого не всегда достаточно
а что еще может понадобиться?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
30.07.2016, 13:05 22
При всем при том, игра написана на UnrealScript, а в нем стандартные типы, как я понял реализованы через классы (как в C#), ковырялся я как-то ради интереса отладчиком в игре, так там вся инфа численная проходит через сопроцессор, т.е. что int , что double - все вычисляется в сопроцессоре. Пытался-пытался, да и плюнул я на все это, мутно там все...

Добавлено через 5 минут
Цитата Сообщение от dailydose Посмотреть сообщение
а что еще может понадобиться?
чтобы реально нормальные читы писать нужно уметь дизассемблировать, потому что взлом игр - это частный случай крекинга, нужно знать win api, также если разрабы предоставляют sdk по игре, можно писать читы и с его помощью (например всякие валхаки, аимы, спидхаки в контре пишутся с использованием вызовов функций source sdk)
1
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
30.07.2016, 14:01 23
Кстати, по теме вашего вопроса: я тут подумал, а почему бы не сделать так:
1) создаем класс, в котором изначально все поля имеют максимальный тип (double)
2) создаем функцию - конвертор. в нее передаем 2 параметра: считанный тип переменной, в которую нужно перевести (int) , например, и т.д. и второй аргумент - сама переменная, обязательно передавать по ссылке, не по значению.
в теле функции конвертируем: если первый аргумент double - т.е. совпадает с максимальным, просто возвращаем, ничего не делая.если там другое слово - ну тут уже без if не обойтись, хотя типов переменных сравнительно немного.
далее читаем файл, после прочтения каждой строки вызываем нашу функцию преобразователь с соответствующими параметрами. почему бы и нет?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.07.2016, 15:11 24
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от minore Посмотреть сообщение
Кстати, по теме вашего вопроса: я тут подумал, а почему бы не сделать так:
не расширяемый говнокод.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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;
}
Миниатюры
Динамическое приложение с использованием шаблонов/конфигов  
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
30.07.2016, 15:21 26
зато рабочий и пишется за 2 секунды.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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;
};
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
30.07.2016, 15:30 28
я про cin.getline говорил. в переменной double или float мы можем хранить 4, а в переменной int - 3.2456 никак. ну если разобрались - хорошо.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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
Для продолжения нажмите любую клавишу . . .
Не знаю что из этого выйдет... Позже отпишусь
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
30.07.2016, 15:53 30
Повторюсь, Моя версия подходит к первоначальным заданным вами условиям: имеем конфигурационный файл, каждая запись которого состоит из 2 строк:
тип переменной
значение.
чтение файла происходит с помощью библиотеки <iostream>.
и желание сделать так, чтобы h файл не трогать, и программу не собирать каждый раз.
поскольку сначала определяется тип переменной, а уж потом присваивается значение, этот "говнокод" становится универсальным. при использовании другого подхода к извлечению данных из файла данный метод может оказаться абсолютно не работоспособным.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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...);
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.07.2016, 16:02 32
Цитата Сообщение от dailydose Посмотреть сообщение
этот "говнокод" становится
не универсальным.
когда нужно поиметь строку в качестве значения.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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;
но так переменная создаётся ЛОКАЛЬНО, внутри {}
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.07.2016, 16:08 34
Цитата Сообщение от dailydose Посмотреть сообщение
было бы круто вот так
не нужно.
см #10
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
30.07.2016, 16:51 36
автору темы: киньте мне пример вашего конфига, хотя бы на несколько строк, чтобы мне его не выдумывать. напишу тогда весь код.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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;
Это конечно же не выход, но вариант. Причём ужасный(!) вариант
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
30.07.2016, 22:40 38
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Ну вот на других ресурсах предлагают примерно следующее:
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);
еще видел реализации без указателей, но там набор ваших переменных единым массивом представлять надо, что в вашем случае не очень удобно.
1
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
30.07.2016, 23:43 39
Цитата Сообщение от minore Посмотреть сообщение
теперь нам не страшно, что переменная b будет недоступна, когда мы выйдем из этого блока
Это еще почему?
2
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
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;
}
и в чем подвох?
1
30.07.2016, 23:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2016, 23:47
Помогаю со студенческими работами здесь

Cоздание итератора с использованием шаблонов
Привет всем! Возникла следующая проблема в шаблонной функции класса возникоет следующая...

Выбор валидной функции с использованием шаблонов
Допустим у нас есть две шаблонные функции. Я хочу сделать так, чтобы в случае если может быть...

Среднее геометрическое с использованием перегруженных функций и шаблонов
Уважаемые форумчане, помогите написать программу: Нужно разработать программу определяющую среднее...

Не получается правильно объявить friend перегрузку оператора с использованием шаблонов
Всем привет! Посмотрите код и во вложениях скриншот ошибок, и, пожалуйста, подскажите, что сделал...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru