Туплю, напомните плиз - как узнать размер int aa[] ?
От: Аноним  
Дата: 05.08.11 20:01
Оценка:
Объявлен статический массив
static int aaa[] = {1,2,3,4,5,6};

Количество элементов это sizeof(aaa)/sizeof(int) или просто sizeof(aaa)?

Вылетело из башки, а в справке что-то не могу найти.
Re: Туплю, напомните плиз - как узнать размер int aa[] ?
От: vitabrevis  
Дата: 05.08.11 20:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Объявлен статический массив

А>static int aaa[] = {1,2,3,4,5,6};

А>Количество элементов это sizeof(aaa)/sizeof(int) или просто sizeof(aaa)?


А>Вылетело из башки, а в справке что-то не могу найти.

первое
Re: Туплю, напомните плиз - как узнать размер int aa[] ?
От: Vamp Россия  
Дата: 05.08.11 20:14
Оценка: 1 (1) +1
А>static int aaa[] = {1,2,3,4,5,6};
А>Количество элементов это sizeof(aaa)/sizeof(int) или просто sizeof(aaa)?
А>Вылетело из башки, а в справке что-то не могу найти.

Ну сам-то как думаешь? Чему равен sizeof(aaa)? Очевидно, что размеру ВСЕГО массива. А чему равен размер ВСЕГО массива? Понятно, что размеру одного элемента умноженного на количество элементов.
Кстати, привыкай писать

sizeof(aaa)/sizeof(aaa[0])


будет меньше сюрпризов, когда в массиве не целые.
Да здравствует мыло душистое и веревка пушистая.
Re: Туплю, напомните плиз - как узнать размер int aa[] ?
От: Shellac  
Дата: 05.08.11 20:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Объявлен статический массив

А>static int aaa[] = {1,2,3,4,5,6};

А>Количество элементов это sizeof(aaa)/sizeof(int) или просто sizeof(aaa)?


А>Вылетело из башки, а в справке что-то не могу найти.


Написали бы тестовый пример и проверили, делов то. Правильный ответ sizeof(aaa)/sizeof(int)
Re: Туплю, напомните плиз - как узнать размер int aa[] ?
От: wander  
Дата: 05.08.11 21:49
Оценка: 9 (3)
Здравствуйте, Аноним, Вы писали:

А>Объявлен статический массив

А>static int aaa[] = {1,2,3,4,5,6};

А>Количество элементов это sizeof(aaa)/sizeof(int) или просто sizeof(aaa)?


А>Вылетело из башки, а в справке что-то не могу найти.


Еще можно использовать вот такой шаблончик:
template <typename ArrT, size_t ArrS>
inline size_t sizeof_array(ArrT const (&)[ArrS])
{
    return ArrS;
}

example
Re[2]: Туплю, напомните плиз - как узнать размер int aa[] ?
От: uzhas Ниоткуда  
Дата: 05.08.11 21:59
Оценка: 1 (1) +1
Здравствуйте, wander, Вы писали:

W>Еще можно использовать вот такой шаблончик:

ну и добавлю статическую версию: http://codepad.org/l1B6e8ei
Re[2]: Туплю, напомните плиз - как узнать размер int aa[] ?
От: Слава Израиль  
Дата: 07.08.11 06:21
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, Аноним, Вы писали:


А>>Объявлен статический массив

А>>static int aaa[] = {1,2,3,4,5,6};

А>>Количество элементов это sizeof(aaa)/sizeof(int) или просто sizeof(aaa)?


А>>Вылетело из башки, а в справке что-то не могу найти.


W>Еще можно использовать вот такой шаблончик:

W>
W>template <typename ArrT, size_t ArrS>
W>inline size_t sizeof_array(ArrT const (&)[ArrS])
W>{
W>    return ArrS;
W>}
W>

W>example

Что-то не понял как это работает.
Спасибо за внимание
Re[3]: Туплю, напомните плиз - как узнать размер int aa[] ?
От: rg45 СССР  
Дата: 07.08.11 08:07
Оценка: 1 (1) +1
Здравствуйте, Слава, Вы писали:

W>>Еще можно использовать вот такой шаблончик:

W>>
W>>template <typename ArrT, size_t ArrS>
W>>inline size_t sizeof_array(ArrT const (&)[ArrS])
W>>{
W>>    return ArrS;
W>>}
W>>

W>>example

С>Что-то не понял как это работает.


Это шаблон функции, принимающей ссылку на констанный массив. Шаблон парметризоман типом элемента массива и его размером. Сразу хочется отметить, что фактичскими аргументмами этой функции не могут выступать указатели. Для понимания того, "как это работает", можно начать с рассмотрения такого варианта использования данной функции:
int some_array[42];
std::cout << array_size<int, 42>(some_array);

Но в данном случае явное указание параметров шаблона не является обязательным, поскольку компилятор способен их вывести из аргумента some_array на этапе компиляции. Поэтому приведенный фрагмент эквивалентен следующему:
int some_array[42];
std::cout << array_size(some_array);

Стоит также сказать два слова о строковых литералах. Типом, например, строкового литерала "Hello" является не const char*, как может показаться, а const char[6] (не забываем о завершающем нулевом символе). Ну и поскольку строковые литералы являются массивами, это позволяет использовать функцию array_size и для них.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Туплю, напомните плиз - как узнать размер int aa[] ?
От: Слава Израиль  
Дата: 07.08.11 10:38
Оценка:
Здравствуйте, rg45, Вы писали:


R>Это шаблон функции, принимающей ссылку на констанный массив. Шаблон парметризоман типом элемента массива и его размером. Сразу хочется отметить, что фактичскими аргументмами этой функции не могут выступать указатели. Для понимания того, "как это работает", можно начать с рассмотрения такого варианта использования данной функции:

R>
R>int some_array[42];
R>std::cout << array_size<int, 42>(some_array);
R>

R>Но в данном случае явное указание параметров шаблона не является обязательным, поскольку компилятор способен их вывести из аргумента some_array на этапе компиляции. Поэтому приведенный фрагмент эквивалентен следующему:
R>
R>int some_array[42];
R>std::cout << array_size(some_array);
R>

R>Стоит также сказать два слова о строковых литералах. Типом, например, строкового литерала "Hello" является не const char*, как может показаться, а const char[6] (не забываем о завершающем нулевом символе). Ну и поскольку строковые литералы являются массивами, это позволяет использовать функцию array_size и для них.

Понятно, игра с тем, что компилятору известен размер массива, ишодя из того, что различает типы int [4] и int [2], например.
Спасибо за внимание
Re[3]: Туплю, напомните плиз - как узнать размер int aa[] ?
От: баг  
Дата: 11.08.11 07:47
Оценка: +1 :)
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, wander, Вы писали:


W>>Еще можно использовать вот такой шаблончик:

U>ну и добавлю статическую версию: http://codepad.org/l1B6e8ei
... и сделаю унифицированный и понятный макрос _countof(array)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.