Taking baby-developer steps

2022.04.08. push_swap 파싱부 구현 -3 arr4i에 입력값을 오름차순으로 정렬하면서 넣기 -1 본문

Logs/학습 log

2022.04.08. push_swap 파싱부 구현 -3 arr4i에 입력값을 오름차순으로 정렬하면서 넣기 -1

Surin Lee 2022. 4. 8. 17:19

이번 과제에서 중요한 요인은 "명령을 내리는 횟수를 최소화" 하는 것이기 때문에 시간 복잡도는 문제가 되지 않는다고 판단했다. 따라서 indexing을 하는 arr4i에 입력 값을 하나씩, atoi로 int로 변환 한 후, arr4i에서 버블 정렬 처럼 정렬해주면서 오름차순으로 정렬하며 넣었다.(각 입력값의 index를 얻는 것이 목적이므로) 현재 arr4i[k]값과 sort4i 사이에, 스택으로 쓸 리스트 구조체에 arr4i[k]값을 입력값의 순서대로 저장하는 부분이 들어가면 좋을 것 같다.(+코드를 작성하는 와중에 쓴 로그라, k++ 구문이 빠져있다.)

+ 첫번째 사진 내 ft_atoi 함수 내에서 int의 max 혹은 min 값을 넘어 가는 값이 input으로 들어온 경우 print_error()함수를 호출해주면 좋을 것 같다.

+ sort4i에서 길이를 넘겨줄 이유가 없어서, 인자를 두개만 넘겨주는 것으로 수정했다.

ft_atoi에서 ft_strchr 리턴값을 받는 와중에 sigfault가 발생하는 것을 확인했고, 그 결과, 인풋 값에 ' '(space) 없이 들어오는 경우를 따로 생각해주지 않아 substr 함수에 넘겨준 값이 의도하지 않은 값으로 넘어서 일어난 오류 였다.  1. "들어온 input str에 ' '가 포함 되지 않은 경우"와 2." ' '(space)가 들어왔지만 가장 마지막 부분이 \0터미네이트로 끝나는 경우"를 고려해 if 문을 추가했고, 향후 리팩토링을 통해 더 가독성 좋게, 간결하게 수정할 예정이다.

 

** printf()문을 중간에 넣으니 segmentation fault(sigfault)가 해결되는 건에 대하여

버블 정렬로 arr4i를 오름차순 정렬하는 sort4i를 호출할 때 segmentation fault가 발생해서 좀더 들여다 보려고 디버깅을 위해 printf()를 호출해서 컴파일만 했더니(디버거를 사용해야하지만.. printf가 편한걸..ㅎㅎㅎ) 결과값이 제대로 나오는 기 현상이 발생한다. 어떤 이유인지 아직은 알 수 없으나 이상한 현상이고 바로 잡아야함이 자명하다.

=> 이런 오류가 왜 나는지를 알수가 없다.

일단은 sort4i() 호출한 경우에서도, 나중에 들어온 입력값이 앞의 입력값보다도 작아서 자리를 바꾸는 swap()함수를 호출하면 segfault가 나고 있는데, swap()함수 호출 전에 아무 printf()문(심지어 인자를 사용하지 않는 파라미터가 하나 뿐인 단순 출력문 조차)을 호출 하기만 하면 의도한대로 결과 값을 내 놓는다. printf()문을 호출 해봤자 일어나는 일은 입력 버퍼가 비워지는것 말곤 없을텐데..! 뭔가 printf()을 호출하면서 컴파일러가 어셈블리어로 변환할때 printf()문을 호출하지 않을 때와는 다르게 변환을 하는게 아닐까 하고 일단 추측만 해볼 뿐이다.

 

이건 정말 왜 이러는 걸까....

 

Comments