如何修复此异常

How to fix this exception?

本文关键字:异常 何修复      更新时间:2023-10-16

我的欧几里得算法问题又遇到了问题。我在MS Visual Studio上将其作为控制台应用程序运行。当我运行它时,它说"由于堆栈溢出异常,进程已终止"。

最近发布了另一个关于这个算法的问题,但现在我遇到了这个问题,这是我第一次看到它。我是一个初学者程序员。

int algoritmoeuclides(int a,int b)
{
if (a%b==0)
return b;
return algoritmoeuclides(b,a%b);
}
std::pair<int, int>division(int dividendo,int divisor)
{
    int resultado=0;
    int residuo=0;
    residuo=dividendo%divisor;
    resultado=dividendo/divisor;
    return std::pair<int, int>(residuo,resultado);
}
std::pair<int, int>EuclidesExtendido(int a,int b)
{
    int q,r,s,t;
    if (b == 0)
    return std::pair<int, int>(1, 0);
    else
        {
        std::pair<int, int>(q, r) = division(a, b);
        std::pair<int, int>(s, t) = EuclidesExtendido(b, r);
        }
        return std::pair<int, int>(t, s - q * t);
}
int main(array<System::String ^> ^args)
{
int a=525;
int b=231;
int s,t;
std::pair<int, int>(s, t)=EuclidesExtendido(a,b);
printf("%d",algoritmoeuclides(a,b));
printf("s=%d  t=%d",s,t);
getch();
}

您错误地收集了函数的返回值。

尽管有两个值,但一对是单个对象。 所以

std::pair<int, int>(q, r) = division(a, b);

应该是这样的:

std::pair<int, int> qr = division(a, b);

然后,您可以使用以下方法单独获得qr

int q = qr.first;
int r = qr.second;

您需要在遇到类似错误的任何地方进行此类更改。

当我用 GNU g++ 编译代码时,注释掉了getch(),将main()的定义更改为更简单的int main()(因为代码不使用任何参数(,并添加了 <cstdio><utility> 标头,我得到了广泛的警告:

euc.cpp: In function ‘int main()’:
euc.cpp:43:1: warning: ‘s’ is used uninitialized in this function [-Wuninitialized]
euc.cpp: In function ‘std::pair<int, int> EuclidesExtendido(int, int)’:
euc.cpp:23:5: warning: ‘r’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:28:60: warning: ‘r’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:30:44: warning: ‘q’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:30:44: warning: ‘t’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:30:44: warning: ‘s’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp: In function ‘int main()’:
euc.cpp:40:29: warning: ‘s’ is used uninitialized in this function [-Wuninitialized]
euc.cpp:40:29: warning: ‘t’ is used uninitialized in this function [-Wuninitialized]

您应该在MS Visual Studio上打开警告级别,以便您看到此类警告,并且可以在此处提交问题之前修复它们。 鉴于您使用的是未初始化的变量,您将获得准随机值,这可能会使您的系统进入比预期更深的递归,从而导致堆栈溢出。


此代码在 Mac OS X 上编译和运行时没有不言而喻的问题。 它产生答案:

21
s=-1  t=64

我不确定这是否是你所期望的。 21 是 231 (11x7x3( 和 525 (7x5x5x3( 的最大公分母。 我怀疑 -1 不正确(因此 64 也可能是错误的(。

#include <cstdio>
#include <utility>
int algoritmoeuclides(int a, int b)
{
    if (a % b == 0)
        return b;
    return algoritmoeuclides(b, a % b);
}
std::pair<int, int>division(int dividendo, int divisor)
{
    int residuo = dividendo % divisor;
    int resultado = dividendo / divisor;
    return std::pair<int, int>(residuo, resultado);
}
std::pair<int, int>EuclidesExtendido(int a, int b)
{
    if (b == 0)
        return std::pair<int, int>(1, 0);
    else
    {
        std::pair<int, int>q = division(a, b);
        std::pair<int, int>s = EuclidesExtendido(b, q.second);
        return std::pair<int, int>(s.second, s.first - q.first * s.second);
    }
}
int main()
{
    int a = 525;
    int b = 231;
    std::pair<int, int>p = EuclidesExtendido(a, b);
    printf("%dn", algoritmoeuclides(a, b));
    printf("s=%d  t=%dn", p.first, p.second);
}

假设您可以使用某些 C++11 库功能,而不是std::pair<int, int>(s, t)您希望从 <tuple> 标头中std::tie(s, t),该标头创建一对可以分配给的引用。