2016-10-28 17 views
-1

クラス外からSetData()メソッドを呼び出すときに0xD0ではなくインデックス0でバイト0x00が返されるのはなぜですか?ByteArrayの同じ要素の値が異なりますか?

は、ここでは、クラスのダウン短縮ます:

using System; 

namespace StackOverflow 
{ 
    class SaveBlock 
    { 
     const short SECTIONS = 14, SECTION_SIZE = 4096; 

     public Section[] sections = new Section[SECTIONS]; 

     public SaveBlock(byte[] blockData) { 
      byte[] sectionData = new byte[SECTION_SIZE]; 
      for (int i = 0; i < SECTIONS; i++) { 
       Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE); 
       sections[i] = new Section(sectionData); 
      } 
     } 

     public void SetForAll() { 
      foreach (Section sect in sections) 
       sect.SetData(); 
     } 
    } 
} 

そして私はのために別のバイトを取得します。セクションのコンストラクタではなく、このような外部ソースから呼び出された場合

using System; 

namespace StackOverflow 
{ 
    class Section 
    {  
     uint _sectionId; 
     byte[] _sectionData; 

     public Section(byte[] sectionData) { 
      _sectionData = sectionData; 
      _sectionId = GetUShort(0x0FF4); 
      Console.WriteLine(_sectionId + ": " + _sectionData[0].ToString("X")); // Gives D0 
     } 

     public void SetData() { 
      switch (_sectionId) { 
       case 0: SetTrainerInfo(); break; 
       default: break; 
      } 
     } 

     void SetTrainerInfo() { 
      Console.WriteLine(_sectionId + ": " + _sectionData[0].ToString("X")); // Can Give 0 

      byte[] deByte = GetBytes(0x00, 7); 

      TrainerInfo.playerName = PkmString.GetString(deByte); 
      Console.WriteLine(TrainerInfo.playerName + "name here"); 
     } 
    } 
} 

は罰金作品同じ要素: Same byte is different

+0

ここにあなたのコードを貼り付けない理由は何ですか? –

+0

@ L.Bコードは、私の経験、特にUnity Answersのようなサイトでフォーマットが悪くなる傾向があります。 – Vyra

+0

そして私の編集後に今思うことは? OK?。あなたのたわごとを投稿し続けるだけです。私はそれを編集することができます:) –

答えて

1

このコードをSaveBlockコンストラクタからご覧ください。

byte[] sectionData = new byte[SECTION_SIZE]; 
for (int i = 0; i < SECTIONS; i++) { 
    Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE); 
    sections[i] = new Section(sectionData); 
} 

ループsectionDataアレイにコピーblockDataバイトをし、新しいSectionオブジェクトのインスタンスを作成するsectionData使用。ここで物事が厄介になるところです... 配列は参照型です。それはあなたのSectionコンストラクタに次の行のみが配列への参照をコピーしている意味:

_sectionData = sectionData; 

あなたがループを通って移動すると、あなたは何度も同じ配列インスタンスにデータをコピーし、その割り当てます同じ配列インスタンスをいくつかのオブジェクトの内部データに置き換えます。これらのオブジェクトはすべて同じ配列インスタンスを共有しています! _sectionIdが非0に初期化プライベートに定義示されるように、唯一の問題ではないかもしれない

byte[] sectionData; 
for (int i = 0; i < SECTIONS; i++) { 
    sectionData = new byte[SECTION_SIZE]; 
    Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE); 
    sections[i] = new Section(sectionData); 
} 

:それはあなたがそれらのオブジェクトのそれぞれについて、新しい配列を望む可能性が高いです。私たちが見ることができるコード、_sectionIdがこれまで0なること方法はありません、そしてSetTrainerInfo()がこれまでと呼ばれていることをこれは決してから

public void SetData() { 
    switch (_sectionId) { 
     case 0: SetTrainerInfo(); break; 
     default: break; 
    } 
} 

SetData()方法は次のようになります。

+0

ええ、私はおそらく、初期化フィールドに入っていたので、ちょっとだけ取り除いてしまいました。しかし、あなたの答えは私の問題に論理を解決しました、ありがとう:D – Vyra

関連する問題