如何修复我的 c++ 毕达哥拉斯三重查找器中的'access violation reading location'错误?

How to fix 'access violation reading location' error in my c++ pythagorean triple finder?

本文关键字:access violation 错误 location reading 毕达哥拉斯 c++ 我的 何修复 查找 三重      更新时间:2023-10-16

我目前正在制作毕达哥拉斯三重探测器。我已经能够让它工作,但现在我正在清理程序返回的结果以避免重复。程序将找到一个毕达格三元组,如 3、4、5,但随后会再次找到相同的三元组 4、3、5。为了解决这个问题,我添加了一些代码,将 Pythag 三元组存储在 3 个数组中:storeAstoreBstoreC 。然后,我有一个函数遍历以前存储的变量,并将每个变量与当前值进行比较。要访问比较函数中的数组,我必须使数组成为全局数组。当我启动程序时,它工作正常,但是当我输入像 10 这样的值时,它会失败并显示错误"访问冲突读取位置0x011F5000"。如果有人能启发我我的错误,我将不胜感激。

repetitionCheck是我用来比较值的函数。

#include "stdafx.h"
#include <iostream>
using namespace std;
int squared(int input);
bool pythagCheck(int a, int b, int c);
bool repetitionCheck(int a, int b, int c);
int x;
int increment;
int storeA[1000];
int storeB[1000];
int storeC[1000];
int main()
{
    int a = 0, b = 0, c = 0;
    //input
    cout << "Specify Boundary: ";
    cin >> x;
    cout << "nn";
    //function
    for (a=0; a<=x; a++) 
    {
        if (pythagCheck(a, b, c) && repetitionCheck(a, b, c))
        {
            increment++;
            storeA[increment] = a;
            storeB[increment] = b;
            storeC[increment] = c;
        }
        for (b=0; b<=x; b++) 
        {
            if (pythagCheck(a, b, c) && repetitionCheck(a, b, c))
            {
                increment++;
                storeA[increment] = a;
                storeB[increment] = b;
                storeC[increment] = c;
            }
            for (c=0; c<=x; c++) 
            {
                if (pythagCheck(a, b, c) && repetitionCheck(a, b, c))
                {
                    increment++;
                    storeA[increment] = a;
                    storeB[increment] = b;
                    storeC[increment] = c;
                }
            }
        }
    }
    system("pause");
    return 0;
}
int squared(int input)
{
    return input * input;
}
bool pythagCheck(int a, int b, int c) 
{
    if (squared(a) + squared(b) == squared(c) && a != 0 && b != 0 && c != 0)
    {
            cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
            return true;
    }
}
bool repetitionCheck(int a, int b, int c) 
{
    for (int i = 0; i >= increment; i++) 
    {
        if (storeA[i] == b) { return false; }
    }
    for (int i = 0; i >= increment; i++) 
    {
        if (storeC[i] == c) { return false; }
    }
    return true;
}

问题出在函数上

bool repetitionCheck(int a, int b, int c) 
{
    for (int i = 0; i >= increment; i++) 
    {
        if (storeA[i] == b) { return false; }
    }
    for (int i = 0; i >= increment; i++) 
    {
        if (storeC[i] == c) { return false; }
    }
    return true;
}

全局变量 increment 未显式初始化。应始终初始化所有变量。

但由于它是一个全局变量,编译器会将其设置为默认值,即 0。

然后调用 repetitionCheck(a, b, c) 函数时,for 循环将几乎永远运行(unitl i 翻转为负数(,因为 i 始终是>= 增量。然后,您可以访问数组索引> 1000,即您的数组大小。

然后你会得到一个赛格错误。

也许你的意思是<=可能是一个简单的错别字。

但。检查你的循环:<=在许多循环中肯定是错误的。