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

Данные типа void* - C++

Восстановить пароль Регистрация
 
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 16:04     Данные типа void* #1
Нужно сделать сохранение данных в бинарном виде в векторе. Я решил сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct StoreData {
    shared_str name;
    void* data;
    TypeOfData type;
};
 
void CStoreHouse::add_bool(LPCSTR name,bool b)
{
    R_ASSERT3(data.find(name)!=data.end(),"Can't save data with the same name ",name);
    StoreData d;
    d.name = name;
    d.data = &b;
    d.type = lua_bool;
    data[name] = d;
}
Сохраняется вроде нормально, а вот загрузка не дает скомпилироваться программе:

C++
1
2
3
4
5
bool CStoreHouse::get_bool(LPCSTR name)
{
    R_ASSERT3(!data_exist(name),"Data doesn't exist! ",name);
    return (*data[name].data);
}
Выдает ошибку: 1>.\Store.cpp(133) : error C2100: illegal indirection
133 строка: return (*data[name].data);

Как тогда преобразовать void* в bool?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
07.11.2012, 16:06     Данные типа void* #2
( bool* )
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 16:14  [ТС]     Данные типа void* #3
Тогда получаю такое:
1>.\Store.cpp(133) : warning C4800: 'bool *' : forcing value to bool 'true' or 'false' (performance warning)
Это разве нормально?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.11.2012, 16:22     Данные типа void* #4
C++
1
static_cast< bool * >( data );
Добавлено через 2 минуты
И один момент не понятен - Вам нужно вернуть сам объект типа bool или указатель на bool?

Добавлено через 2 минуты
Все, увидел. Но вся проблема в том, что в этой функции:

Цитата Сообщение от rus_phantom Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
void CStoreHouse::add_bool(LPCSTR name,bool b)
{
* * R_ASSERT3(data.find(name)!=data.end(),"Can't save data with the same name ",name);
* * StoreData d;
* * d.name = name;
* * d.data = &b;
* * d.type = lua_bool;
* * data[name] = d;
}
После ее завершения, переменная b уничтожается. И data указывает не пойми куда. Вы с 99% вероятностью получите ошибку Access Violation
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 16:34  [ТС]     Данные типа void* #5
Хм, тоже пока писал код подумал об этом. Но благополучно забыл. Так как быть? Как мне быть? Мне нужно сохранить bool значение и потом его вернуть (не указатель на него)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.11.2012, 16:42     Данные типа void* #6
rus_phantom, Нужно его сохранить именно под указателем на void?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 17:04     Данные типа void*
Еще ссылки по теме:

C++ В чем особенность функции типа void от других типов?
Как вводить функции типа void C++
Использование указателей типа VOID C++

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

Или воспользуйтесь поиском по форуму:
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 17:04  [ТС]     Данные типа void* #7
Можно как угодно, но так как я собирался сохранять не только bool значения, но и значения других типов, то я не знаю больше путей кроме void*

Добавлено через 10 минут
Всем спасибо, я сам разобрался. Сделал метод get(LPCSTR name, void* ptr) который брал любое количество данных их буффера и переделал метод get_bool на такой:
C++
1
2
3
4
5
6
bool CStoreHouse::get_bool(LPCSTR name)
{
    bool tmp;
    get(name,&tmp);
    return tmp;
}
Yandex
Объявления
07.11.2012, 17:04     Данные типа void*
Ответ Создать тему
Опции темы

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