文字列内の式から次の数値を抽出する単純な関数を作成しようとしていますが、関数の終了後に参照パラメーター ioIsValidExpression が更新されないという問題があります。test3 (getNextNumber(...) を呼び出す前に呼び出される) と ioIsValidExpression (関数内での名前) のアドレスが同じであるため、実際には正しい変数 (一時変数ではない) を参照しているように見えます。
これはどこかで恥ずかしい間違いだと思いますが、これを理解しようとしてもどこにも行きません。関数から値を返すコメント行に int main と int getNextNumber を含めました。
int getNextNumber(std::string& iExpression, int& ioLoopShift, bool& ioIsValidExpression)
{
//spaces are ignored, a minus is a unary minus (so must be seated next to a number (no spaces between '-' and number))
int length = iExpression.size(); //evaluate only once
bool unaryMinusFound = false;
bool numberFound = false;
int oSubExpression = 0;
for(int i =0; i < length; i++)
{
if((int)iExpression[i] == 32)
{
if(!numberFound)
{
if(!unaryMinusFound)
{
continue;
}
else
{
ioIsValidExpression = false;
td::cout << "address of ioIsValidExpression: " << &ioIsValidExpression << ", value: " << ioIsValidExpression << "\n";
return 0;
}
}
else
{
return unaryMinusFound? -1 * oSubExpression: oSubExpression;
}
}
if((int)iExpression[i] == 45 && !unaryMinusFound)
{
unaryMinusFound = true;
continue;
}
if((int)iExpression[i] >= 48 && (int)iExpression[i] <= 57)
{
numberFound = true;
oSubExpression = (int)(iExpression[i]-48) + 10*oSubExpression;
ioLoopShift++;
continue;
}
else
{
//garbage characters
ioIsValidExpression = false;
return 0;
}
}
return unaryMinusFound? -1 * oSubExpression: oSubExpression;
}
整数メイン:
int main(int argc, char* argv[])
{
std::string test = " - 45 & ";
int test2 = 0;
bool test3 = true;
std::cout << getNextNumber(test,test2,test3) << ", address of test3: " << &test3 << ", value: " << test3 << "\n";
return 0;
}
プログラムの実行による出力:
address of ioIsValidExpression: 0xbf86e58f, value: 0
0, address of test3: 0xbf86e58f, value: 1