You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:36:03