- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一个 RPN 计算器,现在我的 main.cpp 和这些其他类文件应该接受一串代数运算,例如“3 + 4/2.34”,可以采用算术运算符,可以读入 double 、整数、分数和带分数(一个整数、一个空格,然后是一个分数)。
在命令控制台中我收到此错误:
ASSERT: "uint(i) < uint(size())" in file c:\QtSDK\Desktop\Qt\4.8.1\mingw\include
/QtCore/qstring.h, line 701
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Press <RETURN> to close this window...
我对 QT 的理解不够深入,无法嗅出此错误的来源,因此除了展示我的代码并希望有人能帮助我之外,我别无选择。有很多代码:/我已经排除了 Fraction 和 Mixed 类的 header 和源代码,因为它们没有使用 qstring.h,而这正是编译器似乎在提示的。如果您认为这些是必需的,我可以发布它们。
据我所知,它与将无符号整数与整数进行比较有关,可能会尝试将负整数分配给 uint?这是奇怪的部分,在 main.cpp 文件中,输入字符串是“1345/43143 - 2”,这会导致错误。此外,“3+4”也会导致错误。奇怪的是,如果我将输入字符串设置为“2341 + (23 ^ 4.421)/23/321 - 5 6/7”,它确实有效,但似乎没有其他输入字符串有效。
token .h
#ifndef TOKEN_H
#define TOKEN_H
#include "Mixed.h"
#include "Fraction.h"
class Token
{
public:
Token();
Token(const QString& Substring);
void SetIntPart(const QString& Substring);
void SetDoublePart(const QString& Substring);
void SetFractionPart(const QString& Substring);
void SetMixedPart(const QString& Substring);
void SetOperatorPart(const QString& Substring);
bool isDouble(const QString& Substring);
bool isInt(const QString& Substring);
bool isFraction(const QString& Substring);
bool isMixed(const QString& Substring);
bool isOperator(const QString& Substring);
bool isNumber()
{ return (inttoken || doubletoken || fractiontoken || mixedtoken); }
bool isLeftParen();
bool isRightParen();
bool isOperator();
int IntPart() { return intpart; }
double DoublePart() { return doublepart; }
Fraction FractionPart() { return fractionpart; }
Mixed MixedPart() { return mixedpart; }
char OperatorPart() { return operatorpart; }
bool IntToken() { return inttoken; }
bool DoubleToken() { return doubletoken; }
bool FractionToken() { return fractiontoken; }
bool MixedToken() { return mixedtoken; }
bool OperatorToken() { return operatortoken; }
QString toQString();
void Print(ostream& out) const;
friend ostream& operator<<(ostream& out, const Token& T);
private:
int intpart;
double doublepart;
Fraction fractionpart;
Mixed mixedpart;
char operatorpart;
bool inttoken;
bool doubletoken;
bool fractiontoken;
bool operatortoken;
bool mixedtoken;
void ClearBools();
void ClearParts();
void ClearAll() { ClearBools(); ClearParts(); }
};
#endif // TOKEN_H
解析器.h
#ifndef PARSER_H
#define PARSER_H
#include <iostream>
#include <cstdlib>
#include "Fraction.h"
#include "Mixed.h"
#include "Queue.h"
#include "Stack.h"
#include "Token.h"
class Parser
{
public:
Parser();
void LoadInputQueue(const QString& QS);
void LoadOutputQueue();
void CopyInputToString(QString &QS);
void CopyOutputToString(QString &QS);
bool isOperator(const QChar& Qch);
bool isSpace(const QChar& Qch);
bool isRightParen(const QChar& Qch);
bool isLeftParen(const QChar& Qch);
bool isParen(const QChar& Qch);
bool isDigit(const QChar& Qch);
void PrintInputQueue(ostream& out);
void PrintOutputQueue(ostream& out);
void PrintOperatorStack(ostream& out);
int precedence(Token T);
private:
Queue<Token> InputQueue;
Queue<Token> OutputQueue;
Stack<Token> OperatorStack;
void Tokenize(const QString& InputString, int n);
};
#endif // PARSER_H
主要.cpp
#include <QtCore/QCoreApplication>
#include <cstdlib>
#include <iostream>
#include "Token.h"
#include "Parser.h"
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
/*cout << "Fractiontoken: " << A.FractionToken() << endl;
cout << "Fraction part: " << A.FractionPart() << endl;
cout << "Inttoken: " << A.IntToken() << endl;
cout << "Int part: " << A.IntPart() << endl;
cout << "Doubletoken: " << A.DoubleToken() << endl;
cout << "Double part: " << A.DoublePart() << endl;
cout << "Mixedtoken: " << A.MixedToken() << endl;
cout << "Mixed part: " << A.MixedPart() << endl;
cout << "Operatortoken: " << A.OperatorToken() << endl;
cout << "Operator part: " << A.OperatorPart() << endl;*/
QString inputstring = "1345/43143 - 2";
Parser P;
QString displaystring;
P.LoadInputQueue(inputstring);
P.CopyInputToString(displaystring);
cout << qPrintable(displaystring);
cout << endl;
P.LoadOutputQueue();
P.CopyOutputToString(displaystring);
cout << qPrintable(displaystring);
cout << endl;
return a.exec();
}
解析器.cpp
#include "Parser.h"
enum PARENTHESIS_1{P1};
enum PARENTHESIS_2{P2};
bool Parser::isOperator(const QChar& Qch)
{
char ch = Qch.toAscii();
if (ch == '+' ||
ch == '-' ||
ch == '*' ||
ch == '/' ||
ch == '(' ||
ch == ')' ||
ch == '^' )
return 1;
return 0;
}
bool Parser::isSpace(const QChar& Qch)
{
if (Qch.toAscii() == ' ')
return 1;
return 0;
}
bool Parser::isLeftParen(const QChar& Qch)
{
char ch = Qch.toAscii();
if (ch == '(')
return 1;
return 0;
}
bool Parser::isRightParen(const QChar& Qch)
{
char ch = Qch.toAscii();
if (ch == ')')
return 1;
return 0;
}
bool Parser::isParen(const QChar& Qch)
{
if (isRightParen(Qch) || isLeftParen(Qch))
return 1;
return 0;
}
bool Parser::isDigit(const QChar &Qch)
{
char ch = Qch.toAscii();
if (ch > 47 && ch < 58)
return 1;
return 0;
}
Parser::Parser() : InputQueue(100), OutputQueue(100)
{
}
void Parser::Tokenize(const QString& InputString, int n)
{
if (n >= InputString.size())
return;
else
{
if (isOperator(InputString[n]))
{
QString temp;
temp.append(InputString[n]);
Token temptoken(temp);
InputQueue.enqueue(temptoken);
Tokenize(InputString, n+1);
}
else if (isSpace(InputString[n]))
Tokenize(InputString, n+1);
else
{
QString temp;
while (n < InputString.size() && !isSpace(InputString[n]) && !isParen(InputString[n]))
{
temp.append(InputString[n]);
n++;
}
if (isSpace(InputString[n]))
{
if (isDigit(InputString[n+1]))
{
temp.append(' ');
n++;
while (n < InputString.size() && !isSpace(InputString[n]) &&
!isParen(InputString[n]))
{
temp.append(InputString[n]);
n++;
}
Token temptoken(temp);
InputQueue.enqueue(temptoken);
Tokenize(InputString, n);
}
else if (isOperator(InputString[n+1]))
{
Token temptoken(temp);
InputQueue.enqueue(temptoken);
Tokenize(InputString, n+1);
}
}
else if (isParen(InputString[n]))
{
Token temptoken(temp);
InputQueue.enqueue(temptoken);
temp.clear();
temp.append(InputString[n]);
Token temptoken2(temp);
InputQueue.enqueue(temptoken2);
Tokenize(InputString, n+1);
}
}
}
}
int Parser::precedence(Token T)
{
if (T.OperatorToken())
{
char temp = T.OperatorPart();
if (temp == '^')
return 4;
if (temp == '*' || temp == '/')
return 3;
if (temp == '+' || temp == '-')
return 2;
}
return 1;
}
void Parser::LoadOutputQueue()
{
while (!InputQueue.empty())
{
Token temptoken;
InputQueue.dequeue(temptoken);
if (temptoken.isNumber())
OutputQueue.enqueue(temptoken);
else if (temptoken.isLeftParen())
OperatorStack.push(temptoken);
else if (temptoken.isRightParen())
{
while (!OperatorStack.empty() && !(OperatorStack.Peek()).isLeftParen())
{
Token temp;
OperatorStack.pop(temp);
OutputQueue.enqueue(temp);
}
if (!OperatorStack.empty() && (OperatorStack.Peek()).isLeftParen())
OperatorStack.pop(temptoken);
else if (OperatorStack.empty())
throw P1;
}
else if (temptoken.isOperator())
{
while (!OperatorStack.empty() && precedence(temptoken) < precedence(OperatorStack.Peek()))
{
Token temp;
OperatorStack.pop(temp);
OutputQueue.enqueue(temp);
}
OperatorStack.push(temptoken);
}
}
while (!OperatorStack.empty())
{
Token temptoken;
OperatorStack.pop(temptoken);
if (temptoken.isLeftParen())
throw P2;
OutputQueue.enqueue(temptoken);
}
}
//this function takes a QString (of chars) and from that builds its queue of tokens
void Parser::LoadInputQueue(const QString &QS)
{
Tokenize(QS,0);
}
void Parser::CopyOutputToString(QString &QS)
{
QString tempstring;
Token temptoken;
for (int i=OutputQueue.Size()-1; i>=0; i--)
{
temptoken = OutputQueue.Element(i);
tempstring.append(temptoken.toQString());
}
QS = tempstring;
}
void Parser::CopyInputToString(QString& QS)
{
QString tempstring;
Token temptoken;
for (int i=InputQueue.Size()-1; i>=0; i--)
{
temptoken = InputQueue.Element(i);
tempstring.append(temptoken.toQString());
}
QS = tempstring;
}
void Parser::PrintInputQueue(ostream& out)
{
out << InputQueue << endl;
}
void Parser::PrintOutputQueue(ostream& out)
{
out << OutputQueue << endl;
}
void Parser::PrintOperatorStack(ostream& out)
{
out << OperatorStack << endl;
}
token .cpp
#include "Token.h"
#include <QStringList>
enum TOKEN_EXCEPTIONS{UNKNOWN_TOKEN};
Token::Token()
{
}
Token::Token(const QString& Substring)
{
if (isInt(Substring))
SetIntPart(Substring);
else if (isDouble(Substring))
SetDoublePart(Substring);
else if (isFraction(Substring))
SetFractionPart(Substring);
else if (isMixed(Substring))
SetMixedPart(Substring);
else if (isOperator(Substring))
SetOperatorPart(Substring);
else
{
cout << qPrintable(Substring) << endl;
throw UNKNOWN_TOKEN;
}
}
void Token::SetIntPart(const QString& Substring)
{
ClearAll();
intpart = Substring.toInt();
inttoken = 1;
}
void Token::SetDoublePart(const QString& Substring)
{
ClearAll();
doublepart = Substring.toDouble();
doubletoken = 1;
}
void Token::SetFractionPart(const QString& Substring)
{
ClearAll();
QStringList Q;
Q = Substring.split('/');
Fraction frac(Q[0].toInt(),Q[1].toInt());
fractionpart = frac;
fractiontoken = 1;
}
void Token::SetMixedPart(const QString& Substring)
{
ClearAll();
QStringList Q1, Q2;
Q1 = Substring.split(' ');
QString wholepart = Q1[0];
Q2 = Q1[1].split('/');
QString numeratorstring = Q2[0];
QString denominatorstring = Q2[1];
Mixed M(wholepart.toInt(),numeratorstring.toInt(),denominatorstring.toInt());
mixedpart = M;
mixedtoken = 1;
}
void Token::SetOperatorPart(const QString& Substring)
{
ClearAll();
operatorpart = Substring[0].toAscii();
operatortoken = 1;
}
bool Token::isDouble(const QString& Substring)
{
int pointcount=0;
int intcount=0;
int pointloc=0;
for (int i=0; i<Substring.size(); i++)
{
if (isdigit(Substring[i].toAscii()))
intcount++;
if (Substring[i].toAscii() == '.')
{
pointcount++;
pointloc = i;
}
}
if (pointcount != 1)
return 0;
if (intcount != Substring.size() - 1)
return 0;
return 1;
}
bool Token::isInt(const QString& Substring)
{
if (Substring[0].toAscii() == '0')
return 0;
for (int i=0; i<Substring.size(); i++)
{
if (!isdigit(Substring[i].toAscii()))
return 0;
}
return 1;
}
bool Token::isFraction(const QString& Substring)
{
int slashcount=0;
int intcount=0;
int slashloc=0;
for (int i=0; i<Substring.size(); i++)
{
if (Substring[i].toAscii() == '/')
{
slashcount++;
slashloc = i;
}
if (isdigit(Substring[i].toAscii()))
intcount++;
}
if (slashcount != 1) // if there is not exactly 1 slash in substring
return 0;
if (intcount != Substring.size() - 1) //if the rest of the chars are not integers
return 0;
if (slashloc == 0 || slashloc == Substring.size() - 1) //if slash is at wrong location
return 0;
if (Substring[slashloc+1].toAscii() == '0' ||
Substring[0].toAscii() == '0')
return 0;
return 1;
}
bool Token::isMixed(const QString& Substring)
{
if (Substring[0].toAscii() == '0')
return 0;
int spacecount=0;
int slashcount=0;
int intcount=0;
int slashloc=0;
int spaceloc=0;
for (int i=0; i<Substring.size(); i++)
{
if (isspace(Substring[i].toAscii()))
{
spacecount++;
spaceloc = i;
}
if (isdigit(Substring[i].toAscii()))
intcount++;
if (Substring[i].toAscii() == '/')
{
slashcount++;
slashloc = i;
}
}
// cout << "spacecount: " << spacecount << endl;
// cout << "slashcount: " << slashcount << endl;
// cout << "intcount: " << intcount << endl;
// cout << "slashloc: " << slashloc << endl;
// cout << "spaceloc: " << spaceloc << endl;
if (spacecount != 1)
return 0;
if (slashcount != 1)
return 0;
if (intcount != Substring.size() - 2)
return 0;
if (slashloc == 0 || slashloc == Substring.size()-1)
return 0;
if (spaceloc == 0 || spaceloc == Substring.size()-1)
return 0;
if (slashloc < spaceloc)
return 0;
if (!isdigit(Substring[slashloc-1].toAscii()) || !isdigit(Substring[slashloc+1].toAscii()))
return 0;
if (!isdigit(Substring[spaceloc-1].toAscii()) || !isdigit(Substring[slashloc+1].toAscii()))
return 0;
return 1;
}
bool Token::isOperator(const QString& Substring)
{
if (Substring.size() != 1)
return 0;
if (Substring[0] == '+' ||
Substring[0] == '-' ||
Substring[0] == '*' ||
Substring[0] == '^' ||
Substring[0] == '/' ||
Substring[0] == '(' ||
Substring[0] == ')')
return 1;
return 0;
}
void Token::ClearBools()
{
mixedtoken = 0;
inttoken = 0;
doubletoken = 0;
fractiontoken = 0;
operatortoken = 0;
}
void Token::ClearParts()
{
intpart = 0;
doublepart = 0;
Fraction f(0);
fractionpart = f;
Mixed m(0);
mixedpart = m;
operatorpart = NULL;
}
QString Token::toQString()
{
QString tempstring;
if (inttoken)
{
QString temp;
temp.setNum(intpart);
tempstring.append('[');
tempstring.append(temp);
tempstring.append(']');
return tempstring;
}
else if (doubletoken)
{
QString temp;
temp.setNum(doublepart);
tempstring.append('[');
tempstring.append(temp);
tempstring.append(']');
return tempstring;
}
else if (fractiontoken)
{
Fraction F = fractionpart;
QString temp;
tempstring.append('[');
temp.setNum(F.Numerator());
tempstring.append(temp);
tempstring.append('/');
temp.setNum(F.Denominator());
tempstring.append(temp);
tempstring.append(']');
return tempstring;
}
else if (mixedtoken)
{
Mixed M = mixedpart;
QString temp;
tempstring.append('[');
temp.setNum(M.WholePart());
tempstring.append(temp);
tempstring.append(' ');
temp.setNum(M.Numerator());
tempstring.append(temp);
tempstring.append('/');
temp.setNum(M.Denominator());
tempstring.append(temp);
tempstring.append(']');
return tempstring;
}
else if (operatortoken)
{
tempstring.append('[');
tempstring.append(operatorpart);
tempstring.append(']');
}
else
throw UNKNOWN_TOKEN;
}
void Token::Print(ostream& out) const
{
if (inttoken)
{
out << intpart;
}
else if (doubletoken)
{
out << doublepart;
}
else if (fractiontoken)
{
out << fractionpart;
}
else if (mixedtoken)
{
out << mixedpart;
}
else if (operatortoken)
{
out << operatorpart;
}
else
throw 1;
}
ostream& operator<<(ostream& out, const Token& T)
{
T.Print(out);
return out;
}
bool Token::isLeftParen()
{
if (operatortoken && operatorpart == '(')
return 1;
return 0;
}
bool Token::isRightParen()
{
if (operatortoken && operatorpart == ')')
return 1;
return 0;
}
bool Token::isOperator()
{
if (operatortoken)
return 1;
return 0;
}
最佳答案
我认为这里肯定是错误的:
while (n < InputString.size() && !isSpace(InputString[n]) && !isParen(InputString[n]))
{
temp.append(InputString[n]);
n++;
}
if (isSpace(InputString[n]))
应该是:
while (n < InputString.size() && !isSpace(InputString[n]) && !isParen(InputString[n]))
{
temp.append(InputString[n]);
n++;
}
if (n < InputString.size() && isSpace(InputString[n]))
真正的错误可能是其他地方没有读取您的所有代码,而是类似的地方,您运行到字符串结尾,然后访问它后面的字符。
在调试器中运行您的代码,当它断言时查看它在您的代码中的位置。
关于c++ - 奇怪的 QT Unsigned Int 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991740/
我不知道下面的代码有什么问题,它应该读取数字并将它们的值与位置放在一个成对的 vector 中,然后对它们进行排序并打印出位置。我用 sort 删除了部分 - 我认为问题就在那里,但我再次收到编译错误
我相信当您将两个 unsigned int 值相加时,返回值的数据类型将是 unsigned int。 但是两个 unsigned int 值相加可能会返回一个大于 unsigned int 的值。
我从左移得到的结果我找不到解释。 unsigned char value = 0xff; // 1111 1111 unsigned char = 0x01; // 0000 0001 std::c
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
根据:http://en.wikipedia.org/wiki/C_data_types您可以使用 unsigned short 类型或 unsigned short int 类型。但是它们之间有什么
我正在尝试在 arduino 草图中实现 CRC16。从网上拿到了crc.c文件,想试试看。我创建了其他文件以允许 crc.c 正确运行。这是我的文件。 crc.h: #ifndef CRC_C_ #
我正在尝试实现一个将存储相关索引的列表。但是,我在标题中提到的 for (index_itr = (list_size - numberOfEvents - 1) 处遇到错误。我在做什么错误,以及如何
这不是跨平台代码...所有内容都在同一平台上执行(即字节序是相同的......小字节序)。 我有这个代码: unsigned char array[4] = {'t', 'e', 's', '
我有一个 8 位 unsigned char vector 和一个 16 位 unsigned short vector std::vector eight_bit_array; std::vecto
这个问题在这里已经有了答案: Is subtracting larger unsigned value from smaller in C++ undefined behaviour? (2 个答案
这个问题已经有答案了: Difference between unsigned and unsigned int in C (5 个回答) 已关闭 6 年前。 在 C 语言中,unsigned 之间有
我遇到了一个我不太理解的警告。该警告是通过比较我认为是一个未签名的内容与另一个未签名的内容而生成的。 来源如下: #include #include #include #include int
好吧,这一定很愚蠢。我在移动一些代码时遇到了这个问题,并认为我打错了字或未能正确使用调试器。作为健全性检查,我创建了这个测试用例,但它似乎仍然失败。 unsigned int vtxIdx
我有一个同事不热衷于使用现代 C++ 例如,当我要求他开始使用 r_value 引用时,他不会这样做。当我要求他使用 std::array 而不是 c 数组(char example[8])时,他不会
我有一个无符号字符数组,例如Data[2]。我需要它来与返回 unsigned int 的函数的输出进行比较。 我尝试将 Data[2] 转换为 unsigned int,反之亦然。它没有用。 我想做
我遇到了一个我不太明白的警告。警告是通过将我认为是未签名的与另一个未签名的进行比较而生成的。 这是来源: #include #include #include #include int mai
在下面的程序中,我使用了 unsigned 关键字。 #include int main() { unsigned char i = 'A'; unsigned j
整数值转换为浮点值并再次返回时是否与原始整数值相同? 例如: unsigned x = 42; double y = x; unsigned z = y; 假设编译器没有优化浮点转换,x == z 是
这个问题在这里已经有了答案: Difference between unsigned and unsigned int in C (5 个答案) 关闭 9 年前。 我理解 unsigned 和 un
您好,我遇到了一个关于位运算的小概念问题。请参阅下面的代码,其中我有一个 4 字节的无符号整数。然后我通过将地址分配给无符号字符来访问各个字节。 然后我将最后一个字节的值设置为 1。并对 unsign
我是一名优秀的程序员,十分优秀!