| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > void* <-> char |
| Автор: Burka 4.9.2011, 12:57 | ||
| Подскажите как правильно передавать строки через void* у меня примерно такой код
|
| Автор: mes 4.9.2011, 13:05 |
| сделайте явное приведение.. |
| Автор: Burka 4.9.2011, 13:05 |
| черт) видимо промахнулся)) разделом) |
| Автор: bems 4.9.2011, 13:06 |
переместил |
| Автор: Burka 4.9.2011, 13:14 | ||||
если так
тоже не работает, при выводе просто пустая строка |
| Автор: volatile 4.9.2011, 13:25 |
| Второй случай должен работать без приведений: http://liveworkspace.org/code/acfeaa34ac959d46b1b7018551e2aa8d Добавлено через 4 минуты и 44 секунды вот с выводом http://liveworkspace.org/code/59009ef57c8f5c9730db52d96e8ae756 Добавлено через 6 минут и 38 секунд а кстати первый случай не компилится, так как там константный указатель. все с точностью до наоборот. |
| Автор: Burka 4.9.2011, 13:33 | ||
у меня выводит что то вроде "ММММММММММММММММММММММММММ" вместо той строки что надо в http://liveworkspace.org/code/0ec40b8b698b7020ca46747b4beb946c не получается провеить) не компилит |
| Автор: volatile 4.9.2011, 13:42 |
я же говорю, не компилит из-за первого варианта. второй работает без проблем Вот ваш вариант http://liveworkspace.org/code/e294e566a355286edd4c79d0b8e91b1f |
| Автор: Burka 4.9.2011, 13:47 | ||
А меняется ли что нибудь при таком раскладе? может содержимое строки удаляется в SetUserData() или что то такое
|
| Автор: Burka 4.9.2011, 13:54 | ||||
а как быть? что бы не уничтожался) |
| Автор: mes 4.9.2011, 13:59 |
а зачем в MyClass void * ? с таким подходом у Вас на каждом шагу будут проблемы.. |
| Автор: volatile 4.9.2011, 14:01 |
использовать new [] но там надо не забыть еще и delete [] по- хорошему надо писать нормальный класс MyClass с конструктором, деструктором, и оператором присваивания.... |
| Автор: Burka 4.9.2011, 14:02 | ||||
Ну вообще это не в моем классе а в классе движка Box2D void* b2Body::UserData и мне надо это использовать Добавлено через 5 минут и 39 секунд
Спасибо, дальше разберусь) |
| Автор: mes 4.9.2011, 14:11 | ||
значит Вы должны гарантировать необходимое время жизни объекта.. аккуратное использование 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 | ||
в данном случае func1(&str); и func1(str); являются синонимами. в обоих случаях передается указатель на строку.
а чем лучше-то? Если вы имеете ввиду хороший стиль, то тут в принципе не может идти речи о стиле.. Это все равно что советовать бомжу, одевать фрак с бабочкой. А если писать действительно в хорошем стиле, тут не нужны приведения вовсе (ни в стиле С, ни в стиле С++) Добавлено через 42 секунды зы: да и код пробуйте иногда заключать в теги... |