코드를 아래와 같이 작성하였습니다.
그러나, 프로그램이 실행되다가 끝나지 않아
어느 부분이 잘못되었는지 피드백을 듣고 싶습니다.
1시간째 봐도 왜 제눈엔 안보일까요 ㅠ
피드백이나 조언 부탁드립니다.
----------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int m, n;
int sum = 0;
scanf("%d %d", &m, &n);
char** matrix = malloc(sizeof(char*) * m);
for (int i = 0; i < (n + 1); i++)
{
matrix[i] = malloc(sizeof(char) * (n + 1));
memset(matrix[i], 0, sizeof(char) * (n + 1));
}
for (int i = 0; i < m; i++)
{
scanf("%s", matrix[i]);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < (n + 1); j++)
{
if (matrix[i][j] == '*')
{
printf("%c", '*');
continue;
}
else {
for (int k = i - 1; k <= (i + 1); i++)
{
for (int p = j - 1; p <= (j + 1); p++)
{
if (k < 0 || p < 0)
continue;
else if (k > m || p > (n + 1))
continue;
else if (matrix[k][p] == matrix[i][j])
continue;
else
sum += matrix[k][p];
}
}
printf("%d", sum);
}
}
printf("\n");
}
for (int i = 0; i < m; i++)
{
free(matrix[i]);
}
free(matrix);
return 0;
}
UNIT 6을 학습하고, 디버거를 사용하는 게 좋습니다.
일단, 코드를 컴파일하고 입력을 넣어보고
엔터를 한 번 더 입력하면 에러가 발생하고 중단됩니다.
0만 출력하고 중단된 상태
이 상태에서도 변수의 값을 확인할 수 있습니다.
예외를 보면 "위치를 읽는 동안 액세스 위반이 발생했습니다"입니다.
Visual Studio 아래를 보면 조사식 창이 뜨는데 로컬 탭을 선택합니다.
그러면 변수의 값을 볼 수 있습니다.
m은 3인데, i는 2147483647입니다.
i 값이 이상하다는 것을 알 수 있습니다.
"변수가 최적화되어 사용할 수 없습니다."는 최적화가 실행인데...
빌드가 Release 빌드라서 그렇습니다(사용자마다 환경에 차이가 있습니다)
빌드를 Debug로 바꾸고 예제를 다시 실행합니다.
가운데 Debug로 선택을 바꿉니다.
변수 값이 제대로 나오는데,
i는 항상 214748647입니다.
프로그램 실행 시간이 오래 걸리는 것을 보면 반복문을 214748647번 반복하는 것으로 보입니다.
코드에서 중단 조건이 제대로 동작하지 않는 것으로 보입니다.
이런 건 로직을 종이와 펜으로 정리하고 코딩하는 게 좋습니다. 코드만 무조건 고쳐본다고 문제가 해결되지 않습니다.
디버그를 중단하고 디버그 메뉴에서 한 단계씩 코드 실행, F11입니다.
F11로 단계별로 실행하면서 값을 입력하고 나면
이렇게 i = 0, j = 0까지 진입하고 안쪽 루프 실행을 단계별로 볼 수 있습니다.
이런식으로 실행해보면 됩니다.
여기만 반복해서 실행하는 걸 볼 수 있습니다.
코드의 디버깅은 각자 해야 합니다.
UNIT 6에서 디버거 사용법을 익히고, 천천히 해결해보세요.
종이와 펜은 매우 강력한 도구입니다.
경우의 수를 나눠보고 모서리에 위치한 칸에서 지뢰를 찾을 때 경계를 넘지 않으려면 어떻게 해야 하는지 펜으로 정리해야 합니다.
종이와 펜이 없으면 코드에 주석이라도 제대로 달아서 보기 쉽게 해야 고치기가 쉽습니다.
F11로 계속 실행해보면 안쪽에서만 반복하고 있고, i = 2인데 k = -1입니다.
continue나 break는 중첩 루프일 때 안쪽 루프만 흐름을 제어하지 바깥쪽 루프의 흐름을 제어하지 않습니다.