需要帮助将矢量解决范围问题.C

Need help on fixing vector out of range issue. C++

本文关键字:解决 范围 问题 帮助      更新时间:2023-10-16

因此,我正在制作一个程序,该程序在交通灯系统上进行移动汽车。它与北部,东,南,西部的汽车分类,并以顺时针顺序移动。我正在遇到一个问题,即我实施了一个goto和一个重置柜台的问题,这是对给定运行中有多少辆车可以通过的量度。

我尝试将Goto设置为另一个地方,重新安排了它如何分配我的矢量并检查索引,并试图发现计数器重置可能无法工作的地方。该程序在Linux服务器上运行并使用孩子和父进程。

#include <iostream>
#include <vector>
#include <queue>
#include <unistd.h>
#include <sys/wait.h>
//Jeremy Bayangos - 1646316
//OS Class - Castro - Mon/Wed
//COSC3613
using namespace std;
struct cars
{
   string name;
   char dr;
   int t;
};
bool init(vector<cars> &arr, char direct) {
   if (!arr.empty())
      for (vector<cars>::size_type i = 0; i < arr.size(); ++i) {
         if (arr.at(i).dr == direct) {
            return true;
         }
      } return false;
}
int direct_counter(vector<cars> &arr, char n)
{
   int count = 0;
   if (!arr.empty())
      for (int i = 0; i < arr.size(); ++i) {
         if (arr.at(i).dr == n) {
            count++;
         }
      } return count;
}
char direct_bound(char e)
{
   if (e == 'E')
   {
      cout << "Current direction: Eastbound" << endl;
   }
   if (e == 'S')
   {
      cout << "Current direction: Southbound" << endl;
   }
   if (e == 'W')
   {
      cout << "Current direction: Westbound" << endl;
   }
   if (e == 'N')
   {
      cout << "Current direction: Northbound" << endl;
   }
}
char direct_shift(char e)
{
   if (e == 'N')
   {
      return 'E';
   }
   else if (e == 'E')
   {
      return 'S';
   }
   else if (e == 'S')
   {
      return 'W';
   }
   else if (e == 'W')
   {
      return 'N';
   }
   else
   {
      return '';
   }
}

int main() {
   vector <cars> keeper;
   queue <cars> que;
   char track;  //starting direction
   int car_num; //starting car num
   string plate;
   char dir;
   int sec;
   cin >> track;
   cin >> car_num;

   while (cin >> plate >> dir >> sec) //takes the input of plate, 
      direction and time
      {
         cars temp;
         temp.name = plate;
         temp.dr = dir;
         temp.t = sec;
         keeper.push_back(temp);
      }
   char curr_dir = track;
   int counter = 0;
   while (not keeper.empty())
   {
      for (auto i = 0; i < keeper.size(); i++) {
truckstop:
         if (init(keeper, curr_dir))//if directions is inside 
            vector
            {
               if (keeper.at(i).dr == curr_dir)// if current 
                  direction its facing is correct
                  {
                     if (car_num == 1 or 
                         direct_counter(keeper, curr_dir == 1))
                     {
                        que.push(keeper[i]); //pushes 
                        vector at i into queue
                           keeper.erase(keeper.begin() + 
                                        i); // deletes vector at index i
                        curr_dir = 
                           direct_shift(curr_dir);
                        counter = 0;
                        break;
                     }
                     else if (car_num > 1) {
                        que.push(keeper[i]); //pushes 
                        vector at i into queue
                           keeper.erase(keeper.begin() + 
                                        i); // deletes vector at index i
                        counter++;
                        if (counter == car_num) {
                           curr_dir = 
                              direct_shift(curr_dir);
                           counter = 0;
                           break;
                        }
                        else {
                           counter = 0;
                           goto truckstop;
                        }
                     }
                  }
            }
         else
         {
            curr_dir = direct_shift(curr_dir);
            goto truckstop;
         }
      }
   }
   int pid;
   char d1 = que.front().dr;
   char d2;
   while (not que.empty())
   {
      if (d1 != d2)
      {
         direct_bound(que.front().dr);
      }
      if ((pid = fork() == 0))
      {
         cout << "Car " << que.front().name << " is using the 
            intersection for " <<
            que.front().t << " sec(s)." << endl;
         sleep(que.front().t);
         exit(0);
      }
      else
      {
         d1 = que.front().dr;
         wait(0);
         que.pop();
         if (not que.empty())
         {
            d2 = que.front().dr;
         }
      }
   }
   return 0;
}

您无需同步即可访问父和子过程的'que',这可能会导致不可预测的结果。我建议您首先实现您的逻辑而无需"叉"。