0

わかりましたので、本質的に市場シミュレーションを実行しているプログラムがあります。多くのプログラムが正常に動作していますが、問題が 1 つだけあります。私のプログラムのある時点で、次のようなチェッカーの構造体があります。

 14 struct Checker
 15 {
 16  int m_money_in_register;
 17  int m_start_work;
 18  int m_time_checkout;
 19  Cust *m_cust;
 20 };

次のように、チェッカー オブジェクトの配列へのポインターを作成します。

118 Checker *checkers = new Checker[num_checkers]; // Initializing all checkers
119  for(int i = 0; i < num_checkers; i++)
120  {
121   checkers[i].m_money_in_register = 500;
122   checkers[i].m_start_work = 0;
123   checkers[i].m_cust = NULL;
124   checkers[i].m_time_checkout = 0;
125  }

これは問題なく動作し、checkers[i].m_cust = NULL の場合は、チェッカーが使用可能であり、checkout_queue にある Cust オブジェクトをチェッカーに割り当てることができることを意味します。

私のプログラムは、チェックアウトする最初の Cust に対して実行したいことを実行しますが、その Cust がチェックアウトを完了すると、checkers[i].m_cust = NULL を設定して、顧客がもう一度利用できるようにします。ただし、これによりセグメンテーション違反が発生し、次のようになります。

195 if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
215      }

オブジェクトを NULL に正しく設定するにはどうすればよいですか? 出力 im の例は次のとおりです。

1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
Segmentation fault

私が言ったように、13行目は私がやりたいことですが、Custオブジェクトへのポインターをnullに設定すると、セグフォルトが発生します。さらに説明が必要な場合、または GDB メッセージが必要な場合は、提供できます。ご意見をお待ちしております。


ループ全体は次のとおりです。

175    for(int i = 0; checker_queue.empty() != true && i < num_checkers; i++)
176    {
177      int checker_number = i;
178      if(checkers[i].m_cust == NULL && checkers[i].m_start_work == 0)
179      {
180       checkers[i].m_cust = checker_queue.dequeue();
181       checkers[i].m_cust->print_start_checkout(cout, clock, checker_number);
182
183      if(checkers[i].m_cust->get_status() == "shopper")
184       {
185        checkers[i].m_time_checkout = clock + (checkers[i].m_cust->get_num_items()*3);
186       }
187
188       else if(checkers[i].m_cust->get_status() == "robber")
189       {
190        checkers[i].m_time_checkout = clock + 7;
191       }
192       cout << "time checkout: " << checkers[i].m_time_checkout << endl; //check for checkout time
193      }
194
195      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() ==    "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL;
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL;
215      }
216     }

checkers[i].m_cust = NULL の設定をコメントアウトすると、次のような出力が得られます。

1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
14: James paid $10 for 2 items to checker 1
Segmentation fault
4

1 に答える 1