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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пустая строка, определение 
V
    Опции темы
inside_pointer
Дата 15.4.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



всё

Код

 
#include <iostream>

using namespace std;

// проверяет строку на пустоту
int main(void)
{
    string s1 = "one two",
           s2 = "";
    
    cout << *(char **) &s1 << endl;
    if (**(char **) &s2 == '\0')
        cout << "It's empty :)" << endl;
    return 0;
}


Код

[guest@station tmp]$ ./test
one two
It's empty :)
[guest@station tmp]$

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


uploading...
****


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

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



inside_pointer, 
вылетает при запуске на визуал студии

Добавлено через 5 минут и 55 секунд
inside_pointer
в GCC std::string хранит только указатель на char, потому там сработает..только вот стандарт этого не гарантирует.
Код

if (**(char **) &s2 == '\0')

по вашему это красивее и правильнее чем
Код

if ( str.empty() )

?
PM   Вверх
mes
Дата 15.4.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(inside_pointer @  15.4.2009,  10:31 Найти цитируемый пост)
*(char **)&

этим Вы никого кроме себя не обманули. 



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


Опытный
**


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

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



Цитата(azesmcar)

только вот стандарт этого не гарантирует

ну я там писал, что если совпадёт, то можно
а если не совпадёт, то тоже можно smile

Добавлено @ 12:03
mes, ну, это прямой доступ к указателю на первый символ, а не посредством компилятора (типа, как он там решит)

Это сообщение отредактировал(а) inside_pointer - 15.4.2009, 12:07
PM MAIL   Вверх
mes
Дата 15.4.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(inside_pointer @  15.4.2009,  11:02 Найти цитируемый пост)
ну я там писал, что если сопадёт, то можно
а если не сопадёт, то тоже можно 

да.. конечно можно создавать себе проблемы на ровном месте.. имхо, это запретить не реально.
только нас не надо убеждать следовать Вашим путем  smile 


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


Опытный
**


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

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



ну, empty тоже запоминать тогда надо, в итоге разрастётся всё это как Visual Basic - триста операторов, все по-мелочи
PM MAIL   Вверх
mes
Дата 15.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(inside_pointer @  15.4.2009,  11:02 Найти цитируемый пост)
mes, ну это прямой доступ к указателю на первый символ, а не посредством компилятора (типа как он там решит) 

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

class string
{
   int size;
   char m_bufin[20]; // внутренний буффер для коротких строк
   char *m_bufex ; // указатель на внешний буффер, если строка превышает допустимый минимум.
..
}

?
не говоря уже о строках с COW..там буффер получается "запрятан еще дальше". А также совсем не обязательно чтоб буффер был представлен как char *.

Добавлено @ 12:16
Цитата(inside_pointer @  15.4.2009,  11:10 Найти цитируемый пост)
ну, empty тоже запоминать тогда надо 

если память плохая, можно заглянуть в документацию.  smile

Добавлено через 3 минуты и 28 секунд
Цитата(inside_pointer @  15.4.2009,  11:10 Найти цитируемый пост)
тоже запоминать тогда надо, в итоге разрастётся всё это как Visual Basic - триста операторов, все по-мелочи 

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

Добавлено через 5 минут и 42 секунды
Цитата(inside_pointer @  15.4.2009,  11:02 Найти цитируемый пост)
а не посредством компилятора (типа, как он там решит)

вобще-то  доступ через интерфейс, определяет не компилятор, а программист/ы, написавший этот компонент.
а компилятор лишь следит (в силу своих возможностей) за установленными договоренностями .


Это сообщение отредактировал(а) mes - 15.4.2009, 12:16


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


Опытный
**


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

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



Цитата(mes)

определяет не компилятор, а программист/ы, написавший этот компонент

какой компонент, компонент компилятора ?

Цитата(mes)

А также совсем не обязательно чтоб буффер был представлен как char *

это как, а в чём смысл иного представления ? char - минимальный размер, чем меньше размер, тем меньше требований к выравниванию
PM MAIL   Вверх
mes
Дата 15.4.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(inside_pointer @  15.4.2009,  11:36 Найти цитируемый пост)

какой компонент, компонент компилятора ?

класс, функция или библиотека. В нашем случае класс string.

вот почуствуйте разницу между возможной реализцией внутренней функции и того что Вы предлагали :
Код

class string
{
    char * m_buf;
 public:
      string () : m_buf(NULL) {}
      bool is_empty () { return !m_buf || !*m_buf; } 
};

// if (**(char **) &s == '\0')

как видете, Ваш способ имеет вероятность обращения по нулевому указателю.


Цитата(inside_pointer @  15.4.2009,  11:36 Найти цитируемый пост)
это как, а в чём смысл иного представления ? 

а может она хранит внутри себя как юникод ? 

Это сообщение отредактировал(а) mes - 15.4.2009, 12:49


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


uploading...
****


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

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



Цитата

ну, empty тоже запоминать тогда надо, в итоге разрастётся всё это как Visual Basic - триста операторов, все по-мелочи 


Почитайте главу "Ослабленная монолитность std::string" в книге Саттера "Решение более сложных задач на С++".
Там он говорит о том что многие функции класса std::string могли бы быть глобальными, например тот же empty
Код

namespace std {
   template <typename T>
   bool empty( const T& container ) {
      return (container.begin() == container.end());
   }
}

это можно применять с любым STL совместимым контейнером. И это приемлемый способ (и даже лучше чем тот что есть сейчас)..но ваш я приемлемым никак не могу назвать

Это сообщение отредактировал(а) azesmcar - 15.4.2009, 12:55
PM   Вверх
mes
Дата 15.4.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  15.4.2009,  11:54 Найти цитируемый пост)
И это приемлемый способ

но это тоже не избавит от запоминания функции empty  smile 


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


uploading...
****


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

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



Склероз лечится smile 


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


depict1
****


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

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



Цитата(azesmcar @  15.4.2009,  12:54 Найти цитируемый пост)
это можно применять с любым STL совместимым контейнером.

это можно применять с чем угодно. и если передадим не контейнер, то получим шквал ругательств от компилятора.
Код

char *s = "";
empty(s);

а вообще да, способ хороший. мне нравится smile


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


uploading...
****


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

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



Цитата

это можно применять с чем угодно. и если передадим не контейнер, то получим шквал ругательств от компилятора.

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


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

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