while 루프 내에 스위치가 있습니다. 옵션 4를 세 번 호출하면 다음 번에 int를 입력 할 때 프로그램이 충돌하여 어떤 경우에 스위치를 사용할 것인지 결정합니다. 나는 그것이 왜 일어나는 지 전혀 모른다. 세 후while-switch 루프에서 istream 크래시가 발생했습니다.
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 시간 후, 전용 케이스 (4)과 4), 사례 위해 입력, 그것은 내부가 CIN >> OP 도달 다음번 충돌 : 이 while 루프의 코드는 istream 파일. 오류로 인해 다음과 같은 오류 메시지가 나타납니다. "Ex6.exe의 0x4a34870c에서 처리되지 않은 예외 : 0xC0000005 : 액세스 위반." 도움을 환영 할 것입니다!
그냥 추측하면 C++ 11을 사용하지 않습니까? ;; 어쨌든, 당신은 [valgrind] (http://valgrind.org)가 그것을 봐야합니다. –
"크래시"란 무엇을 의미합니까? 또한, 여기에 게시하기 전에 코드를 최소한으로 줄이십시오. 그리고 우리에게 최강의 * compilable * 코드를 제공하십시오. 게시 된 코드에는 모를 물건이 많이 포함되어 있으므로 문제를 재현 할 수 없습니다. –
업데이트 된 질문. 그리고 Jonas, C++ 11을 사용하지 않습니다. – nodwj