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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dec to 17ную, Перевести из десятичной в 17чную систему 
:(
    Опции темы
densa
Дата 24.7.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите как можно конвертировать число из десятичной системы исчисления в 17чную.
Если я понял правильно, то нужно создать массив, который будет содержать 1, 2, ..., G и по алгоритму деления на основание?
PM MAIL   Вверх
Gordon
Дата 24.7.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(densa @  24.7.2009,  18:31 Найти цитируемый пост)
Подскажите как можно конвертировать число из десятичной системы исчисления в 17чную.Если я понял правильно, то нужно создать массив, который будет содержать 1, 2, ..., G и по алгоритму деления на основание?


Примерно так же как и в 16 - ю, 2 - ю...

Скажи, а зачем тебе 17 - я СС? 


--------------------

  
     
PM MAIL WWW   Вверх
mes
Дата 24.7.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Gordon, ну тогда бы пример конвертирования в 16ричную привели бы  smile 


--------------------
PM MAIL WWW   Вверх
Gordon
Дата 24.7.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  24.7.2009,  20:50 Найти цитируемый пост)
Gordon, ну тогда бы пример конвертирования в 16ричную привели бы   


 smile 

Вот, кривова-то (сильно не ругайте, лучше дайте конструктивный совет), но для понимания принципа думаю хватит:

Код

char dig[17] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G'};

//dec - число в 10-й СС, N - основоние СС (естественно разумное, проверка не осуществляется)
string conv(int dec, int N)
{
    string s = "";
    int q = dec / N;

    while(q)
    {
        s = dig[dec % N] + s;
        dec = q;
        q = dec / N;
    }
    s = dig[dec % N] + s;
    
    return s;
}




Это сообщение отредактировал(а) Gordon - 24.7.2009, 21:11


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 24.7.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



С Вашего позволения, немного модифицирую smile

Код

#include <stdexcept>
#include <string>
#include <algorithm>

std::string IntToString(int value, const size_t base = 10)
{
    static char const dig[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    if(base > 16)
        throw std::range_error("IntToString: base exceed 16");
    bool negative = false;
    if(value < 0){
        negative = true;
        value = -value;
    }
    std::string s;
    int q = value / base;
    while(q)
    {
        s += dig[value % base];
        value = q;
        q = value / base;
    }
    s += dig[value % base] ;
    if(negative)
        s += '-' ;
    std::reverse(s.begin(), s.end());
    return s;
}


Это сообщение отредактировал(а) Леопольд - 25.7.2009, 02:40


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 24.7.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В принципе можно и без массива сделать, вроде...

Код

string convert(int dec, int N)
{
    string s = "";
    int q = dec / N, n;
    char c;

    while(q)
    {
        n = dec % N;
        if(n < 10)
        {
            c = '0' + n;
        }else
        {
            c = 'A' + n - 10;
        }
        
        s = c + s;
        dec = q;
        q = dec / N;
    }
    
    n = dec % N;
    if(n < 10)
    {
        c = '0' + n;
    }else
    {
        c = 'A' + n - 10;
    }
        
    s = c + s;
    
    return s;
}



--------------------

  
     
PM MAIL WWW   Вверх
azesmcar
Дата 24.7.2009, 21:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(Леопольд @  24.7.2009,  21:15 Найти цитируемый пост)
std::string IntToString(int value, size_t base = 10) throw (std::range_error)

Уберите эту гадость (я о спецификации исключений).
А функция itoa не подходит? smile
Код

char buffer[20];
itoa(454, buffer, 17);


Это сообщение отредактировал(а) azesmcar - 24.7.2009, 21:41
PM   Вверх
Gordon
Дата 24.7.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  24.7.2009,  22:41 Найти цитируемый пост)
А функция itoa не подходит? 


Может просто хочется мозг поиметь потренировать...  smile 



--------------------

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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(Gordon @  24.7.2009,  21:59 Найти цитируемый пост)
Может просто хочется мозг поиметь потренировать...  smile 

да, иногда мозг требует плотских утех smile 
PM   Вверх
densa
Дата 24.7.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Gordon @ 24.7.2009,  19:45)
Скажи, а зачем тебе 17 - я СС?

