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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Hunter9494
21 / 18 / 3
Регистрация: 29.10.2012
Сообщений: 154
#1

Передача двумерного массива в функцию - C++

03.07.2014, 11:18. Просмотров 1213. Ответов 25
Метки нет (Все метки)

Не могу передать массив в фунцию
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
int min(int Array[][3])
{
    int min = 0;
    min = Array[0][0];
    for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
if(Array[i][j]<min)
    min=Array[i][j];
    }
return min;
}
 
 
int main{
cout<<"Введите массив A"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>A[i][j];
}
cout<<endl;
}
 
int min1 = min(A);
 
cout<<min1;
}
выдает ошибку
Ошибка 1 error C2664: min: невозможно преобразовать параметр 1 из "int [3][3]" в "int"
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zibertscrem
3 / 3 / 1
Регистрация: 03.07.2014
Сообщений: 19
03.07.2014, 11:40     Передача двумерного массива в функцию #2
Один из вариантов - это передать его как указатель. Костыль, но работает.
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
#include <stdio.h>
#include <stdlib.h>
const int n = 3;//Размерность массива
void func(int** param);
int main()
{
    int Array[n][n];
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            Array[i][j] = i*n+j;
        }
    }
    //Тот самый костыль, который обеспечивает передачу в функцию
    int** mas = new int*[n];
    for(int i = 0; i<n; i++)
    {
        mas[i] = &Array[i][0];
    }
    func(mas);
    return 0;
}
void func(int** param)
{
    int** arr = param;
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
}
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
03.07.2014, 11:43     Передача двумерного массива в функцию #3
Очевидно, что аргументом функции должна быть ссылка на массив

C++
1
2
3
4
5
6
7
8
9
10
void f( int ( &arr )[ 3 ][ 3 ] ) {
 
}
 
int main() {
  int arr[ 3 ][ 3 ] = {};
  f( arr );
 
  return 0;
}
zibertscrem
3 / 3 / 1
Регистрация: 03.07.2014
Сообщений: 19
03.07.2014, 11:45     Передача двумерного массива в функцию #4
А вообще странно. Вот пример без костылей и тоже все работает. Напрямую передача массива в функцию.
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
#include <stdio.h>
#include <stdlib.h>
const int n = 3;//Размерность массива
void func(int arr[][n]);
int main()
{
    int Array[n][n];
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            Array[i][j] = i*n+j;
        }
    }
    func(Array);
    return 0;
}
void func(int arr[][n])
{
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
}
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 11:57     Передача двумерного массива в функцию #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вся проблема в том, что вы не определили размер массива глобально. Т.е. в функцию передается массив array[][3], а в теле main используется массив array[][n]. Вот вам и не стыковочка. Если это исправить то проблем не будет:
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
#include <iostream>
    const int n = 3;
int min(int Array[][n])
{
    int min = 0;
    min = Array[0][0];
    for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(Array[i][j]<min)
    min=Array[i][j];
    }
return min;
}
 
 
int main(){
 
    int A[n][n];
    std::cout<<"Input array A:"<<std::endl;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            std::cin>>A[i][j];
        }
        std::cout<<std::endl;
    }
    int min1 = min(A);
    std::cout<<min1;
    return 0;
}
Сразу открещиваюсь - используется авторская расстановка скобок...
zibertscrem
3 / 3 / 1
Регистрация: 03.07.2014
Сообщений: 19
03.07.2014, 12:01     Передача двумерного массива в функцию #6
тоже верно. я в своем рабочем примере это указал как-то на автомате
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 12:06     Передача двумерного массива в функцию #7
Цитата Сообщение от Voivoid Посмотреть сообщение
Очевидно, что аргументом функции должна быть ссылка на массив
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
 
void f( int arr[ 3 ][ 3 ] ) {
arr[0][0]=99;
}
 
int main() {
  int arr[ 3 ][ 3 ] = {};
  std::cout<<" before "<<arr[0][0]<<"\n";
  f( arr );
  std::cout<<" after "<<arr[0][0]<<"\n"; 
  return 0;
}
Кому очевидно?
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
03.07.2014, 12:11     Передача двумерного массива в функцию #8
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кому очевидно?
Всем тем, кто хочет писать надежный код.

Как думаешь какой тип у аргумента функции f? И как думаешь можно ли передать в эту функцию например такой массив:

int arr[42][3] = {};
f( arr );
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
03.07.2014, 12:17     Передача двумерного массива в функцию #9
Для меня это тоже не очевидно. Я бы даже сказал что ссылка там излишняя.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 12:18     Передача двумерного массива в функцию #10
Цитата Сообщение от Voivoid Посмотреть сообщение
Как думаешь
Я думаю, что массивы по значению не передаются.
Вариантов передать параметр я знаю достаточное количество различной надежности.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:23     Передача двумерного массива в функцию #11
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кому очевидно?
Voivoid, дело говорит. Так как при передаче по ссылке вы автоматически передаете сигнатуру массива, которая определяется всеми своими размерами. При передаче по указателю такой возможности нет.

Добавлено через 3 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Для меня это тоже не очевидно. Я бы даже сказал что ссылка там излишняя.
Но в противном случае необходимо передавать и размер массива. Как считаете? Но этого нет, поэтому Voivoid и сделал вполне резонное замечание, что передавать необходимо ссылку.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
03.07.2014, 12:27     Передача двумерного массива в функцию #12
В других случаях это может быть полезным, но я не вижу причин использования ссылки в данном примере.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:31     Передача двумерного массива в функцию #13
Цитата Сообщение от castaway Посмотреть сообщение
В других случаях это может быть полезным, но я не вижу причин использования ссылки в данном примере.
Это уже вопросы к ТС.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 12:33     Передача двумерного массива в функцию #14
Цитата Сообщение от Ilot Посмотреть сообщение
дело говорит
Вполне возможно, только не вижу связи с вопросом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2014, 12:36     Передача двумерного массива в функцию
Еще ссылки по теме:
C++ Передача двумерного массива в функцию
Передача двумерного массива в функцию. C++
Передача двумерного массива в функцию C++
Передача в функцию двумерного массива C++
Передача двумерного массива в функцию C++

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:36     Передача двумерного массива в функцию #15
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вполне возможно, только не вижу связи с вопросом.
Дабы узреть сие действо соблаговолите вознести свои очи ко второй половине поста №11. (Юмор, не путать с грубостью)
Yandex
Объявления
03.07.2014, 12:36     Передача двумерного массива в функцию
Ответ Создать тему
Опции темы

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