如何修复此异常
How to fix this exception?
我的欧几里得算法问题又遇到了问题。我在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);
然后,您可以使用以下方法单独获得q
和r
:
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)
,该标头创建一对可以分配给的引用。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++中的赋值发生,尽管右侧出现异常
- Boost Graph Library,修复节点大小
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 从构造函数抛出异常时如何克服内存泄漏
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 如何修复bad_typeid异常
- 如何在C++中修复PyImport_Import(python35.dll中的异常)
- 是什么导致异常输出以及如何修复
- 加载C DLL文件时,如何修复异常_access_violation
- 如何修复在代码的某个部分引发的此异常
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"
- 快速修复bad_cast login_message破裂的异常
- 如何修复此异常
- 1[main]972异常::handle:异常:STATUS_ACCESS_VIOLATION解释和如何修复