2016-09-23 6 views
0

に値を転送することはできません:は私が名前の最初のクラスを持っている別のクラス(C#の)

  Appartments[] appartments; 

私は「数」の値をコピーして、「AppartmentInfo.cs」クラスにそれを貼り付ける(私は彼らを推測パラメータと呼ばれます)。

 public static void FindFloor(Appartments[] appartments, int amount,out int floorToRound,out AppartmentInfo[] AInfo) 
    { 
     floorToRound = 0; 
     AInfo = new AppartmentInfo[Max]; 
     for (int i = 0; i < amount; i++) 
     { 
      AInfo[i].Floor1 = Convert.ToDouble(appartments[i].Number); 
      Console.WriteLine(appartments[i].Number); 
      if (appartments[i].Number < 27) 
      { 
       appartments[i].Number = 1; 
      } 
      else 
      { 

       appartments[i].Number /= 27; 
      } 
     } 
    } 

必要な場合は、コード全体を投稿することができます。エラーが発生する: NullReferenceExceptionが処理されませんでした。ライン上の

エラー:

AInfo[i].Floor1 = Convert.ToDouble(appartments[i].Number); 

FULL CODE:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 

namespace P3._1 
{ 
class Program 
{ 
    public const int Max = 20; 
    static void Main(string[] args) 
    { 
     int amount, AmountOfRooms, price, floor, floorToRound; 
     Appartments[] appartments; 
     AppartmentInfo[] AInfo; 
     //AppartmentInfo AInfo = new AppartmentInfo(); 
     ReadData(out appartments, out amount); 
     TextImput(out floor, out AmountOfRooms, out price); 
     FindFloor(appartments, amount,out floorToRound,out AInfo); 
     Console.ReadKey(); 
    } 
    public static void ReadData(out Appartments[] appartments, out int amount) 
    { 
     amount = 0; 
     appartments = new Appartments[Max]; 
     using (StreamReader reader = new StreamReader("C:\\Users\\Andrius\\Desktop\\Mokslams\\C#\\Pratybos\\P3\\P3.1 be konstruktoriaus\\Appartments.csv", true)) 
     { 
      reader.ReadLine(); 
      string line = null; 
      while (null != (line = reader.ReadLine())) 
      { 
       string[] values = line.Split(','); 
       int number = int.Parse(values[0]); 
       int area = int.Parse(values[1]); 
       int rooms = int.Parse(values[2]); 
       int sellingCost = int.Parse(values[3]); 
       int phone = int.Parse(values[4]); 

       Appartments appartmentsObj = new Appartments(number, area, rooms, sellingCost, phone); 
       appartments[amount++] = appartmentsObj; 
      } 
     } 
    } 

    public static void TextImput(out int floor, out int AmountOfRooms, out int price) 
    { 
     AmountOfRooms = 0; 
     price = 0; 
     Console.WriteLine("Iveskite buto aukštą: "); 
     floor = int.Parse(Console.ReadLine()); 
     Console.WriteLine("Iveskite kambariu skaiciu: "); 
     AmountOfRooms = int.Parse(Console.ReadLine()); 
     Console.WriteLine("Maksimali kaina: "); 
     price = int.Parse(Console.ReadLine()); 


    } 

    public static void FindFloor(Appartments[] appartments, int amount,out int floorToRound,out AppartmentInfo[] AInfo) 
    { 
     floorToRound = 0; 
     AInfo = new AppartmentInfo[Max]; 
     for (int i = 0; i < amount; i++) 
     { 
      AInfo[i].Floor1 = Convert.ToDouble(appartments[i].Number); 
      Console.WriteLine(appartments[i].Number); 
      if (appartments[i].Number < 27) 
      { 
       appartments[i].Number = 1; 
      } 
      else 
      { 

       appartments[i].Number /= 27; 
      } 
     } 
    } 




} 

}

答えて

0

あなたがゼロから量へのループ繰り返し処理のために - 1は、その後、ルックアップしようとしますそのインデックスのAppartments配列の配列エントリ。

amountフィールドに渡された値がapartments配列のサイズよりも大きい可能性があります。

マンションの配列がどのようなものか、量のパラメータにどのような値が入っているかを知らなくても、言うのは難しいです。

+0

を、量が境界を通過したことがありません。私はちょうど完全なコードをアップロードしました – Andrius

+0

forループの最初の反復で失敗しますか? – Banners

+0

私はBensの答えと同じ考え方に従っていたので、私は尋ねます。彼は正しい。あなたの配列は初期化されていますが、その中の要素は初期化されていません。 – Banners

1

あなたはAInfo[i].Floor1プロパティにアクセスしようとしているが、AppartmentInfoがクラスである場合、その後、あなたのAInfo配列の各要素はnullになります。最初AppartmentInfoオブジェクトを作成する必要があります:

for (int i = 0; i < amount; i++) 
    { 
     AInfo[i] = new AppartmentInfo 
     { 
      Floor1 = Convert.ToDouble(appartments[i].Number) 
     }; 

編集/更新:構文実証するためのコンプリート/コンパイルプログラム:私のビューから

public class Program 
{  
    public static void Main() 
    { 
     var meow = new Foo[3]; 

     for (int i = 0; i < 3; ++i) 
     { 
      meow[i] = new Foo 
      { 
       Bar = Convert.ToDouble("3.141"), 
       Blah = "Another Test", 
      };    

      if (i < 2) 
      { 
       meow[i].Buzz = 3; 
      } 
     } 
    } 

    class Foo 
    { 
     public double Bar { get; set; } 
     public string Blah { get; set; } 
     public int Buzz { get; set; } 
    } 
}  
+0

どうもありがとうございます。もう1つ質問があります。 AppartmentInfoオブジェクトを作成する簡単な方法はありますか?たとえば、私は "Floor1"だけでなく "Rooms"、 "Price"など多くのものを転送する必要があります。転送するものとそうでないものを確認する必要があるため、IFを使用する必要があります – Andrius

+0

@Andrius '{}'の中に複数のプロパティを設定するには、カンマ '、'を使って各プロパティを区切ります。 'if'チェックが必要な場合は、オブジェクトを作成した後でもプロパティを設定できます。 –

関連する問題