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

С++ для начинающих

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

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

07.07.2014, 23:37. Просмотров 1482. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определение размера массива (C++):

Определение размера массива - C++
Привет всем у меня несколько вопросов по языку си (компилятор gcc). 1) Есть, например след код: char* sym; char c = 'a'; ...

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

Определение размера массива в функции - C++
Всем доброго дня ! Подскажите пожалуйста, как можно определить размер массива в функции ? запись int n = sizeof(a)/sizeof(int);...

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

Определение размера массива + sizeof - C++
Массив из 6 чисел: sizeof возвращает 24 байта. Тот же массив вызван функцией возвращает только 4 байта. #include &lt;iostream&gt; using...

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

12
nmcf
5355 / 4675 / 1566
Регистрация: 14.04.2014
Сообщений: 18,634
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 / 11
Регистрация: 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!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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
267 / 261 / 93
Регистрация: 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
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,888
Записей в блоге: 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
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.07.2014, 04:19 #12
Цитата Сообщение от TierX Посмотреть сообщение
нет чтобы показать что при помощи шаблонов можно то чего нельзя другим способом.
http://www.cyberforum.ru/cpp-experts/thread323714.html
1
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1139
Регистрация: 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
Привет! Вот еще темы с ответами:

Определение размера динамического массива строк - C++
Здравствуйте, столкнулся с проблемой предопределения размера массива строк. Проблема в том, что я не знаю, какой размер мне выделить при...

Определение размера файла - C++
Здравствуйте, я учусь на программиста, нужна помощь в программе. #include &lt;fstream.h&gt; #include &lt;windows.h&gt; #include &lt;iostream&gt; ...

Определение размера char** argv - C++
Есть массив строк char** argv где я знаю число строк argc for (int i = 0; i &lt; argc; i++){ printf(&quot;%s \n&quot;,argv); } char**...

Преобразование числа в символ и определение размера, - C++
Вот что я написал: #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; void main() { const int n=5; int M={8,2,3,4,5}; ...


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

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

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