![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
вот функция, преобразование int в char...
использую как printf("[%s][%s]",itos(4),itos(6)); Как в этом случае почистить память ? |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
в данном случае не как!!!
Добавлено @ 06:33 лутше делать так:
Это сообщение отредактировал(а) chaos - 28.7.2005, 06:41 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
тогда как правильно написать эту функцию ? |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
я бы сделал так:
Добавлено @ 06:48 или можно сделать объектную обертку для char* Это сообщение отредактировал(а) chaos - 28.7.2005, 06:46 |
|||
|
||||
| admsasha |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
неее, нужно что бы можно было использовать, так:printf("[%s][%s]",itos(4),itos(6)); так же удобнее чем вводить куча лишних переменных в главной процедуре Добавлено @ 07:00
извиняюсь, не то процитировал... спешил, когда писал..... |
||||
|
|||||
| Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Можно просто использовать std::string или MFC::CString и т.д.
В общем, когда выделяешь динамическую память, нужно всегда думать о том, кто и когда будет ее освобождать. Хорошо, когда у блока динамической памяти один владелец - тот, кто определяет время жизни. Твоя начальная функция плоха тем, что память выделяется внутри функции, а освобождать ее должен вызывающий код. Попробуй упомни. В общем случае используют умные указатели, но в твоем сойдет какой-нибудь строковый класс.
Для этого пример Chaos можно изменить так:
НО если тебе это нужно именно для печати, вообще забей и пользуйся стандартным форматированием:
-------------------- ... |
||||||
|
|||||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
вот еще одно решение:
PS класс не завершонный! Просто написан наспех что бы продемонстрировать конкретное решение и то решение на мой взгляд плохое, тк printf принимает ... после формата, так что еще надо делать явное преобразование (char *) Это сообщение отредактировал(а) chaos - 28.7.2005, 07:29 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
как всё непросто в этом C++... элементарная задача, создает большие проблемы.... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
это ты сам себе создаешь проблемы тк можно вывести на экран printf("%d %d\n", 4,6); а ты извращаешься(а за извращения надо платить Это сообщение отредактировал(а) chaos - 28.7.2005, 08:03 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
я для примера показал, смысл так что из базы с varchar значением берется число, его нужно переделать, сложить с другим числом, и вывести, когда все это делается одной функцией без всяких дополнетельных переменных это очень удобно, еще и в одну строчку можно уместить printf ("%d \n",stoi(str1)+stoi(str2)); - примерно так |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
тогда извращение хранить в базе число в виде строки, хотя бы по тому что
sizeof(1000000) < sizeof("1000000") хотя дело тво1, на вкус и цвет... Это сообщение отредактировал(а) chaos - 28.7.2005, 08:14 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
1. число 3-х значное... 2. может содержаться не только число... 3. мне так удобнее держать в varchar в том же perl и php никогда проблемы так такой простой задачей не возникало... обидно даже... что с C++ проблемы.. как я заметил он вообще плохо справляется с стринговым типом... даже функциии иначе чем для int приходится писать.... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
Джефф Элджер C++ БИБЛИОТЕКА ПРОГРАММИСТА по сравнению с Perl, PHP PS хотя сам я не испытываю ни каких проблем, тк знаю перл и очень люблю его Это сообщение отредактировал(а) chaos - 28.7.2005, 08:26 |
|||
|
||||
| comcon1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Так-то так, однако уметь то, очем просил создатель темы тоже надо. Хотя это скорее "in a C-face", а не C++. Функции типа
как раз и занимаются внутри себя отведением памяти. Потом, если надо, ее можно почистить free(a). А если сделать printf("%s", strdup(b)) то память отведется, строка напечатается и память сотрется. Поскольку указатель на нее потеряется. Или я что-то неправильно понимаю? И ему такую же процедуру надо было написать.
Таких функций, которые возвращают указатель на отведенную внутри них память в системных вызовах очень много. Возьмите, к примеру, get_current_directory(). |
||||
|
|||||
| maxim1000 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
все тут правильно кроме "память сотрется " выделенную память надо стирать вручную или вызывать какую-то функцию, которая это сделает само ничего не освободится... еще как вариант можно делать такую функцию (только не надо это использовать, это ОЧЕНЬ плохой подход
в данном случае в начале создается достаточно большой буфер при каждом вызове в него записывается результат и возвращается указатель на него строки пишутся друг за другом после того, как дошли до конца, указатель сбрасывается на начало буфера таким образом самые первые строки стираются память выделяется один раз при старте программы (точнее, при первом вызове функции) и все а значит, никакой утечки не будет Добавлено @ 12:12
есть два класса таких функций: 1. возвращают указатель на какую-то область, которая была выделена когда-то и будет освобождена неизвестно когда, эта память используется исключительно для хранения конкретного результата 2. выделяют память и возвращают указатель на него - для них в help-никах обчыно пишут "вы сами должны освободить память от этого указателя" -------------------- qqq |
||||||
|
|||||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
comcon1
а тебе нужно внимательно читать тему! тк то что ты предлагаешь использовать free уже предлагалось(delete)!
создателю дали пищи для размышления, пускай думает! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Чего тут думать
Хочется как в перле - используй какой-нибудь строковый класс из имеющейся библиотеки. И будет тебе и "плюс" и "равно"... В отличие от языков, в которые строковый тип встроен, в C++ ты можешь использовать любой строковый тип из кучи доступных, даже несколько в пределах одной функции, если очень хочется. Или написать свой, если чужие не нравятся. Например, для твоей задачи можно написать тип, который будет выполнять операции сложения строк, сначала преобразуя операнды в числа, складывая их и опять преоброазуя в строку, по дороге проверяя, число ли это, а если нет, писать в результат "сам дурак". Причем все это очень несложно. -------------------- ... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
может человек к простоте привык
Это сообщение отредактировал(а) chaos - 28.7.2005, 13:13 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А я про что говорю... добавим к нашему супер-строковому С++ классу оператор +(int). А также double, complex и все, что в голову придет. А что не придет - потом добавим, когда придет.
И можно потом написать ровно такой же код, только без закорючек и со скобками в вызове функции print. Типы переменных, правда, придется объявлять явно... -------------------- ... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
|
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
да не важно "плюс" или "равно", важно то что на выходе должно быть char, а не число...
разве нет примера с такой функцией которую можно было бы использовать просто func(1)+func(2); ?? без дополнительной очистки памяти... программа написанная с очисткой паматью, аж 7 раз увеличилась... так как создаются куча лишних переменных.... вызовов... и очисток.... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
зачем ты себе создаешь проблемы
вот посмотри на это решенеие
Это сообщение отредактировал(а) chaos - 29.7.2005, 06:29 |
|||
|
||||
| admsasha |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
вообщем сделал так
cifra надо выгружать ? всё ли так правильно ? Добавлено @ 07:32
немогу разобраться в твоем классе... Это сообщение отредактировал(а) admsasha - 29.7.2005, 07:28 |
||||
|
|||||
| chaos |
|
||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
еслы ты имеешь ввиду освобождение памяти то нет, она автоматически освободиться а так все правельно!
а что именно не понятно, давай объясню |
||||
|
|||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
по честному сналача хорошую ссылку (только не книгу) по классам на C++.... я знаю их только поверхностно... если не сложно можно каждый пункт прокоментировать ? P.S. класс кажется немного не то что надо.... P.S.S. спасибо за помощь |
|||
|
||||
| chaos |
|
||||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
про класс, я думаю надо читать только книгах и тп, а ссылку только могу дать на книги.
Это сообщение отредактировал(а) chaos - 29.7.2005, 08:35 |
||||||
|
|||||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
стоит почитать у Страуструпа "Описание C++", там есть описание STL (Standart Template Library), она является частью C++ точно так же, как встроенные функции (в том числе и работы со строками) являются, например, частью Паскаля или Бейсика
ссылку можно найти в разделе Компьютерная литература (а то так не вспомню)... Это сообщение отредактировал(а) maxim1000 - 29.7.2005, 09:31 -------------------- qqq |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
Слушай!!!
а почему бы тебе не воспользоваться стандартной функцией
|
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
itoa нет в Linux... atoa - есть, ей и пользуюсь Это сообщение отредактировал(а) admsasha - 29.7.2005, 12:22 |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
ну да это не стандартная функция |
|||
|
||||
| admsasha |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
может эту функцию можно "доставить" ? |
||||
|
|||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Ну, в принципе, можно доставить все. записать в /usr/include файл, прописать в нем функцию. Можно даже нарыть исходники какого-нить stdlib-а и дописать туда... Тока в стандарты Линухи она от этого не добавится
|
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
а чем тебе не нравится пример класс каторый я для тебя набросал
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=479169 |
|||
|
||||
| Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Самому itoa написать куда легче, чем потом сопровождать программу, полагающуюся на измененный инклюд. Кстати, как уже три, или четыре раза говорила Earnest, легче было бы заюзать готовый класс строк. К примеру, строка из Qt имеет удобные функции-члены arg(int), arg(double) и другие на все случаи жизни. С их помощью можно было бы написать так QString("[%1][%2]").arg(4).arg(8). И вот тебе отформатированная строка.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |