82.10 심사문제에서 어떤 부분이 틀렸는지 도저히 모르겠습니다.
예제랑 다른상황까지 제가 테스트해보면 코드는 작동합니다..
포럼에 82.10을 검색하여 나온 내용들과, 스스로 디버깅을 해보고 이전 유닛들을 다시 복습하기도 해봤지만 틀린점을 찾지 못했습니다..
이에 틀린 부분에 관하여 질문드립니다.
아래는 제 코드입니다
문의한 코드는 삭제합니다.
*리틀엔디언으로 저장되어있지만, 메모리에 직접 접속하기에 RX로 비교하였습니다.(XR도 어차피 안되긴합니다)
(도장_ 관리자님이 수정함 - 원문 제출일: 수요일, 7 9월 2022, 11:35 오후)
가이드를 무시하면 안 됩니다.
현대 프로세서는 대부분 리틀 엔디언입니다. 'XR'로 비교해야 합니다.
디버거로 한 줄 단위로 실행해보면 'RX' 조건을 통과하지 못하니까 해당 코드는 실행되지 않습니다. 'XR'로 비교해야만 코드가 실행됩니다.
심사문제는 텍스트 일치로 판단합니다.
이렇게 공백이 있으면 통과할 수 없습니다.
결과는 잘 나오는 것을 알 수 있습니다.
공백을 지우고 심사문제를 제출하면 잘 되는 것을 알 수 있습니다.
대다수 생태계는 리틀 엔디언입니다. 애플의 M1 최신 프로세서도 리틀 엔디언입니다. 스마트폰의 ARM 프로세서도 대부분 리틀 엔디언입니다. ARM은 리틀, 빅, 둘 다 지원하지만, 대부분은 리틀 엔디언이고, 대부분의 ARM 리눅스 배포판은 리틀 엔디언만 지원합니다. ARM + 리눅스인데 빅 엔디언 모드로 꼭 써야 한다면 빅 엔디언을 지원하는 리눅스 배포판을 찾거나 리눅스 자체를 직접 빌드하거나 해야 할 겁니다. 그만큼 비주류라는 뜻입니다. PowerPC는 빅 엔디언입니다. 애플이 90년대까지는 빅 엔디언이었으나 이후엔 리틀 엔디언으로 넘어온 상태입니다. 대부분의 경우엔 신경 쓰지 않아도 문제가 생기지 않습니다.
엔디언 중립적인 코딩이 궁금하다면 IBM 문서를 참고하세요.
https://developer.ibm.com/articles/au-endianc/
ARM은 리틀, 빅 둘 다 지원하므로 엔디언에 대해서는 ARM 문서를 참고하세요.
https://developer.arm.com/documentation/den0013/d/Porting/Endianness
아무리 생각해도, 공백을 찾지 못한건 너무 꼼꼼하지 못했습니다. 이 부분은 보완해가겠습니다.
궁금한 것은 매직넘버 리틀 엔디언 비교 부분입니다.
왜 RX는 안되는 것인지 여러 방면에서 궁금합니다.
1. 저장할때 RX로 입력했기에 메모리상 순서는 XR이 되었지만,
비교할때 꺼내면 다시 RX가 되지 않는 이유는, 저장할때는 리틀 엔디언으로 저장되지만 비교할때는 메모리 순서 그대로 읽는 것이라면 왜 일관적이지 않은 것인지 궁금합니다.
(메모리를 1바이트 크기로 건드릴때는 리틀/빅엔디언이 무의미하다는 것은 인지했지만 그 외에 상황에 언제 작동하지 않는지 모르겠습니다)
2. https://dojang.io/mod/page/view.php?id=716
82.7 파일 아카이브 기능별로 나누기 유닛에서 archive.c 코드를 보면 파일이 없는 경우엔 매직 넘버를 AF로 저장하는데
파일이 있는 경우엔 FA가 아니라 또 AF로 비교합니다.
이 경우는 왜 그런 것인지 궁금합니다.
3. 사실상 2번과 동일한 질문인데, 2번 코드에서 매직넘버를 RX로, 버전을 2로 수정한 filearchive.exe를 통해서 archive.bin을 만들고 심사문제처럼 출력되는지 테스트를 해보면, XR이 아니라 RX로 비교해야 정상작동을 하였습니다(질문에 올린 코드와 동일했습니다)
이는 심사문제 테스트 환경과 server-code(visual studio), gcc 환경이라는 차이에 기인하는 것인지, 아니면 다른 이유가 있는지 궁금합니다.
늘 감사합니다.
이런 상황에서 출력하면 저장과 출력 모두 리틀엔디언\n이 출력됩니다. 하지만 심사문제에서는 이것과 다릅니다.
코드 수정하겠습니다. 결과값은 똑같습니다