@i888844
Student

Как передать статический двумерный массив типа float в функцию типа void в качестве аргумента на языке C?

Есть статический двумерный массив типа float. Стоит задача передать его в функцию типа void в качестве аргумента. Задача функции - заполнить переданный ей двумерный массив по определённой формуле. В моём варианте, приведённом ниже, Visual Studio видит ошибку E0142: "выражение должно иметь тип указателя на объект, но имеет тип float", соответственно, код не запускается. Рассматривал аналогичные вопросы на данном и иных порталах, но ничего не понял. Объясните, пожалуйста, как решаются подобные задачи на моём или собственном примере.

Прилагаю свои наработки:

#include <iostream>
#include <math.h>

void functionFill(float *nameMatrix, int columnsMatrix, int stringsMatrix, float a, float b)
{
    int x, y;
    for (x = 0; x < columnsMatrix; x = x + 1)
    {
        for (y = 0; y < stringsMatrix; y = y + 1)
        {
            nameMatrix[x][y] = a * (x + 1) * powf(sinf(y + b), 2);
        }
    }
}

int main()
{
    float A[16][16];
    functionFill(&A[0][0], 16, 16, 17.2f, -1.1f);
}
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
1. В двумерных массивах в Си данные располагаются в памяти по строчно, т.е. сначала идет первая строка массива, затем вторая и т.д. У вас же индекс по строкам указан вторым. Вас тут спасает только то, что матрица квадратная и количество строк равно количеству столбцов.
2. Внутри функции переданный массив - это не массив, это указатель float *nameMatrix. Соответственно вы не можете делать двойную индексацию nameMatrix[x][y]. Вам надо вычислять индекс вручную:
*(nameMatrix + y * columnsMatrix + x) = a * (x + 1) * powf(sinf(y + b), 2);

Для справки, индексация массива это синтаксический сахар для следующей операции: *(nameMatrix + i)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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