// 得到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; } } }, if (! paths[i].empty()) { // 检查 paths 是否有数据 std:: cout << "wsn" << endl; painter.setPen(QPen(Qt::red, 5)); // 设置画笔颜色和宽度 for (int i = 0; i < paths.size(); i++) { // 遍历每个子数组 painter.setPen(QPen(Qt::red, 5)); // 设置画笔颜色和宽度 for (int j = 0; j < paths[i].size() - 1; j++) { // 遍历每个子数组中的点 QPoint start(paths[i][j]->x * 25 + 200, paths[i][j]->y * 25 + 50); QPoint end(paths[i][j + 1]->x * 25 + 200, paths[i][j + 1]->y * 25 + 50); painter.drawLine(start, end); } } },報錯:一運行就白屏卡死,怎麽修改
时间: 2024-01-20 08:03:44 浏览: 27
首先,要确定报错原因,可以在代码中添加一些输出语句来进行调试,看看程序在哪里卡住了。比如在代码中添加一些这样的语句:
```
std::cout << "Debug1" << std::endl;
```
然后逐步检查程序执行到哪一步就卡住了。
另外,在你的第二段代码中,你有两个嵌套的 for 循环,但是你在内部循环中使用了 i 这个变量,这个变量已经在外部循环中被使用了。这个问题可能会导致程序出错。可以尝试修改为:
```
for (int i = 0; i < paths.size(); i++) {
painter.setPen(QPen(Qt::red, 5)); // 设置画笔颜色和宽度
for (int j = 0; j < paths[i].size() - 1; j++) { // 遍历每个子数组中的点
QPoint start(paths[i][j]->x * 25 + 200, paths[i][j]->y * 25 + 50);
QPoint end(paths[i][j + 1]->x * 25 + 200, paths[i][j + 1]->y * 25 + 50);
painter.drawLine(start, end);
}
}
```
最后,如果你的程序还是无法正常运行,可以贴出完整的代码,方便我们更好地帮助你解决问题。
相关问题
// 遍历所有 AGV,更新位置和状态 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) { moveAgvs(i); std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl; } },將他變爲定時觸發
如果你想将这段代码变为定时触发,可以使用 QTimer 类在指定的时间间隔内触发一个信号,并在该信号的槽函数中执行这段代码。
首先,你需要创建一个 QTimer 对象,并设置定时器的时间间隔:
```
QTimer* timer = new QTimer(this);
timer->setInterval(1000); // 定时器间隔为 1 秒
```
接下来,你需要将 QTimer 对象的 timeout() 信号连接到一个槽函数,该槽函数将执行你需要定时触发的代码:
```
connect(timer, &QTimer::timeout, this, [=]() {
// 遍历所有 AGV,更新位置和状态
for (int i = 0; i < agvs.size(); i++) {
if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) {
moveAgvs(i);
std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl;
}
}
});
```
最后,你需要启动 QTimer 对象来开始定时触发:
```
timer->start();
```
这样就可以在每个 1 秒钟内触发一次定时器,并执行你指定的代码。需要注意的是,如果你的程序需要在多线程中运行,请确保在正确的线程中创建和使用 QTimer 对象。
//分配小車 AGVScheduler scheduler; scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務 // 遍历所有 AGV,更新位置和状态 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) { moveAgvs(i); std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl; } },添加代碼 :遍歷所有的task,只要所有task的completed的值不全為2,則循環這個函數
如果您的要求是遍历所有任务,只要所有任务的completed的值不全为2,就循环这个函数,可以尝试以下代码:
```
while (true) {
bool all_completed = true;
for (int i = 0; i < tasks.size(); i++) {
if (tasks[i].completed != 2) {
all_completed = false;
break;
}
}
if (all_completed) {
break;
}
AGVScheduler scheduler;
scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務
for (int i = 0; i < agvs.size(); i++) {
if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) {
moveAgvs(i);
std::cout << "agv.id:" << agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl;
}
}
}
```
这段代码会无限循环,直到所有任务的completed的值都为2为止。在每次循环中,会先检查所有任务的completed的值是否都为2,如果是就跳出循环;否则就继续进行任务分配和 AGV 的更新操作。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)