Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > void* <-> char


Автор: Burka 4.9.2011, 12:57
Подскажите как правильно передавать строки через void*

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

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

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

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

Автор: Burka 4.9.2011, 13:05
черт) видимо промахнулся)) разделом)

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

переместил

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

если так
 
Код

func1((char *)str);

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

Автор: volatile 4.9.2011, 13:25
Второй случай должен работать без приведений:
http://liveworkspace.org/code/acfeaa34ac959d46b1b7018551e2aa8d

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

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

все с точностью до наоборот.  smile 

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

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

в http://liveworkspace.org/code/0ec40b8b698b7020ca46747b4beb946c не получается провеить) не компилит

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

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

Автор: Burka 4.9.2011, 13:47
А меняется ли что нибудь при таком раскладе? может содержимое строки удаляется в 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());
}

Автор: 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;
}

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

Автор: Burka 4.9.2011, 13:54
Цитата(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;
}

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

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

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

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

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

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

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

Автор: Burka 4.9.2011, 14:02
Цитата(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
с конструктором, деструктором, и оператором присваивания....

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

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

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

Автор: slavenk 5.9.2011, 21:52
а у меня наоборот, версия со строковым литералом не работает. говорит, что невозможно преобразовать 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;
}

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

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

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

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

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

Добавлено через 42 секунды
зы: да и код пробуйте иногда заключать в теги...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)