Начал учить Си и вот решил поломать голову smile

Не пойму, что мы делаем вот этим
Код

string convert(int dec, int N)
{
    string s = "";

PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(azesmcar @ 24.7.2009,  21:41)
А функция itoa не подходит? smile

Я тоже сначала о ней подумал, но вот беда...
(с) cplusplus.com
Portability
This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.

g++ 4.3.3 (linux) не знает такой функции.

Спецификацию исключений убрал почти сразу, но не потому что считаю её гадостью, а потому что не знаю какие исключения порождает std::string smile На самом деле я обычно её не использую. Но мне интересно узнать, почему именно гадость? Вроде бы иногда, глядя на объявление функции, неплохо было бы знать, какие исключения она может порождать.

P.S. Оказалось, забыл убрать, но хотел, да так, что думал что убрал smile

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 02:25


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 25.7.2009, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(Леопольд @  25.7.2009,  02:19 Найти цитируемый пост)

Я тоже сначала о ней подумал, но вот беда...
(с) cplusplus.com
Portability
This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.
g++ 4.3.3 (linux) не знает такой функции.

Ну это уже автору решать, использовать нестандартные функции или нет. Я как вариант предложил.

Цитата(Леопольд @  25.7.2009,  02:19 Найти цитируемый пост)
Спецификацию исключений убрал почти сразу, но не потому что считаю её гадостью

А зря..самая натуральная гадость (это я мягко выражаюсь) smile 
Не надо их вообще использовать, почитайте доклад Герба Саттера по поводу спецификации исключений http://www.gotw.ca/publications/mill22.htm или посмотрите в книге more exceptional C++, Задача 13. Прагматичный взгляд на спецификации исключений.


Это сообщение отредактировал(а) azesmcar - 25.7.2009, 09:34
PM   Вверх
Gordon
Дата 25.7.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @  25.7.2009,  03:19 Найти цитируемый пост)
Вроде бы иногда, глядя на объявление функции, неплохо было бы знать, какие исключения она может порождать.


С одной стороны да, но с другой, реально функция может породить и другие исключения, не указанные в спецификации!


densa, 

Код

//dec и N - параметры, первый число в десятичной СС, 
//второй - основание СС в которую нужно перевести число dec
string convert(int dec, int N) 
{
    string s = ""; //Пустая строка, в неё будет записано число (уже переведенное)

Функция возвращает в виде строки число в СС с основанием N.
Или что ты не понял?

Это сообщение отредактировал(а) Gordon - 25.7.2009, 10:08


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(azesmcar @ 25.7.2009,  09:14)
Не надо их вообще использовать

Если подумать, то пользы от них действительно никакой, а вот вред может быть - например, callback функция порождает исключение, которого нет в спецификации той функции, которая её вызывает. Хотя, пустую спецификацию, я иногда использовал, в специфичных случаях, например, при наследовании от std::exception надо переопределить what с пустой спецификацией, иначе g++ не компилит smile Или что-бы показать что своя функция, вызываемая в деструкторе (иногда в конструкторе), не должна порождать исключений.

Добавлено @ 10:09
Цитата(Gordon @ 25.7.2009,  10:05)
densa, 
Код

    string s = ""; //Пустая строка, в нею будет записано число (уже переведенное)

или что ты не понял?

Присваивание лишнее, конструктор по умолчанию делает пустую строку. Т.е. так:
Код

std::string s; // пустая строка



Это сообщение отредактировал(а) Леопольд - 25.7.2009, 10:28


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 25.7.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Леопольд @  25.7.2009,  10:05 Найти цитируемый пост)
Если подумать, то пользы от них действительно никакой

польза есть. иначе пустую спецификацию исключений не использовали бы в бусте.

Это сообщение отредактировал(а) zim22 - 25.7.2009, 10:12


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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(zim22 @  25.7.2009,  10:12 Найти цитируемый пост)
польза есть. иначе пустую спецификацию исключений не использовали бы в бусте.

Да, это единственный вид спецификации исключений которые можно использовать, но это может повлиять на производительность программы, так как некоторые компиляторы могут не встраивать функции со спецификацией исключений.
Цитата(Herb Sutter)

