2013-06-17 1 views
0

Я работаю над программой на C#, которая должна копировать элементы рандомизированного массива 10 * 12 2D на 1D-массиве. Кажется, все работает нормально. Однако некоторые элементы 2D-массива (последние 18) не будут копироваться в 1D-массив.Некоторые значения в 1D Массив не отображается

Вот код:

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

namespace James_Archbold_A1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      int row = 10; 
      int column = 12; 

      int[,] twoDArray = new int[row, column]; 
      int[] oneDArray = new int[row*column]; 

      FillTwoDimArray(twoDArray); 
      DisplayTwoDimArray(twoDArray); 
      StoreValues(twoDArray, oneDArray); 
      DisplayOneDimArray(oneDArray); 
      Console.ReadLine(); 

     } 

     static void FillTwoDimArray(int[,] table) 
     { 
      int min = 0; 
      int max = 100; 
      int rndNumber; 
      Random rnd = new Random(); 
      for (int row = 0; row < table.GetLength(0); row++) //use GetLength(0) to get the size of the row 
      { 
       for (int col = 0; col < table.GetLength(1); col++) //use GetLength(1) to get the size of the column 
       { 
        rndNumber = rnd.Next(min,max); 
        table[row, col] = rndNumber; 
       } 
      } 
     } 

     static void DisplayTwoDimArray(int[,] table) 
     { 
      for (int row = 0; row < table.GetLength(0); row++) 
      { 
       for (int col = 0; col < table.GetLength(1); col++) 
       { 
        Console.Write("{0}\t", table[row, col]); 
       } 
      } 
      Console.WriteLine(); 
     } 

     static void StoreValues(int[,] twoDArray, int[] oneDArray) 
     { 
      int rowSize = twoDArray.GetLength(0); 
      int colSize = twoDArray.GetLength(1); 
      for (int row = 0; row < rowSize; row++) 
      { 
       for (int col = 0; col < colSize; col++) 
       { 
        int element; 
        element = twoDArray[row, col]; 
        oneDArray[row * rowSize + col] = element; 
       } 
      } 

     } 

     static void DisplayOneDimArray(int[] oneDArray) 
     { 
      for (int i = 0; i < oneDArray.GetLength(0); i++) 
      { 
       Console.Write("{0}\t", oneDArray[i]); 
      } 
      Console.WriteLine(); 

     } 




    } 
} 

ответ

4

Если у вас есть массив 2x5, ваш rowSize является 2, и ваш colSize 5. Тогда ваш цикл установки значения в массив в [row * rowSize + col]. Первые несколько значений этого будут:

0*2+0 = 0 
0*2+1 = 1 
0*2+2 = 2 
0*2+3 = 3 
0*2+4 = 4 
1*2+0 = 2 
1*2+1 = 3 
1*2+2 = 4 
1*2+3 = 5 

Так вы цикл над теми же значениями, устанавливая их несколько раз, а также не устанавливать последние значения в массиве. Если у вас больше строк, чем столбцов, я предполагаю, что вы получите исключение из-за пределов?

Если вы изменили row * rowSize + col на правильное отображение row * colSize + col, оно должно работать.

+0

Большое вам спасибо :) – Jameslat

0

Попробуйте следующий код, чтобы скопировать 1D:

void StoreValues(int[,] twoDArray, int[] oneDArray) 
{ 
    int rowSize = twoDArray.GetLength(0); 
    int colSize = twoDArray.GetLength(1); 
    var total=rowSize*colSize;//TOTAL ITEMS IN 1D ARRAY 
    for (int row = 0, d=0; row < rowSize; row++) 
    { 
     for (int col = 0; col < colSize; col++) 
     { 
      //STORE AT POSITION d 
      oneDArray[d++] = twoDArray[row, col]; 
     } 
    } 
} 

использованием row * rowSize + col вызовет проблемы, как описано в this answer.

Смежные вопросы