-2

我目前正在制作毕达哥拉斯三重取景器。我已经能够让它工作,但现在我正在清理程序返回的结果以避免重复。该程序会找到像 3、4、5 这样的 Pythag 三元组,但随后会再次找到与 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 << "\n\n";

    //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;
}
4

1 回答 1

0

问题出在函数中

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 始终 >= increment。然后你访问数组索引> 1000,你的数组大小。

然后你得到一个段错误。

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

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

于 2019-07-17T07:41:28.360 回答