Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/697: Рейтинг темы: голосов - 697, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 23
1

Как передать функции массив в качестве аргумента?

23.04.2012, 17:19. Показов 125631. Ответов 96
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Подскажите, как передать функции массив в качестве аргумента? И как сделать, чтобы функция возвращала массив?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2012, 17:19
Ответы с готовыми решениями:

Как в качестве аргумента функции передать массив?
Доброго времени суток! Расскажите, пожалуйста, если не затрудняет, как в качестве аргумента...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель)
#include <iostream> using namespace std; template <class T1> class mas { public: T1 n; T1...

Как передать функции указатель на функцию в качестве аргумента?
как передать функции указатель на функцию в качестве аргумента?

Нюансы работы с массивами: как правильно передать массив в функцию в качестве аргумента?
Здравствуйте!!!Начал недавно изучать с++ и с по книге!!!там есть пример и возник небольшой вопрос к...

96
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
21.11.2016, 08:46 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Shutz00 Посмотреть сообщение
как передать функции массив в качестве аргумента?
Цитата Сообщение от Centurion01_1 Посмотреть сообщение
как мне передать вот этот массив в функцию
Раз, два, три, четыре.

Так же, не забываем про STL-обёртки std::begin и std::end - весьма полезные штуки.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
01.03.2019, 11:49 22
Объясните новичку строку:

Цитата Сообщение от hoggy Посмотреть сообщение
T (&Example( *T (&arr)[N] ) * )[N]
А именно [N] после скобок.
Заранее благодарен.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.03.2019, 11:58 23
Цитата Сообщение от WhiteRaven01 Посмотреть сообщение
Объясните новичку строку
Функция
принимает в качестве параметра ссылку на массив из N элементов типа T,
и возвращает ссылку на массив из N элементов типа T.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
01.03.2019, 12:31 24
C++
1
2
3
4
5
6
7
8
9
10
template<class T, size_t N>
T (&Example(  T (&arr)[N] )   )[N]
{
    static T tmp[N]; 
    
    for(size_t i=0; i<N; ++i ) 
        tmp[i]= arr[i]*2;
    
    return tmp; 
}
Объясните новичку строку

C++
1
T (&Example(  T (&arr)[N] )   )[N]
А именно [N] после скобок.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.03.2019, 12:39 25
Цитата Сообщение от WhiteRaven01 Посмотреть сообщение
А именно [N] после скобок.
Это часть конструкции, той же что и задана в параметре T (&arr)[N], только здесь в качестве "возвращающего типа".
Проверить себя можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template <typename T, std::size_t N>
auto example(T(&arr)[N]) -> decltype(arr) // для большей наглядности и 
{                                         // менее пугливо выглядит
    static T tmp[N]; 
    
    for(size_t i=0; i<N; ++i ) 
        tmp[i]= arr[i]*2;
    
    return tmp; 
}
 
int main() {  
    int a[]{1, 2, 3, 4, 5, 6};
    // Проверим слова Croessmah, что же вернет ф-я
    std::cout << std::boolalpha << std::is_reference_v<decltype(example(a))> << '\n'; 
}
1
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
10.03.2019, 14:59 26
Цитата Сообщение от Azazel-San Посмотреть сообщение
-> decltype(arr)
Это, если я не ошибаюсь, использование указателей?
Для меня это только недавно открытая тема (указатели) и оператор "->" является пока что тайной.
Но спасибо, буду знать что есть ещё один способ возвратить массив из функции.
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
10.03.2019, 17:19 27
Цитата Сообщение от WhiteRaven01 Посмотреть сообщение
Это, если я не ошибаюсь, использование указателей?
Ошибаетесь)

Как может выглядеть функция, которая возвращает int?
C++
1
int example();
А как может выглядеть функция, которая возвращает float?
C++
1
float example();
Все тоже самое можно написать по другому:


Как может выглядеть функция, которая возвращает int?
C++
1
auto example() -> int;
А как может выглядеть функция, которая возвращает float?
C++
1
auto example() -> float;

Стрелочка -> после функции указывает компилятору,
какой тип данных должна вернуть функция.

Здесь:
C++
1
2
template <typename T, std::size_t N>
auto example(T(&arr)[N]) -> decltype(arr)
Стрелочка -> указывает компилятору,
что функция должна вернуть такой же тип данных, как у переменной arr
Причем, тип переменной arr - ссылка на массив.
Значит функция должна вернуть точно такую же ссылку на массив.

Цитата Сообщение от WhiteRaven01 Посмотреть сообщение
ещё один способ возвратить массив из функции.
Из функции нельзя вернуть массив.

Можно вернуть указатель на массив, или на первый элемент, или по ссылкам.
Можно вернуть массив по значению в составе агрегирующей структуры.

Но нельзя вернуть сам массив.
Или как ещё говорят: нельзя вернуть массив по значению
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
10.03.2019, 18:53 28
Цитата Сообщение от eva2326 Посмотреть сообщение
Но нельзя вернуть сам массив.
Или как ещё говорят: нельзя вернуть массив по значению
Возврат по значению это не возврат "самого" объекта, а возврат его копии.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
12.03.2019, 19:43 29
Спасибо огромное!

Но вот ещё один вопрос: как можно передать в функцию массив string? Желательно в шаблонную, возможно для этого уже существуют решения из STL.
Проблема, как я понял, в том, что при попытке запихнуть подобный массив в шаблонную функцию, <size_t N> не может правильно определиться.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
03.04.2019, 09:24 30
Всё, разобрался, просто делаешь контейнер с типом string (vector<string>) и передаешь в функцию.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
05.05.2019, 10:22 31
Цитата Сообщение от hoggy Посмотреть сообщение
int Example( *int (&arr)[N] )
а что это за декларирование без запятой ?