Moral #1: Never write an exception specification.
Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.


PM   Вверх
Gordon
Дата 25.7.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @  25.7.2009,  11:05 Найти цитируемый пост)
Присваивание лишнее, конструктор по умолчанию делает пустую строку


Делает, но с присваиванием более наглядно, хотя...


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  10:22)
Делает, но с присваиванием более наглядно, хотя...

Это вызов лишней функции std::string::operator= (char*)
Я ещё заменил все s = char + s на s += char, по тем же соображениям, так намного быстрее.

ещё можно s.reserve(x) добавить после объявления переменной s.

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 10:33


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @  25.7.2009,  11:31 Найти цитируемый пост)
Я ещё заменил все s = char + s на s += char, по тем же соображениям, так намного быстрее.


Код

s = char + s;


и

Код

s += char;


немного разные вещи...   smile 
А так спасибо за замечания!  smile

Добавлено через 5 минут и 50 секунд
Цитата(Леопольд @  25.7.2009,  11:31 Найти цитируемый пост)
Это вызов лишней функции std::string::operator= (char*)



Леопольд, а 100% будет вызыватья std::string::operator= (char*)?

Добавлено через 11 минут и 12 секунд
Допустим, такой класс:

Код

class A
{
    public:
        A() : i() { cout << "A()" << endl; }
        A(int n) : i(n) { cout << "A(int)" << endl; }
        ~A() { cout << "~A()" << endl; }
        A& operator =(const A &a)
        {
            cout << "operator =" << endl;
            this->i = a.i;
            return *this;
        }
    private:
        int i;
};


потои я создаю объекты:
Код

A a = 5;
A a1(5);


оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит?
p.s. с типом std::string так же, или нет?


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  10:40)
немного разные вещи...   smile

Не за что smile

Я бы даже сказал что это совсем разные вещи  smile 
В одном случае вызывается встраиваемая функция для добавления в конец строки, которая, возможно, должна быть увеличена в размерах, но совсем не обязательно. Где-то отложилось в памяти что по умолчанию на любую строку выделяется что-то вроде 32 символов. 
В другом, конструируется новая копия строки, в которую помещается результат конкатенации символа и строки, причём всё в строке должно быть сдвинуто вправо. После этого эта копия присваивается аккумулирующей строке.

Ещё есть бага в функции, связанная с тем что наименьшая система счисления двоичная. Эта бага может привести к бесконечному циклу, или делению на ноль  smile

Добавлено @ 10:59
Цитата(Gordon @ 25.7.2009,  10:40)
оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит?
p.s. с типом std::string так же, или нет?

Я ошибся!  smile Читал ведь, давно, у Страутрупа что type x(val); и type x = val; одно и тоже. Но недавно где-то прочёл (или неправильно понял) что это не так. Последнее запомнилось больше... smile А вообще, что бы не думалось, можно сделать так
std::string s("init string");

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:07


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 25.7.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Gordon @  25.7.2009,  10:40 Найти цитируемый пост)
оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит?

в первом случае вызывается конструктор преобразования  A(int n). все конструкторы с одним параметром - конструкторы преобразования.
во-втором случае вы явно вызываете конструктор с одним параметром.
***
сделайте конструктор явным и увидите ошибку. 
Код

explicit A(int n)


Это сообщение отредактировал(а) zim22 - 25.7.2009, 11:03


--------------------
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(zim22 @ 25.7.2009,  11:01)
в первом случае вызывается конструктор преобразования  A(int n). все конструкторы с одним параметром - конструкторы преобразования.
***
Код

explicit A(int n)

Это один и тот же конструктор, квалификатор explicit просто запрещает использовать его для неявных преобразований. Соответственно его нельзя будет вызвать таким синтаксисом type x = val;

Код

struct S{
    explicit S(int) {}
    explicit S(S&) {}
};

int main(void){
    S s1(1);  // ОК
    S s2(s1);// ОК

    S s3 = 1;  // error
    S s4 = s1;// error в конструкторе копирования
    return 0;
}

