2014-09-24 5 views
1

나는 게임을 만들고 있어요, 내 프로그램의 현재 구조는 외부 입력, 헤더, 전역 변수

prog structure

난 데 문제는 내가하는 기능을 가지고있다 ... 다음과 같다 init_game.c에서 필요한 데이터로 플레이어 보드를 초기화하면이 초기화 된 보드가 있으면 the_game.c이 초기화 된 보드 (init_game.c)를 사용해야합니다.

은 내가이 extern의 작업을 얻을 것입니다 방법에 대한 혼란 스러워요

편집 : 명확한 설명 - 나는 나를 사용할 수 있도록 내 프로그램 구조와 extern 키워드를 사용하는 방법을 궁금하네요 파일 the_game.c

추가 내 문제에 대한 설명은 아래 그림에서 (파일 init_game.c에 초기화됩니다하지만 먼저 attributes.h 파일에 정의) 2D char 배열을 초기화 선수 ...init_game.c에서enter image description here

+0

이 변수들을'main'에 전역 적으로 정의하고 main에'attribute.h'를 포함 시키십시오. – Adarsh

+0

내 게임 기능이'the_game.c'에 있기 때문에'main'에'attributes.h'를 포함 시키면 쓸모가 없습니다. 내 질문에 분명하지 않을 수도 있습니다, 나는 다른 파일에서 한 파일에서 초기화 된 변수를 사용하여 언급 한 방식으로 'extern'을 사용하는 방법에 대해 혼란스러워. –

+0

전역 변수의 실제 정의와 초기화를 넣는'globals.c' ('#include attributes.h') 파일을 추가해야합니다. – Medinoc

답변

0

, 전역 변수를 선언

char player_board[BOARD_SIZE][BOARD_SIZE]; 
char enemy_board[BOARD_SIZE][BOARD_SIZE]; 

attributes.h 다음이 배열에 액세스 할 수 있습니다 포함 모든 파일은 그 파일이 같은 이름의 다른 변수를 선언하지 않습니다 제공.

main에서 전역 배열을 사용하는 the_game.c에서 함수를 호출하기 전에 init_game.c에서 초기화 함수를 호출해야합니다.

+0

좋아요, 그럼'the_game.c'에서 배열에 어떻게 접근할까요? 'player_board [i] [j]'처럼? 나는 'extern'에 대해 매우 혼란 스럽다. –

+1

동일한 유형의 배열에 액세스하는 것과 같은 방식으로 액세스합니다. 'extern'은 단순히 배열이 다른 컴파일 단위 (이 경우에는'init_game.c')에 정의되어 있음을 컴파일러에게 알려줍니다. – downhillFromHere

1

이것은 프로그램 디자인에 결함이 있음을 분명하게 나타냅니다. 올바른 해결책은 전역 변수로 스파게티 코딩을 구현하지 않고 프로그램 디자인을 수정하는 것입니다.

"클래스"또는 "ADT"또는 "코드 모듈"을 만드는 방법으로 객체 지향 디자인을 사용하는 것이 가장 좋습니다 (클래스 키워드가 없기 때문에 기본적으로 C에서 동일한 것을 의미합니다) . 각 클래스는 .h 파일과 .c 파일로 구성됩니다. 클래스를 자립적으로 유지하는 객체 지향 개념을 사용하고 나머지 세계를 신경 쓰지 않고 특정 작업 만 수행하십시오. 개인 캡슐화를 사용하고 .h 파일에 공개로 간주되는 모든 것을 넣습니다.

  • 게임은 프로젝트의 한 클래스입니다. 따라서 게임과 관련된 모든 것은 해당 클래스에 있어야합니다.
  • 게임 초기화는 게임 클래스와 가장 관련이 깊으므로 코드를 game.h와 병합해야합니다. 그것을 자신의 파일에 포함시키는 것은 의미가 없습니다.
  • 해당 파일 중 하나에 게임 클래스에 속하지 않는 항목이 포함되어 있으면 이러한 항목을 자신의 파일로 이동해야합니다.
  • 게임 클래스가 너무 복잡해 보이면 게임의 다양한 속성을 하위 클래스로 분할해야합니다. 예를 들어, 보드를 다루는 클래스 하나, 플레이어를 다루는 클래스 하나 등.
  • 프로그램 디자인이 올바르다면 전역 변수가 없어야합니다. extern 키워드를 사용하여 자신을 발견하면 프로그램 디자인에 결함이 있습니다.정적 파일 범위 변수는 완벽하게 사용할 수 있지만 (스레드 안전 문제를 고려해도) 유의하십시오.
+0

나는 C로 프로그래밍 할 때 항상 내 프로그램을 적절하게 분할하는 것이 어렵다는 것을 안다. –