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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобпазование типов: std::string->unsigned char[] 
V
    Опции темы
mes
Дата 2.11.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alca @  2.11.2008,  13:15 Найти цитируемый пост)
    for (unsigned int i = 0; i < csStr.size(); i ++) {
        int iChar = (unsigned int)csStr.at(i);    
        ucBuff[i] = iChar;
    }

вот с какого боку там int iChar, когда  ucBuff типа  unsigned char.

во первых можно написать короче, без непонятно для чего нужного приведенния к int
Код

  for (unsigned int i = 0; i < csStr.size(); i ++)  { ucBuff[i]  = static_cast<unsigned char>(csStr.at(i)); }

во вторых в цикле мы должны быть уверены, что  ни при каком значение i мы не выйдем за границу выделенной памяти для ucBuff.


Это сообщение отредактировал(а) mes - 2.11.2008, 14:04


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


Эксперт
****


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

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



А чем принципиальное отличие?
Код

    for (unsigned int i = 0; i < csStr.size(); i ++) {
        ucBuff[i] = (unsigned int)csStr.at(i);
    }

и
Код

    for (unsigned int i = 0; i < csStr.size(); i ++)  { 
        ucBuff[i]  = static_cast<unsigned char>(csStr.at(i)); 
    } 



--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 2.11.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alca @  2.11.2008,  13:51 Найти цитируемый пост)
 ucBuff[i] = (unsigned int)csStr.at(i);

строчка не полна, и заставляет программиста лишний раз задуматься о происходящем, хотя никакой дополнительной нагрузки вышеупомянутый код не несет.

во первых если делаете преобразование , то старайтесь делать его точно. А так вы оставляете преобразование unsigned int->unsigned char на волю компилятора.
во вторых точное преобразование типа static_cast всегда лучше си-каста (использованного в Вашем примере).
 smile 

Это сообщение отредактировал(а) mes - 2.11.2008, 14:05


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


Эксперт
****


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

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



Спасибо.

Это сообщение отредактировал(а) Alca - 2.11.2008, 17:33


--------------------
PM WWW ICQ Skype Jabber   Вверх
JackYF
Дата 2.11.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Тему пометил решённой.

Добавлено через 28 секунд
Нет, не пометил smile
Топикстартер, помечай.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
J0ker
Дата 2.11.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MAKCim @ 2.11.2008,  10:36)
Цитата(J0ker @  2.11.2008,  02:03 Найти цитируемый пост)
std::string - это массив char'ов

никогда в жизни
std::string - это класс
реализация может быть разной  smile

отчасти согласен, но смею указать, что спецификация метода c_str() приводит к тому, что эффективная реализация string в 99.99999% - это все-таки массив


--------------------
user posted image
PM MAIL   Вверх
vinter
Дата 3.11.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(J0ker @  2.11.2008,  19:49 Найти цитируемый пост)
отчасти согласен, но смею указать, что спецификация метода c_str() приводит к тому, что эффективная реализация string в 99.99999% - это все-таки массив

какая спецификация можети об этом говорить? c_str() возвращает сторонний буфер который умрет при любом изменении стринга, каким образом это связано с внутренностью стринга?


--------------------
Мой блог
PM MAIL WWW   Вверх
J0ker
Дата 3.11.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  3.11.2008,  14:23 Найти цитируемый пост)
какая спецификация можети об этом говорить?

никакая

Цитата(vinter @  3.11.2008,  14:23 Найти цитируемый пост)
c_str() возвращает сторонний буфер

обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 3.11.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(J0ker @  3.11.2008,  17:53 Найти цитируемый пост)
обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна 

ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода  smile 
поэтому c_str() в принципе не должен использоваться часто, а значит и реализация не обязана быть эффективной


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Цитата(MAKCim @ 3.11.2008,  19:32)
Цитата(J0ker @  3.11.2008,  17:53 Найти цитируемый пост)
обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна 

ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода  smile 
поэтому c_str() в принципе не должен использоваться часто, а значит и реализация не обязана быть эффективной

а я разве говорил где-то про обязательства?
проясняю ситуацию
в связи с тем, что:
1. c_str() быть обязана
2. организация внутреннего буфера std::string в виде нэйтив массива ничему не препятствует в плане эффективности на большинстве современных архитектур
- внутренний буфер std::string организован обычно в виде массива



--------------------
user posted image
PM MAIL   Вверх
Lazin
Дата 3.11.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MAKCim @  3.11.2008,  19:32 Найти цитируемый пост)
ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода

я не согласен, многие интерфейсы используют const char* чтобы быть более универсальными, например, что-бы можно было написать так:
Код

void foo(const char*);
...
foo("blablabla");

иначе пришлось бы писать так:
Код

foo(std::string("blablabla"));
 smile

Добавлено через 1 минуту и 30 секунд
хотя нет, можно было-бы писать foo("blablabla") в любом случае, просто в случае std::string неявно был бы вызван конструктор smile 
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 3.11.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



J0ker, 
это все понятно
вопрос в чем вообще?
Цитата(J0ker @  2.11.2008,  02:03 Найти цитируемый пост)
std::string - это массив char'ов

Цитата(MAKCim @  2.11.2008,  10:36 Найти цитируемый пост)
никогда в жизни
std::string - это класс
реализация может быть разной


ты с чем-то не согласен?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
J0ker
Дата 4.11.2008, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ладно, MAKCim, ты победил  smile 


--------------------
user posted image
PM MAIL   Вверх
JackYF
Дата 4.11.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Вообще говоря, лишние конструкторы - лишнее падение производительности... ;)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1089 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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