임의의 a를 입력받아 axa크기의 이미지와 같은 달팽이배열을 만드는데,
중간에 주석을 보면 알겠지만 4x4라고 가정하고 직접 적었을때에는 문제없이 되었고,
그 후 a를 입력받고 a를 통해 배열을 채우려고 시도했지만 a에 3이나 4를 넣었을때 segment fault 가 뜨네요
몇번 직접 계산해봤는데 for통한거나 직접 적는거나 차이가 없어보이는데 대체 뭐가 문제일까요
가독성올려주는 사이트썼는데 폰이라 그런지 적용해서 복붙이 안되네요;;
코드 다 올리긴하겠지만 main의 for쪽만 봐도 되지않나 싶어요
초보자라 코드 난잡해요 난잡한부분도 지적해주면 ㄱㅅㄱㅅ
알고리즘이 궁금한게아니라 segmentfault가 뜨는 이유가 궁금해요
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int void1 = 0;
int void2 = 0;
int *pn1 = &void1;
int *pn2 = &void2;
int checkarr(int length, int (*arr1)[length])
{
int num1 = 1;
for (int n1 = 0; n1 < length; n1++)
{
for (int n2 = 0; n2 < length; n2++)
{
num1 *= (arr1[n1][n2]);
}
}
return num1;
}
void voidarr(int length, int (*arr1)[length])
{
for (int n1 = 0; n1 < length; n1++)
{
for (int n2 = 0; n2 < length; n2++)
{
arr1[n1][n2] = 0;
}
}
}
void printfarr(int length, int (*arr1)[length])
{
for (int n1 = 0; n1 < length; n1++)
{
for (int n2 = 0; n2 < length; n2++)
{
printf("%3d", arr1[n1][n2]);
}
printf("\n");
}
}
void _arr(int length, int (*arr1)[length], int n1, int n2, int n3, int *pn3, int n4)
{
if (n4 == 0)
{
{
do
{
if (arr1[n1][n2] == 0)
{
arr1[n1][n2] = n3;
n3++;
n2++;
}
else
break;
} while (!((n2 == 0) || (n2 == length)));
}
*pn2 = n2 - 1;
}
else
{
do
{
if (arr1[n1][n2] == 0)
{
arr1[n1][n2] = n3;
n3++;
n2--;
}
else
{
break;
}
} while (!((n2 == -1) || (n2 == length)));
*pn2 = n2 + 1;
}
*pn1 = n1;
*pn3 = n3;
}
int larr(int length, int (*arr1)[length], int n1, int n2, int n3, int *pn3, int n4)
{
if (n4 == 0)
{
{
do
{
if (arr1[n1][n2] == 0)
{
arr1[n1][n2] = n3;
n3++;
n1++;
}
else
{
break;
}
} while (!((n1 == 0) || (n1 == length)));
*pn1 = n1 - 1;
}
}
else
{
do
{
if (arr1[n1][n2] == 0)
{
arr1[n1][n2] = n3;
n3++;
n1--;
}
else
{
break;
}
} while (!((n1 == -1) || (n1 == length)));
*pn1 = n1 + 1;
}
*pn2 = n2;
*pn3 = n3;
}
int main(int argc, char *argv[])
{
int x = 1;
int a = 0;
int b = 1;
int *pb = &b;
scanf("%d", &a);
int arr1[a][a];
voidarr(a, arr1);
// if44
//_arr(4, arr1, *pn1, *pn2, b, pb, 0);
// larr(4, arr1, *pn1 + 1, *pn2, b, pb, 0);
//_arr(4, arr1, *pn1, *pn2 - 1, b, pb, 1);
//larr(4, arr1, *pn1 - 1, *pn2, b, pb, 1);
//_arr(4, arr1, *pn1, *pn2 + 1, b, pb, 0);
//larr(4, arr1, *pn1 + 1, *pn2, b, pb, 0);
//_arr(4, arr1, *pn1, *pn2 - 1, b, pb, 1);
for (; !(checkarr(a, arr1)); x++)
{
if(x==1)
{
_arr(a, arr1, *pn1, *pn2, b, pb, 0);
larr(a, arr1, *pn1 + 1, *pn2, b, pb, 0);
}
else if ((x % 2) == 0)
{
_arr(a, arr1, *pn1, *pn2 - 1, b, pb, 1);
larr(a, arr1, *pn1 - 1, *pn2, b, pb, 1);
}
else if ((x % 2) == 1)
{
_arr(a, arr1, *pn1, *pn2 - 1, b, pb, 0);
larr(a, arr1, *pn1 - 1, *pn2, b, pb, 0);
}
}
printfarr(a, arr1);
return 0;
}
for 주석 해제 직접적은거 주석
for주석 직접적은거 주석 해제
- dc official App
메인함수에서 컴파일했을때 모든 함수 오류나는데 ?
void _arr(int length, *arr1, int n1, int n2, int n3, int *pn3, int n4) no matching function for call to '_arr'gcc
??? 주석된 부분 풀고 for쪽 주석걸어서 실행해보심?? 함수 자체는 별문제없었는데 - dc App
뭐 때문인지 모르겠네,,, 방금 그냥 컴파일러에서 바로 복붙해서 붙였으니 한번만 더 확인좀 - dc App
문제 원본이 뭐임 ? 어디꺼냐
열혈c 챕터20 달팽이배열 - dc App
코드 보니까 시간 좀 쓴거같은데 그냥 구글에 답 보고 알고리즘 이해해라
굳이 이렇게 길게 쓸 문제가 아닌듯
알고리즘이야 아는데 오류 떠서 그러지 이유도 모르겠고 답답함 - dc App
segment fault뜨는곳읖 모르겠음 - dc App
메모리공간이 없는 부분에서 값을 빼오려고 하니까 저게 뜨지
저런건 대부분 배열인덱스 오류임
배열 크기 선언은 입력만큼 할 필요도 없음 arr1[50][[50] 이런식으로도 바꿔보셈
https://m.dcinside.com/board/programming/2335074
고쳤는데
봐줘잉 - dc App