С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 672
#1

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

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

Есть файл 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое приложение с использованием шаблонов/конфигов (C++):

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

Cоздание итератора с использованием шаблонов - C++
Привет всем! Возникла следующая проблема в шаблонной функции класса возникоет следующая проблемма: expected `;' before 'p' ...

Переписать код с использованием шаблонов - C++
Помогите переписать код через шаблоны , не совсем ясно понимаю , как их в данном случае использовать.. #include &lt;iostream&gt; ...

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

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

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

45
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 672
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
hoggy
6723 / 2908 / 499
Регистрация: 15.11.2014
Сообщений: 6,548
Завершенные тесты: 1
30.07.2016, 16:02 #32
Цитата Сообщение от dailydose Посмотреть сообщение
этот "говнокод" становится
не универсальным.
когда нужно поиметь строку в качестве значения.
1
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 672
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
hoggy
6723 / 2908 / 499
Регистрация: 15.11.2014
Сообщений: 6,548
Завершенные тесты: 1
30.07.2016, 16:08 #34
Цитата Сообщение от dailydose Посмотреть сообщение
было бы круто вот так
не нужно.
см #10
1
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 672
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
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
30.07.2016, 16:51 #36
автору темы: киньте мне пример вашего конфига, хотя бы на несколько строк, чтобы мне его не выдумывать. напишу тогда весь код.
1
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 672
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
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
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);
еще видел реализации без указателей, но там набор ваших переменных единым массивом представлять надо, что в вашем случае не очень удобно.
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
30.07.2016, 23:43 #39
Цитата Сообщение от minore Посмотреть сообщение
теперь нам не страшно, что переменная b будет недоступна, когда мы выйдем из этого блока
Это еще почему?
2
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
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
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
31.07.2016, 00:00 #41
Цитата Сообщение от minore Посмотреть сообщение
и в чем подвох?
В UB подвох.
То, что твой код работает - это до поры до времени.
Просто никто еще не успел занять место, которое было у переменной b, и записать туда что-то другое.
Ты разве сам не видишь, что здесь происходит?

Добавлено через 6 минут
Вот чуть-чуть усложним код, и уже вместо 5 выводится почему-то 0.
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
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <stack>
 
#include <vector>
using namespace std;
struct money
{
    string type;
    void *p;
};
int main()
{
    void * p = NULL;
    
    int a;
    std::cin >> a;
    
    if(a == 2)
    {
        int b = 5;
        p = &b;
    }
    if(a == 3)
    {
        double c = 3.14;
        p = &c;
    }
    cout << *((int*)p) << '\n';
    return 0;
}
В консоли вводим 2:
http://rextester.com/DFX68423
Казалось бы, в чем же подвох?
1
Fulcrum_013
Заблокирован
31.07.2016, 03:56 #42
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
все это хранится на стороне сервера), так что есть сомнения в реальной работе твоего чита в сетке
Не сомнения а прямая уверенность что для нормально сделанных игр в которых на серве не экономят работать вообще не будет. По снифу трафа - ты туда нажатые клавиши оно тебе твои координаты. Т.е. что либо подменяя получишь разве что некорректную отрисовку (не соответсвующую тому что в мозгах у сервера) и не более. А по слухам в ближайшее время многое перейдет на еще более веселую схему - ты туда нажатые клавиши оттуда тебе стрим уже отрендеренного видео.
1
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 672
31.07.2016, 06:02  [ТС] #43
Цитата Сообщение от DrOffset Посмотреть сообщение
Казалось бы, в чем же подвох?
В том, что
C++
1
2
3
4
5
if()
{
     int b = 5;
        p = &b;
}
p указывает на адрес переменной b, но так как после выхода из области видимости if(){} переменная b "удаляется", а p по прежнему указывает на тот адрес где была переменная b, но по ходу программы в этот адрес уже может записаться другое значение, т.к. оно ни кем не занятно. так?

Добавлено через 3 минуты
Цитата Сообщение от 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 <fstream>
#include <string>
#include <list>
#include <stack>
 
#include <vector>
using namespace std;
struct money
{
    string type;
    void *p;
};
int main()
{
    void * p = NULL;
    
    int a;
    std::cin >> a;
    
    if(a == 2)
    {
        int b = 5;
        p = &b;
        cout << *((int*)p) << '\n';
    }
    cout << *((int*)p) << '\n';
    if(a == 3)
    {
        double c = 3.14;
        p = &c;
    }
    cout << *((int*)p) << '\n';
    return 0;
}
Compilation time: 0.62 sec, absolute running time: 0.13 sec, cpu time: 0 sec, memory peak: 3 Mb, absolute service time: 0,77 sec
5
4200608
4200458
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
31.07.2016, 11:04 #44
Цитата Сообщение от dailydose Посмотреть сообщение
так?
Да.
1
Knuckles124
2 / 2 / 2
Регистрация: 05.07.2016
Сообщений: 11
31.07.2016, 11:12 #45
http://rextester.com/HRIM32691
Цитата Сообщение от C++
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
 
struct Money
{
    std::string type;
    void *ptr;
 
    float fValue;
    int iValue;
    short sValue;
    unsigned char cValue;
};
 
int main()
{
    Money money;
 
    // Step1: Читаем конфиг, получаем тип переменной
    // (на самом деле вместо std::cin должно быть readConfig(structMoney& money)
    std::cout << "Enter type: float/int/short/byte" << std::endl;
    std::cin >> money.type;
 
    // Step:2 Получили тип, теперь делаем манипуляции, зависящие от типа
    if (money.type == "float")
    {
        money.fValue = 13500.0;
        money.ptr = &money.fValue;
    }
 
    else if (money.type == "int")
    {
        money.iValue = 1234567;
        money.ptr = &money.iValue;
    }
 
    else if (money.type == "short")
    {
        money.sValue = 257;
        money.ptr = &money.sValue;
    }
 
    else if (money.type == "byte")
    {
        money.cValue = 38;
        money.ptr = &money.cValue;
    }
 
    // Step 3: здесь какой-то код ,..,
    /*         Place your code here */
 
    // Step 4: где-то далеко-далеко абсолюнто в другом месте,
    //         возможно даже в другом файле,
    //         уже работаем с нужным значением
    if (money.type == "float")
    {
        std::cout << *(float*)money.ptr << std::endl;
    }
 
    else if (money.type == "int")
    {
        std::cout << *(int*)money.ptr << std::endl;
    }
 
    else if (money.type == "short")
    {
        std::cout << *(short*)money.ptr << std::endl;
    }
 
    else if (money.type == "byte")
    {
        // static_cast просто для вывода.
        // Если выводить char в консоль/на экран,
        // то выведится не его значение,
        // а символ, который соотвествует этому значению
        // ASCII (American Standard Code for Information Interchange)
 
        // Напримеp:
        // число 38 - его символ &
        // число 83 - его символ S
 
        std::cout << static_cast<short>(*(unsigned char*)money.ptr) << std::endl;
        std::cout << *(unsigned char*)money.ptr << std::endl;
    }
    else 
        std::cout << "Конфиг сломан, GG WP" << std::endl;
    
    return 0;
}
Добавлено через 1 минуту
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include "Hero.h"
 
int main()
{
    Hero masterYoda;
 
    masterYoda.addInfo(HERO_INFO_HEALTH);
    masterYoda.addInfo(HERO_INFO_ARMOUR);
    masterYoda.addInfo(HERO_INFO_MONEY);
 
    masterYoda.printInfo();
 
    masterYoda.testTypes();
    
    return 0;
}
Цитата Сообщение от Hero.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
50
51
52
53
54
55
56
57
58
59
60
61
#pragma once
#ifndef HERO_H
#define HERO_H
#include <string>
 
enum HERO_INFO { HERO_INFO_HEALTH, HERO_INFO_ARMOUR, HERO_INFO_MONEY };
 
class Hero
{
public:
    Hero();
    ~Hero();
 
    void printInfo();
    void addInfo(HERO_INFO info);
    void testTypes();
 
private:
    struct Health
    {
        std::string type;
        void *ptr;
 
        float fValue;
        int iValue;
        short sValue;
        unsigned char cValue;
    };
    struct Armour
    {
        std::string type;
        void *ptr;
 
        float fValue;
        int iValue;
        short sValue;
        unsigned char cValue;
    };
    struct Money
    {
        std::string type;
        void *ptr;
 
        float fValue;
        int iValue;
        short sValue;
        unsigned char cValue;
    };
 
    Health hp;
    Armour ap;
    Money ma;
 
    template<class S>
    void getValue_(S &structure);
 
    template<class S>
    void putInfo_(S &structure);
};
 
#endif
Цитата Сообщение от Hero.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
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
#include <iostream>
#include "Hero.h"
Hero::Hero() {}
Hero::~Hero() {}
 
void Hero::printInfo()
{
    std::cout << "_out [INFO]" << std::endl;
    std::cout << "You're Health Points: "; getValue_(hp); std::cout << std::endl;
    std::cout << "You're Armour Points: "; getValue_(ap); std::cout << std::endl;
    std::cout << "You're Money  Amount: ";  getValue_(ma); std::cout << std::endl;
}
 
void Hero::addInfo(HERO_INFO info) {
    switch (info)
    {
    case HERO_INFO_HEALTH:
        std::cout << "__in [HEALTH]" << std::endl;
        putInfo_(hp);
        break;
 
    case HERO_INFO_ARMOUR:
        std::cout << "__in [ARMOUR]" << std::endl;
        putInfo_(ap);
        break;
 
    case HERO_INFO_MONEY:
        std::cout << "__in [MONEY]" << std::endl;
        putInfo_(ma);
        break;
    }
}
 
template<class S>
void Hero::getValue_(S &structure)
{
    if (structure.type == "float")
    {
        std::cout << *(float*)structure.ptr;
    }
 
    else if (structure.type == "int")
    {
        std::cout << *(int*)structure.ptr;
    }
 
    else if (structure.type == "short")
    {
        std::cout << *(short*)structure.ptr;
    }
 
    else if (structure.type == "byte")
    {
        std::cout << static_cast<short>(*(unsigned char*)structure.ptr);
        //std::cout << *(unsigned char*)structure.ptr;
    }
    //return -1;
}
 
template<class S>
void Hero::putInfo_(S &structure)
{
    std::cout << "Enter type: float/int/short/byte" << std::endl;
    std::cin >> structure.type;
    std::cout << "Enter value: 13500.0 or 123457 or 12 or etc..." << std::endl;
 
    if (structure.type == "float")
    {
        std::cin >> structure.fValue;
        structure.ptr = &structure.fValue;
    }
 
    else if (structure.type == "int")
    {
        std::cin >> structure.iValue;
        structure.ptr = &structure.iValue;
    }
 
    else if (structure.type == "short")
    {
        std::cin >> structure.sValue;
        structure.ptr = &structure.sValue;
    }
 
    else if (structure.type == "byte")
    {
        // Сначала записываем в shortValue, потом записываем в cValue.
        // Eсли сразу записывать в cValue,
        // То запишется одна первая цифра введеного числа,
        // т.е. вместо ожидаемой записи 238 запишется только 2
        std::cin >> structure.sValue;
        structure.cValue = structure.sValue;
        structure.ptr = &structure.cValue;
    }
    std::cout << std::endl;
}
 
void Hero::testTypes()
{
    std::cout << std::endl;
 
    std::cout << "_out [DEBUG]" << std::endl;
    std::cout << ((hp.type == "int") ? "health is INT" : "health is'nt INT");
    std::cout << std::endl;
 
    std::cout << ((ap.type == "short") ? "armour is short" : "armour is'nt short");
    std::cout << std::endl;
 
    std::cout << ((ma.type == "float") ? "money is float" : "money is'nt float");
    std::cout << std::endl;
 
    Health hz = hp;
    Armour az = ap;
    Money za = ma;
    std::cout << std::endl;
}
Добавлено через 2 минуты
Вывод:
Цитата Сообщение от cmd
Кликните здесь для просмотра всего текста
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
__in [HEALTH]
Enter type: float/int/short/byte
int
Enter value: 13500.0 or 123457 or 12 or etc...
98
 
__in [ARMOUR]
Enter type: float/int/short/byte
byte
Enter value: 13500.0 or 123457 or 12 or etc...
56
 
__in [MONEY]
Enter type: float/int/short/byte
float
Enter value: 13500.0 or 123457 or 12 or etc...
18500.50
 
_out [INFO]
You're Health Points: 98
You're Armour Points: 56
You're Money  Amount: 18500.5
 
_out [DEBUG]
health is INT
armour is'nt short
money is float
 
Для продолжения нажмите любую клавишу . . .
1
31.07.2016, 11:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2016, 11:12
Привет! Вот еще темы с ответами:

Сортировка массива с использованием алгоритма стандартной библиотеки шаблонов Sort() - C++
6.Напишите программу на языке программирования С++, сортирующую массив с использованием алгоритма стандартной библиотеки шаблонов sort().

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

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

Поиск с заменой с использованием шаблонов в середине фрагмента эталона для поиска - C++
Написать программу, обеспечивающую поиск с заменой с использованием шаблонов в середине фрагмента эталона для поиска, то есть, программа...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.