Здравствуйте, проблема с пользовательской функцией, пытаюсь сделать функцию на вывод матрицы
#include <iostream>
#include <cmath>
using namespace std;
void vivod(double** x[10][10],int stl1, int str1);
int main()
{
setlocale(LC_ALL, "Russian");
int str1, stl1, str2, stl2;
double** x, ** y, ** um;
cout << "Введите количество строк первой матрицы: ";
cin >> str1;
cout << "Введите количество столбцов первой матрицы: ";
cin >> stl1;
str2 = stl1;
cout << "Введите количество столбцов второй матрицы: ";
cin >> stl2;
if (str1 != stl2)
{
cout << "Умножить нельзя!";
return 0;
}
//ввод матрицы 1
x = new double* [str1];
cout << "Введите элементы первой матрицы" << endl;
for (int i = 0; i < str1; i++)
{
x[i] = new double[stl1];
for (int j = 0; j < stl1; j++)
{
cout << "x[" << i << "][" << j << "]= ";
cin >> x[i][j];
}
}
vivod (x); // здесь красный x
}
void vivod(double** x[10][10], int stl1, int str1)
{
x = new double* [str1]; // здесь красное равно
for (int i = 0; i < str1; i++)
{
for (int j = 0; j < stl1; j++)
cout << x[i][j] << " ";
cout << endl;
}
}
Ответы (2 шт):
Когда вы пишите так:
void vivod(double** x[10][10], ...)
x - это параметр, который является указателем на указатели на массив из 10 элементов на массив из 10 элементов. В общем 4 мерный массив.
Чтобы передавать в функцию матрицу динамического размера нужно писать так:
void vivod(double** x, ...)
Так же у вас функция vivod принимает 3 аргумента, а вы передаете всего один.
Я так думаю, вам нужно передавать так же stl1 и str1.
vivod(x, stl1, str1);
Еще я заметил, что ваша функция vivod предназначенная для вывода матрицы, зачем то внутри себя затирает переданный в нее указатель на матрицу, выделяя по новой память на str1 динамических массивов. И даже это у вас не сработает, т.к. вы не выделили память под сами массивы.
В общем для вывода матрицы, вам не нужно затирать указатель на нее выделяя память, так что просто удалите строчку:
x = new double* [str1]; // здесь красное равно
из функции vivod.
В итоге получаем такую функцию:
void vivod(double** x, int stl1, int str1)
{
for (int i = 0; i < str1; i++)
{
for (int j = 0; j < stl1; j++)
cout << x[i][j] << " ";
cout << endl;
}
}
Так же не забудьте заменить строчку перед main:
void vivod(double** x[10][10], int stl1, int str1);
на:
void vivod(double** x, int stl1, int str1);
В C++ должно быть так:
#include <iostream>
#include <vector>
using namespace std;
void vivod(vector<vector<double>>& x);
int main()
{
setlocale(LC_ALL, "Russian");
int str1, stl1, str2, stl2;
vector<vector<double>> x, y, um;
cout << "Введите количество строк первой матрицы: ";
cin >> str1;
cout << "Введите количество столбцов первой матрицы: ";
cin >> stl1;
str2 = stl1;
cout << "Введите количество столбцов второй матрицы: ";
cin >> stl2;
if (str1 != stl2)
{
cout << "Умножить нельзя!";
return 0;
}
//ввод матрицы 1
x.resize(str1);
cout << "Введите элементы первой матрицы" << endl;
for (size_t i = 0; i < str1; i++)
{
x[i].resize(stl1);
for (size_t j = 0; j < stl1; j++)
{
cout << "x[" << i << "][" << j << "]= ";
cin >> x[i][j];
}
}
vivod(x); // здесь красный x
}
void vivod(vector<vector<double>> const& x)
{
for (auto& row : x)
{
for (auto e : row)
cout << e << " ";
cout << endl;
}
}