Как вернуть двумерный массив?

Я делаю функцию для инвертирования типа матрицы, и у меня возникают проблемы с ее возвратом. Я просмотрел несколько руководств по нему, но они не работали, вероятно, потому, что у них была другая ситуация, поэтому я пришел на этот сайт, чтобы ответить на мою проблему. Вот код (С++):

   float inverse(float mat[4][4])
    {
    float nmat[4][4];
    nmat[0][0] = mat[0][0]; nmat[0][1] = mat[0][1]; nmat[0][2] = mat[0][2]; nmat[0][3] = mat[0][3];
    nmat[1][0] = mat[1][0]; nmat[0][1] = mat[1][1]; nmat[1][2] = mat[1][2]; nmat[1][3] = mat[1][3];
    nmat[2][0] = mat[2][0]; nmat[0][1] = mat[2][1]; nmat[2][2] = mat[2][2]; nmat[2][3] = mat[2][3];

    nmat[3][0] = -(mat[3][0] * mat[0][0] + mat[3][1] * mat[1][0] + mat[3][2] * mat[2][0]);
    nmat[3][1] = -(mat[3][0] * mat[0][1] + mat[3][1] * mat[1][1] + mat[3][2] * mat[2][1]);
    nmat[3][2] = -(mat[3][0] * mat[0][2] + mat[3][1] * mat[1][2] + mat[3][2] * mat[2][2]);
    nmat[3][3] = 1.0f;

    return mat;
    }

Обещаешь вернуться float, а на самом деле возвращаешь (float[4])*.

273K 16.06.2023 04:17

не могли бы вы сказать мне, как это исправить, пожалуйста?

coolprogrammer123 16.06.2023 04:38

Массивы в C++ глупы. Их нельзя вернуть. Используйте using Float2D=std::array<std::array<float, 4>,4>; и передайте / верните Float2D. Остальная часть вашего кода остается прежней.

PaulMcKenzie 16.06.2023 04:41

можете ли вы показать мне отредактированную версию кода, потому что я не могу реализовать это самостоятельно

coolprogrammer123 16.06.2023 04:44

Необработанные массивы не могут быть возвращены в C++. Можно вернуть объект (типа struct/class), содержащий массив [который, грубо говоря, и есть std::array<std::array<float, 4>,4>].

Peter 16.06.2023 05:03

Можете ли вы объяснить, почему вы используете такие необработанные массивы? Возможно, вы изучаете C++ из устаревшего источника.

Pepijn Kramer 16.06.2023 07:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы хотели вернуть новый массив или изменить массив, который у вас был? Поскольку вы копируете всю матрицу в nmat, я полагаю, вы хотели вернуть nmat, поскольку nat не изменилось! Как уже упоминалось @ 273K, возвращаемый тип вашей функции должен быть не одиночным числом с плавающей запятой, а массивом массивов. Последнее: было бы чище, если бы вы использовали цикл для копирования массивов.

я хотел вернуть nmat, и есть ли возможность изменить тип функции, чтобы приспособиться к массиву?

coolprogrammer123 16.06.2023 04:36
Ответ принят как подходящий

Вместо низкоуровневых массивов можно использовать std::array, так как std::array можно копировать, возвращать и передавать без проблем:

#include <array>
using Float2D = std::array<std::array<float, 4>,4>;

Float2D inverse(const Float2D& mat)
{
    Float2D nmat;
    nmat[0][0] = mat[0][0]; nmat[0][1] = mat[0][1]; nmat[0][2] = mat[0][2]; nmat[0][3] = mat[0][3];
    nmat[1][0] = mat[1][0]; nmat[0][1] = mat[1][1]; nmat[1][2] = mat[1][2]; nmat[1][3] = mat[1][3];
    nmat[2][0] = mat[2][0]; nmat[0][1] = mat[2][1]; nmat[2][2] = mat[2][2]; nmat[2][3] = mat[2][3];
    nmat[3][0] = -(mat[3][0] * mat[0][0] + mat[3][1] * mat[1][0] + mat[3][2] * mat[2][0]);
    nmat[3][1] = -(mat[3][0] * mat[0][1] + mat[3][1] * mat[1][1] + mat[3][2] * mat[2][1]);
    nmat[3][2] = -(mat[3][0] * mat[0][2] + mat[3][1] * mat[1][2] + mat[3][2] * mat[2][2]);
    nmat[3][3] = 1.0f;
    return mat;
}

int main()
{
    Float2D mat;
    // fill in mat with values
    //...
    // Get inverse
    auto invMat = inverse(mat);
}

Еще одно улучшение, которое вы можете сделать: сделайте Float2D классом Matrix2D, и вы сможете начать добавлять к нему операции, и вы сделали его отличным от 2D-вектора, что позволит вам иметь функции, которые действительно принимают только экземпляры Matrix (более четкое намерение)

Pepijn Kramer 16.06.2023 07:29

Другие вопросы по теме