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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 146, средняя оценка - 4.64
Shutz00
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 23
23.04.2012, 17:19     Как передать функции массив в качестве аргумента? #1
Всем привет! Подскажите, как передать функции массив в качестве аргумента? И как сделать, чтобы функция возвращала массив?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2012, 17:19     Как передать функции массив в качестве аргумента?
Посмотрите здесь:

Dызовом родовой функции! Нужно передать массив в качестве аргумента функции через указатель." C++
Как передать файл в качестве параметра функции C++
C++ Передача функции в качестве аргумента массив
C++ передать целый массив в качестве входных параметров для функции main()?
C++ Как передать итератор в качестве параметра функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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
53 / 53 / 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.04.2012, 17:47     Как передать функции массив в качестве аргумента? #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
return arr[N-1];
это вернет последний элемент массива
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2012, 17:49     Как передать функции массив в качестве аргумента? #5
Цитата Сообщение от MrGluck Посмотреть сообщение
это вернет последний элемент массива
ну да, а что ты хотел, чтобы я вернул?
Это ж пример. Я специально показал, какой элемент последний.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2012, 18:01     Как передать функции массив в качестве аргумента? #7
Цитата Сообщение от MrGluck Посмотреть сообщение
А вернуть можно по ссылке на первый элемент.
тут нужно добавить, что возвращаемый массив надо размещать в динамической памяти("куче")
иначе ссылка на локальную переменную будет указывать на затёртую память после выхода из функции
System16v
 Аватар для 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
38 / 38 / 13
Регистрация: 24.02.2015
Сообщений: 151
30.03.2015, 14:32     Как передать функции массив в качестве аргумента? #9
System16v,
C++
1
2
void tryToModifyArray(int[]);
void tryModifyArray(int b[])
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.03.2015, 14:34     Как передать функции массив в качестве аргумента? #10
найди 10 отличий
Цитата Сообщение от System16v Посмотреть сообщение
tryToModifyArray
Цитата Сообщение от System16v Посмотреть сообщение
tryModifyArray
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
30.03.2015, 14:37     Как передать функции массив в качестве аргумента? #11
Kuzia domovenok, пардон...что-то я затупил сильно.Спасибо,все запускается
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
30.03.2015, 15:40     Как передать функции массив в качестве аргумента? #13
Цитата Сообщение от hoggy Посмотреть сообщение
с++ way:
Ну, я бы поспорил c++ way это итераторы
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
30.03.2015, 16:14     Как передать функции массив в качестве аргумента? #15
Цитата Сообщение от hoggy Посмотреть сообщение
// c++
// 100% гарантии.
view(arr);
Не, это-то все понятно, я к тому, что в общем-то не нужна функция view принимающая массивы ( хоть именно этого и просил топикстрартер ), а нужна функция view принимающая или пару итераторов, или range.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
30.03.2015, 16:25     Как передать функции массив в качестве аргумента? #16
Цитата Сообщение от Voivoid Посмотреть сообщение
Не, это-то все понятно, я к тому, что в общем-то не нужна функция view принимающая массивы ( хоть именно этого и просил топикстрартер ), а нужна функция view принимающая или пару итераторов, или range.
похоже нефига вам не понятно.

зачем писать много и небезопасно,
если можно написать мало, и безопасно?
Centurion01_1
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 2
18.11.2016, 12:36     Как передать функции массив в качестве аргумента? #17
Подскажите как мне передать вот этот массив в функцию:
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
39
40
41
42
43
44
45
46
#include "stdafx.h"
#include<iostream>
#include<clocale>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "RUS");
    const int N = 10;
    int min, max, i, k = 1, s = 0, massiv[N];
    cout << "Введите 10 целых чисел\n";
    for (i = 0; i<N; i++)
        cin >> massiv[i];
    for (i = 0; i<N; i++)
        cout << "\n massiv[" << i << "] = " << massiv[i];
 
    for (i = 1; i <= N; i = i + 2)
    {
        k = massiv[i - 1] * k;
    }
    cout << "\n  Proizv=" << k << '\n';
 
    for (i = 0; i<N; i++)
    {
        if (massiv[i] == 0)
        {
            min = i; break;
        }
    }
 
    for (i = 0; i<N; i++)
    {
        if (massiv[i] == 0)
        {
            max = i;
        }
    }
 
    for (i = min + 1; i<max; i++)
    {
        s = massiv[i] + s;
    }
    cout << "Sum=" << s << endl;
    system("pause");
}
GbaLog-
Не Эксперт C++
1522 / 626 / 176
Регистрация: 24.08.2014
Сообщений: 2,542
Записей в блоге: 1
Завершенные тесты: 2
18.11.2016, 12:47     Как передать функции массив в качестве аргумента? #18
Цитата Сообщение от Centurion01_1 Посмотреть сообщение
как мне передать вот этот массив в функцию
Так, как показал господин hoggy в посте #12.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
18.11.2016, 12:54     Как передать функции массив в качестве аргумента? #19
Цитата Сообщение от Centurion01_1 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for (i = 0; i<N; i++)
    {
        if (massiv[i] == 0)
        {
            min = i; break;
        }
    }
 
    for (i = 0; i<N; i++)
    {
        if (massiv[i] == 0)
        {
            max = i;
        }
    }
Это интересно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2016, 04:48     Как передать функции массив в качестве аргумента?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.11.2016, 04:48     Как передать функции массив в качестве аргумента? #20
Croessmah,
Yandex
Объявления
21.11.2016, 04:48     Как передать функции массив в качестве аргумента?
Ответ Создать тему
Опции темы

Текущее время: 09:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru