문제

하나의 작은 2D 배열 객체에서 배열 데이터 멤버를 반환하고 배열을 더 큰 2D 어레이 객체에 삽입하려고합니다. 그러나 이것을 시도 할 때, 나는 두 가지 문제가 생겼습니다.

첫 번째 문제는 2D 배열의 이름을 반환하고 싶지만 2D 배열 이름을 반환하기 위해 구문을 올바르게하는 방법을 모르겠습니다.

이것이 내 2D 배열 데이터 멤버의 모습입니다.

private:
int pieceArray[4][4];
// 2D Smaller Array

이 배열을 함수로 반환하고 싶지만 컴파일러 오류가 발생합니다.

int Piece::returnPiece()
{
    return pieceArray; //not vaild
    // return the 2D array name
}

나는이 반환 유형을 사용하여 피곤하고 효과가 있었다.

int Piece::returnPiece()
{
    return pieceArray[4][4];
}

그러나 배열과 모든 내용을 반환하고 싶기 때문에 이것이 내가 원하는 것인지 확실하지 않습니다.

다른 문제는 insertArray () 함수이며, 여기서 returnpiece () 함수를 insertArray ()의 인수에 넣습니다.

insertArray ()의 문제는 인수입니다. 여기에 코드가 있습니다.

void Grid::InsertArray( int arr[4][4] ) //Compiler accepts, but does not work
{
    for(int i = 0; i < x_ROWS ; ++i)
    {
         for (int j = 0; j < y_COLUMNS ; ++j)
         {
             squares[i][j] = arr[i][j];
         }
    }
}

이것의 문제는 그것이 내 returnpiece ()를 허용하지 않는다는 것입니다. [4] [4]를 제거하면 컴파일러가 허용되지 않습니다.

대부분이 모든 것이 구문 오류이지만 이러한 문제를 어떻게 해결합니까?

  1. returnpiece ()에서 전체 조각을 반환
  2. insertArray ()의 인수에 대한 올바른 구문
  3. returnice ()를 수락하는 insertarray ()의 인수

이 3은 도움이 필요한 주요 문제이며 포인터 포인터 방법을 사용하려고 할 때 동일한 문제가있었습니다. 이 세 가지 문제를 해결하는 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

배열을 통과 할 때 배열 사본을 만들고 싶은지 또는 배열로 포인터를 반환할지 여부를 결정해야합니다. 반환 배열의 경우 사본을 쉽게 반환 할 수 없습니다. 포인터 (또는 C ++의 참조) 만 반환 할 수 있습니다. 예를 들어:

// Piece::returnPiece is a function taking no arguments and returning a pointer to a
// 4x4 array of integers
int (*Piece::returnPiece(void))[4][4]
{
    // return pointer to the array
    return &pieceArray;
}

사용하려면 그렇게 부릅니다.

int (*arrayPtr)[4][4] = myPiece->returnPiece();
int cell = (*arrayPtr)[i][j];  // cell now stores the contents of the (i,j)th element

유형 선언과이를 사용하는 유형의 유사성에 유의하십시오 - 괄호, Dereferencing 연산자 *, 및 괄호는 같은 장소에 있습니다.

당신의 선언 Grid::InsertArray 정확합니다 - 그것은 하나의 인수가 4x4 배열의 정수 인 인수를 가져옵니다. 이것은 콜 별 값입니다. 호출 할 때마다 4x4 어레이의 사본을 만들므로 전달 된 배열에 반영되지 않습니다. 대신 어레이에 포인터를 전달하십시오.

// InsertArray takes one argument which is a pointer to a 4x4 array of integers
void Grid::InsertArray(int (*arr)[4][4])
{
     for(int i = 0; i < x_ROWS; i++)
     {
         for(int j = 0; j < y_COLUMNS ; j++)
             squares[i][j] = (*arr)[i][j];
     }
}

다차원 배열에 대한 포인터가있는 이러한 유형의 선언은 정말 빠르게 혼란 스러울 수 있습니다. 나는 만드는 것이 좋습니다 typedef 그렇게하기 때문에 :

// Declare IntArray4x4Ptr to be a pointer to a 4x4 array of ints
typedef int (*IntArray4x4Ptr)[4][4];

그런 다음 기능을 훨씬 더 읽기 쉬운 것으로 선언 할 수 있습니다.

IntArray4x4Ptr Piece::returnPiece(void) { ... }
void Grid::InsertArray(IntArray4x4Ptr arr) { ... }

당신은 또한 사용할 수 있습니다 cdecl 복잡한 C/C ++ 유형을 해독하는 데 도움이되는 프로그램.

다른 팁

C ++의 포인터와 기준에 따라 Pass vs. Pass By Value에 대해 더 많은 것을 읽어야 할 것 같습니다.

Return Piece 메소드는 단일 셀의 값을 반환하는 것으로 정의됩니다. 색인 (예 : [4] [4])가 주어지면 해당 셀의 내용 사본을 반환하므로 변경할 수 없거나 올바르게 변경하면 사본을 변경할 수 없습니다.

누군가가 당신에게 올바른 구문을 줄 것이라고 확신하지만,이 물건을 배우는 것이 좋습니다. 그렇지 않으면 잘못된 코드를 사용할 수 있기 때문입니다.

다음은 다음과 같습니다.

class Array {
  public:

    Array() {
      for (int i = 0; i < 4; ++i)
      {
         for (int j = 0; j < 4; ++j)
         {
            (*this)(i, j) = 0;
         }
      }
    }


    int &operator()(int i, int j)
    {
      return pieceArray[i][j];
    }

  private:
    int pieceArray[4][4];
};

그런 다음 다음과 같은 작업을 수행 할 수 있습니다.

  Array x; // create 4x4 array
  x(1, 2) = 3; // modify element

문제 Adam Rosenfield 's Arrayptr 그것에 조각 :: 피스 아레 레이 당신 아래에서 바뀔 수 있습니다. (카피 바이 회의 대 카피 별 값).)

카피 바이 값은 비효율적입니다. 그러나 당신이 정말로 그것을하고 싶다면, 그냥 속임수 :

struct FOO { int  piece [4][4]; };

FOO Piece::returnPiece()
{
  FOO f;
  memcpy( f.piece, pieceArray, sizeof(pieceArray) );
  return f;
}

void Grid::InsertArray( const FOO & theFoo )
{
  // use theFoo.piece[i][j]
}

물론 더 나은 객체 지향 솔루션은 returnpiece () 생성 및 반환 a 조각 또는 정렬 물체. (처럼 후안 제안 된 ...)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top