2011-09-20 4 views
5

012 공간을 1 차원 배열 int boardArray [49];로 선언하고 2 차원 7x7 배열을 int boardArrayTwo [7][7]'로 선언했습니다. 중첩 된 루프를 사용하여 1 차원 배열을 던지려고합니다. 여기서 2 차원 배열은 테스트 할 때 사용하는 코드입니다.C++에서 2 차원으로 1 차원 바꾸기

for (int i = 0; i > 50; ++i) 
{ 
    boardArray[i] = i; //fills the array with ints 0 - 48 to test 
} 
for (int x = 0; x >= 7; ++x) 
{ 
    for (int k = 0; k >= 7; ++k) 
    { 
     for (int n = 0; n >= 49; ++n) 
     { 
      boardArrayTwo[x][k] = boardArray[n]; 
      cout << boardArrayTwo[x][k] << " " << endl; 
     } 

    } 
} 

나는 이것을 시험해 보았지만 아무 일도 일어나지 않았다. 내가 잘못하고 있니?

+1

스티치를 잘못에 대한 이끄는 코드를하고있다 (int n = 0, n> = 49, ++ n) 및 (int x = 0; x> = 7; ++ x)는 정확히 0 번 실행됩니다. 그래서 아무 일도 일어나지 않을 것입니다. –

답변

6
for (int x = 0; x >= 7; ++x) 
{ 
    for (int k = 0; k >= 7; ++k){ 
     for (int n = 0; n >= 49; ++n) 
    { 

이것은 잘못되었습니다. x와 k는 < 7해야한다 (3 회째를 사용할 수 없습니다) :

for (int x = 0; x < 7; ++x) 
{ 
    for (int k = 0; k < 7; ++k){ 
     boardArrayTwo[x][k] = boardArray[7*x + k]; 

편집 :

@Fabio Ceconello 같은

날 자신의 의견에 알 수 있도록, 심지어 첫 번째 루프 때문에 잘못 반전 상태를 확인, 그것은 이런 식으로 수정해야합니다 : 당신이보다 크거나 같은 사용하여 각 루프에서

for (int i = 0; i < 49; ++i) 
{ 
    boardArray[i] = i; //fills the array with ints 0 - 48 to test 
} 
+0

뿐만 아니라 루프의 모든 조건문은 논리를 거꾸로합니다. –

+0

@Fabio 당신은 무엇을 의미합니까? – Ziggy

+0

무엇이 잘못 되었나요? 나는 이의를 이해하지 못한다. 둘 다 나에게 분명히 해줄 수 있니? – Heisenbug

4

for 루프에 i > 50을 (를) 사용했습니다. i < 49이어야하며 다른 모든 루프에도 동일해야합니다.

또한 작동하지 않습니다. 당신은 boardArrayTwo[][] 모든 값을 설정하는 것은 당신이 대신 같은 것을해야 boardArray[49]합니다 : i 0으로 초기화

for (int i = 0; i > 50; ++i) 

경우

for (int x = 0; x < 7; ++x) 
{ 
    for (int k = 0; k < 7; ++k) 
    { 
     boardArrayTwo[x][k] = boardArray[7*x + k]; 
     cout << boardArrayTwo[x][k] << " " << endl; 
    } 
} 

또는

int count = 0; 

for (int x = 0; x < 7; ++x) 
{ 
    for (int k = 0; k < 7; ++k) 
    { 
     boardArrayTwo[x][k] = boardArray[count]; 
     cout << boardArrayTwo[x][k] << " " << endl; 
     count++; 
    } 
} 
+0

아 맞아. 편집 됨. – quasiverse

0

참고, 그것을 50보다 크지 않으므로 결코 루프에 들어 가지 않습니다.

0

을 (>)보다는 (<) 또는 동등보다. Fabio가 위에서 지적한 것처럼 세 번째 중첩 루프는 boardArrayTwo[x][k]을 0-49까지 반복하여 49 번 설정합니다. 산술 연산을 사용하여 x와 k를 조작하여 boardArray에 대한 인덱스가되도록하고 그 인덱스를 boardArrayTwo[x][k]에 할당해야합니다.

실제로 8 위치 인 0..7 포함을 사용하는 것도 중요합니다. 배열의 길이는 7이므로 실제로 거기에 약간의 가비지 값이 있습니다.

#include <iostream> 
using std::cout; 
using std::endl; 

int main() { 

    int boardArray[49]; 
    int boardArrayTwo[7][7]; 

for (int i = 0; i < 50; ++i) 
{ 
    boardArray[i] = i; //fills the array with ints 0 - 48 to test 
} 
for (int x = 0; x < 7; ++x) 
{ 
    for (int k = 0; k < 7; ++k) 
    { 
      boardArrayTwo[x][k] = boardArray[x*7 + k]; 
      cout << boardArrayTwo[x][k] << " " << endl; 
    } 
} 

} 

모든 행운을 빕니다 (당황하지 않는 한) 이것은 트릭을 수행해야합니다!

편집 : Fabio에게 특별 감사합니다!

+0

잘 작동하지 않습니다. 역 연산자를 사용하더라도 여전히 boardArray [49]에 모든 boardArrayTwo [x] [k] 값을 설정하고 있습니다. – quasiverse

5

루프에서 반전 된 로직 (다른 것들은 언급 했음)을 제외하고는 세 번째 내부 루프가 필요하지 않습니다. 그냥 두 번째 내부 루프에 속성을 넣어 :

boardArrayTwo[x][k] = boardArray[x * 7 + k]; 

편집 : 가 나는 또한 모든 리터럴 좋은 방법이 아닙니다 것을 언급해야한다, 내가 한 번 더 (7) 위 덧붙였다.

#define arrlen(x) (sizeof(x)/sizeof((x)[0])) 

for (int i = 0; i < arrlen(boardArray); ++i) 
{ 
    boardArray[i] = i; 
} 
int stride = arrlen(boardArrayTwo[0]); 
for (int x = 0; x < arrlen(boardArrayTwo); ++x) 
{ 
    for (int k = 0; k < stride; ++k) 
    { 
     boardArrayTwo[x][k] = boardArray[stride * x + k]; 
     cout << boardArrayTwo[x][k] << " " << endl; 
    } 
} 

주의를 : 다음과 같이 내가 코드를 다시 작성하려는 배열이 (매개 변수로 전달 된), arrlen 여기에 선언되지 않은 경우() 작동하지 않습니다. 그러나 그것은 또 다른 긴 이야기입니다 ...

+0

나는 단지 그것을 알아 차렸다! – Ziggy

+0

+1 : 정확하고 종합적인 답변 – Heisenbug

+0

안녕하세요.하지만 0 <= 7보다 중요한 것은 8 개의 값을줍니다. 그것은 그의 작은 배열에 비해 너무 많습니다! – Ziggy

1

우선 for 루프의 두 번째 용어는 for 루프가 해당 조건이 true 인 동안 실행될 것이라고 말합니다. 따라서 모든 루프에 >= 대신 <을 사용해야합니다.

두 번째로 n 이상의 루프가 추가되어 있어야하지 않습니다. 필요한 것은 xk을 거쳐 boardArray에서 boardArrayTwo으로 해당 요소를 복사하는 것입니다.

당신은 다음 중 하나를 수행 할 수 :

int n = 0; 
for (int x = 0; x < 7; ++x) 
    for (int k = 0; k < 7; ++k) 
    { 
     boardArrayTwo[x][k] = boardArray[n]; 
     ++n; 
    } 

또는 계산하는 수식을 사용하는 n 적절한 : 그것은의 행 반복되는 x 같은 것 때문에

for (int x = 0; x < 7; ++x) 
    for (int k = 0; k < 7; ++k) 
     boardArrayTwo[x][k] = boardArray[x*7+k]; 

나는 x*7+k를 썼다 배열, 각 행 7 요소를 가지고, 그 x*7+k boardArray의 번째 요소는 boardArrayTwo의 [x][k] 위치를 나타냅니다/

+0

이것은 답입니다. – Ziggy

5

목적지 배열이 행 우선 순위에있는 것처럼 보입니다. 소스 배열을 직접 제자리에 밀어 넣을 수 있습니다.

memcpy(boardArrayTwo, boardArray, 49 * sizeof(int)); 

또는 ++ 더 관용적 C에서 뭔가를 선호하는 경우 : 다른 오류가 옆에

std::copy(boardArray, boardArray + 49, reinterpret_cast<int*>(boardArrayTwo)); 
+0

+1 당신이 나에게 뭔가 가르쳐 줬기 때문에! – Ziggy

+0

나는 캐스트가 싫다. 'std :: copy (& boardArray [0], & boardArray [49], & boardArrayTwo [0] [0]), ' –

+0

@Rob도 마찬가지입니다. 나는 새로운 C++ 캐스트를 너무 많이 신경 쓰지 않는다. 코드에서 찾을 수 있으므로 컴파일러에게 오용을 일으킬 수있는 기회를 제공합니다. – Blastfurnace

0
for(int i=0; i<49; i++) 
b[i]=(i+1); 

int p=0; 
for(int i=0;i<7;i++){ 
     for(int j=0;j<7;j++) 
     {a[i][j]=b[p]; 
     p++;} 
     } 

을, 세 번째 루프는