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

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

Войти
Регистрация
Восстановить пароль
 
IAlexey
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 15
#1

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

24.04.2016, 17:01. Просмотров 359. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Не получается передать двумерный массив как параметр конструктора.
Необходимо, чтобы пользователь ввел размерность квадратной матрицы и массив с клавиатуры. Эти значения надо передать конструктору с параметрами класса матрица.
Вот как я пытался это сделать:
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++
Народ, задача такая: Создать абстрактный класс с виртуальной функцией – норма. Создать производные классы : комплексные ...

Undefined reference или передача string в конструктор класса - C++
Собственно проблема на этапе компиляции в main.cpp на 19 строке. Не понимаю, почему он требует 4 аргумента, когда у меня в объявлении...

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

передача параметров в конструктор при создании динамического массива - C++
Добрый день! Есть довольно тривиальный класс: class Array1d{ int* ptr_; public: Array1d(int n): ptr_(new...

Передача двумерного массива - C++
Помогите разобраться int func(int *arr) { arr=1; } void main(){ int arr; arr=1;

передача двумерного массива - C++
Разработать программу с шаблонными функциями для типов int, float и double. Данные в функции передаются в качестве параметров....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
meJevin
155 / 147 / 58
Регистрация: 18.11.2015
Сообщений: 649
Завершенные тесты: 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
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,219
Завершенные тесты: 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 которые вообще не задавал.
Спасибо всем за ответы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2016, 17:59
Привет! Вот еще темы с ответами:

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

Передача двумерного массива - C++
Искал по поиску , но так и не получилось у меня решить мою проблему с передачей динамического двумерного массива #include&lt;iostream&gt; ...

Передача двумерного массива в функцию - C++
Неожиданно для себя столкнулся с такой вот проблемой . Есть две функции : void print_matrix(double ** A, int n) { for (int i = 0;...

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


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

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

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