【发布时间】:2016-03-03 20:01:11
【问题描述】:
我的应用程序有一个非常奇怪的问题。我正在使用带有 MBED Online IDE 的 STM 开发板 NUCLEO-F411RE。我的函数 myObj() 返回一个对象;返回对象的值被打印到 LCD。
我似乎发现了一些问题,可能与编译器/链接器中的返回值优化有关。 我无法在错误的应用程序代码中解释问题。
当在 myObj() 中添加第二个 return 语句时,开始出现奇怪的行为。 使用单个 return 语句一切正常,因此我怀疑存在一些基本问题。
预期的 LCD 结果:dar LCD 结果不正确:条形
代码sn-ps:
class charStream {
public:
charStream(); // Constructor
~charStream();
void in(char c);
void undoIn();
char out();
bool empty();
int size();
void readReset();
char read();
bool readEnd();
private:
charStreamElement *firstElement;
charStreamElement *lastElement;
charStreamElement *readElement;
int streamSize;
};
charStream myObj() {
charStream ch;
charStream ch2;
ch.in('d');ch.in('a');ch.in('r');
ch2.in('D');ch2.in('A');ch2.in('R');
return ch;
// return ch2;
//When above line is uncommented lcd prints Bar. When commented lcd prints dar
}
int main() {
lcdPrintStr(&lcds, myObj());
do{} while(1);
}
void charStream::in(char c) {
charStreamElement *newElement;
newElement = new charStreamElement(c,NULL,firstElement);
firstElement->setPrevious(newElement);
firstElement=newElement;
if (streamSize==0)
lastElement=firstElement;
streamSize++;
}
class charStreamElement {
public:
charStreamElement(char c, charStreamElement *prev, charStreamElement *next); // Constructor
~charStreamElement();
char elementValue();
charStreamElement *getPrevious();
charStreamElement *getNext();
void setLast();
void setPrevious(charStreamElement *prev);
private:
char value;
charStreamElement *nextElement;
charStreamElement *prevElement;
};
charStreamElement::charStreamElement(char c, charStreamElement *prev, charStreamElement *next) {
value=c;
nextElement=next;
prevElement=prev;
}
void charStreamElement::setPrevious(charStreamElement *prev) {
prevElement=prev;
}
【问题讨论】:
-
欢迎来到 Stack Overflow!请edit您的问题与minimal reproducible example 或SSCCE (Short, Self Contained, Correct Example)
-
您没有显示足够精确的代码 - 但我没有看到声明的复制构造函数...
-
charStream可能违反了三规则 -
至少您需要显示
charStream::in()的定义,并且正如@M.M 所提到的,您的类可能需要定义一些其他函数(例如复制ctor)。 -
@callyalater 函数中的返回次数没有规则。当你有不同的分支返回不同的东西时,这是双重的。在这种情况下没有意义,但它不应该做任何事情。