Думаю, это уже достаточно веская причина для инициализации в скобках а не при помощи =

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:14


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 25.7.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Леопольд @  25.7.2009,  11:06 Найти цитируемый пост)
Это один и тот же конструктор,

ну да. один и тот же. 
в-первом случае он вызывается неявно
во-втором - явно.
Цитата(Леопольд @  25.7.2009,  10:52 Найти цитируемый пост)
Я ошибся! Читал ведь, давно, у Страутрупа что type x(val); и type x = val; одно и тоже

это разные вещи. 
Код

int i(10); // прямая инициализация
int i = 10; // инициализация копии

Язык С++ поддерживает две формы инициализации переменных: инициализация копии( copy-initialization) и прямая инициализация(direct-initialization).
различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату. Кроме того прямая инициализация гибче, т.к. можно указать любое количество параметров конструктора.



--------------------
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(zim22 @ 25.7.2009,  11:13)
различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату.

В обоих случаях выполняется один и тот же код. Если для инициализации нужен временный объект, то он будет создан в обоих случаях. Но вариант с = запрещён, если использовать explicit.


Код

struct S{
    int j;
    S(int i): j(i) {}
};

 int main(){
    S s1(1);
    S s2 = 1;
 }

Код

0x401059    lea    rdi,[rbp-0x10]
0x40105d    mov    esi,0x1
0x401062    call   0x401538 <S>
0x401067    lea    rdi,[rbp-0x20]
0x40106b    mov    esi,0x1
0x401070    call   0x401538 <S>


Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:25


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22 @  25.7.2009,  12:13 Найти цитируемый пост)
Язык С++ поддерживает две формы инициализации переменных: инициализация копии( copy-initialization) и прямая инициализация(direct-initialization).различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату. Кроме того прямая инициализация гибче, т.к. можно указать любое количество параметров конструктора.


Ну это да! А explicit запрещает неявные вызовы конструктора.
Мне интересно, может ли компилятор это - "int i = 10;", заменить int i(10); ?


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  11:29)
Ну это да! А explicit запрещает неявные вызовы конструктора.
Мне интересно, может ли компилятор это - "int i = 10;", заменить int i(10); ?

Именно так он и сделает, если нет explicit.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @  25.7.2009,  12:30 Найти цитируемый пост)
Именно так он и сделает, если нет explicit.


int i(10); // прямая инициализация
int i = 10; // инициализация копии

имеют одинаковую эффективность, так?


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 25.7.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Gordon @  25.7.2009,  11:41 Найти цитируемый пост)
имеют одинаковую эффективность, так?

Цитата(Леопольд @  25.7.2009,  11:18 Найти цитируемый пост)
В обоих случаях выполняется один и тот же код. 

для встроенных типов данных - да. для классов - нет.
для классов прямая инициализация быстрей. т.к. копия не создаётся. smile
***
Цитата(Леопольд @  25.7.2009,  11:18 Найти цитируемый пост)
Но вариант с = запрещён, если использовать explicit.

разрешён.
Код

S s1 = S(10);


Это сообщение отредактировал(а) zim22 - 25.7.2009, 12:02


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


Опытный
**


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

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



Цитата(zim22 @  25.7.2009,  12:46 Найти цитируемый пост)
для классов прямая инициализация быстрей. т.к. копия не создаётся. 


zim22, а чем эта копия потом присваивается объявляемому объекту, я пробовал operator = и конструктор копирования делать закрытыми, и все равно код работал...

Это сообщение отредактировал(а) Gordon - 25.7.2009, 11:56


--------------------

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


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Gordon @  25.7.2009,  11:53 Найти цитируемый пост)
, а чем эта копия потом присваивается объявляемому объекту,

Код

struct S{
    int j;
    S(int i): j(i) {}
    S(const S &rhs) : j(rhs.j) { }
};

S s1 = 10;
S s2 = s1;



--------------------
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(zim22 @ 25.7.2009,  11:46)
разрешён.
Код

S s1 = S(10);

запрещён
Код

struct S{
    S(void) {}
    explicit S(S const&) {}
};

int main(void){
    S s1 = S(); // error
}


