缓冲区溢出错误,求指点

jian4317 2015-08-01 09:16:37
各位前辈:
这两天写了个求圆心的程序,程序的结构是,写了一个类,类里面用一个成员函数是通过空间中的三个点求取圆心:
类声明:
class CirCle
{
public:
double *CalCircleCenter(double *P0, double *P1, double *P2);
private:
double O[3]; //存储圆心坐标
};

成员函数定义:
double *CirCle::CalCircleCenter(double *a, double *b, double *c)
{
double P[2][2],D[2];
Eigen::MatrixXd A(3,3),B(3,3);
Eigen::Vector3d v1,O1;
P[0][0] = a[1]*b[2] - a[1]*c[2] - a[2]*b[1] + a[2]*c[1] + b[1]*c[2] - c[1]*b[2];
P[0][1] = -a[0]*b[2] + a[0]*c[2] + a[2]*b[0] - a[2]*c[0] - b[0]*c[2] + c[0]*b[2];
P[0][2] = a[0]*b[1] - a[0]*c[1] - a[1]*b[0] + a[1]*c[0] + b[0]*c[1] - c[0]*b[1];
P[1][0] = 2 * (b[0] - a[0]);
P[1][1] = 2 * (b[1] - a[1]);
P[1][2] = 2 * (b[2] - a[2]);
P[2][0] = 2 * (c[0] - a[0]);
P[2][1] = 2 * (c[1] - a[1]);
P[2][2]= 2 * (c[2] - a[2]);
D[0] = -a[0]*b[1]*c[2] + a[0]*c[1]*b[2] + b[0]*a[1]*c[2] - c[0]*a[1]*b[2] - b[0]*c[1]*a[2] + c[0]*b[1]*a[2];
D[1] = a[0] * a[0] + a[1] * a[1] + a[2] * a[2] - b[0] *b[0]- b[1] *b[1] - b[2] *b[2];
D[2] = a[0] * a[0] + a[1] * a[1] + a[2] * a[2] - c[0] *c[0] - c[1]*c[1] - c[2] *c[2];
A(0, 0) = P[0][0];
A(0, 1) = P[0][1];
A(0, 2) = P[0][2];
A(1, 0) = P[1][0];
A(1, 1) = P[1][1];
A(1, 2) = P[1][2];
A(2, 0) = P[2][0];
A(2, 1) = P[2][1];
A(2, 2) = P[2][2];
v1(0) = D[0];
v1(1) = D[1];
v1(2) = D[2];
B = -(A.inverse());
O1= B*v1;
cout << O1; //程序到这里没有问题
O[0] = O1(0);
O[1] = O1(1);
O[2] = O1(2);
//cout << O1(0)<<O1(1)<<O1(2)<<endl;
getchar();
cout << O[0] << O[1] << O[2];
getchar();
return O;
}

在main函数运行的时候,程序可以一直运行,也可以输出向量的值。但用向量元素给数组元素赋值,提示错误:
Error:在已损坏了程序内部状态的 circleforthreepoint.exe 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。

弄了好久,没搞明白。求指点。谢谢!
...全文
109 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jian4317 2015-08-01
  • 打赏
  • 举报
回复
引用 7 楼 king191923157 的回复:
[quote=引用 5 楼 jian4317 的回复:] [quote=引用 2 楼 king191923157 的回复:] 没用过这个矩阵库,提出点问题 Eigen::Vector3d 有这个构造函数么?(O1(0);) O[0]是一个double类型,O1(0)的返回值是一个double类型么?
是的 这是列向量,d就代表的是double型。是三楼提到的错误[/quote] 嘿嘿,代码太长了,就没看,真是数组越界了[/quote]就是没太懂单步调试的时候,前面不报错,一直最后赋值的时候才报错。
king191923157 2015-08-01
  • 打赏
  • 举报
回复
引用 5 楼 jian4317 的回复:
[quote=引用 2 楼 king191923157 的回复:] 没用过这个矩阵库,提出点问题 Eigen::Vector3d 有这个构造函数么?(O1(0);) O[0]是一个double类型,O1(0)的返回值是一个double类型么?
是的 这是列向量,d就代表的是double型。是三楼提到的错误[/quote] 嘿嘿,代码太长了,就没看,真是数组越界了
jian4317 2015-08-01
  • 打赏
  • 举报
回复
引用 3 楼 ant2012 的回复:
楼主,你这是数组越界啊 double P[2][2],D[2]; 变量的行或列的长度是2,但其下标值是0~1啊,数组元素下标从0开始计数,其最后一个元素的下标值= 数组长度 - 1; 像P[0][2]后面的2,就超出了数组的下标值,发生越界
谢谢啦 我单步调试的时候,前面一直没报错。一直到用O1给O赋值那一步才报错。所以一直在那里下功夫。没想到前面错的,太渣。感谢
jian4317 2015-08-01
  • 打赏
  • 举报
回复
引用 2 楼 king191923157 的回复:
没用过这个矩阵库,提出点问题 Eigen::Vector3d 有这个构造函数么?(O1(0);) O[0]是一个double类型,O1(0)的返回值是一个double类型么?
是的 这是列向量,d就代表的是double型。是三楼提到的错误
jian4317 2015-08-01
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
按“中断”以调试程序,或按“继续”以终止程序。 你就点击中断,看看是哪句语句发生错误
谢谢回复。是在用向量元素给矩阵元素赋值的时候出错,一直在检查这个地方的问题。没想到时三楼提到的错误。
二班的码农 2015-08-01
  • 打赏
  • 举报
回复
楼主,你这是数组越界啊 double P[2][2],D[2]; 变量的行或列的长度是2,但其下标值是0~1啊,数组元素下标从0开始计数,其最后一个元素的下标值= 数组长度 - 1; 像P[0][2]后面的2,就超出了数组的下标值,发生越界
king191923157 2015-08-01
  • 打赏
  • 举报
回复
没用过这个矩阵库,提出点问题 Eigen::Vector3d 有这个构造函数么?(O1(0);) O[0]是一个double类型,O1(0)的返回值是一个double类型么?
幻夢之葉 2015-08-01
  • 打赏
  • 举报
回复
按“中断”以调试程序,或按“继续”以终止程序。 你就点击中断,看看是哪句语句发生错误

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