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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5101 / 4421 / 1471
Регистрация: 14.04.2014
Сообщений: 17,519
07.07.2014, 23:40     Определение размера массива #2
Для длины строки функция strlen().
TierX
20 / 20 / 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
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 00:39  [ТС]     Определение размера массива #5
то что она деляет я понимаю вопрос как она это делает. И как написать такуюе же функцию но не шаблонную. Которая бы принемала массив без явного указания ей кол. эллементов. Если я пишу аналог типо F1((&a)[]) оно требует явное указание размера масива константным значением. Хоть стреляй
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
08.07.2014, 00:40     Определение размера массива #6
Цитата Сообщение от TierX Посмотреть сообщение
как такое сделать для обычной функции.
Никак.
TierX
20 / 20 / 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
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 02:34  [ТС]     Определение размера массива #9
вот такие примеры о шаблонах нада в книги пилить. А не ой смарите как прикольно теперь можно функцию сразу и чар и дабл делать .
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
08.07.2014, 02:42     Определение размера массива #10
Цитата Сообщение от TierX Посмотреть сообщение
вот такие примеры о шаблонах нада в книги пилить
нафига? Чтобы при разных массивах код разбухал?
Цитата Сообщение от TierX Посмотреть сообщение
А не ой смарите как прикольно теперь можно функцию сразу и чар и дабл делать .
а тут тоже самое, просто чуть завуалированно
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.07.2014, 04:07  [ТС]     Определение размера массива #11
нет чтобы показать что при помощи шаблонов можно то чего нельзя другим способом.
Jupiter
Каратель
Эксперт С++
6551 / 3971 / 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++
Здравствуйте, я учусь на программиста, нужна помощь в программе. #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}; ...

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

Определение размера типа переданного в шаблон - C++
Доброй день. Подскажите почему, sizeof в данном случае некорректно определяет размер структуры struct Preheader_1 { uint8_t...


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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
Эксперт С++
15236 / 6868 / 1087
Регистрация: 02.05.2013
Сообщений: 11,237
Завершенные тесты: 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     Определение размера массива
Ответ Создать тему
Опции темы

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