Форум программистов, компьютерный форум CyberForum.ru

Определение размера массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
07.07.2014, 23:37     Определение размера массива #1
Код:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
template <class T,int N>
int arr_sz(T (&arr)[N])
{return N;}
 
void sum(int a){cout<<a;};
 
int main() {
    
    char a[]={"kak ti mena zadolbal razmer masiva!"}; //36
 
    sum(arr_sz(a));//36

Началось с того что я решил найти размер масива создаваемого неявным кол элементов типо:
p[]={"А кто его знает сколько тут букф! Небуду я их считать!"}
в голову быстро пришло sizeof(p)/sizeof(char) все ок сработало
Потом решил сделать функцию. функция упорно выкидывала 4. Я примерно понял что это размер самого указателя. Никак не удавалось сделать как хотелось потом решил создать шаблонную функцию ... Аналогично...
Гугл выдал тот код что в начале. Он работает как нужно.
При создании чегото похожего для обычной функции требует обязательно явное кол элементов масива.Что понятное дело противоречит самому назначению функции.
Вопрос:
1) Как оно работает и как такое сделать для обычной функции.
+
2) Никак не получаеться передать неявное кол. элементов или весь масив в обычную функцию. Возможно ли это? Потмоучто в шаблонной как мы видим возможно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4286 / 3717 / 1250
Регистрация: 14.04.2014
Сообщений: 14,535
07.07.2014, 23:40     Определение размера массива #2
Для длины строки функция strlen().
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
07.07.2014, 23:44  [ТС]     Определение размера массива #3
А не для строки)
srin
25 / 25 / 11
Регистрация: 05.05.2014
Сообщений: 115
08.07.2014, 00:35     Определение размера массива #4
1. судя по всему, ваша функция arr_sz всего-лишь вычисляет размер массива char и передаёт её в функцию sum
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 00:39  [ТС]     Определение размера массива #5
то что она деляет я понимаю вопрос как она это делает. И как написать такуюе же функцию но не шаблонную. Которая бы принемала массив без явного указания ей кол. эллементов. Если я пишу аналог типо F1((&a)[]) оно требует явное указание размера масива константным значением. Хоть стреляй
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.07.2014, 00:40     Определение размера массива #6
Цитата Сообщение от TierX Посмотреть сообщение
как такое сделать для обычной функции.
Никак.
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 00:54  [ТС]     Определение размера массива #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Никак.
Несправедливо. Кактож оно реализовано в шаблоне. Почему такое обьявление допускаеться в шаблоне а в обычной функции нет? Чем шаблон такой уникальный, что ему такое позволено? Более того в голове сразу куча мыслей, а что шаблонам еще такого позволено чего нельзя обычным нищщим.
Прямо как эволюция какаето...
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
08.07.2014, 01:02     Определение размера массива #8
Цитата Сообщение от TierX Посмотреть сообщение
Чем шаблон такой уникальный, что ему такое позволено?
Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
Цитата с вики.
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 02:34  [ТС]     Определение размера массива #9
вот такие примеры о шаблонах нада в книги пилить. А не ой смарите как прикольно теперь можно функцию сразу и чар и дабл делать .
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
08.07.2014, 02:42     Определение размера массива #10
Цитата Сообщение от TierX Посмотреть сообщение
вот такие примеры о шаблонах нада в книги пилить
нафига? Чтобы при разных массивах код разбухал?
Цитата Сообщение от TierX Посмотреть сообщение
А не ой смарите как прикольно теперь можно функцию сразу и чар и дабл делать .
а тут тоже самое, просто чуть завуалированно
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 04:07  [ТС]     Определение размера массива #11
нет чтобы показать что при помощи шаблонов можно то чего нельзя другим способом.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.07.2014, 04:19     Определение размера массива #12
Цитата Сообщение от TierX Посмотреть сообщение
нет чтобы показать что при помощи шаблонов можно то чего нельзя другим способом.
http://www.cyberforum.ru/cpp-experts/thread323714.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 21:47     Определение размера массива
Еще ссылки по теме:

Определение размера динамического массива строк C++
C++ Определение размера char** argv
Определение размера массива в функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14190 / 6205 / 984
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
08.07.2014, 21:47     Определение размера массива #13
Цитата Сообщение от TierX Посмотреть сообщение
Вопрос:
1) Как оно работает и как такое сделать для обычной функции.
Массивы вырождаются в указатели, это известная "фича" языков C и C++.

С++03:
4.2 Array-to-pointer conversion

1 An lvalue or rvalue of type “array of N T” or “array of unknown
bound of T” can be converted to an rvalue of type “pointer to T.”
The result is a pointer to the first element of the array.
Поэтому следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
template <typename T>
size_t size_of_array(T Arr[])
{
    return (sizeof (Arr) / sizeof (Arr[0]));
}
 
int main()
{
    int Array[] = {1, 2, 3, 4, 5, 6};
    std::cout << size_of_array(Array) << std::endl;
    return 0;
}
выдает вполне предсказуемый результат:
Кликните здесь для просмотра всего текста

> 1


Однако в том же стандарте сказано, что для ссылочных аргументов
шаблона никаких преобразований не выполняется:
14.3.2 Template non-type arguments

For a non-typetemplate-parameterof type reference to object, no conversions apply.
Поэтому вот такой код будет работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
template <typename T>
size_t size_of_array(T & Arr)
{
    return (sizeof (Arr) / sizeof (Arr[0]));
}
 
int main()
{
    int Array[] = {1, 2, 3, 4, 5, 6};
    std::cout << size_of_array(Array) << std::endl;
    return 0;
}
Вывод:
Кликните здесь для просмотра всего текста

> 6


Цитата Сообщение от TierX Посмотреть сообщение
Никак не получаеться передать неявное кол. элементов или весь масив в обычную функцию. Возможно ли это?
Только отдельным параметром. Иначе будет вырождение массива в указатель.
Yandex
Объявления
08.07.2014, 21:47     Определение размера массива
Ответ Создать тему
Опции темы

Текущее время: 20:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru