尝试在 C++ 中通过引用乘以矩阵时出现访问冲突异常
Posted
技术标签:
【中文标题】尝试在 C++ 中通过引用乘以矩阵时出现访问冲突异常【英文标题】:Acess violation exception when trying to multiply matrixes by reference in c++ 【发布时间】:2017-12-21 18:20:24 【问题描述】:我一直在尝试创建一个函数来乘以 2 个 4x4 矩阵,而不必复制其中一个。 我确实将矩阵定义为一个简单的数组列,主要排序。
我得出的结果显示在下面的函数上。 出于某种原因,每次我尝试这样的事情时:
matrix4 position = matrix4::identity();
position *= matrix4::identity();
我得到的东西翻译成英文应该是这样的:
在 MFU-Core.exe 中的 0x010004B6 处生成异常:0xC0000005:尝试在 0x00E50000 上写入时访问冲突。
这一行的异常点。
elements[x + y * 4] = sum;
我在这里遗漏了什么吗? 提前致谢!
完整的 .cpp 文件:
namespace mfu namespace maths
//Default constructor
//Creates a 4x4 matrix filled with zeroes
matrix4::matrix4()
for (int i = 0; i < 4 * 4; i++)
elements[i] = 0.0f;
matrix4::matrix4(float diagonal)
//Fills every element with 0
for (int i = 0; i < 4 * 4; i++)
elements[i] = 0.0f;
//Replaces diagonal elements with diagonal
elements[0 + 0 * 4] = diagonal;
elements[1 + 1 * 4] = diagonal;
elements[2 + 2 * 4] = diagonal;
elements[3 + 3 * 4] = diagonal;
//Matrix format = mat[row + column x 4]
matrix4& matrix4::multiply(const matrix4& other)
//All the rows
for (int y = 0; y < 4; y++)
//All the columns
for (int x = 0; y < 4; x++)
float sum = 0.0f;
//All the elements
for (int e = 0; e < 4; e++)
sum += elements[x + e * 4] * other.elements[e + y * 4];
elements[x + y * 4] = sum;
return *this;
matrix4 operator*(matrix4 left, const matrix4& right)
return left.multiply(right);
matrix4& matrix4::operator*=(const matrix4& other)
return multiply(other);
完整的头文件:
namespace mfu namespace maths
struct matrix4
float elements[4 * 4];
matrix4();
matrix4(float diagonal);
static matrix4 identity();
matrix4& multiply(const matrix4& other);
friend matrix4 operator*(matrix4 left, const matrix4& right);
matrix4& operator*=(const matrix4& other);
;
【问题讨论】:
崩溃发生时,所有涉及的变量的值是多少?他们看起来神志清醒吗? 错字:for (int x = 0; y < 4; x++)
--> for (int x = 0; x < 4; x++)
元素向量和 other.elements 看起来不错,但变量总和看起来很奇怪。示例:elements[x+y*4] 1.98270866e+34 float sum 1.98270866e+34 float
正确的@RichardCritten。我一直在寻找一些困难的东西,最后它是如此简单......非常感谢!
几个注意事项:std::array
会为您正确初始化数据。您必须多次编写表达式x + 4 * y
的事实表明它应该是一个函数。
【参考方案1】:
在您的所有列中,您的循环永远不会完成。你应该测试x
而不是y
//All the columns
for (int x = 0; x < 4; x++)
【讨论】:
以上是关于尝试在 C++ 中通过引用乘以矩阵时出现访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章
WindowsError:异常:使用从 C++ 到 Python 的 ctypes 创建 DLL 时出现访问冲突或 Windows 错误 193
C++ 11 可以在不同线程中通过引用安全地传递和访问 std::atomics