6 / 6 / 0
Регистрация: 14.11.2011
Сообщений: 54
|
|||||||||||
1 | |||||||||||
проблема с передачей параметра функции14.11.2011, 13:12. Показов 3545. Ответов 41
Метки нет (Все метки)
Здравствуйте. Изучил уже 6 языков программирования, но С++ не дается как-то так просто.
Вот есть например часть кода.
0
|
14.11.2011, 13:12 | |
Ответы с готовыми решениями:
41
Проблема, связана с неправильной передачей параметров Вызов функции внутри другой функции с передачей локальной переменной по ссылке Динамические массивы с передачей в функции Ошибка с передачей функции потоку |
14.11.2011, 16:39 | 21 |
При этом надо понимать, если ты попытаешься вернуть указатель на локальный массив функции convert, то по завершении работы функции convert данный локал будет уже несуществующим и получится, что указатель смотрит на невалидную память
1
|
6 / 6 / 0
Регистрация: 14.11.2011
Сообщений: 54
|
|
14.11.2011, 16:41 [ТС] | 22 |
-=ЮрА=-, спасибо. задание просто этим то не ограничевается. Мне как раз надо было разбить на несколько функций. Ну пока я свою проблему развязал и еще почерпнул много полезного.
Всем спасибо)
0
|
6 / 6 / 0
Регистрация: 14.11.2011
Сообщений: 54
|
|
14.11.2011, 17:00 [ТС] | 24 |
-=ЮрА=-, ну вообще я понемногу переделываю клиент для некоторой работы с БД с языка PHP на С++.
да, насколько я понял, если уже есть некое char str[1000] = "TEXT"; , то изменить его можно только при помощи strcpy(str, "another text")?
0
|
Заблокирован
|
|||||||||||
14.11.2011, 17:27 | 26 | ||||||||||
- да можно, только вот "another text" не должен превышать длинны str лучше использовать sprintf(str,"%s","another text"); - на мой взгляд меньше граблей с перекрытием блоков памяти. Ну и если уж используем плюсы то std::string упомянутая Evg, имеет больший функционал чем char * (хотя CharToOem вы к string таким образом не примените
думаю всё равно чаровский буферок потребуется, что-то вроди такого
1
|
14.11.2011, 17:32 | 27 |
Грабли ровно те же самые - отсутствие контроля за размером буфера. А вот с контролем - это strncpy и snprintf (есть не везде). Но контроль выражается в то, что лишняя часть строки будет молча откидываться, а потому такие простые решения годятся только для программ-самоделок.
На самом деле любая частность (коей является класс string) ВСЕГДА имеет меньшие возможности, чем общий случай (коим является char*). std::string просто более удобен в работе, больше ничего особенно полезного или принципиально лучшего в нём нет
1
|
6 / 6 / 0
Регистрация: 14.11.2011
Сообщений: 54
|
|
14.11.2011, 17:32 [ТС] | 28 |
Evg, значит будем использовать.
с буферком идея хорошая. Возможно и получше.
0
|
14.11.2011, 17:35 | 29 |
Нет. В данном случае std::string является оптимальным решением, потому что в perl'е есть понятие строки, которое по простому отображается на плюсовые string'и. А работа с Си'шными буферами и указателями - это больше возможностей, чтобы ошибиться. Особенно если нет опыта работы с ними
0
|
Заблокирован
|
||||||
14.11.2011, 17:39 | 30 | |||||
- Evg, я под этим подразумевал уже наличие методов find erase sub, которые в char * ещё нужно писать, так на форуме string-ом почти не балуюсь, как и бустом, т.к предпочитаю своё "доморощенное магазинскому"А вот за strncpy не очень понял я к этому
0
|
14.11.2011, 17:59 | 31 | ||||||||||
У string'а - методы класса, у char* - стандартные библиотечные функции
Добавлено через 1 минуту Не понял вообще ничего. sprintf ничего не знает о размере буфера и никак его не контролирует.
1
|
Заблокирован
|
||||||
14.11.2011, 18:19 | 32 | |||||
Evg, спасибо я понял наверное в кодах где как мне казалось было перекрытие я сам косячил
Сталкивался с проблеммой связи dst1 и str при этом str[2] = '\0';, но как показал этот код где всё чётко в плане выделения памяти подрезание исходника на производных строках не отображается
0
|
6 / 6 / 0
Регистрация: 14.11.2011
Сообщений: 54
|
||||||
14.11.2011, 18:25 [ТС] | 33 | |||||
блин string это же намного проще...
зачем было с этим всем мучится, тем более что они взаимноприсваемые, если судить из кода
0
|
14.11.2011, 18:40 | 35 |
-=ЮрА=-, в посте #32 при вызове malloc'а надо к размеру добавлять ещё +1, потому как strlen учитывает только значащие символы, но не учитывает хвостовой ноль
То, что ты привёл этот пример - это вовсе не string. Ну а в какой-то момент тебе всё равно придётся опуститься до указателей, как того требует CharToOem
0
|
6 / 6 / 0
Регистрация: 14.11.2011
Сообщений: 54
|
|
14.11.2011, 19:12 [ТС] | 38 |
а как сделать взаимный переход из одного типа к другому?
ну, string, char[], char* Добавлено через 18 секунд кастованием вроде не получится
0
|
Заблокирован
|
||||||
14.11.2011, 20:41 | 40 | |||||
Evg, простите но здесь с вами не соглашусь (по крайней мере в пределах до VS 2008)
это const char * и запихнуть этот указатель в (char *) никак не выйдет Вижу два варианта Нужен char-вский буффер, а из него уже можно впихивать в указатель по примеру этого Либо присваивание делать
1
|
14.11.2011, 20:41 | |
14.11.2011, 20:41 | |
Помогаю со студенческими работами здесь
40
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов Функции с передачей разного количества параметров Использование функции как параметра другой функции Передача функции в качестве параметра функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |