sizeof(arr) / sizeof(arr[0])
От: gbt Россия  
Дата: 06.07.05 06:32
Оценка:
Надоело уже везде писать сабж или определять шаблонную функцию count_in().
Нет ли стандартной функции или макроса ?
Re: sizeof(arr) / sizeof(arr[0])
От: Bell Россия  
Дата: 06.07.05 06:33
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Надоело уже везде писать сабж или определять шаблонную функцию count_in().

gbt>Нет ли стандартной функции или макроса ?

Увы, нет.
Любите книгу — источник знаний (с) М.Горький
Re: sizeof(arr) / sizeof(arr[0])
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 06.07.05 07:12
Оценка: 1 (1)
Здравствуйте, gbt, Вы писали:

gbt>Надоело уже везде писать сабж или определять шаблонную функцию count_in().

gbt>Нет ли стандартной функции или макроса ?

Если надоело, то пора систематизировать код
У нас в библиотеке (которая подключается ко всем внутренним проектам), есть набор "стандартных" макросов

#define _DIM_(__Array__) (sizeof(__Array__)/sizeof((__Array__)[0]))
#define _END_(__Array__) ((__Array__)+_DIM_(__Array__))

#define _MEMBER_SIZE_(s_name,m_name) (sizeof(((s_name*)0)->m_name))
#define _MEMBER_DIM_(s_name,m_name)  _DIM_(((s_name*)0)->m_name)
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: sizeof(arr) / sizeof(arr[0])
От: gbt Россия  
Дата: 06.07.05 07:17
Оценка: :)
Здравствуйте, Коваленко Дмитрий, Вы писали:

gbt>>Надоело уже везде писать сабж или определять шаблонную функцию count_in().

gbt>>Нет ли стандартной функции или макроса ?

КД>Если надоело, то пора систематизировать код

КД>У нас в библиотеке (которая подключается ко всем внутренним проектам), есть набор "стандартных" макросов

КД>
КД>#define _DIM_(__Array__) (sizeof(__Array__)/sizeof((__Array__)[0]))
КД>

Ох уж не люблю я макросы, вспоминая хотя бы о стандартных min и max в windows.h, которые приходится постоянно отключать, чтобы было можно воспользоваться numeric_limits, поэтому я обычно пишу такую шаблонную функцию:
template <typename TItem, int Count>
unsigned count_in(TItem const (& a_array)[Count])
{
    return sizeof(a_array) / sizeof(a_array[0]);
}

Я нигде стандарт не нарушил ?
Re: sizeof(arr) / sizeof(arr[0])
От: stasan  
Дата: 06.07.05 07:26
Оценка: 2 (1)
Здравствуйте, gbt, Вы писали:

gbt>Надоело уже везде писать сабж или определять шаблонную функцию count_in().


Мне тоже надоело. Использую boost::array:

    boost::array<int, 5> a = { 1, 2, 3, 4, 5 };

    cout << a.size() << endl;


gbt>Нет ли стандартной функции или макроса ?


Нет.
Re[3]: sizeof(arr) / sizeof(arr[0])
От: korzhik Россия  
Дата: 06.07.05 07:44
Оценка: 6 (3)
Здравствуйте, gbt, Вы писали:

gbt>
gbt>template <typename TItem, int Count>
gbt>unsigned count_in(TItem const (& a_array)[Count])
gbt>{
gbt>    return sizeof(a_array) / sizeof(a_array[0]);
gbt>}
gbt>

gbt>Я нигде стандарт не нарушил ?

да вроде нигде. Только делаешь лишнюю работу.
Зачем нужна эта строчка:
  return sizeof(a_array) / sizeof(a_array[0]);

если в результате вывода аргументов компилятору уже известен размер массива, то есть правильней было бы так:
template <typename TItem, unsigned Count>
unsigned count_in(TItem const (&a_array)[Count])
{
  return Count;
}

но у этого решения один недостаток — эта функция не даёт константу времени компиляции.
Если нужна константа времени компиляции, то есть такое решение (не я придумал к сожалению ):
template<class T, std::size_t N> 
char(&lenghtOf(T(&)[N]))[N];

#define lenghtOf(arr) sizeof(lenghtOf(arr))


Если сильная аллергия на макросы, то используй без макроса:
template<class T, std::size_t N> char(&lenghtOf(T(&)[N]))[N];

int main()
{
  int arr[10];
  enum{arr_size = sizeof(lenghtOf(arr))};
}
Re[2]: sizeof(arr) / sizeof(arr[0])
От: Centaur Россия  
Дата: 06.07.05 14:48
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>У нас в библиотеке (которая подключается ко всем внутренним проектам), есть набор "стандартных" макросов


КД>
КД>#define _DIM_(__Array__) (sizeof(__Array__)/sizeof((__Array__)[0]))
КД>#define _END_(__Array__) ((__Array__)+_DIM_(__Array__))

КД>#define _MEMBER_SIZE_(s_name,m_name) (sizeof(((s_name*)0)->m_name))
КД>#define _MEMBER_DIM_(s_name,m_name)  _DIM_(((s_name*)0)->m_name)
КД>


Вы рискуете поломать своими макросами какую-нибудь реализацию стандартной библиотеки, или быть поломанными ею. Согласно 17.4.3.1.2/1, имена, начинающиеся с двух подчёркиваний или с подчёркивания и большой буквы, зарезервированы для реализаций стандартной библиотеки.
Re[3]: sizeof(arr) / sizeof(arr[0])
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 06.07.05 17:08
Оценка: -1 :)
Здравствуйте, Centaur, Вы писали:

C>Вы рискуете поломать своими макросами какую-нибудь реализацию стандартной библиотеки, или быть поломанными ею. Согласно 17.4.3.1.2/1, имена, начинающиеся с двух подчёркиваний или с подчёркивания и большой буквы, зарезервированы для реализаций стандартной библиотеки.


Я в этой жизни делал и более серьезные ошибки
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: sizeof(arr) / sizeof(arr[0])
От: aik Австралия  
Дата: 06.07.05 17:50
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Надоело уже везде писать сабж или определять шаблонную функцию count_in().

gbt>Нет ли стандартной функции или макроса ?

Есть только SIZEOF_ARRAY в ks.h. Но хидер весьма специфичный (kernel streaming).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.