Это сообщение отредактировал(а) Леопольд - 25.7.2009, 12:24


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 25.7.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(Леопольд @  25.7.2009,  12:14 Найти цитируемый пост)
запрещён

Да smile но не только по причине explicit copy constructor -а, еще надо default constructor определить.
PM   Вверх
Леопольд
Дата 25.7.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(zim22 @ 25.7.2009,  12:08)
Код

S s1 = 10;
S s2 = s1;

Это вызовы разных конструкторов.
Код

S s0(10);
S s1 = 10;

А это одного и того же.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не, ну так понятно, а если что-то вроде этого: 

Код

class A
{
    public:
        A() : i() { cout << "A()" << endl; }
        A(int n) : i(n) { cout << "A(int)" << endl; }
        ~A() { cout << "~A()" << endl; }
        
    private:
        A& operator =(const A &a)
        {
            cout << "operator =" << endl;
            this->i = a.i;
            return *this;
        }
        A(const A&) {cout << "A(A&)" << endl; }

        int i;
};



--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(azesmcar @ 25.7.2009,  12:20)
Да smile но не только по причине explicit copy constructor -а, еще надо default constructor определить.

Угу, точно. Поправил.

Добавлено @ 12:28
Цитата(Gordon @ 25.7.2009,  12:23)
не, ну так понятно, а если что-то вроде этого:

Здесь запрет копирования.
Код

int main(void){
    A a0(0);
    A a1 = 1; // error
 }

Код

main.cpp||In function ‘int main()’:|
main.cpp|47|ошибка: ‘A::A(const A&)’ is private|
main.cpp|53|ошибка: в данном контексте|
||=== Build finished: 2 errors, 0 warnings ===|

Пытается вызвать конструктор копирования... zim22 прав


Это сообщение отредактировал(а) Леопольд - 25.7.2009, 12:33


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 25.7.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Леопольд @  25.7.2009,  12:14 Найти цитируемый пост)
запрещён

smile "Copy" на экран выводится? Какой из этого можно сделать вывод?
Код

struct S{
    S() {}
     S(S const&) { std::cout << "Copy"; }
};
int main() {
  S s = S();
}




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


uploading...
****


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

Репутация: 52
Всего: 211



Леопольд, 
zim22, 

Я чего-то не пойму о чем вы smile 
Леопольд примеры с explicit показывает, вы - без..и спорите о чем-то? О чем? smile 
PM   Вверх
zim22
Дата 25.7.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(azesmcar @  25.7.2009,  12:39 Найти цитируемый пост)
Я чего-то не пойму о чем вы

посты набиваю smile


--------------------
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(azesmcar @ 25.7.2009,  12:39)
О чем? smile

В чём разница между
1. type obj(val);
2. type obj = val;

Он мне напомнил что второй вариант, это неявный вызов конструктора копирования.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @  25.7.2009,  13:24 Найти цитируемый пост)
Здесь запрет копирования.КодincludeSyntax('cpp');int main(void){    A a0(0);    A a1 = 1; // error }


У меня такой код работает!

Код

class A
{
    public:
        A() : i() { cout << "A()" << endl; }
        A(int n) : i(n) { cout << "A(int)" << endl; }
        ~A() { cout << "~A()" << endl; }
        
    private:
        A& operator =(const A &a)
        {
            cout << "operator =" << endl;
            this->i = a.i;
            return *this;
        }
        A(const A&) {cout << "A(A&)" << endl; }

        int i;
};

int _tmain(int argc, _TCHAR* argv[])
{             
    A a = 5; // и это работает!
    A a1(5);

    system("pause");
    return 0;
}


А вот такое создание уже не работает!
Код

A a2 = A(5);


Это сообщение отредактировал(а) Gordon - 25.7.2009, 12:44


--------------------

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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(zim22 @  25.7.2009,  12:40 Найти цитируемый пост)
посты набиваю smile 

Ай ай ай...совсем забыл..розыгрыш призов уже скоро.  smile 
PM   Вверх
zim22
Дата 25.7.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Леопольд @  25.7.2009,  12:42 Найти цитируемый пост)
 это неявный вызов конструктора копирования.

