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

Передача двумерного массива в конструктор класса - C++

Восстановить пароль Регистрация
 
IAlexey
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 15
24.04.2016, 17:01     Передача двумерного массива в конструктор класса #1
Здравствуйте!
Не получается передать двумерный массив как параметр конструктора.
Необходимо, чтобы пользователь ввел размерность квадратной матрицы и массив с клавиатуры. Эти значения надо передать конструктору с параметрами класса матрица.
Вот как я пытался это сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
... 
cout << "\nРазмер матрицы n = "; 
cin >> xn; 
for (int i = 0; i < xn; i++) 
    for (int j = 0; j < xn; j++) 
    { 
        cout << "\nВвод элементов матрицы"; 
        cin >> xA[i][j]; 
    } 
    MatrixArray[element] = new Matrix(xn, &xA[0][0]); 
...
файл методов:
C++
1
2
3
4
5
6
7
8
9
Matrix::Matrix(int xn, int* xA)      //размер матрицы, указатель начала массива 
{ 
    n = xn; 
    for (int i = 0; i < n; i++) 
    { 
        for (int j = 0; j < n; j++) 
            A[i][j] = *xA++;             
    } 
}
Когда вывожу, то получается первый ряд правильно, а дальше нет.
Например если ввел матрицу
1 2 3
4 5 6
7 8 9
То в итоге получу:
1 2 3
-12323 -213230 -231213
-21312 -321321 -231231
Числа конечно не такие, но суть передал.
По заданию статическая матрица должна передаваться.
Подскажите, где я косячу?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2016, 17:01     Передача двумерного массива в конструктор класса
Посмотрите здесь:

передача двумерного массива в функции C++
передача двумерного массива C++
Передача двумерного массива C++
Передача двумерного массива C++
Передача двумерного массива в функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 1
24.04.2016, 17:25     Передача двумерного массива в конструктор класса #2
По-моему, матрица - указатель на указатели. Типа, ты делаешь указатель на указатели, а каждый из тех указателей указывает на блок в памяти, который выделен под определенную строчку. А у тебя
Цитата Сообщение от IAlexey Посмотреть сообщение
int* xA
просто указатель на строчку, грубо говоря.

Добавлено через 1 минуту
То есть, если ты хочешь передать матрицу, то как-то так надо Matrix::Matrix(int xn, int** xA), где xn - размер (а он нужен один, потому что у тебя квадратная матрица), а xA - указатель на указатели (а те указатели указывают на строчки).

Добавлено через 1 минуту
Хотя, я и сам могу ошибаться.

Добавлено через 7 минут
А, у тебя статическая матрица, тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const int size = 3;
 
void fill(int matrixSize, int matrix[][size]) {
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize; j++)
            matrix[i][j] = 5;
    }
}
 
int main() {
 
    int matrix[size][size];
 
    fill(size, matrix);
 
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++)
            std::cout << matrix[i][j] << " ";
        std::cout << "\n";
    }
 
    _getch();
}
Добавлено через 4 минуты
Но ты там пишешь
Цитата Сообщение от IAlexey Посмотреть сообщение
cout << "\nРазмер матрицы n = ";
cin >> xn;
Это значит, что она динамическая. Тогда так будет:
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
void fill(int matrixSize, int** matrix) {
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize; j++)
            matrix[i][j] = 5;
    }
}
 
int main() {
    setlocale(LC_ALL, "");
 
    int N;
    std::cout << "Введите размер: ";
    std::cin >> N;
 
    int** matrix = new int*[N];
    for (int i = 0; i < N; i++)
        matrix[i] = new int[N];
 
    fill(N, matrix);
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            std::cout << matrix[i][j] << " ";
        std::cout << "\n";
    }
 
    _getch();
}
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
24.04.2016, 17:32     Передача двумерного массива в конструктор класса #3
Если A - динамический массив, то его строки не обязаны располагаться одна за другой.
Начало каждой строки надо определять заново.
C++
1
2
3
4
5
6
7
8
9
Matrix::Matrix(int xn,int** xA)      //размер матрицы, указатель начала массива 
{ 
    n = xn; 
    for (int i = 0; i < n; i++) 
    { 
        for (int j = 0; j < n; j++)// матрица квадратная 
            A[i][j] = xA[i][j];             
    } 
}
IAlexey
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 15
24.04.2016, 17:59  [ТС]     Передача двумерного массива в конструктор класса #4
Спасибо за ответы. Вроде бы разобрался в чем накосячил. Я вам не отправил начало немного...
C++
1
2
3
4
5
6
7
8
9
10
11
int xn;
int xA[10][10];
cout << "\nРазмер матрицы n = "; 
cin >> xn; 
for (int i = 0; i < xn; i++) 
    for (int j = 0; j < xn; j++) 
    { 
        cout << "\nВвод элементов матрицы"; 
        cin >> xA[i][j]; 
    } 
    MatrixArray[element] = new Matrix(xn, &xA[0][0]);
через xn я передавал размер матрицы. Но сделал глупейшую ошибку, не учел, что задал массив как 10х10. Использовал всегда меньше, а шел то по указателю по порядку, вот и вылазили элементы 4-10 которые вообще не задавал.
Спасибо всем за ответы.
Yandex
Объявления
24.04.2016, 17:59     Передача двумерного массива в конструктор класса
Ответ Создать тему
Опции темы

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