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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 146, средняя оценка - 4.64
Shutz00
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 23
#1

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

23.04.2012, 17:19. Просмотров 26063. Ответов 20
Метки нет (Все метки)

Всем привет! Подскажите, как передать функции массив в качестве аргумента? И как сделать, чтобы функция возвращала массив?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2012, 17:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать функции массив в качестве аргумента? (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
23.04.2012, 17:37 #2
передать указатель на первый элемент.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
int foo(int* arr, int N){
    std::cout<<arr[N-1];
    return arr[N-1];
}
int main(){
  int a[3];
  a[2]=2011;
  foo(a, 3);
  return 0;
}
extenup
54 / 54 / 3
Регистрация: 12.11.2011
Сообщений: 109
23.04.2012, 17:42 #3
Массив передаётся как ссылочный тип и при изменении его значений в переданной функции, его значения изменяются и в функции ИЗ которой его передали

вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
void change_arr(int arr[], int size); // прототип функции
 
int main(int argc, char *argv[])
{
    const int size = 10; // размер масcива
    int arr[size];       // масcив целых чисел
 
    // инициализирую масcив
    for(int i = 0; i < size; i++) arr[i] = i;
 
    // вывод масcива
    cout << "source massif: " << endl;
    for(int i = 0; i < size; i++) cout << arr[i] << " ";
    cout << endl << endl;
 
    // изменяю масcив
    change_arr(arr, size);
    
    // вывод изменённого масcива
    cout << "change massiv: " << endl;
    for(int i = 0; i < size; i++) cout << arr[i] << " ";
 
    cout << endl << endl;
    system("PAUSE");
    return 0;
}
 
// arr  - ссылка на масcив
// size - размер масcива
void change_arr(int arr[], int size)
{
    for(int i = 0; i < size; i++) 
        arr[i] = 300 - i;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
23.04.2012, 17:47 #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
return arr[N-1];
это вернет последний элемент массива
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
23.04.2012, 17:49 #5
Цитата Сообщение от MrGluck Посмотреть сообщение
это вернет последний элемент массива
ну да, а что ты хотел, чтобы я вернул?
Это ж пример. Я специально показал, какой элемент последний.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
23.04.2012, 17:58 #6
Массив можно передать:
1) по указателю
2) по ссылке
3) просто передав его в качестве параметра (нужно указать размерность)

А вернуть можно по ссылке на первый элемент.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int* foo()
{
    int *A = new int(5);
    for (int i = 0; i < 5; i++)
        A[i] = i;
    return A;
}
int main()
{
    int *B = foo();
    for (int i = 0; i < 5; i++)
        std::cout<<B[i]<< " ";
    return 0;
}
Но я так понимаю, нам нужно ведь просто изменить массив в функции? Тогда можно это сделать просто передав указатель на массив вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
void foo(int *A)
{
    for (int i = 0; i < 5; i++)
        A[i] = i;
}
int main()
{
    int B[5];
    foo(B);
    for (int i = 0; i < 5; i++)
        std::cout<<B[i]<< " ";
    return 0;
}
Добавлено через 54 секунды
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну да, а что ты хотел, чтобы я вернул?
Это ж пример. Я специально показал, какой элемент последний.
Он же вроде просил вернуть массив.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
23.04.2012, 18:01 #7
Цитата Сообщение от MrGluck Посмотреть сообщение
А вернуть можно по ссылке на первый элемент.
тут нужно добавить, что возвращаемый массив надо размещать в динамической памяти("куче")
иначе ссылка на локальную переменную будет указывать на затёртую память после выхода из функции
System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
30.03.2015, 14:26 #8
Может кто подсказать,что не так?Пытался передать массив в функцию,чтоб она модифицировала элементы и вывести их на экран обратно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
void tryToModifyArray(int[]);
 
