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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Hunter9494
 Аватар для Hunter9494
21 / 18 / 3
Регистрация: 29.10.2012
Сообщений: 154
03.07.2014, 11:18     Передача двумерного массива в функцию #1
Не могу передать массив в фунцию
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
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
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
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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
325 / 228 / 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
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
03.07.2014, 12:11     Передача двумерного массива в функцию #8
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кому очевидно?
Всем тем, кто хочет писать надежный код.

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

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

Добавлено через 3 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Для меня это тоже не очевидно. Я бы даже сказал что ссылка там излишняя.
Но в противном случае необходимо передавать и размер массива. Как считаете? Но этого нет, поэтому Voivoid и сделал вполне резонное замечание, что передавать необходимо ссылку.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
03.07.2014, 12:27     Передача двумерного массива в функцию #12
В других случаях это может быть полезным, но я не вижу причин использования ссылки в данном примере.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:31     Передача двумерного массива в функцию #13
Цитата Сообщение от castaway Посмотреть сообщение
В других случаях это может быть полезным, но я не вижу причин использования ссылки в данном примере.
Это уже вопросы к ТС.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 12:33     Передача двумерного массива в функцию #14
Цитата Сообщение от Ilot Посмотреть сообщение
дело говорит
Вполне возможно, только не вижу связи с вопросом.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
03.07.2014, 12:36     Передача двумерного массива в функцию #15
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вполне возможно, только не вижу связи с вопросом.
Дабы узреть сие действо соблаговолите вознести свои очи ко второй половине поста №11. (Юмор, не путать с грубостью)
Hunter9494
 Аватар для Hunter9494
21 / 18 / 3
Регистрация: 29.10.2012
Сообщений: 154
03.07.2014, 12:48  [ТС]     Передача двумерного массива в функцию #16
Всем спасибо)
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 13:20     Передача двумерного массива в функцию #17
Цитата Сообщение от Ilot Посмотреть сообщение
второй половине поста №11
На мой взгляд, конструктив кончился на посте №5
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
03.07.2014, 15:19     Передача двумерного массива в функцию #18
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Я думаю, что массивы по значению не передаются.
к чему это?

Цитата Сообщение от castaway Посмотреть сообщение
Для меня это тоже не очевидно. Я бы даже сказал что ссылка там излишняя.
Лол, как она может быть излишняя? Ссылки стоит употреблять всегда за исключением случаев, когда аргумент опционален, в этом случае можно использовать указатели дабы была возможность передать nullptr
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
03.07.2014, 15:54     Передача двумерного массива в функцию #19
Какая выгода от ссылки в данном случае? Массив передаётся по адресу, ссылка - тот же адрес.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2014, 16:17     Передача двумерного массива в функцию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
03.07.2014, 16:17     Передача двумерного массива в функцию #20
Цитата Сообщение от Voivoid Посмотреть сообщение
к чему это?
К тому, что все остальное - дело личных предпочтений АКА малосущественные подробности.
Yandex
Объявления
03.07.2014, 16:17     Передача двумерного массива в функцию
Ответ Создать тему
Опции темы

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