Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> void* <-> char, преобразование 
:(
    Опции темы
Burka
Дата 4.9.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Подскажите как правильно передавать строки через void*

у меня примерно такой код
Код

void func1(void * data)
{
   std::string mystr((char*)data);
   ...
}

void main
{
   func1("primer1") // здесь код работает нормально, строка передается
   char str[100] = "primer2";
   func1(str); //а так уже не передается, как ни пробывал, то есть через переменную не получается передать
}


Это сообщение отредактировал(а) Burka - 4.9.2011, 13:02


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
mes
Дата 4.9.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



сделайте явное приведение..


Это сообщение отредактировал(а) mes - 4.9.2011, 13:05


--------------------
PM MAIL WWW   Вверх
Burka
Дата 4.9.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



черт) видимо промахнулся)) разделом)


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
bems
Дата 4.9.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(Burka @  4.9.2011,  13:05 Найти цитируемый пост)
черт) видимо промахнулся)) разделом) 

переместил


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Burka
Дата 4.9.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(mes @ 4.9.2011,  13:05)
сделайте явное приведение..

если так
 
Код

func1((char *)str);

тоже не работает, при выводе просто пустая строка

Это сообщение отредактировал(а) Burka - 4.9.2011, 13:16


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
volatile
Дата 4.9.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Второй случай должен работать без приведений:
http://liveworkspace.org/code/acfeaa34ac95...1b7018551e2aa8d

Добавлено через 4 минуты и 44 секунды
вот с выводом 
http://liveworkspace.org/code/59009ef57c8f...0db52d96e8ae756

Добавлено через 6 минут и 38 секунд
а кстати первый случай не компилится, так как там константный указатель.

все с точностью до наоборот.  smile 
PM MAIL   Вверх
Burka
Дата 4.9.2011, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(volatile @ 4.9.2011,  13:25)
Второй случай должен работать без приведений:
http://liveworkspace.org/code/acfeaa34ac95...1b7018551e2aa8d

у меня выводит что то вроде "ММММММММММММММММММММММММММ" вместо той строки что надо

в liweworkspace не получается провеить) не компилит


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
volatile
Дата 4.9.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Burka @  4.9.2011,  13:33 Найти цитируемый пост)
в liweworkspace не получается провеить) не компилит 

я же говорю, не компилит из-за первого варианта.
второй работает без проблем
Вот ваш вариант
http://liveworkspace.org/code/e294e566a355...d4c79d0b8e91b1f
 smile 

Это сообщение отредактировал(а) volatile - 4.9.2011, 13:42
PM MAIL   Вверх
Burka
Дата 4.9.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



А меняется ли что нибудь при таком раскладе? может содержимое строки удаляется в SetUserData() или что то такое

Код

class MyClass
{
 void* UserData;
}

MyClass myClass;

void SetUserData(const std::string & data)
{
   char s[100] = data.c_str();
   myClass.UserData = s;
}

void GetUserData()
{
   std::string mystr((char*)myClass.UserData);
   printf(mystr.c_str());
}



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
volatile
Дата 4.9.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Burka @  4.9.2011,  13:47 Найти цитируемый пост)
void SetUserData(const std::string & data)
{
   char s[100] = data.c_str();
   myClass.UserData = s;
}

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

PM MAIL   Вверх
Burka
Дата 4.9.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(volatile @ 4.9.2011,  13:52)
Цитата(Burka @  4.9.2011,  13:47 Найти цитируемый пост)
void SetUserData(const std::string & data)
{
   char s[100] = data.c_str();
   myClass.UserData = s;
}

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

а как быть? что бы не уничтожался)


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
mes
Дата 4.9.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Burka @  4.9.2011,  12:54 Найти цитируемый пост)
а как быть? что бы не уничтожался) 

а зачем в MyClass void * ? с таким подходом у Вас на каждом шагу будут проблемы.. 
 


--------------------
PM MAIL WWW   Вверх
volatile
Дата 4.9.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Burka @  4.9.2011,  13:54 Найти цитируемый пост)
 как быть? что бы не уничтожался) 

использовать  new []
но там надо не забыть еще и delete []

по- хорошему надо писать нормальный класс MyClass
с конструктором, деструктором, и оператором присваивания....
PM MAIL   Вверх
Burka
Дата 4.9.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(mes @ 4.9.2011,  13:59)
Цитата(Burka @  4.9.2011,  12:54 Найти цитируемый пост)
а как быть? что бы не уничтожался) 

а зачем в MyClass void * ? с таким подходом у Вас на каждом шагу будут проблемы..

Ну вообще это не в моем классе а в классе движка Box2D  void* b2Body::UserData
и мне надо это использовать

Добавлено через 5 минут и 39 секунд
Цитата(volatile @ 4.9.2011,  14:01)
Цитата(Burka @  4.9.2011,  13:54 Найти цитируемый пост)
 как быть? что бы не уничтожался) 

использовать  new []
но там надо не забыть еще и delete []

по- хорошему надо писать нормальный класс MyClass
с конструктором, деструктором, и оператором присваивания....

Спасибо, дальше разберусь)


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
mes
Дата 4.9.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Burka @  4.9.2011,  13:02 Найти цитируемый пост)
Ну вообще это не в моем классе а в классе движка Box2D  void* b2Body::UserData
и мне надо это использовать 

значит Вы должны гарантировать необходимое время жизни объекта.. 
аккуратное использование new и delete в помощь.. 



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1263 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.