public: std::vector<std::vector<Node*>> paths;,void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); //根據agv獲取taskid,初始化 int completed_task_index = -1; // 如果任務都完成了,停止定時器 bool all_tasks_completed = true; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].completed != 2) { all_tasks_completed = false; break; } } if (all_tasks_completed) { timer->stop(); // 停止定时器 return; } // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad() == true) { // 如果是负载的状态 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { // 如果到达终点 agvs[i].setLoad(false); // 设置为空载状态 agvs[i].setState(true); std::cout << "agv__id :" << agvs[i].getid() << " ,agv_get_task_id :" << agvs[i].get_task_id() << endl; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (completed_task_index != -1) { tasks[completed_task_index].completed = 2; } task_to_agv(); // 更新任务分配 update(); // 更新AGV状态 } else { // 否则行驶到终点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path = astar.getPath(start_node, end_node1); path.erase(path.begin()); paths[i] = path; } } else { // 如果是空载的状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { // 如果到达起点 agvs[i].setLoad(true); // 设置为负载状态 } else { // 否则行驶到起点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path = astar.getPath(start_node, end_node); path.erase(path.begin()); paths[i] = path; } } } // for (int i = 0; i < paths.size(); i++) { // std::cout << "AGV " << i << " path: "; // for (int j = 0; j < paths[i].size(); j++) { // std::cout << "(" << paths[i][j]->x << "," << paths[i][j]->y << ") "; // } // std::cout << std::endl; // },爲什麽在其他函數中引用path永遠為空,怎麽修改代碼
时间: 2024-01-10 07:04:56 浏览: 58
在你的代码中,你在 `MainWindow::moveAgvs()` 函数中定义了一个名为 `paths` 的变量,它是一个二维向量,表示每个 AGV 的路径。然而,在其他函数中,你又使用了一个名为 `paths` 的变量,看起来是试图访问同一个变量,但实际上它们是不同的变量。
这是因为在 `MainWindow::moveAgvs()` 函数中,你定义了一个新的 `paths` 变量,它遮盖了外部作用域中定义的同名变量。因此,当你在其他函数中访问 `paths` 变量时,访问的是外部作用域中的变量,而非 `MainWindow::moveAgvs()` 函数中定义的变量。
要解决这个问题,你可以将 `paths` 变量从 `MainWindow::moveAgvs()` 函数中移动到类的成员变量中。具体来说,你可以在类的头文件中添加以下代码:
```
private:
std::vector<std::vector<Node*>> paths;
```
然后,在 `MainWindow::moveAgvs()` 函数中,你可以将路径存储到成员变量 `paths` 中,如下所示:
```
// 得到agv的路綫
for (int i = 0; i < agvs.size(); i++) {
// ...
std::vector<Node*> path = astar.getPath(start_node, end_node1);
path.erase(path.begin());
paths[i] = path; // 存储路径到成员变量中
// ...
}
```
这样,在其他函数中访问 `paths` 变量时,就能正确地访问到 `MainWindow` 类的成员变量了。
阅读全文