동적할당된 이차원배열을 함수의 인수로 받아야 하는데
글쓴이: 익명 사용자 / 작성시간: 목, 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] 에 뭔가를 쓰려다 죽습니다.
좋은 하루 되세요!
댓글 달기