使用Visual Studio单元测试框架测试C++三角计算程序报E0304错误求助
问题原因&解决方案
1. E0304报错直接原因
Assert::AreEqual 没有可匹配的重载,你传入的两个参数类型分别是float和float*,类型不匹配,编译器找不到对应的函数实现,所以报E0304“没有找到匹配的重载函数”错误。
2. 更核心的底层错误:返回局部栈指针
你写的C函数getTriangleAngles返回的是函数内部定义的局部数组angles的地址,局部变量存储在栈内存中,函数执行结束后栈空间会被自动回收,返回的指针属于野指针,指向的内存内容是不确定的,哪怕你修复了断言类型问题,后续读取指针内容也属于未定义行为,大概率会得到乱码值或直接崩溃。
具体修复步骤
第一步:修改C函数实现
不要返回局部数组指针,改为通过入参传递外部数组存储计算结果:
// 修改后的函数声明,out_angles为外部传入的长度为3的float数组,用于存储计算出的三个角度 void getTriangleAngles(float side1, float side2, float side3, float out_angles[3]) { float pi, s, area, R; pi = acos(-1); s = (side1 + side2 + side3) / 2; area = sqrt(s * (s - side1) * (s - side2) * (s - side3)); R = (side1 * side2 * side3) / (4 * area); out_angles[0] = (180 / pi) * asin(side1 / (2 * R)); out_angles[1] = (180 / pi) * asin(side2 / (2 * R)); out_angles[2] = (180 / pi) * asin(side3 / (2 * R)); printf("Angles: %6.2f %6.2f %6.2f\n", out_angles[0], out_angles[1], out_angles[2]); }
如果你的C函数需要在C测试代码中调用,需要在函数声明外包裹extern "C",避免C的名称修饰导致链接失败:
#ifdef __cplusplus extern "C" { #endif void getTriangleAngles(float side1, float side2, float side3, float out_angles[3]); #ifdef __cplusplus } #endif
第二步:修改单元测试代码
- 浮点数比较需要指定允许的误差范围,避免浮点计算精度误差导致断言误判
- 先把返回的三个角度求和,再和预期值比较
TEST_METHOD(T001_TriangleAngleTest_EquilateralTriangle_true) { // 等边三角形三边相等,角度都为60,和为180 float side1 = 1.0f, side2 = 1.0f, side3 = 1.0f; float result_angles[3] = {0}; getTriangleAngles(side1, side2, side3, result_angles); float sum = result_angles[0] + result_angles[1] + result_angles[2]; float expected_sum = 180.0f; // 第三个参数为允许的误差范围,可根据精度需求调整 Assert::AreEqual(expected_sum, sum, 1e-3f, L"三个角度之和应为180"); // 也可以单独校验每个角度的数值 float expected_angle = 60.0f; Assert::AreEqual(expected_angle, result_angles[0], 1e-3f, L"等边三角形角度应为60"); Assert::AreEqual(expected_angle, result_angles[1], 1e-3f, L"等边三角形角度应为60"); Assert::AreEqual(expected_angle, result_angles[2], 1e-3f, L"等边三角形角度应为60"); }
测试用例设计建议
可以覆盖以下场景验证逻辑正确性:
- 常规用例:等边三角形、普通等腰三角形、普通不等边三角形、直角三角形
- 边界用例:接近退化的三角形(三边接近共线,角度和仍为180)
- 异常用例:不符合三角形构成规则的三边(两边之和小于等于第三边),可以增加异常判断逻辑后测试
内容的提问来源于stack exchange,提问作者FlaviiP
相关产品推荐
相关产品推荐

