2012-07-05 4 views
0

이 코드는 다음과 같은 오류를 표시합니다. "암시 적으로 ArrayList [] 유형을 ArrayList [] []"로 변환 할 수 없습니다.이 행의 경우 : m_grid[gridIndexX] = new ArrayList[Height]; 어떻게 할 수 있습니까? 또 다른 방법? m_grid 배열이 2 차원 배열 일 때 작동하지만 3 차원 배열로 작동하지 않습니다. 도움을 청합니다.암시 적으로 ArrayList []를 ArrayList [] []로 변환 할 수 없습니다.

private ArrayList[][][] m_grid; 
private void initialize() { 
    Width   = 5; 
    Height   = 5; 
    Depth   = 5; 
    m_grid = new ArrayList[Width][][]; 
} 
public void Refresh(ref ArrayList particles) { 

     m_grid = null; 
     m_grid = new ArrayList[Width][][]; 

     if (particles != null) { 
      for (int i = 0; i < particles.Count; i++) { 
       FluidParticle p = (FluidParticle) particles[i]; 
       int gridIndexX = GetGridIndexX(ref p); 
       int gridIndexY = GetGridIndexY(ref p); 
       int gridIndexZ = GetGridIndexZ(ref p); 

       // Add particle to list 
       if (m_grid[gridIndexX] == null) { 
        m_grid[gridIndexX] = new ArrayList[Height]; 
       } 
       if (m_grid[gridIndexX][gridIndexY][gridIndexZ] == null) { 
        m_grid[gridIndexX][gridIndexY][gridIndexZ] = new ArrayList(); 
       } 
       m_grid[gridIndexX][gridIndexY][gridIndexZ].Add(i); 
      } 
     } 
    } 
+0

3 차원 ArrayList와 같은 것은 없습니다. 당신이 가지고있는 것은 ArrayLists의 3 차원 ** 배열입니다 ** ... – Adam

+2

아마도 하나의리스트를 가질 수있는 클래스를 정의하는 것이 좋습니다. ? – Bazzz

+0

예 실제로 그것을 의미하고 싶었습니다. @codeparkle – Ozg

답변

1

다른 인덱서를 추가해야합니다. m_grid을 3 차원 배열로 초기화했습니다. 따라서 m_grid 내의 첫 번째 레벨 요소는 2 차원 배열입니다. m_grid[gridIndexX] 유형 ArrayList[][]입니다, 위의 코드에서

m_grid[gridIndexX] = new ArrayList[Height]; 

, 그래서 당신은 형태가 일치하지가 : 그리고 당신은 1 차원 배열에 이러한 요소 중 하나를 설정하기 위해 노력하고 있습니다.

당신이 올바른 유형으로 설정해야합니다

이 혼자 문제를 해결할 경우이 코드가 실제로으로되어 있는지 식별하기 어렵 기 때문에,

m_grid[gridIndexX] = new ArrayList[Height][]; 

나도 몰라 해야 할 것. (코드의 어떤 부분이 배열의 차원인지 확실하지 않으면 이 코드가 무엇을해야하는지 알지조차 모르겠다 ...)

+0

사실이 코드는 내 것이 아니며 it.What 내가 배열 배열의 배열을 3 차원으로 변환하는 것입니다. m_grid 배열의 처음을 잡고 있었다 예를 들어 입자 (x 축 : 1, y 축 : 2)는이 입자의 인덱스가 m_grid [1] [2] 배열 목록에 있어야합니다.하지만 원하는 것은 particle (1,2, z 축 : 1)입니다. m_grid [1] [2] [1] 배열 목록에 있어야합니다. 내가 잘못하고있는 것 같아요 :) 다른 방법을 찾으려고 노력할 것입니다. – Ozg

+0

@ozg : 원시 배열 대신 사용자 정의 클래스를 사용하려고합니다. 'Particle' 클래스는 여기에서 매우 유용 할 것 같은데요.클래스의 속성으로 'Position' 구조체가있을 수 있습니다. – David

0

[]가 누락되었습니다.

m_grid[gridIndexX] = new ArrayList[Height]; 

라인 대신

m_grid[gridIndexX] = new ArrayList[Height][]; 

해야한다.

0

초기화해야합니다. 크기로는 :

ArrayList[][][] m_grid; 

m_grid = new ArrayList[100][][]; 

m_grid[0] = new ArrayList[100][]; 

m_grid[0][0] = new ArrayList[100]; 

이 코드 샘플은 다음과 같이된다는 것을 의미합니다 : 당신이 할 수있는 경우

public void Refresh(ref ArrayList particles) 
{ 

    m_grid = null; 
    m_grid = new ArrayList[Width][][]; 

    if (particles != null) 
    { 
     for (int i = 0; i < particles.Count; i++) 
     { 
      FluidParticle p = (FluidParticle)particles[i]; 
      int gridIndexX = GetGridIndexX(ref p); 
      int gridIndexY = GetGridIndexY(ref p); 
      int gridIndexZ = GetGridIndexZ(ref p); 

      // Add particle to list 
      if (m_grid[gridIndexX] == null) 
      { 
       m_grid[gridIndexX] = new ArrayList[Height][]; 
      } 
      if (m_grid[gridIndexX][gridIndexY][gridIndexZ] == null) 
      { 
       m_grid[gridIndexX][gridIndexY][gridIndexZ] = new ArrayList(); 
      } 
      m_grid[gridIndexX][gridIndexY][gridIndexZ].Add(i); 
     } 
    } 
} 

Allthough 나는 강하게 당신은 ArrayList에서 벗어나 건의 할 것입니다. 다른 주석가들이 말했듯이 List<T>과 같이 강력하고 형식화 된 제네릭 컬렉션을 사용하십시오.

관련 문제