调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码:〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】,并动画演示〕》,VS2015调试Exata,跟踪调试修改后的[ routing_bellmanford.cpp ]源码,确认修改版的[ routing_bellmanford.cpp ]源码,能够将”跳数度量”更改为”路由器节点之间的物理距离度量”,并根据[发送节点]与[目的节点]之间的距离进行路由:

★[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法←Exata调试分析

修改的距离度量版[routing_bellmanford.cpp]中添加如下源码,用于计算两个路由器节点之间的物理距离(除以1000,得到㎞量纲)

计算两个路由器节点之间的物理距离(除以1000,得到㎞量纲)←修改的距离度量版[routing_bellmanford.cpp]源码 

// C:\Scalable\Exata6.2Source__DEBUG_1\libraries\developer\src\routing_bellmanford.cpp 

#pragma region // JSLS添加:【步骤③】计算【[发送节点]与[接收节点]之间的物理距离】,用于 更新路由表中的路由距离
	// 需要用到《 C:\Scalable\Exata6.2Source__DEBUG_1\include\coordinates.h 》的 
	//          第493行:
						/*
						BOOL COORD_CalcDistance(
							int coordinateSystemType,
							const Coordinates* position1,
							const Coordinates* position2,
							CoordinateType* distance);
						*/

	double distanceBetweenTwoNodes;  // 单位:米。后续需要转化为 ㎞ 千米。
	Coordinates sendNodePosition; // 发送节点 的 坐标位置
	Coordinates recvNodePosition; // 接收节点 的 坐标位置
	MOBILITY_ReturnCoordinates(sendNode, &sendNodePosition);
	MOBILITY_ReturnCoordinates(node, &recvNodePosition);
	printf("JSLS: sendNodePosition and recvNodePosition have been got! \n");
	COORD_CalcDistance(NODE_GetTerrainPtr(no
基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定反演问题。NO₂作为影响空气质的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参以及辅助气象据,形成多维度特征据集。该据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的据处理流程。前期预处理包括辐射定标、噪声抑制及据标准化等步骤,以保障输入特征的质与一致性;后期处理则涉及模型输出的物理转换与结果验证,确保反演结果符合实际大气浓度范围,提升据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
你提出的问题非常关键,是典型的 **C++ 函重载匹配失败** 和 **参不一致导致的编译错误**。 我们来一步步分析: --- ## 🔍 问题描述回顾 你在 `.h` 头文件中声明了如下函: ```cpp void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info); ``` 在 `.cpp` 中实现了它(但没有默认参): ```cpp void AdaptInternal2Output(RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info) { // 实现... } ``` 但在 `Messenger::Publish` 函中调用的是: ```cpp AdaptInternal2Output(routingMap, routing_map_, routingMap->is_on_highway); ``` 👉 只传了 **3个参**! 而你的函定义需要 **4个参** —— 所以编译报错: > ❌ no matching function for call to ‘AdaptInternal2Output(... only 3 args)’ --- ## ✅ 核心问题总结 | 项目 | 状态 | |------|------| | 被调用函签名 | 需要 4 个参 | | 实际调用参 | 仅提供 3 个参 | | 第四个参类型 | `cem::fusion::navigation::AccLaneInfo`(非基本类型,无法自动构造) | | 是否有默认值? | 没有!所以必须显式传入 | ➡️ 因此:**编译器找不到一个接受 3 个参的 `AdaptInternal2Output` 重载版本**,于是报错。 --- ## ✅ 解决方案 ### ✅ 方案一:为第四个参添加默认构造(推荐) 如果你的设计允许 `sd_acc_lane_info` 在某些场景下使用“空”或“默认”值,则应为其设置默认值。 #### 修改头文件 `.h`: ```cpp void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info = cem::fusion::navigation::AccLaneInfo()); ``` > ⚠️ 前提是 `AccLaneInfo` 类型支持默认构造函(通常 Protobuf 或普通 struct 都支持)。 #### 同时修改 `.cpp` 定义: ```cpp void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info) { // 此处可以安全使用 sd_acc_lane_info,即使调用时未传入也会是默认值 if (!routingMap || !adapted_routing_map) return; adapted_routing_map->set_timestamp(routingMap->header.timestamp()); adapted_routing_map->set_is_on_highway(is_on_highway_flag); // 可选:处理 AccLaneInfo 字段 // auto* lane_info = adapted_routing_map->mutable_acc_lane_info(); // *lane_info = sd_acc_lane_info; } ``` ✅ 这样之后,下面这行代码就能通过编译了: ```cpp AdaptInternal2Output(routingMap, routing_map_, routingMap->is_on_highway); // 第四个参自动使用默认构造 ``` --- ### ✅ 方案二:增加一个只接受 3 个参的重载函(备选) 如果你不想改变原有四参的行为,可以 **新增一个重载函**,专门用于不需要 `sd_acc_lane_info` 的场景。 #### 在 `.h` 中添加重载声明: ```cpp // 重载1:带 AccLaneInfo void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info); // 重载2:不带 AccLaneInfo(供 Publish 使用) void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag); ``` #### 在 `.cpp` 中实现第二个重载: ```cpp void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap> adapted_routing_map, bool is_on_highway_flag) { // 调用主函,传入默认的 sd_acc_lane_info cem::fusion::navigation::AccLaneInfo default_info; AdaptInternal2Output(routingMap, adapted_routing_map, is_on_highway_flag, default_info); } ``` 这样 `Publish` 就可以直接调用三参版本,不会出错。 --- ## 🛠️ 关于 `namespace cem { namespace fusion { ... } }` 是什么? 这是 C++ 的嵌套命名空间(nested namespace),用来组织代码避免名字冲突。 ```cpp namespace cem { namespace fusion { void Messenger::Publish(RoutingMapPtr routingMap) { AdaptInternal2Output(routingMap, routing_map_, routingMap->is_on_highway); AINFO << "publish routing Map timestamp " << routingMap->header.timestamp; } } // namespace fusion } // namespace cem ``` 这段代码的意思是: - 当前作用域在 `cem::fusion` 命名空间内。 - `Messenger` 类属于 `cem::fusion`。 - 它内部的 `Publish` 成员函正在被实现。 - 调用的 `AdaptInternal2Output` 应该也在同一个命名空间中可见(否则需加 `::` 或 `using`)。 📌 所以你要确保 `AdaptInternal2Output` 函也定义在相同的命名空间里,例如: ```cpp namespace cem { namespace fusion { void AdaptInternal2Output(...) { ... } } // namespace fusion } // namespace cem ``` 否则会出现链接错误:“undefined reference”。 --- ## ✅ 最终建议修复步骤 ### Step 1: 修正函声明(`.h`) ```cpp namespace cem { namespace fusion { void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap>& adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info = cem::fusion::navigation::AccLaneInfo()); } // namespace fusion } // namespace cem ``` > 注意:建议将 `shared_ptr` 参改为引用 `&` 避免不必要的拷贝。 --- ### Step 2: 修正函定义(`.cpp`) ```cpp namespace cem { namespace fusion { void AdaptInternal2Output( RoutingMapPtr routingMap, std::shared_ptr<byd::msg::orin::routing_map::RoutingMap>& adapted_routing_map, bool is_on_highway_flag, cem::fusion::navigation::AccLaneInfo sd_acc_lane_info) { if (!routingMap || !adapted_routing_map) return; adapted_routing_map->set_timestamp(routingMap->header.timestamp()); adapted_routing_map->set_is_on_highway(is_on_highway_flag); // 可选处理其他字段... ADEBUG << "Adapted routing map with highway=" << is_on_highway_flag; } } // namespace fusion } // namespace cem ``` --- ### Step 3: `Publish` 函无需修改(已正确) ```cpp void Messenger::Publish(RoutingMapPtr routingMap) { AdaptInternal2Output(routingMap, routing_map_, routingMap->is_on_highway); AINFO << "publish routing Map timestamp " << routingMap->header.timestamp(); } ``` ✅ 现在能成功匹配带默认参的四参函。 --- ## ✅ 总结 | 问题 | 原因 | 解决方法 | |------|------|-----------| | 编译错误:no matching function | 调用 3 个参,但函需要 4 个 | 给第四个参加默认值,或增加三参重载 | | `AdaptInternal2Output` 找不到 | 不在相同命名空间或未声明 | 确保函在 `cem::fusion` 内声明和定义 | | 参顺序与类型 | 类型复杂且跨命名空间 | 使用 `using` 别名简化,注意智能指针引用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值