-1

アプリケーションに非常に奇妙な問題があります。MBED Online IDE で STM 開発ボード NUCLEO-F411RE を使用しています。私の関数 myObj() はオブジェクトを返します。返されたオブジェクトの値が LCD に出力されます。

おそらくコンパイラ/リンカーの戻り値の最適化で、いくつかの問題を特定しているようです。間違ったアプリケーション コードで問題を説明することはできません。

myObj() に 2 番目の return ステートメントを追加すると、奇妙な動作が発生し始めます。単一の return ステートメントですべて正常に動作するため、根本的な問題が疑われます。

予想される LCD の結果: dar 誤った LCD の結果: Bar

コード スニペット:

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;
}
4

1 に答える 1

1

コピーコンストラクターを導入することで解決しました。

次に、関数 myObj() はコピー コンストラクターを使用し、2 番目の戻り値がアクティブであっても正しい結果を返します (これが実際の状況で使用されるわけではありませんが、そのような場合の対処方法を強調しています)。

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を正しく出力するようになりました。

于 2016-03-03T22:35:12.460 に答える