выдает ошибку что нехватает запятой
C++
1
2
3
4
5
6
7
int val2 = 5;
int foo(int val1 val2 ){
return (val1<val2)?1:0;
}
int main(){
printf("%d",foo(2));
}
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
05.05.2019, 11:42 32
alexbmd, чё?
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
05.05.2019, 13:20 33
Croessmah, пытаюсь понять что это такое
type (var1)[var2]
Цитата Сообщение от Azazel-San Посмотреть сообщение
T (&arr)[N]
var2==N макрос т.е. по сути переменная int может быть?. почему именно в квадратных скобках ?
var1==&arr. почему именно в круглых скобках ? только ссылка или любая int переменная может быть ?
обе переменные одного типа должны быть? любого типа можно?

Добавлено через 3 минуты
так же непонятно зачем вся эта эпопея с передачей или не передачей второго аргумента как размер массива, если можем просто передать массив и внутри функции посчитать его размер (кто count-ом любит, кто sizeof и тд), или это не круто или неправильно, или почему не считают его размер внутри функции?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
05.05.2019, 13:30 34
Начнем с простого:
type (&arr)[10] - ссылка на массив из 10 элементов типа type
C++
1
2
int arr[10]; 
int (&ref)[10] = arr; //ref - ссылка на массив arr
С шаблонами тоже самое, никакой магии или еще чего-либо волшебного.
C++
1
2
template <typename T, std::size_t N>
auto example(T(&arr)[N]) -> decltype(arr)
arr - ссылка на массив из N элементов типа T.
При передаче в данную функцию массива, параметры шаблона N и T будут выведены компилятором на основе аргумента функции.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
05.05.2019, 18:46 35
спасибо
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
18.07.2019, 16:24 36
Цитата Сообщение от hoggy Посмотреть сообщение
template<class T, size_t N>
void view(const T (&arr)[N], const char* name)
друзья растолкуйте плиз пару моментов
1. зачем там class когда по идее должно быть typename ? и если заменить оно также работает

2. когда у нас ссылка на массив, мы обязаны указать размер, например void foo(int (&a)[5]). N это size_t но если пишу как в цитате void foo(int (&a)[size_t]) получаю кучу ошибок. как можно исправить ? развернуть так сказать тимплейт в обычную функцию
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
18.07.2019, 16:27 37
Цитата Сообщение от alexbmd Посмотреть сообщение
1. зачем там class когда по идее должно быть typename ? и если заменить оно также работает
И так и так можно. Разница только в количестве писанины.
Цитата Сообщение от alexbmd Посмотреть сообщение
N это size_t но если пишу как в цитате
N - Это не тип size_t, а значение типа size_t
Под конкретное значение:
C++
1
void foo(int (&a)[10])//Принимает ссылку на массив из 10 элементов типа int
В случае с шаблоном, при передачи ссылки на массив, значение N выводится автоматически, исходя из типа аргумента.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
18.07.2019, 16:48 38
Цитата Сообщение от Croessmah Посмотреть сообщение
N - Это не тип size_t, а значение типа size_t
это фича тимплейта или можно сделать просто функцию в которой размер (N) тоже будет выводится автоматически ?

Добавлено через 16 минут
я имею ввиду, вот упростим наш тимплейт до такого вида
C++
1
2
template <size_t N>
void view(const int (&)[N])
N будет высчитываться автоматически на основе передаваемого аргумента.
это так только в тимплейте можно или я могу обычную функцию написать, с авто подсчётом
вроде
C++
1
void foo(int (&a)[ N ])
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
18.07.2019, 17:02 39
Цитата Сообщение от alexbmd Посмотреть сообщение
это так только в тимплейте можно
Да.
Цитата Сообщение от alexbmd Посмотреть сообщение
N будет высчитываться автоматически на основе передаваемого аргумента
Да.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
18.07.2019, 17:08 40
Цитата Сообщение от alexbmd Посмотреть сообщение
это так только в тимплейте можно или я могу обычную функцию написать, с авто подсчётом
Обычную - не сможешь. Потому что для обычной функции тебе придётся указать

C++
1
void foo(int (&a)[ 10 ])
или ещё какую-нибудь константу, которая будет раз и навсегда задана для данной функции.

А шаблонные функции - это не одна функция, а целый набор, который генерируется для каждого типа массива свой собственный (т.е. если у тебя вызывается для массивов с размерами 10, 20 и 50, то шаблонная функция инстанцируется тоже 3 раза, для каждого из размеров получится своя собственная "функция", где это число будет везде подставлено)
2
18.07.2019, 17:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2019, 17:08
Помогаю со студенческими работами здесь

Передать std::vector в качестве аргумента функции
Задание: определить моду чисел из массива. Вот код: #include &lt;iostream&gt; #include &lt;vector&gt; int...

Как передать массив структур в функцию в качестве параметра, чтобы изменения в функции меняли исходный массив?
Допустим есть структура struct Base { int a; int b; int c; }; В...

Как передать функцию в качестве аргумента?
Как передать функцию в функцию, выполняющую усреднение значения через интегрирование. Так как...

Передача функции в качестве аргумента массив
Помогите пожалуйста! есть некая рекурсивная функция N которая принимает 2 целочисленные переменные...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru