尝试在 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 &lt; 4; x++) --> for (int x = 0; x &lt; 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++ 中通过引用乘以矩阵时出现访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章

如何访问在 C++ 中通过引用传递的列表/向量的元素

WindowsError:异常:使用从 C++ 到 Python 的 ctypes 创建 DLL 时出现访问冲突或 Windows 错误 193

C++ 11 可以在不同线程中通过引用安全地传递和访问 std::atomics

在 React 中通过 axios 调用 API(使用自签名证书)时出现 CORS 问题

使用 getenv 检索不存在的环境变量时出现访问冲突异常

尝试从 Spark 访问 S3 时出现 400 Bad Request