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

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

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

Студворк — интернет-сервис помощи студентам
Всем привет! Подскажите, как передать функции массив в качестве аргумента? И как сделать, чтобы функция возвращала массив?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2012, 17:19
Ответы с готовыми решениями:

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

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

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

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

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

Цитата Сообщение от hoggy Посмотреть сообщение
T (&Example( *T (&arr)[N] ) * )[N]
А именно [N] после скобок.
Заранее благодарен.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
01.03.2019, 11:58
Цитата Сообщение от WhiteRaven01 Посмотреть сообщение
Объясните новичку строку
Функция
принимает в качестве параметра ссылку на массив из N элементов типа T,
и возвращает ссылку на массив из N элементов типа T.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
01.03.2019, 12:31
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
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.03.2019, 12:39
Цитата Сообщение от 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
Цитата Сообщение от Azazel-San Посмотреть сообщение
-> decltype(arr)
Это, если я не ошибаюсь, использование указателей?
Для меня это только недавно открытая тема (указатели) и оператор "->" является пока что тайной.
Но спасибо, буду знать что есть ещё один способ возвратить массив из функции.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
10.03.2019, 17:19
Цитата Сообщение от 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
Цитата Сообщение от eva2326 Посмотреть сообщение
Но нельзя вернуть сам массив.
Или как ещё говорят: нельзя вернуть массив по значению
Возврат по значению это не возврат "самого" объекта, а возврат его копии.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
12.03.2019, 19:43
Спасибо огромное!

Но вот ещё один вопрос: как можно передать в функцию массив string? Желательно в шаблонную, возможно для этого уже существуют решения из STL.
Проблема, как я понял, в том, что при попытке запихнуть подобный массив в шаблонную функцию, <size_t N> не может правильно определиться.
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 8
03.04.2019, 09:24
Всё, разобрался, просто делаешь контейнер с типом string (vector<string>) и передаешь в функцию.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
05.05.2019, 10:22
Цитата Сообщение от 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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.05.2019, 11:42
alexbmd, чё?
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
05.05.2019, 13:20
Croessmah, пытаюсь понять что это такое
type (var1)[var2]
Цитата Сообщение от Azazel-San Посмотреть сообщение
T (&arr)[N]
var2==N макрос т.е. по сути переменная int может быть?. почему именно в квадратных скобках ?
var1==&arr. почему именно в круглых скобках ? только ссылка или любая int переменная может быть ?
обе переменные одного типа должны быть? любого типа можно?

Добавлено через 3 минуты
так же непонятно зачем вся эта эпопея с передачей или не передачей второго аргумента как размер массива, если можем просто передать массив и внутри функции посчитать его размер (кто count-ом любит, кто sizeof и тд), или это не круто или неправильно, или почему не считают его размер внутри функции?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.05.2019, 13:30
Начнем с простого:
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
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
05.05.2019, 18:46
спасибо
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
18.07.2019, 16:24
Цитата Сообщение от 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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 16:27
Цитата Сообщение от alexbmd Посмотреть сообщение
1. зачем там class когда по идее должно быть typename ? и если заменить оно также работает
И так и так можно. Разница только в количестве писанины.
Цитата Сообщение от alexbmd Посмотреть сообщение
N это size_t но если пишу как в цитате
N - Это не тип size_t, а значение типа size_t
Под конкретное значение:
C++
1
void foo(int (&a)[10])//Принимает ссылку на массив из 10 элементов типа int
В случае с шаблоном, при передачи ссылки на массив, значение N выводится автоматически, исходя из типа аргумента.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
18.07.2019, 16:48
Цитата Сообщение от 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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 17:02
Цитата Сообщение от alexbmd Посмотреть сообщение
это так только в тимплейте можно
Да.
Цитата Сообщение от alexbmd Посмотреть сообщение
N будет высчитываться автоматически на основе передаваемого аргумента
Да.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.07.2019, 17:08
Цитата Сообщение от alexbmd Посмотреть сообщение
это так только в тимплейте можно или я могу обычную функцию написать, с авто подсчётом
Обычную - не сможешь. Потому что для обычной функции тебе придётся указать

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

А шаблонные функции - это не одна функция, а целый набор, который генерируется для каждого типа массива свой собственный (т.е. если у тебя вызывается для массивов с размерами 10, 20 и 50, то шаблонная функция инстанцируется тоже 3 раза, для каждого из размеров получится своя собственная "функция", где это число будет везде подставлено)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2019, 17:08

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru