如何解决这个异常?

时间:2012-05-20 03:34:13

标签: c++

我的Euclid算法问题再次出现问题。我在MS Visual Studio上运行它作为控制台应用程序。当我运行它时,它说'#34;进程因堆栈溢出异常而终止。"

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

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();
}

3 个答案:

答案 0 :(得分:4)

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

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

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;

你需要在有类似错误的地方进行这种改变。

答案 1 :(得分:1)

当我使用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("%d\n", algoritmoeuclides(a, b));
    printf("s=%d  t=%d\n", p.first, p.second);
}

答案 2 :(得分:0)

假设您可以使用某些C ++ 11库功能,而不是std::pair<int, int>(s, t),而不是std::tie(s, t)来自<tuple>标头的{{1}},它会创建一对可以分配给它的引用