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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.63
Borsch
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 10
#1

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

20.05.2011, 18:25. Просмотров 5120. Ответов 7
Метки нет (Все метки)

Доброго времени суток, форумчане.

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

Задание: Создать функцию нахождения первого элемента, равного нулю, и его местоположение в матрице. Использовать функцию для обмена положениями нулей в матрицах А(4,3) и В(7,3). Функция должна возвращать несколько значений, для этого использовать ссылки.

Пишу в MS Visual Studio 2010
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#define randomize() (srand(time(0))) //рандом в Visual C++ 2010
using namespace std; //использование стандартного пространста имён
 
//константы
#define X 4
#define Y 3
#define K 7
#define L 3
 
//Функция нахождения нулей в матрице
//&zero_i и &zero_j - это ссылки на переменные, в которые будут запоминаться координаты нуля
void find_nullz(int *array[3], int i, int &zero_i, int &zero_j)
{
    
        for (int j = 0; j < 3; j++) 
        {
        
        if (array[j]== 0)
            {
                zero_i = i;
                zero_j = j;
                break;
            
            } break;
        }
    
}
 
void main() {
 
    //задали две матрицы
    int first[X][Y];
    int second[K][L];
 
    //задали начальные значения запоминающих переменных
    int first_i=-1, first_j=-1, second_i=-1, second_j=-1;
    int i, j, I, J;
    randomize();
 
    //задаем рандомно первый массив
    cout<<"Original first array "<<endl;
        for (i=0; i<X; i++) 
    {
            for (j=0; j<Y; j++) 
            {
                first[i][j]=(rand() % 10) - 5;
                cout<<setw(5)<<first[i][j];
            }
            cout<<endl; 
    }
    cout<<endl;
    
    //задаем рандомно второй массив
    cout<<"Original second array "<<endl;
    for (I=0; I<K; I++) 
    {       for (J=0; J<L; J++)
            {     
                second[I][J]=(rand() % 10) - 5;
                cout<<setw(5)<<second[I][J];
            }
            cout<<endl; 
    }   
    cout<<endl;
 
    cout<<"Use function"<<endl;
    
        for (i=0; i<X; i++)
    {       find_nullz(first, i, first_i, first_j); 
            //ругается тут, подчеркивая слово first(первое в скобке). Пишет, что: Error. argument of type "int(*)[3]" is incompatible with parameter of type "int**"
            if (first_i != -1 && first_j != -1) break; 
    }
    if (first_i != -1 && first_j != -1) cout<<" Dlya pervogo massiva "<<endl<<first_i<<"  "<<first_j<<endl;
    else cout<<" net znacheniy "<<endl;
 
 
// закомментированный вызов для второй матрицы
//  for (i=0; i<K; i++)
//  {       find_nullz(second[i], second_i, second_j); 
    //      if (second_i != -1 && second_j != -1) break; 
//  }
//  if (second_i != -1 && second_j != -1) cout<<"Dlya vtorogo massiva "<<endl<<second_i<<"  "<<second_j<<endl;
    //else cout<<"net znacheniy";
 
    //чтоб при окончании окно программы не закрывалось
    system("PAUSE");
}
Update: так же пробовал на "приёмке" в параметрах функции писать не
C++
1
void find_nullz(int *array[3], int i, int &zero_i, int &zero_j)
а
C++
1
void find_nullz(int **array, int i, int &zero_i, int &zero_j)
Update2: обилие инклудов в начале кода - это просто стандартная шапка для любой лабораторной работы, прошу не заострять внимание.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2011, 18:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача двумерного массива в функцию (C++):

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

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

