@tmtimuchin

В чём ошибка в коде C++?

Есть простая программа на 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. До этого точно также переписывал другую программу в функциональной парадигме, где была работа с тремя одномерными массивами, там всё работает. Писал я её прямо ТОЧНО ТАКЖЕ, как и эту, только переменные другие. Оставлю её в качестве примера в комментариях.
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
@galaxy
float fobr(float **af, int nf) {
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы