Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как правильно почистить память ? Продолжение бывшей темы... 
:(
    Опции темы
chaos
Дата 28.7.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



comcon1
а тебе нужно внимательно читать тему! тк то что ты предлагаешь использовать free уже предлагалось(delete)!

Цитата
однако уметь то, очем просил создатель темы тоже надо

создателю дали пищи для размышления, пускай думает!

PM WWW   Вверх
Earnest
Дата 28.7.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Чего тут думать smile
Хочется как в перле - используй какой-нибудь строковый класс из имеющейся библиотеки. И будет тебе и "плюс" и "равно"...
В отличие от языков, в которые строковый тип встроен, в C++ ты можешь использовать любой строковый тип из кучи доступных, даже несколько в пределах одной функции, если очень хочется. Или написать свой, если чужие не нравятся.
Например, для твоей задачи можно написать тип, который будет выполнять операции сложения строк, сначала преобразуя операнды в числа, складывая их и опять преоброазуя в строку, по дороге проверяя, число ли это, а если нет, писать в результат "сам дурак". Причем все это очень несложно.


--------------------
...
PM   Вверх
chaos
Дата 28.7.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



может человек к простоте привык smile
Код

$s = "56";
$v = 4;
$r = $s+$v;
print $r; # = 60


Это сообщение отредактировал(а) chaos - 28.7.2005, 13:13
PM WWW   Вверх
Earnest
Дата 28.7.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



А я про что говорю... добавим к нашему супер-строковому С++ классу оператор +(int). А также double, complex и все, что в голову придет. А что не придет - потом добавим, когда придет. smile А еще пригодится оператор присваивания и конструктор от всего этого.
И можно потом написать ровно такой же код, только без закорючек и со скобками в вызове функции print. Типы переменных, правда, придется объявлять явно... smile Вот беда-то...


--------------------
...
PM   Вверх
comcon1
Дата 28.7.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



smile думал - тока с new такая лажа. явно ступил. thx.


--------------------
PM MAIL   Вверх
admsasha
Дата 29.7.2005, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да не важно "плюс" или "равно", важно то что на выходе должно быть char, а не число...
разве нет примера с такой функцией которую можно было бы использовать просто func(1)+func(2); ?? без дополнительной очистки памяти...
программа написанная с очисткой паматью, аж 7 раз увеличилась... так как создаются куча лишних переменных.... вызовов... и очисток....
PM MAIL WWW ICQ Jabber   Вверх
chaos
Дата 29.7.2005, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



зачем ты себе создаешь проблемы smile
вот посмотри на это решенеие
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

class CStr
{
    char *s;
    friend CStr operator + (const CStr& s1, const CStr& s2);
public:
    CStr(int n)
        :s(new char[10])
    {
        sprintf(s, "%d", n);
    }

    CStr(const CStr& c)
    {
        s = new char[strlen(c.s)+1];
        strcpy(s,c.s);
    }

    ~CStr()
    {
        delete[] s;
    }

    operator char*() const
    {
        return s;
    }
};

CStr operator + (const CStr& s1, const CStr& s2)
{
    CStr s(atoi(s1) + atoi(s2));
    return s;
}


int main(int argc, char* argv[])
{
    printf("%s\n", (CStr(8)+CStr(4)));
    printf("%s\n", CStr(4));
    printf("%s\n", CStr(8));

    return 0;
}


Это сообщение отредактировал(а) chaos - 29.7.2005, 06:29
PM WWW   Вверх
admsasha
Дата 29.7.2005, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вообщем сделал так

Код

void itos(int chislo, char *s)
{
  sprintf(s,"%i",chislo);
}

char cifra[10];
itos(10, cifra);


cifra надо выгружать ?

всё ли так правильно ?
Добавлено @ 07:32
Цитата(chaos @ 29.7.2005, 13:28)
вот посмотри на это решенеие


немогу разобраться в твоем классе... smile

Это сообщение отредактировал(а) admsasha - 29.7.2005, 07:28
PM MAIL WWW ICQ Jabber   Вверх
chaos
Дата 29.7.2005, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(admsasha @ 29.7.2005, 07:25)
cifra надо выгружать ?

еслы ты имеешь ввиду освобождение памяти то нет, она автоматически освободиться
а так все правельно!
Цитата
немогу разобраться в твоем классе...

а что именно не понятно, давай объясню
PM WWW   Вверх
admsasha
Дата 29.7.2005, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(chaos @ 29.7.2005, 15:08)
а что именно не понятно, давай объясню

по честному сналача хорошую ссылку (только не книгу) по классам на C++.... я знаю их только поверхностно...
если не сложно можно каждый пункт прокоментировать ?

P.S. класс кажется немного не то что надо....

P.S.S. спасибо за помощь smile
PM MAIL WWW ICQ Jabber   Вверх
chaos
Дата 29.7.2005, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(admsasha @ 29.7.2005, 08:23)
Цитата(chaos @ 29.7.2005, )
а что именно не понятно, давай объясню

по честному сналача хорошую ссылку (только не книгу) по классам на C++.... я знаю их только поверхностно...
если не сложно можно каждый пункт прокоментировать ?

P.S. класс кажется немного не то что надо....

P.S.S. спасибо за помощь smile

про класс, я думаю надо читать только книгах и тп, а ссылку только могу дать на книги.
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

class CStr
{
    char *s; //приватная переменная где будет храниться строка
    friend CStr operator + (const CStr& s1, const CStr& s2); //дружественный метод() имеет доступ к закрытым членам
public:
    CStr(int n) //Конструктор принимающий число
        :s(new char[10])//выделяем память для строки
    {
        sprintf(s, "%d", n); //заносим чилсло в строку
    }

    CStr(const CStr& c)//конструктор копий(вызывается в сложении строк)
    {
        s = new char[strlen(c.s)+1]; //выделяем память 
        strcpy(s,c.s); //копируем строку
    }

    ~CStr()//деструктор
    {
        delete[] s;//освобождаем память
    }

    operator char*() const//оператор приведения к char*
    {
        return s; //возвращаем строку
    }
};

CStr operator + (const CStr& s1, const CStr& s2) //сложение строк
{
    CStr s(atoi(s1) + atoi(s2)); //сначала получаем числовое значение потом складываем и потом создаем объект
    return s; //возвращаем созданный объект
}


int main(int argc, char* argv[])
{
    printf("%s\n", (CStr(8)+CStr(4)));
    printf("%s\n", CStr(4));
    printf("%s\n", CStr(8));

    return 0;
}


Это сообщение отредактировал(а) chaos - 29.7.2005, 08:35
PM WWW   Вверх
maxim1000
Дата 29.7.2005, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



стоит почитать у Страуструпа "Описание C++", там есть описание STL (Standart Template Library), она является частью C++ точно так же, как встроенные функции (в том числе и работы со строками) являются, например, частью Паскаля или Бейсика
ссылку можно найти в разделе Компьютерная литература (а то так не вспомню)...

Это сообщение отредактировал(а) maxim1000 - 29.7.2005, 09:31


--------------------
qqq
PM WWW   Вверх
chaos
Дата 29.7.2005, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Слушай!!!
а почему бы тебе не воспользоваться стандартной функцией
Код

char* itoa(int);
int atoi(const char*);

PM WWW   Вверх
admsasha
Дата 29.7.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(chaos @ 29.7.2005, 19:10)
Слушай!!!
а почему бы тебе не воспользоваться стандартной функцией


itoa нет в Linux...
atoa - есть, ей и пользуюсь

Это сообщение отредактировал(а) admsasha - 29.7.2005, 12:22
PM MAIL WWW ICQ Jabber   Вверх
chaos
Дата 29.7.2005, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(admsasha @ 29.7.2005, 12:21)
itoa нет в Linux...

ну да это не стандартная функция
PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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