동적할당된 이차원배열을 함수의 인수로 받아야 하는데
글쓴이: 익명 사용자 / 작성시간: 목, 2018/10/11 - 8:51오후
1 #include <iostream> 2 #include <algorithm> 6 8 using namespace std; 9 2 3 void magic(int n, int** arr) 4 { 5 6 int num = 1; 7 int i = 0; 8 int j = (n / 2) + 1; 9 arr[i][j] = num; 10 num++; 11 while (num <= n * n) 12 { 13 if ( (num - 1) % n == 0) 14 { 15 i++; 16 arr[i][j] = num; 17 num++; 18 } 19 else 20 { 21 if (i - 1 < 1) 22 { 23 i = n; 24 j++; 25 arr[i][j] = num; 26 num++; 27 } 28 else if (j + 1 > n) 29 { 30 i--; 31 j = 1; 32 arr[i][j] = num; 33 num++; 34 } 35 else 36 { 37 i--; 38 j++; 39 arr[i][j] = num; 40 num++; 41 } 42 } 43 } 44 } 10 int main(int argc, char *argv[]) 11 { 12 int a = atoi(argv[1]); 13 if( a % 2 != 1 && a < 3) 14 { 15 return 0; 16 } 17 int** arr = new int* [a]; 18 for(int i = 0; i < a; i++) 19 { 20 arr[i] = new int[a]; 21 } 22 magic(a, arr); 23 for(int i = 0; i < a; i++) 24 { 25 for(int j = 0; j < a; j++) 26 { 27 cout << arr[i][j]; 28 } 29 cout << endl; 30 } 31 32 for(int i = 0; i < a; ++i) 33 { 34 delete[] arr[i]; 35 } 36 delete[] arr; 37 return 0; 38 }
홀수 마방진 인데요
실행은 되고 리눅스 터미널에선 세그멘테이션 폴트를 뱉네요
우선 이차원 배열을 이렇게 동적할당 해도 되나요...? 그리고 인수로 저렇게 받아도 되나요?
Forums:
어떻게든 할 방법이 있기는 있는데 저라면 그냥
어떻게든 할 방법이 있기는 있는데 저라면 그냥
vector<vector<int>>
쓸 겁니다.C-style 배열은 지역변수로 만들어서 지역 안에서만 갖고 놀 때나 편하지 이리저리 전달해 주기 번거로워요.
2차원 배열이면 세 배는 더 번거롭지요.
소스 코드 올릴 때 행 번호는 넣지 마세요.
소스 코드 올릴 때 행 번호는 넣지 마세요.
그래야 다른 분들이 그 소스로 컴파일 실행 테스트 하기 좋죠.
컴파일은 되는데 실행시 에러나면, 컴파일 할 때 아래와 같이 해서 Error 뿐 아니라 Warning도 잘 보세요.
세벌 https://sebuls.blogspot.kr/
인자 전달은 문제가 없는데, 예를 들어 명령행 인자가
인자 전달은 문제가 없는데, 예를 들어 명령행 인자가 3이라면 만들어진 이차원 배열(사실 이건 이차원 배열이 아니고 일차원 배열들 여러 개를 만들고 그것들의 첫 원소들을 가리키는 배열을 쓰는 거지만)의 행과 열의 인덱스는 0부터 2사이여야 하는데, 당장 num = 2에서 arr[3][3] 에 뭔가를 쓰려다 죽습니다.
좋은 하루 되세요!
댓글 달기