int main()
{
        int a[]={10,20,30};
        tryToModifyArray(a);
        cout << a[0] << ' ' << a[1] << ' ' << a[2] << '\n';
        system("pause");
        return 0;
}
void tryModifyArray(int b[])
{
 b[0]=2;
 b[1]=2;
 b[2]=2;
}
Компилятор выдает ошибку - [Linker Error] Unresolved external 'tryToModifyArray(int *)' referenced from C:\PROGRAM FILES (X86)\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ .Пытался передать с 2мя параметрами,с размером, все равно ошибку эту выдает.Что я не так делаю?
MakeEasy
39 / 39 / 13
Регистрация: 24.02.2015
Сообщений: 151
30.03.2015, 14:32 #9
System16v,
C++
1
2
void tryToModifyArray(int[]);
void tryModifyArray(int b[])
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
30.03.2015, 14:34 #10
найди 10 отличий
Цитата Сообщение от System16v Посмотреть сообщение
tryToModifyArray
Цитата Сообщение от System16v Посмотреть сообщение
tryModifyArray
System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
30.03.2015, 14:37 #11
Kuzia domovenok, пардон...что-то я затупил сильно.Спасибо,все запускается
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
30.03.2015, 14:54 #12
с++ way:

http://rextester.com/UXC97799


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
//функция принимает на входе одномерный массив любого типа
//и возвращает массив такого же типа по ссылке
 
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; 
}
 
template<class T, size_t N>
void view(const T (&arr)[N], const char* name)
{
    std::cout<<name<<'['<< N <<"] = { ";
    for(const auto i: arr)
        std::cout<<i<<", ";
    std::cout<<" };\n";
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    int ar[]={1, 2, 3, 4, 5, 6};
    view(ar, "исходный массив: ar");
    
    // обратите внимание: указывать количество элементов массива не нужно
    // эта информация выводится автоматически
    const auto& array_result = Example(ar);
    
    view(array_result, "полученный из функции: array_result");
}
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
30.03.2015, 15:40 #13
Цитата Сообщение от hoggy Посмотреть сообщение
с++ way:
Ну, я бы поспорил c++ way это итераторы
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
30.03.2015, 15:52 #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Ну, я бы поспорил c++ way это итераторы
вы немножечко не в ту сторону смотрите.
давайте я слегка направлю ваш взор:

посмотрите на функцию view.
обратите внимание на цикл for.

там, под капотом - итераторы.
поэтому, этот цикл умеет любые коллекции.
в этом смысле, вы правы насчет итераторов.

однако цемес моего тезиса заключается в том,
что получив на входе обычный сишный массив,
он автоматически распознает количество элементов.

да, он будет работать по итераторам,
вот только begin и end он распознает автоматически.
что делает его работу инвариантной,
не зависящей от корректности вызывающей стороны.

в этом и заключается с++ way.

сравните это с pure-с way:

C
1
2
3
// pure-c
// нет никаких гарантий. полностью зависит от корректности вызывающей стороны
view(arr, size);
C++
1
2
3
// c++ 
// 100% гарантии. 
view(arr);
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
30.03.2015, 16:14 #15
Цитата Сообщение от hoggy Посмотреть сообщение
// c++
// 100% гарантии.
view(arr);
Не, это-то все понятно, я к тому, что в общем-то не нужна функция view принимающая массивы ( хоть именно этого и просил топикстрартер ), а нужна функция view принимающая или пару итераторов, или range.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 16:14
Привет! Вот еще темы с ответами:

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

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

Передать целый массив в качестве входных параметров для функции main()? - C++
Было рабочее оконное приложение Qt, теперь всю реализацию &quot;впихнуть&quot; в консольное приложение C++(( Смысл: пользователь вводит строки,...

Как передать итератор в качестве параметра функции? - C++
хочу вызвать функцию как-то так: show_string(std::cout, line.begin(), line.end()); в качестве line.begin() и line.end() выступают...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.03.2015, 16:14
Ответ Создать тему
Опции темы

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