바쁘실텐데만 죄송한데.. ㅠㅠ

YooJaeHyo Reply 9 years 25 weeks ago
저번에 올려주신 에러코드를 보고도 왜 컴파일 에러가 뜨는지 이해가안가서요... ㅠㅠ 코드블럭으로도 실행은 잘되는데... 대체 뭐가 문제인가요.. 제가 구조체는 처음인지라..죄송합니다 ㅠㅠ
pichulia Reply 9 years 25 weeks ago
구조체 내부의 변수를 직접 초기화하는 것은 불가능합니다. 구조체는 "이런이런 변수들을 하나로 묶을 것이다" 라는것만 지정해주는건데, 거기다가 "이녀석은 값이 0이다" 라고 때려박는건 별도의 영역에서 동작하는 친구입니다. 이름만 묶어둔거랑 그 값에다가 뭘 집어넣는 "삽입 연산"이랑은 서로 다른 영역이라는건 납득이 가시나요? 이름을 묶어주는건 컴파일러가 해주는거고, 값의 삽입은 명령어를 통해 CPU가 연산하는 작업이니까요... 자 그럼 이 코드를 봅시다. struct W{ char word[10000]; int num=0; }; 물론 의도는 "W 구조체엔 word라는 녀석과 num이라는 녀석이 있는데, 그 중 num은 값을 0을 가지고 시작했으면 좋겠어" 겠네요. 하지만 컴파일러는 이 말을 이해하지 못할 수도 있습니다. "num 에 0을 넣어라" 라는 명령어를 추가로 생성해줘야하는데 이걸 못하는거죠. struct W{ char word[10000]; int num; W(){num = 0;} }; 이렇게 별도의 "생성자"라는 함수를 만들어서, 초기화할 때 어떤동작을 해달라고 CPU한테 알아들을 수 있는 명령어로 만들어줄 필요가 있습니다. 근데 저게 C에서 가능한지는 잘 모르겠네요... 제 컴퓨터에서 돌렸을 때의 에러메세지를 보면 이렇게 뜨네요 error C2864: 'W::num' : 정적 상수인 정수 계열 데이터 멤버만 클래스 내부에서 초기화될 수 있습니다. 대충 클래스 = 구조체 인데... 즉 초기화는 저 선언부에서 할 수 있는 영역이 아니라는거죠. 음...물론 어떤 컴파일러들은 저 숫자 0이 상수라는 정보를 알고있어서 초기화하는 함수를 컴파일러 스스로가 알아서 만들어주기도합니다. 그 예가 코드블럭이랑 ANSI C 컴파일러겠네요. 하지만 채점서버는 그러지 않습니다. 수정해주세요.
YooJaeHyo Reply 9 years 25 weeks ago
과연...구조체 내부자체에서 값을 초기화를 할수가 없을수도있는거였군요..! 좋은정보 감사드립니다! ㅎㅎ