【发布时间】:2012-06-19 07:11:45
【问题描述】:
我在 while 循环中有一个开关。在我三次调用选项 4 之后,程序在下次我输入决定在 switch 中进入哪种情况的 int 时崩溃。我不知道为什么会这样。 这是while循环的代码:
void Menu::start()
{
Store st;
int op=1,num,quantity;
string name;
while(op!=0)
{
cin>>op;
try
{
switch(op)
{
case 1:
{
cin>>num>>name;
st.addProduct(num,name);
break;
}
case 4:
{
cin>>num>>quantity;
st.sellProduct(num,quantity);
break;
}
case 0:
break;
default:
throw(exception("Unknown option, try again.\n"));
} //end of switch
} //end of try
//catches
} //end of while
}
/*****************************************************************************
* function name: addProduct
* The Input: This Store, const& int num, const& string name
* The output: If product with given num doesn't exist in store, adds it to
* store.
* The Function operation: uses the products map.
*****************************************************************************/
void Store::addProduct( const int& num,const string& name )
{
//if product doesn't exist in map, add it
if(prods.find(num)==prods.end())
prods.insert(pair<int,Product>(num,Product(num,name)));
//otherwise issue an error
else
throw(AddProdException(num));
}
/*****************************************************************************
* function name: sellProduct
* The Input: This Store, const int& prodNum, const unsigned int& quantityBought
* The output: If product doesn't exist or quantityBought is more than 10 units
* more than quantity in stock, issues an error. Otherwise, sells the product
* and if needed, issues a shipment such that after the purchase the store will
* be left with 20 units.
* The Function operation: uses the products and orders map.
*****************************************************************************/
void Store::sellProduct( const int& prodNum, const unsigned int& quantityBought )
{
if(prods.find(prodNum)!=prods.end())
{
Product& pr = prods.find(prodNum)->second;
const int& signedQB=quantityBought, signedPQ=pr.getQuantity();
if( signedPQ<signedQB-10 )
//store can't supply product
throw(BuyQuanException(prodNum,quantityBought));
//make purchase
else
{
//purchase only what left in stock
if(signedPQ<signedQB )
{
//issue shipment
Order order=Order(prodNum,20+quantityBought-pr.getQuantity());
orders.insert(pair<int,Order>(order.getID(),order));
//document order
purchaseDocs.add(new Documentation(pr,quantityBought,
orders.find(order.getID())->second));
//buy product
pr.decreaseQuantity( pr.getQuantity() );
}
//purchase requested amount
else
{
//buy product
pr.decreaseQuantity( quantityBought );
//document order
purchaseDocs.add(new Documentation(pr,quantityBought));
}
} //else regarding making the purchase
} //if regarding found the product
//otherwise issue an error
else
throw(BuyProdException(prodNum));
}
3 次进入 case 4 后,(并且仅在 case 4 中,仅在 3 次后),它在下一次到达 cin>>op 时崩溃,在 istream 文件中。崩溃是指弹出以下错误消息:“Ex6.exe 中 0x4a34870c 处的未处理异常:0xC0000005:访问冲突。”欢迎帮助!
【问题讨论】:
-
只是猜测,你没有使用 c++11,是吗?无论如何,你应该valgrind看看它。
-
“崩溃”是什么意思?此外,请在此处发布之前将您的代码减至最少,并为我们提供最少的可编译代码。您发布的代码包含大量我们不知道的内容,因此我们无法重现您的问题。
-
更新问题。还有 Jonas,不使用 c++11。
-
如果你没有扔任何东西,唯一可能的罪魁祸首是
Store::sellProduct。你为什么不发布呢? -
更新问题以包含 sellProduct 和 addProduct。添加 1 个产品,将部分产品销售 2 次,然后选择下一个案例进入后发生错误。