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

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

Войти
Регистрация
Восстановить пароль
 
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
#1

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

07.11.2012, 16:04. Просмотров 594. Ответов 6
Метки нет (Все метки)

Нужно сделать сохранение данных в бинарном виде в векторе. Я решил сделать так:

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

Функции типа void - C++
Добрый вечер, у меня есть проблема, которую я не могу решить. Есть функция типа void. Суть этой функции в том, чтобы печетать некие...

Указатель типа void c++ - C++
Haпример указатель типа void*ptr char *p void *ptr="abs"; p=((char *)ptr);Так указатель неопределённого типа, присваивается к...

Указатель типа void - C++
Добрый день. enum Type { Double, Int, Float }; void func(int k,enum Type t,...) { void *pv; pv = (...); ... }

Обобщенный указатель типа void - C++
В приложенной картинке рассказывается о динамическом распределении памяти в С. Сказано, что функция malloc() возвращает указатель типа...

Динамический массив типа void - C++
Объявлен двумерный массив в глобальных: void **buf; Размер как и тип определяются в рантайме.. Нужно чтоб это заработало: buf = new...

Значение типа "void" нельзя использовать для инициализации сущности типа "int" - C++
Не понимаю, почему компилятор считает, что s.pop() это значение типа "void".. он же вернет этот удаляемый элемент? Как исправить? void...

6
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
07.11.2012, 16:06 #2
( bool* )
0
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 16:14  [ТС] #3
Тогда получаю такое:
1>.\Store.cpp(133) : warning C4800: 'bool *' : forcing value to bool 'true' or 'false' (performance warning)
Это разве нормально?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
07.11.2012, 16:22 #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
0
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 16:34  [ТС] #5
Хм, тоже пока писал код подумал об этом. Но благополучно забыл. Так как быть? Как мне быть? Мне нужно сохранить bool значение и потом его вернуть (не указатель на него)
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
07.11.2012, 16:42 #6
rus_phantom, Нужно его сохранить именно под указателем на void?
1
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
07.11.2012, 17:04  [ТС] #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;
}
0
07.11.2012, 17:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 17:04
Привет! Вот еще темы с ответами:

Как вводить функции типа void - C++
прошу помощи я полнейший ноль в программировании а в универе ездят этими прогами хоть и не по профилю совсем задание такое вот есть...

Аналог break для функции типа void - C++
надо сделать так , на месте break функция ничего не сделала void push(Stack *tmp, int element) { Stack *curr, *prev; ...

Как в if прописать условие на функцию типа void? - C++
Собственно, такой вопрос: Как в if прописать условие на функцию типа void, в которой в добавок ко всему присутствует еще и указатель? ...

Прерывание работы рекурсионной функции типа void - C++
Есть рекурсионная функция, имеющая нечто общее с функцией ниже: void function test(int b) { int a; a = b; a++; if (a == 10) ...


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

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

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