Есть простая программа на C++, где я нахожу скалярное произведение векторов матрицы по некоторым условиям. Вот код:
#include <iostream>
using namespace std;
int main() {
// Задаю матрицу
float a[3][3] = {{1,2,3},
{4,5,6},
{6,0,4}};
int min = a[0][0];
int imin = 0;
int jmin = 0;
for (int j = 0; j < 3; j++) {
cout << a[0][j] << " | ";
}
cout << "\n";
for (int j = 0; j < 3; j++) {
cout << a[1][j] << " | ";
}
cout << "\n";
for (int j = 0; j < 3; j++) {
cout << a[2][j] << " | ";
}
// Ищу минимальный элемент и его индексы
for (int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
if (min > a[i][j]) {
imin = i;
jmin = j;
}
}
}
cout << "\nimin: " << imin+1 << endl;
cout << "jmin: " << jmin+1 << endl;
// Беру нужные векторы
int ai[3];
int aj[3];
cout << "Строка с минимальным элементом: ";
for (int j = 0; j < 3; j++) {
ai[j] = a[imin][j];
}
for (int j = 0; j < 3; j++) {
cout << ai[j] << " ";
}
cout << "\nСтолбец с минимальным элементом: ";
for (int i = 0; i < 3; i++) {
aj[i] = a[i][jmin];
}
for (int i = 0; i < 3; i++) {
cout << aj[i] << " ";
}
//Скалярное произведение
float scal = 0;
for (int i = 0; i < 3; i++) {
scal += ai[i] * aj[i];
}
cout << "\nСкалярное произведение: " << scal;
return 0;
}
Программа полностью работает, с ней всё в порядке. Я пытаюсь переписать её в функциональной парадигме - тут-то и возникают сложности:
#include <iostream>
using namespace std;
float fobr(float *af, int nf);
int main() {
// Задаю матрицу
int n = 3;
float a[n][n] = {{1,2,3},
{4,5,6},
{6,0,4}};
float sc;
for (int j = 0; j < n; j++) {
cout << a[0][j] << " | ";
}
cout << "\n";
for (int j = 0; j < n; j++) {
cout << a[1][j] << " | ";
}
cout << "\n";
for (int j = 0; j < n; j++) {
cout << a[2][j] << " | ";
}
sc = fobr(a,n);
}
//---------------------------------------------------------------------------
float fobr(float *af, int nf) {
int min = af[0][0];
int imin = 0;
int jmin = 0;
// Ищу минимальный элемент и его индексы
for (int i = 0; i < nf; i++) {
for(int j = 0; j < nf; j++) {
if (min > af[i][j]) {
imin = i;
jmin = j;
}
}
}
cout << "\nМинимальный элемент находится в строке " << imin+1 << endl;
cout << "Минимальный элемент находится в столбце " << jmin+1 << endl;
// Беру нужные векторы
int ai[nf];
int aj[nf];
cout << "Строка с минимальным элементом: ";
for (int j = 0; j < nf; j++) {
ai[j] = af[imin][j];
}
for (int j = 0; j < nf; j++) {
cout << ai[j] << " ";
}
cout << "\nСтолбец с минимальным элементом: ";
for (int i = 0; i < nf; i++) {
aj[i] = af[i][jmin];
}
for (int i = 0; i < nf; i++) {
cout << aj[i] << " ";
}
//Скалярное произведение
float scal = 0;
for (int i = 0; i < nf; i++) {
scal += ai[i] * aj[i];
}
cout << "\nСкалярное произведение: " << scal;
return scal;
}
При запуске выдаёт ошибки "main.cpp:27:18: error: cannot convert ‘float (*)[n]’ to ‘float*’ for argument ‘1’ to ‘float fobr(float*, int)’ sc = fobr(a,n);" и "main.cpp:33:22: error: invalid types ‘float[int]’ for array subscript int min = af[0][0];".
Я менял float на int, выдаёт тоже самое. Видимо проблема именно с матрицей. Пожалуйста, помогите найти и исправить ошибку.
P.S. До этого точно также переписывал другую программу в функциональной парадигме, где была работа с тремя одномерными массивами, там всё работает. Писал я её прямо ТОЧНО ТАКЖЕ, как и эту, только переменные другие. Оставлю её в качестве примера в комментариях.