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

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

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

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

20.05.2011, 18:25. Просмотров 5062. Ответов 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: обилие инклудов в начале кода - это просто стандартная шапка для любой лабораторной работы, прошу не заострять внимание.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,384
Записей в блоге: 3
20.05.2011, 18:50     Передача двумерного массива в функцию #2
После Update1 получилось или нет?
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


Есть идеи, как привести эту программу к рабочему виду?
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 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;
}
как это по матрице вы за один цикл проходите?)
HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,384
Записей в блоге: 3
21.05.2011, 07:54     Передача двумерного массива в функцию #5
Исходя из условия, рекомендую переделать следующим образом:
1) в качестве 1-го формального параметра использовать int**
2) передавать фактические размеры матрицы для прохода в цикле
3) как справедливо заметил Maxwe11 сделать правильный проход по матрице
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 - соответственно количество строк и столбцов в матрице?
HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,384
Записей в блоге: 3
21.05.2011, 11:36     Передача двумерного массива в функцию #7
Что-то вроде этого:
C++
1
void find_nullz(int **arr/*или как там ваш массив называется*/, int N,int M,int &zero_i,int &zero_j);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2011, 11:27     Передача двумерного массива в функцию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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");
}
Yandex
Объявления
22.05.2011, 11:27     Передача двумерного массива в функцию
Ответ Создать тему
Опции темы

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