Я делаю функцию для инвертирования типа матрицы, и у меня возникают проблемы с ее возвратом. Я просмотрел несколько руководств по нему, но они не работали, вероятно, потому, что у них была другая ситуация, поэтому я пришел на этот сайт, чтобы ответить на мою проблему. Вот код (С++):
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;
}
не могли бы вы сказать мне, как это исправить, пожалуйста?
Массивы в C++ глупы. Их нельзя вернуть. Используйте using Float2D=std::array<std::array<float, 4>,4>; и передайте / верните Float2D. Остальная часть вашего кода остается прежней.
можете ли вы показать мне отредактированную версию кода, потому что я не могу реализовать это самостоятельно
Необработанные массивы не могут быть возвращены в C++. Можно вернуть объект (типа struct/class), содержащий массив [который, грубо говоря, и есть std::array<std::array<float, 4>,4>].
Можете ли вы объяснить, почему вы используете такие необработанные массивы? Возможно, вы изучаете C++ из устаревшего источника.





Вы хотели вернуть новый массив или изменить массив, который у вас был? Поскольку вы копируете всю матрицу в nmat, я полагаю, вы хотели вернуть nmat, поскольку nat не изменилось! Как уже упоминалось @ 273K, возвращаемый тип вашей функции должен быть не одиночным числом с плавающей запятой, а массивом массивов. Последнее: было бы чище, если бы вы использовали цикл для копирования массивов.
я хотел вернуть nmat, и есть ли возможность изменить тип функции, чтобы приспособиться к массиву?
Вместо низкоуровневых массивов можно использовать 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 (более четкое намерение)
Обещаешь вернуться
float, а на самом деле возвращаешь(float[4])*.