Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Hunter9494
21 / 18 / 14
Регистрация: 29.10.2012
Сообщений: 154
#1

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

03.07.2014, 11:18. Просмотров 1546. Ответов 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"
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2014, 11:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача двумерного массива в функцию (C++):

Передача двумерного массива в функцию
Не нашел в поиске, как правильно передавать в функцию в качестве параметра...

Передача двумерного массива в функцию
Приветствую всех. Помогите пожалуйста советом. Уже три вечера сижу над одной...

Передача двумерного массива в функцию
проблема в том что в функция inicil не изменяет похожу массива, и в output...

Передача в функцию двумерного массива
Вводится две квадратные матрицы разного размера, посчитать сумму модулей...

Передача двумерного массива в функцию
Неожиданно для себя столкнулся с такой вот проблемой . Есть две функции : ...

Передача двумерного массива в функцию
Здравствуйте! Написала код для передачи двумерного массива в функцию:...

25
zibertscrem
3 / 3 / 4
Регистрация: 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");
    }
}
0
Voivoid
708 / 280 / 15
Регистрация: 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;
}
0
zibertscrem
3 / 3 / 4
Регистрация: 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");
    }
}
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 11:57 #5
Лучший ответ Сообщение было отмечено Hunter9494 как решение

Решение

Вся проблема в том, что вы не определили размер массива глобально. Т.е. в функцию передается массив 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;
}
Сразу открещиваюсь - используется авторская расстановка скобок...
1
zibertscrem
3 / 3 / 4
Регистрация: 03.07.2014
Сообщений: 19
03.07.2014, 12:01 #6
тоже верно. я в своем рабочем примере это указал как-то на автомате
0
uglyPinokkio
326 / 229 / 55
Регистрация: 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;
}
Кому очевидно?
0
Voivoid
708 / 280 / 15
Регистрация: 31.03.2013
Сообщений: 1,339
03.07.2014, 12:11 #8
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кому очевидно?
Всем тем, кто хочет писать надежный код.

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

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

Добавлено через 3 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Для меня это тоже не очевидно. Я бы даже сказал что ссылка там излишняя.
Но в противном случае необходимо передавать и размер массива. Как считаете? Но этого нет, поэтому Voivoid и сделал вполне резонное замечание, что передавать необходимо ссылку.
1
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
03.07.2014, 12:27 #12
В других случаях это может быть полезным, но я не вижу причин использования ссылки в данном примере.
1
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:31 #13
Цитата Сообщение от castaway Посмотреть сообщение
В других случаях это может быть полезным, но я не вижу причин использования ссылки в данном примере.
Это уже вопросы к ТС.
1
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 12:33 #14
Цитата Сообщение от Ilot Посмотреть сообщение
дело говорит
Вполне возможно, только не вижу связи с вопросом.
1
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:36 #15
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вполне возможно, только не вижу связи с вопросом.
Дабы узреть сие действо соблаговолите вознести свои очи ко второй половине поста №11. (Юмор, не путать с грубостью)
1
Hunter9494
21 / 18 / 14
Регистрация: 29.10.2012
Сообщений: 154
03.07.2014, 12:48  [ТС] #16
Всем спасибо)
0
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 13:20 #17
Цитата Сообщение от Ilot Посмотреть сообщение
второй половине поста №11
На мой взгляд, конструктив кончился на посте №5
0
Voivoid
708 / 280 / 15
Регистрация: 31.03.2013
Сообщений: 1,339
03.07.2014, 15:19 #18
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Я думаю, что массивы по значению не передаются.
к чему это?

Цитата Сообщение от castaway Посмотреть сообщение
Для меня это тоже не очевидно. Я бы даже сказал что ссылка там излишняя.
Лол, как она может быть излишняя? Ссылки стоит употреблять всегда за исключением случаев, когда аргумент опционален, в этом случае можно использовать указатели дабы была возможность передать nullptr
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
03.07.2014, 15:54 #19
Какая выгода от ссылки в данном случае? Массив передаётся по адресу, ссылка - тот же адрес.
0
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 16:17 #20
Цитата Сообщение от Voivoid Посмотреть сообщение
к чему это?
К тому, что все остальное - дело личных предпочтений АКА малосущественные подробности.
0
03.07.2014, 16:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2014, 16:17
Привет! Вот еще темы с решениями:

Передача в функцию двумерного массива
Доброго времени суток. Есть двумерный массив, размерностью n на m. Нужно...

Передача двумерного массива в функцию
Как я знаю, имя массива и указателя тождественны в С++. Из этого следует, что...

Передача двумерного массива в функцию.
Требуется написать функцию которая бы слагала и умножала матрицы. Для этого Я...

Передача двумерного массива в функцию
Здравствуйте, появился новый вопрос на тему указателей: как передать двумерный...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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