Модераторы: 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   Вверх
slavenk
Дата 5.9.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TheAthlete
*


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

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



а у меня наоборот, версия со строковым литералом не работает. говорит, что невозможно преобразовать const void* в void*
а с переменной работает.

могу посоветовать передавать адрес строки: func1(&str)
во-вторых, лучше использовать явное преобразование вместо преобразования в стиле С:

void func1(void *data) {
  //string mystr((char*)data);
  string mystr(static_cast<char*>(data));
  cout << mystr << endl;
}

И по идее, должно работать так:

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

void func1(void *data) {
  //string mystr((char*)data);
  string mystr(static_cast<char*>(data));
  cout << mystr << endl;
}

int main() {
  //func1("primer1");
  char str[100] = "primer2";
  func1(&str);
  return 0;
}

PM MAIL ICQ Skype   Вверх
volatile
Дата 6.9.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(slavenk @  5.9.2011,  21:52 Найти цитируемый пост)
могу посоветовать передавать адрес строки: func1(&str)

в данном случае func1(&str); и func1(str); являются синонимами.
в обоих случаях передается указатель на строку.

Цитата(slavenk @  5.9.2011,  21:52 Найти цитируемый пост)
во-вторых, лучше использовать явное преобразование вместо преобразования в стиле С:

а чем лучше-то?
Если вы имеете ввиду хороший стиль, то тут в принципе не может идти речи о стиле..
Это все равно что советовать бомжу, одевать фрак с бабочкой.  smile

А если писать действительно в хорошем стиле, тут не нужны приведения вовсе (ни в стиле С, ни в стиле С++) smile

Добавлено через 42 секунды
зы: да и код пробуйте иногда заключать в теги...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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