2014-04-22 6 views
0

안녕하세요 배열에 약간의 문제가 있습니다. 나는 여러 개의 작은에 큰 배열을 공유하고, 내가 ArrayList를 배열을 더 얻을 함수에 전달할 필요가배열과 코드가 작동하지 않습니다 (arraylist의 다중 배열)

의 ArrayList에 추가하고, 여기

int frame_size = 410; 
     int frame_shift = 320; 
     ArrayList<double[]> frames = new ArrayList<double[]>(); 
     for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) { 
      double[] frame = new double[frame_size]; 
      System.arraycopy(inbuf, i, frame, 0, frame_size); 
      frames.add(frame); 
     } 

: 여기

코드입니다
int[] Cover = new int[frames.size() * nParam]; 

     for (int i = 0; i < frames.size(); i++) { 
      double[] finMc = Gos.getVek(frames.get(i)); 
      for (int c = 0; c < finMc.length; c++) { 
       int mc = (int) finMc[c]; 
       for (int m = 0; m < Cover.length; m++) { 
        Cover[m] = mc; 
       } 
      } 
     } 

이 모든 코드가 작동하지 않습니다 (

: 다음 일 처리 배열을 답을 받아 조립

배열의 모든 요소는 0입니다.

Сover[0] = 0 
Cover[1] = 0 
Cover[2] = 0 
... 

도움이 문제를하십시오 해결!)

는 업데이트

int frame_size = 410; 
     int frame_shift = 320; 
     ArrayList<double[]> frames = new ArrayList<double[]>(); 
     for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) { 
      double[] frame = new double[frame_size]; 
      System.arraycopy(inbuf, i, frame, 0, frame_size); 
      frames.add(frame); 
     } 

     int[] Cover = new int[frames.size() * nParam]; 

     for (int i = 0; i < frames.size(); i++) { 
      double[] finMc = Gos.getVek(frames.get(i)); 
      for (int c = 0; c < finMc.length; c++) { 
       int mc = (int) finMc[c]; 
       Cover[i * frames.size() + c] = (int) finMc[c]; 
      } 
     } 

코드 (

업데이트 2를 작동하지 ^) 사전에 감사합니다

double[] inbuf = new double[Size]; 
     inbuf = toDoubleArray(Gos.data); 

     inbuf[2] = 10; 
     inbuf[4] = 14; 

toDoubleArray

public static double[] toDoubleArray(byte[] byteArray) { 
    int times = Double.SIZE/Byte.SIZE; 
    double[] doubles = new double[byteArray.length/times]; 
    for (int i = 0; i < doubles.length; i++) { 
     doubles[i] = ByteBuffer.wrap(byteArray, i * times, times) 
       .getDouble(); 
    } 
    return doubles; 
} 

코드는 작동하지 :

int frame_size = 410; 
     int frame_shift = 320; 
     ArrayList<double[]> frames = new ArrayList<double[]>(); 
     for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) { 
      double[] frame = new double[frame_size]; 
      System.arraycopy(inbuf, i, frame, 0, frame_size); 
      frames.add(frame); 
     } 


     double[] Cover = new double[frames.size() * nParam]; 

     for (int i = 0; i < frames.size(); i++) { 
      double[] finMc = Gos.getVek(frames.get(i)); 
      for (int c = 0; c < finMc.length; c++) { 
       Cover[i * frames.size() + c] = finMc[c]; 
      } 
     } 
+1

이 발생하는 어떤 문제 :이 이런 식으로 쓰여 경우

그래서 합계에서, 코드는 좀 더 잘 작동 하는가? "이 코드가 모두 작동하지 않음"이란 의미는 무엇입니까? – CPerkins

+0

배열의 모든 요소를 ​​썼습니다. 커버가 없습니다. 그 이유는 arraylist가 번호에서 뽑히지 않은 이유입니다. – user3384347

+0

그럼 배열 커버를 사용해야하고 그는 여전히 0을내어 놓습니다. – user3384347

답변

0

생각의 몇 봄 즉시 마음에 :

1) for (int m = 0; m < Cover.length; m++) { Cover[m] = mc; }

이 블록은 매번 루프를 통해 0에서 m을 시작합니다. 이는 항상 Cover 배열의 같은 부분에 쓰는 것을 의미합니다. 따라서 효과적으로 저장되는 것은 마지막 프레임의 데이터뿐입니다. 당신은 아마

for(int m = i * frames.size(); m < (i+1)*frames.size(); i++) { 
    Cover[m] = mc; 
} 

를 의미하지만이 더 문제를 제기한다 - 당신은 데이터의 전체 프레임에 할당 된 전체 영역에 같은 값 ( mc)을 쓰고있어. 이런 일이 발생하지 않도록이 루프를 이전 루프와 병합하려고합니다.

for (int c = 0; c < finMc.length; c++) { 
    Cover[i * frames.size() + c] = (int)finMc[c]; 
} 

2) int mc = (int) finMc[c];

즉 라인 finMc[c]에 저장된 값을 절단 int 값에 캐스트. finMc[c]0과사이에 있으면 데이터 복사 및 캐스팅시 0이됩니다. 이는 이전 프레임 데이터가 복사되는 것을 보장하는 이전 호에 요약됩니다.이는 캐스트를 제거하고 Cover를 int 대신 double s의 배열로 선언함으로써 간단히 해결할 수 있습니다.

double[] Cover = new double[frames.size() * nParam]; 

for (int i = 0; i < frames.size(); i++) { 
    double[] finMc = Gos.getVek(frames.get(i)); 
    for (int c = 0; c < finMc.length; c++) { 
     Cover[i * frames.size() + c] = finMc[c]; 
    } 
} 
+0

고맙습니다. 많은! 하지만 코드를 잘 쓰지 않아서 대체 할 항목을 말하지 않습니까?) – user3384347

+0

문제 도메인과 더 많은 컨텍스트에 대한 추가 정보가 없으면 올바른 수정 프로그램이 무엇인지 말할 수 없습니다. 나는 내 대답에 무엇이 효과가 있을지 생각해 보겠다. 그러나 소금 한 알을 가지고 가져 가라. – acomar

+0

추가 정보를 제공 할 수 있습니다 .inbuf 배열은 길이가 - 1024.frames 길이 - 3입니다. (그 배열은) finMc = 14의 길이입니다. – user3384347

관련 문제