기사의 투어 문제에 대해 작업 중이며 클래스를 정의하고 싶지만 사용자가 정의한 배열을 초기화하는 데 문제가 있습니다. 따라서 명령 줄의 사용자 입력 argvs
은 체스 판 길이 mX 및 nY입니다. 및 시작 위치 (x, y). 기본적으로 사용자가 정의한 배열을 어떻게 초기화합니까?
첫 번째 질문 : public
부분적으로 선언하는 것이 옳 int ** tour
습니까?
두 번째 질문 : tour
동일한 클래스의 다음 함수에서 배열을 어떻게 참조 합니까?
세 번째 질문 : 에서 사용자가 지정한 차원 배열을 초기화하도록 main
호출 K.knight
했지만 초기화되지 않았습니다. main
함수 를 사용하여 배열을 초기화 K.knigt()
하고 다음 함수에서 배열을 사용할 수있는 방법은 K.knightfunc()
무엇입니까?
class Ktour{
public:
int xSize; //m
int ySize; //n
int ** tour; //array to be initialized
int solutionsCount; //tracking solutions
int position; //position count, from 0 to m * n -1
// initialize tour matrix
void knight(int M, int N) {
position = 1;
solutionsCount = 0;
xSize = M;
ySize = N;
tour = new int * [xSize];
for (int i = 0; i < xSize; i++) {
for (int j = 0; j < ySize; j++) {
tour[i][j] = 0;
std::cout << tour[i][j] << std::endl;
}
}
}
....some other functions defined in between...
....
....
};
...
// main
int main(int argc, char *argv[])
{
Ktour K;
//user inputs chessboard length mX and nY; and a starting position(x,y)
int mX = atoi(argv[1]);
int nY = atoi(argv[2]);
int x = atoi(argv[3]);
int y = atoi(argv[4]);
//initialization
K.knight(mX, nY);
//run the recursive function;
K.knightFunc(x,y);
return 0;
}
예, ctor에서 초기화하는 것이 더 논리적으로 보입니다. 내 생각은 int 포인터 배열을 만들고 아직 가리키는 int를 할당하지 않았다는 것입니다.
몇 가지 가능성이 있습니다.
일반적인 체스 판을 생각한다면 배열 크기가 미리 알려져 있고 특별히 크지 않기 때문에 클래스에서 생성하면됩니다.
class Ktour{
...
int tour[8][8];
...
}
일부 순수 주의자들은 그러한 어레이를 "새로"만 사용해야한다고 말할 수 있습니다. 훨씬 더 큰 배열이라면 확실히해야합니다.
알 수없는 크기의 배열을 처리하기 위해 수행하려는 작업과 같은보다 간단한 구문은 다음과 같습니다.
class Ktour{
...
int **tour=0;
KTour(int M, int N) {
tour = new int * [M];
for (int i=0; i<M; ++i)
tour[i] = new int [N];
};
~KTour() {
for (int i=0; i<M; ++i)
delete [] tour[i];
delete [] tour;
};
...
}
다음과 같이 아주 간단하게 액세스 할 수 있습니다.
std::cout << tour[i][j];
위의 코딩 유형은 오류가 발생하기 쉽습니다. 메모리 액세스 오류로 인한 향후 갈등을 줄이려면 실제로 STL 컨테이너 클래스 (또는 Qt를 사용할 때 Boost 클래스 또는 Qt 크기가 너무 제한되지 않은 경우 Qt에서 사용할 수 있지만 Qt에서도 사용할 수 있음)를 사용해야합니다. 예를 들어 중요한 포인터를 덮어 쓰는 대신 배열의 경계를 벗어난 첨자에 액세스 할 때 디버그에서 오류가 발생합니다. 따라서 다음과 같은 것을 사용할 수 있습니다.
class Ktour{ ... std::vector < std::vector<int> > Tour;
KTour(int M, int N) {
// tour.resize(M); // not needed.
tour.assign(M, std::vector <int> (N, 0));
};
~KTour() {
// No need to delete
};
...
}
그리고 당신은
std::cout << tour[i][j];
(참고 : 코드의 추가 줄은 <pre> 및 <code> 태그의 일부 아티팩트입니다. 들여 쓰기 된 모든 줄이 코드로 인식되지 않기 때문에 필요합니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다