2016-03-03 7 views
-1

У меня очень странная проблема с моим приложением. Я использую STM Development board NUCLEO-F411RE с MBED Online IDE. Моя функция myObj() возвращает объект; значение возвращаемого объекта печатается на ЖК-дисплее.Странный результат при реализации нескольких операторов возврата C++

Кажется, я идентифицирую некоторую проблему, возможно, с Оптимизацией возвращаемого значения в компиляторе/компоновщике. Я не могу объяснить проблему в неправильном коде приложения.

При добавлении второго оператора return в myObj() начинает происходить странное поведение. С одним оператором возврата все работает отлично, поэтому я подозреваю какую-то фундаментальную проблему.

Ожидаемый результат LCD: DAR Некорректное LCD результат: Бар

Фрагменты кода:

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; 
} 
+3

Добро пожаловать в переполнение стека! Пожалуйста, ** ** [изменить] ** ваш вопрос с помощью [mcve] или [SSCCE (Short, Self Contained, Correct Example)] (http://sscce.org) – NathanOliver

+1

У вас недостаточно кода, чтобы быть точным - но Я не вижу, что конструктор копирования объявлен ... –

+1

'charStream', вероятно, имеет право на нарушение правил. –

ответ

1

решаемые путем введения копировального-конструктор.

Функция myObj() затем использует экземпляр-конструктор и возвращает правильный результат, даже если активен второй возврат (а не то, что это будет использоваться в реальной ситуации, но в нем показано, как это происходит в таких случаях).

charStream &charStream::operator=(const charStream &copy) { 
    char c; 
    charStreamElement *temp; 

    streamSize=0; 
    firstElement=NULL; 
    lastElement=NULL; 
    readElement=NULL; 

    temp=copy.lastElement; 
    while (temp!=NULL) { 
     c=temp->elementValue(); 
     in(c); 
     temp=temp->getPrevious(); 
    } 
} 


charStream myObj() { 
    charStream ch; 
    ch.in('d');ch.in('a');ch.in('r'); 

    charStream ch2 = ch; 
    ch2.in('D');ch2.in('A');ch2.in('R'); 
    return ch;  
    return ch2; 
} 

Объекты ch и ch2 созданы на стеке и не зависят друг от друга. LCD теперь правильно печатает dar как и следовало ожидать.