Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
#1

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

07.07.2014, 23:37. Просмотров 1892. Ответов 12
Метки нет (Все метки)

Код:
Кликните здесь для просмотра всего текста

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) Никак не получаеться передать неявное кол. элементов или весь масив в обычную функцию. Возможно ли это? Потмоучто в шаблонной как мы видим возможно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 23:37
Ответы с готовыми решениями:

Определение размера массива
Привет всем у меня несколько вопросов по языку си (компилятор gcc). 1) Есть,...

Определение размера динамического массива
Вопрос может не много глупый, но я подзабыл с. Считаю размер динамического...

Определение размера массива + sizeof
Массив из 6 чисел: sizeof возвращает 24 байта. Тот же массив вызван функцией...

Определение размера массива в функции
Всем доброго дня ! Подскажите пожалуйста, как можно определить размер...

Определение размера одномерного массива
Добрый день. Необходимо задать размер одномерного массива. В цикле for стоит...

12
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.07.2014, 23:40 #2
Для длины строки функция strlen().
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
07.07.2014, 23:44  [ТС] #3
А не для строки)
0
srin
25 / 25 / 14
Регистрация: 05.05.2014
Сообщений: 115
08.07.2014, 00:35 #4
1. судя по всему, ваша функция arr_sz всего-лишь вычисляет размер массива char и передаёт её в функцию sum
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 00:39  [ТС] #5
то что она деляет я понимаю вопрос как она это делает. И как написать такуюе же функцию но не шаблонную. Которая бы принемала массив без явного указания ей кол. эллементов. Если я пишу аналог типо F1((&a)[]) оно требует явное указание размера масива константным значением. Хоть стреляй
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
08.07.2014, 00:40 #6
Цитата Сообщение от TierX Посмотреть сообщение
как такое сделать для обычной функции.
Никак.
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 00:54  [ТС] #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Никак.
Несправедливо. Кактож оно реализовано в шаблоне. Почему такое обьявление допускаеться в шаблоне а в обычной функции нет? Чем шаблон такой уникальный, что ему такое позволено? Более того в голове сразу куча мыслей, а что шаблонам еще такого позволено чего нельзя обычным нищщим.
Прямо как эволюция какаето...
0
GuGo1991
269 / 263 / 146
Регистрация: 02.08.2012
Сообщений: 609
08.07.2014, 01:02 #8
Цитата Сообщение от TierX Посмотреть сообщение
Чем шаблон такой уникальный, что ему такое позволено?
Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
Цитата с вики.
1
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 02:34  [ТС] #9
вот такие примеры о шаблонах нада в книги пилить. А не ой смарите как прикольно теперь можно функцию сразу и чар и дабл делать .
0
Croessmah
++Ͻ
14527 / 8289 / 1556
Регистрация: 27.09.2012
Сообщений: 20,353
Записей в блоге: 3
Завершенные тесты: 1
08.07.2014, 02:42 #10
Цитата Сообщение от TierX Посмотреть сообщение
вот такие примеры о шаблонах нада в книги пилить
нафига? Чтобы при разных массивах код разбухал?
Цитата Сообщение от TierX Посмотреть сообщение
А не ой смарите как прикольно теперь можно функцию сразу и чар и дабл делать .
а тут тоже самое, просто чуть завуалированно
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 04:07  [ТС] #11
нет чтобы показать что при помощи шаблонов можно то чего нельзя другим способом.
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.07.2014, 04:19 #12
Цитата Сообщение от TierX Посмотреть сообщение
нет чтобы показать что при помощи шаблонов можно то чего нельзя другим способом.
http://www.cyberforum.ru/cpp-experts/thread323714.html
1
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 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 Посмотреть сообщение
Никак не получаеться передать неявное кол. элементов или весь масив в обычную функцию. Возможно ли это?
Только отдельным параметром. Иначе будет вырождение массива в указатель.
1
08.07.2014, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 21:47

Определение размера динамического массива строк
Здравствуйте, столкнулся с проблемой предопределения размера массива строк....

Определение размера строки массива строк
Здравствуйте! Visual C++ char *my_string={&quot;Это первая строка&quot;, ...

Определение размера файла
Здравствуйте, я учусь на программиста, нужна помощь в программе. #include...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru