2014-10-28 2 views
0

저는 전에 Java를 배운 테스트를 위해 C++을 배웠습니다. 이제는 많은 혼란이 있습니다. 부울 값의 2D 배열을 인쇄하려고하는데, #이 참이면? false 인 경우. 내가 생각하는 배열을 먼저 초기화 해봤는데, iterator (printGrid)를 사용하지 않으면 특정 배열 위치의 값을 인쇄 할 수있다. 아래는 내 코드입니다C++에서 2D 배열을 반복 처리하지 못했습니다.

#include<iostream> 

void printGrid(bool a[][10]){ // why this method doesn't work? 

    for(int i = 0; i < sizeof(a)/ (sizeof(*a)) ; i++){ 
     for(int j = 0; j < sizeof(a)/ (sizeof(*a)) ; j++) { 
      char x = a[i][j] ? '#' : '?'; // i've using the conditional in my std::cout before, still doesn't work 
      std::cout << x; 

     } 
     std::cout<< std::endl; 
    } 

    } 
void main(){ 
    bool grid[10][10]; 
     for(int i = 0; i < sizeof(grid)/sizeof(*grid) ; i++){ 
     for(int j = 0; j < sizeof(grid)/sizeof(*grid); j++){ 

      grid[i][j] = 1; 
     } 

    } 
    printGrid(grid); // this doesn't work 
    std::cout<<((grid[0][1]) ? "#" : "?") << std::endl; // this works fine 
    getchar(); 

} // main 

어디에서 printGrid를 잘못 가져 왔습니까? 나는 main 대신에 똑같은 설정으로 INT의 2D 배열을 사용하려고 시도했다. 어떤 생각?

편집 : 답장을 보내 주셔서 감사합니다. 내 질문에 대한 답변이 없지만 내 기능에 어떤 문제가 있습니까? 나는 같은 설치, 단지 서로 다른 매개 변수를 사용하는 방법을 사용하여 시도했습니다, 그리고 내가 INT의 제 2 차원 배열을 인쇄 할 printint를 사용할 때, 그냥 괜찮 았는데

void printint(int a[][10]){ // why does this work, and the above doesn't? 
for(int i = 0; i < 10 ; i++){ 
     for(int j = 0; j < 10 ; j++) { 

      std::cout <<((a[i][j] == 10) ? "a" : "b"); 

     } 
     std::cout << std::endl; 
    } 
} 

잘 작동하기 때문에?

+1

배열 크기를 전달하거나 컨테이너 클래스를 사용합니다. – crashmstr

+0

@ 2501 내가 무슨 뜻인지 모르겠다. 위에서 언급했듯이, 2D 정수를 사용하여 같은 방법을 시도해 보았다.이 방법은 2D 배열을 잘 인쇄 할 것이다. – Rei

+0

@crashmstr 네 말 뜻은. 내 코드에서 잘못된 점을 지적 해 주시겠습니까? – Rei

답변

2

bool a[][10]은 실제로 bool (*a)[10]이므로 sizeof (a)은 포인터의 크기입니다. 참조로

패스 어레이 :

void printGrid(const bool (&a)[10][10]) 

Live example

std::array<std::array<bool, 10u>, 10u> 사용이보다 직관적 인 인터페이스를 갖는다.

+0

참조 배열이 해당 코드에서 불법임을 말하는 오류가 있습니다. 나는 int [] [10] 매개 변수 btw를 사용하여 같은 메소드를 작성해 보았습니다. 부울 매개 변수가있는 내 printGrid 메서드에서만 사용합니다. – Rei

+0

@Rei : 작업 코드에 대한 링크를 제공했습니다. 나는 당신이 배열에 대한 참조를 위해 괄호를 놓쳤다 고 생각한다. – Jarod42

+0

@Rei 어떤 컴파일러를 사용하고 있습니까? 그것은 나를 위해 잘 작동합니다. (Jarod의 독자가 http://ideone.com/WN6LfU) – Baldrickk

0

여기서 포인터는 포인터로 변환 된 함수에 배열을 전달하므로 포인터 크기 만 얻을 수 있습니다.

패싱 형식에서 부적절한 배열을 요구할 때, 즉 해당 매개 변수가 포인터로 선언 된 경우 (이 경우) 배열을 기억하십시오. 매개 변수가 배열에 대한 참조로 선언 된 경우 부패가 발생하지 않습니다.

관련 문제