C++中dist_mini变量值未更新:最近点查找函数异常求助
解决C++查找最近点函数的逻辑错误
你的代码出现问题的核心原因及修正思路如下:
循环体缺少花括号,导致逻辑完全偏离预期
C++中,for/if语句如果没有用{}包裹代码块,只会将紧跟的第一行作为执行体。你的代码里,for循环仅会重复执行xi = positions_x[i];这一行,其余计算距离、判断更新的代码都在循环体外,只会在循环结束后执行一次。而且循环结束后i的值是50000,此时访问positions_y[50000]已经超出数组下标范围(数组下标从0开始,最大为49999),属于未定义行为。距离计算可以优化,避免重复开根号
比较两点距离的大小,等价于比较距离的平方大小,完全不需要调用sqrt。这样既能提升运算效率,也能减少浮点运算的精度误差。变量类型不合理
ind_min是点的索引,应该用int类型而非double,避免不必要的类型转换问题。循环上限硬编码,缺乏灵活性
不要直接写死i < 50000,建议传入点集的实际数量作为参数,或者使用容器(比如std::vector)的长度来控制循环范围。
修正后的代码(基于数组)
// 假设positions_x和positions_y是全局数组,或可改为函数参数传入 int nearestPoint(double x, double y, int pointCount) { int ind_min = 0; // 初始化最小距离平方为第一个点与目标点的距离平方 double dist_mini_sq = pow(x - positions_x[0], 2) + pow(y - positions_y[0], 2); for (int i = 1; i < pointCount; ++i) { double dx = x - positions_x[i]; double dy = y - positions_y[i]; double dist_sq = dx * dx + dy * dy; // 直接计算平方,省去pow和sqrt if (dist_sq < dist_mini_sq) { dist_mini_sq = dist_sq; ind_min = i; } } return ind_min; }
更安全的容器版本(使用std::vector)
#include <vector> #include <cmath> int nearestPoint(double x, double y, const std::vector<double>& positions_x, const std::vector<double>& positions_y) { // 处理空数组或坐标数组长度不匹配的异常情况 if (positions_x.empty() || positions_y.empty() || positions_x.size() != positions_y.size()) { return -1; } int ind_min = 0; double dist_mini_sq = pow(x - positions_x[0], 2) + pow(y - positions_y[0], 2); for (size_t i = 1; i < positions_x.size(); ++i) { double dx = x - positions_x[i]; double dy = y - positions_y[i]; double dist_sq = dx * dx + dy * dy; if (dist_sq < dist_mini_sq) { dist_mini_sq = dist_sq; ind_min = static_cast<int>(i); } } return ind_min; }
内容的提问来源于stack exchange,提问作者Baptiste
相关产品推荐
相关产品推荐