компиляторы могут так соптимизировать код, что конструктор копирования вызываться не будет. что собственно и происходит.
Цитата(Gordon @  25.7.2009,  12:43 Найти цитируемый пост)
У меня такой код работает!

здорово! smile
http://codepad.org/gncCk9z6

Это сообщение отредактировал(а) zim22 - 25.7.2009, 12:45


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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(Леопольд @  25.7.2009,  12:42 Найти цитируемый пост)
1. type obj(val);
2. type obj = val;


Леопольд

Ну это все ясно, а спор о чем? smile
PM   Вверх
Леопольд
Дата 25.7.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  12:43)
У меня такой код работает!

Это Visual Studio.

Добавлено @ 12:48
Цитата(azesmcar @ 25.7.2009,  12:45)
Ну это все ясно, а спор о чем? smile

Уже ни о чём, zim22 выиграл smile

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 12:58


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zim22, в код:

Код

type obj(val);
type obj = val;


может компилироваться по разному, в зависимости от компилятора, так получается?!

Добавлено @ 12:54
Цитата(Леопольд @  25.7.2009,  13:47 Найти цитируемый пост)
Это Visual Studio.


Да, она самая!  smile

Добавлено @ 12:56
Короче, лучше по воможности писать так:

Код

type obj(val);


чтобы не надеяться на компилятор! Да?

Это сообщение отредактировал(а) Gordon - 25.7.2009, 13:01


--------------------

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


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  12:51)
может компилироваться по разному, в зависимости от компилятора, так получается?!

По идее, type obj = val;  должно развернуться в type obj(type( val_type)) ; Если этого не происходит, значит компилятор не соответствует стандарту.

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 15:23


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ладно, спасибо всем за разъяснения...

p.s. Тему "слегка" изменили...  smile 


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  12:51)
Короче, лучше по воможности писать так:
Код

type obj(val);

 smile 
Но для встроенных типов это аналогично int i = 0; что на мой взгляд читабельнее, и я инициализирую встроенные типы так. Но не в списке инициализации конструктора.
MyInt::MyInt(int i_) : i(i_) {}

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 13:13


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 25.7.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Леопольд @  25.7.2009,  12:05 Найти цитируемый пост)
MyInt::MyInt(int i_) : i(i) {}

У Вас опечатка  smile 


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(mes @ 25.7.2009,  13:09)
У Вас опечатка  smile

Спасибо! Сложно впервые смотреть Lost и одновременно думать про С++ smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
densa
Дата 26.7.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А кто подскажет как в чистом Си заменить string ?
PM MAIL   Вверх
azesmcar
Дата 26.7.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(densa @  26.7.2009,  17:30 Найти цитируемый пост)
А кто подскажет как в чистом Си заменить string ? 

char []
PM   Вверх
zim22
Дата 26.7.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(densa @  26.7.2009,  17:30 Найти цитируемый пост)
А кто подскажет как в чистом Си заменить string 

описать свою структуру и набор функций к ней.


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


Новичок



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

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



Цитата(zim22 @ 26.7.2009,  18:16)
Цитата(densa @  26.7.2009,  17:30 Найти цитируемый пост)
А кто подскажет как в чистом Си заменить string 

описать свою структуру и набор функций к ней.

Вот это натупили smile Я токо учусь  smile 
PM MAIL   Вверх
zim22
Дата 26.7.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(densa @  26.7.2009,  18:56 Найти цитируемый пост)
 Я токо учусь    smile 

у меня сейчас нет времени пример вам набрасывать.
смотрите набор функций для класса string в MSDN. и реализовываете их аналоги. только на С.
Цитата

append
assign
capacity
clear
compare
copy
empty
find_first_not_of
...


что-то типа такого:

Код

struct String {
  char *ptr_to_string;
};

struct String *CreateJoinedString(struct String *s1, struct String *s2) {
  int size_of_two_string = stlren(s1) + strlen(s2) + 1;
  struct String *new_string = (struct String*)malloc(sizeof struct String);
  strcpy(new_string, s1);
  strcat(new_string, s2);
  return new_string;
}




Это сообщение отредактировал(а) zim22 - 26.7.2009, 19:13


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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