Передача двумерного массива в функцию - C++
в функцию set_ships передаю массив human, появляется ошибка cannot convert `int (*)' to `int**' for argument `1' to `void set_ships(int**)'...

Передача двумерного массива в функцию - C++
Здравствуйте! Написала код для передачи двумерного массива в функцию: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,453
Записей в блоге: 2
20.05.2011, 18:50 #2
После Update1 получилось или нет?
0
Borsch
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 10
21.05.2011, 03:19  [ТС] #3
Нет, не получилось.
При "приёмке" вида Update1
C++
1
void find_nullz(int **array, int i, int &zero_i, int &zero_j)
он всё равно ругается там же, где и ругался. В комментариях описано. Для наглядности выведу сюда:

1 Error
1 IntelliSense: argument of type "int (*)[3]" is incompatible with parameter of type "int **" c:\visual studio 2010\projects\test\14lab.cpp 75


Есть идеи, как привести эту программу к рабочему виду?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.05.2011, 03:30 #4
Цитата Сообщение от Borsch Посмотреть сообщение
for (int j = 0; j < 3; j++)
{
if (array[j]== 0)
{
zero_i = i;
zero_j = j;
break;
} break;
}
как это по матрице вы за один цикл проходите?)
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,453
Записей в блоге: 2
21.05.2011, 07:54 #5
Исходя из условия, рекомендую переделать следующим образом:
1) в качестве 1-го формального параметра использовать int**
2) передавать фактические размеры матрицы для прохода в цикле
3) как справедливо заметил Maxwe11 сделать правильный проход по матрице
0
Borsch
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 10
21.05.2011, 11:12  [ТС] #6
Цитата Сообщение от Maxwe11 Посмотреть сообщение
как это по матрице вы за один цикл проходите?)
Эм, я думал так: в майне сделать цикл for по строкам, в цикле вызывать функцию find_nullz. Т.е. передавать в функцию не весь массив целиком, а строки его. Т.е. передал первую строку, функция поработала, затем вторую строку, и т.д. Сделать флаг, мол, если в проходе по какой-то строке отыскался 0, то изменить значение флага по ссылке и прекратить в майне цикл for. Но, кажется, это немного извращенство?


Цитата Сообщение от Predator_2004 Посмотреть сообщение
1) в качестве 1-го формального параметра использовать int**
т.е. так ?
C++
1
void find_nullz (int **array

Цитата Сообщение от Predator_2004 Посмотреть сообщение
передавать фактические размеры матрицы для прохода в цикле
C++
1
find_nullz(first, rows, cols,
, где rows и cols - соответственно количество строк и столбцов в матрице?
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,453
Записей в блоге: 2
21.05.2011, 11:36 #7
Что-то вроде этого:
C++
1
void find_nullz(int **arr/*или как там ваш массив называется*/, int N,int M,int &zero_i,int &zero_j);
0
Borsch
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 10
22.05.2011, 11:27  [ТС] #8
Таки доделал программу. Кстати говоря, без лукавого параметра int**. Итак, предлагаю на ваш суд. Программа работает отлично, всё находит и меняет. Можете прямо отсюда скопипастить в Visual Studio.
Про задание: оно было некорректное, поэтому теперь задача программы - с помощью функций находить минимальное значение в матрице и его координаты двух матриц. Использовать функцию для обмена минимальными значениями в матрицах А(4,3) и В(7,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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#define randomize() (srand(time(0))) //рандом в Visual C++ 2010
using namespace std; //использование стандартного пространств имён
 
//константы
#define X 4
#define Y 3
#define K 7
#define L 3
 
//Функция нахождения минимального значения в матрице
//&zero_i и &zero_j - это ссылки на переменные, в которые будут запоминаться координаты минимума
void find_minimalz(int* arr, int len_i, int len_j, int &zero_i, int &zero_j)
{
 
    int counter = 0, min=*arr;
    for (int i = 0; i < len_i; i++)
    {
        for (int j = 0; j < len_j; j++)
        {
            if (min > *(arr+counter))
            {
                min = *(arr+counter);
                zero_i = i;
                zero_j = j;
            }
            counter++;
        }
    }
}
void obmenka(int *arr1, int *arr2, int fi, int fj, int si, int sj) 
{
    //cout<<*arr1;      Выведет первый (нулевой) элемент первой матрицы. 
    //cout<<*(arr1+1);  Выведет второй  (первый) элемент первой матрицы.
     cout <<endl<<"Говорит функция! Массивы приняты!"<<endl;
     cout <<"Минимальное значение первого массива: "<<*(arr1+(3*fi+fj))<<endl;
     cout <<"Минимальное значение второго массива: "<<*(arr2+(3*si+sj))<<endl;
    int temp;
    temp = *(arr1+(3*fi+fj));
    *(arr1+(3*fi+fj)) = *(arr2+(3*si+sj));
    *(arr2+(3*si+sj)) = temp;
}
 
void main() {
    //Поддержка кириллицы activated
    setlocale (LC_CTYPE, "Russian");
 
    //задали две матрицы
    int first[X][Y];
    int second[K][L];
 
    //задали начальные значения запоминающих переменных
    int first_i=0, first_j=0, second_i=0, second_j=0;
 
    //счетчики (можно было ограничиться лишь i и j)
    int i, j, I, J;
 
    randomize();
 
    //задаем рандомно первый массив
    cout<<"Original first array "<<endl;
        for (i=0; i<X; i++) 
    {
            for (j=0; j<Y; j++) 
            {
                first[i][j]=(rand() % 100) - 5;
                cout<<setw(5)<<first[i][j];
            }
            cout<<endl; 
    }
    cout<<endl;
    
    //задаем рандомно второй массив
    cout<<"Original second array "<<endl;
    for (I=0; I<K; I++) 
    {       for (J=0; J<L; J++)
            {     
                second[I][J]=(rand() % 100) - 5;
                cout<<setw(5)<<second[I][J];
            }
            cout<<endl; 
    }   
    cout<<endl;
 
    //Вызов функции нахождения минимального значения и координат его
    find_minimalz(*first, X, Y, first_i, first_j);
    find_minimalz(*second, K, L, second_i, second_j);
 
    //Вывод координат минимальных значения в 1 и 2 матрицах
    cout<<setw(4)<<"     stroka - stolbec"<<endl;
    cout<<setw(4)<<"1 Matrix: "<<first_i<<" - "<<first_j<<endl;
    cout<<setw(4)<<"2 Matrix: "<<second_i<<" - "<<second_j<<endl;
    
    //Вызов функции обмена
    obmenka(&first[0][0], &second[0][0], first_i, first_j, second_i, second_j);
    cout<<endl;
 
    //выводим измененную первую матрицу
    cout<<"New first array "<<endl;
        for (i=0; i<X; i++) 
    {
            for (j=0; j<Y; j++) 
            {
                cout<<setw(5)<<first[i][j];
            }
            cout<<endl; 
    }
    cout<<endl;
    
    //выводим измененную вторую матрицу
    cout<<"New second array "<<endl;
    for (I=0; I<K; I++) 
    {       for (J=0; J<L; J++)
            {     
                cout<<setw(5)<<second[I][J];
            }
            cout<<endl; 
    }   
    cout<<endl;
    
 
 
    system("PAUSE");
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2011, 11:27
Привет! Вот еще темы с ответами:

Передача двумерного массива в функцию - C++
Доброго времени суток, возникла проблема с передачей двумерного массива в с++. По условию необходимо подсчитать норму матрицы, для этого...

Передача двумерного массива в функцию - C++
Не могу передать массив в фунцию int min(int Array) { int min = 0; min = Array; for(int i=0;i&lt;3;i++){ for(int...

Передача двумерного массива в функцию - C++
проблема в том что в функция inicil не изменяет похожу массива, и в output выводятся нелепые числа... #include &lt;iostream&gt; #include...

Передача двумерного массива в функцию - C++
Возможно это уже и естьна форуме, но как передать из одной функции в другую двумерный массив? (статическое распределение адресов)


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

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

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