-4

何らかの理由で、関数は最初のものを除いてオブジェクトの配列のメンバー値を保存しません。この問題の性質を強調するためにコードを要約しました。

classFile.cpp

myClass objectArray[10];

void myClass::Set(float x, int elementID)
{
    myX = x;
    log<< myX; //output is equal to x
    log<< elementID; //output ranges from 0-9
    log<< objectArray[elementID].myX; //output is incorrect if elementID is higher than 0
}

classFile.h

extern myClass objectArray[10];

呼び出し関数ファイル.cpp

for(int i=0; i<10;i++)
{
   objectArray[i].Set(5.0f, i);
   i++;
}

の誤った出力はobjectArray[elementID].myX、特定の場合は常に同じですelementIDが、他の では異なりelementIDます。0 の場合もあれば、8231924021 のような場合もあります。

編集:これは、関連する部分が上部に書かれた元のコードです(実際に実行するには長すぎるというニュアンスに気付いた場合): classFile.hclassFile.cppfunctionCallingFile.cpp

Edit2: クラスメンバーの位置がメモリ内で各オブジェクトごとに 3 バイトシフトされているように見えるため、最初のものを除いてそれらを読み取ることができなくなります。myXアドレスとobjectArray[i].myXアドレスの比較は次のとおりです-pastebinLink

この 3 バイトのシフトを手動でカウンターすることもできますが、それは洗い流すのではなく、デオドラントをトイルドにスプレーするようなものです。

Edit3: 問題を解決したのは、#include "classFile.h"callingFunctionFile.cpp ファイル内の位置を変更することでした。最初のインクルードとして一番上に配置した後、問題は消えました

4

1 に答える 1

2

ループ内で 2 回インクリメントiしているため、配列内の他のすべての要素がスキップされます。

于 2015-12-13T14:14:11.367 に答える