2017-12-18 3 views
-3

C를 배우려고 노력하면서이 짧은 프로그램을 만들어 클래스를 모방하려고했습니다. 이 코드에는 C 나 최선의 방법과 같은 코드를 개선 할 수있는 방법이 있으면 안됩니다. 내가 항상했던 그런 것들에 대한 구조체를 사용했습니다 때이 코드를 향상시킬 방법을 찾고 있거나하지 말아야 할 것이 있다면

structs.h

struct weapon { 
    char name[30]; 
    int damage; 
    int durability; 
}; 

struct player { 
    int health; 
    int armor_level; 
    int currency; 
    struct weapon player_weap; 
}; 

을 main.c는

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "structs.h" 

struct player new_player(); 

void main() { 

    struct player user = new_player(); 

    printf("The players health is %d.\n", user.health); 
    printf("The players armor is %d.\n", user.armor_level); 
    printf("The players currency is %d.\n", user.currency); 
    printf("The players weapon is the %s.\n", user.player_weap.name); 
    printf("The players weapon does %d damage and has %d durability.\n", user.player_weap.damage, user.player_weap.durability); 

} 

struct player new_player() { 

    struct player new_player; 
    new_player.health = 100; 
    new_player.armor_level = 0; 
    new_player.currency = 0; 
    strcpy(new_player.player_weap.name, "Starter Sword"); 
    new_player.player_weap.damage = 1; 
    new_player.player_weap.durability = 100; 

    return new_player; 

} 
+8

특정 질문을하고 난 당신이 알고 https://codereview.stackexchange.com/ – taskinoor

+0

를 사용하는 것이 좋습니다보다 당신의 코드에 대한 몇 가지 의견을하지 않으려면 메모리가 부족하지는 않지만 구조가 메모리에 정렬되는 방식에 대해 변경할 수있는 것도 있습니다. 구조 패딩 및 패킹? – WedaPashi

답변

2

그것은 단지 취향의 문제지만, typedef 자신에게 새로운 데이터 유형을 제공합니다. 코드 작성이 쉬우 며, 상황을보다 잘 이해할 수 있습니다.

typedef struct { 
    char name[30]; 
    int damage; 
    int durability; 
} Weapon; 

typedef struct { 
    int health; 
    int armor_level; 
    int currency; 
    Weapon player_weap; 
} Player; 

그래서 대신

struct player new_player(); 

같은 기능을 선언하는 당신은 IMO, 그것은 훨씬 더 클래스를 사용하여 작업하는 과정을 시뮬레이션이

Player new_player(); 

처럼 그것을 할 것입니다. 또한 void main()을 사용하라고 말한 사람은 아무렇지도 않게 있습니다. 커널이나 마이크로 컨트롤러 등을 쓰지 않는 한 이것을 사용하지 마십시오. 거의 모든 프로그래밍 환경에서 int main(void)입니다. 프로그램이 성공적으로 실행되면 return 0;을 확인하십시오.

+1

'return 0;'도 연락이 안된다 - 1999 년 이후, return 문이없는 메인은'return 0;과 같다. –

3

그럼 몇 가지 점이 있습니다 : - 구조가 너무 크지 않은 경우이 방법으로 할 수 있습니다. 그것은 완벽하게 정확하다.

malloc은 함수에서 반환 할 때 변수를 복사하는 것보다 계산 상으로 더 비쌉니다. 경우에는 구조의 크기가 더 큰 경우 malloc해야합니다. 그렇게하면 스택에 엄청난 양의 메모리를 사용하지 않게됩니다.

코드 재사용을 고려해야합니다. 구조체를 인쇄 할 함수를 유지할 수 있습니다. 뭔가 (같은 이유로 구조체의 인스턴스를 가져 오는 별도의 함수를 유지).

void printPlayer(struct player p){ 
    ... 
} 

이렇게하면 언제든지 인쇄 할 수 있습니다. 이렇게하면 동일한 인쇄 코드를 여러 번 반복하지 않아도됩니다.

또 다른 점은 typedefstruct player을 읽을 수있는 것입니다. 이 경우 player은 읽을 수 있지만 경우에 따라 typedef이 도움이됩니다. 하지만 그게 바로 debatable입니다.

또한 main()이 머리글 자체 기능 printPlayer 또는 new_player의 선언을 이동할 수있다 (OS가 다시 정수를 예상)

int main(void){ 
    .. 
    return 0; 
} 

이어야한다. 그것은 훨씬 더 의미가 있습니다.

다른 하나는 적절한 이름을 사용하고 있습니다.structs.h은 헤더 파일에 적합하지 않습니다. 이 프로젝트에서는 어떤 struct 헤더 파일도 없을 것입니다. 이름은 Player.h 또는 Game.h으로 유지하십시오. 그것은 훨씬 더 읽기 쉽습니다.

사용 헤더 가드

#ifndef PLAYER_H 
#define PLAYER_H 


struct weapon { 
    char name[30]; 
    int damage; 
    int durability; 
}; 

struct player { 
    int health; 
    int armor_level; 
    int currency; 
    struct weapon player_weap; 
}; 

#endif 
+1

함수 선언을 헤더로 옮기는 것은 무엇을 의미 하는가? – izzzi

+1

@izzzi .:'struct player new_player();'이 부분을 헤더에 보관할 수 있습니다. – coderredoc

+0

structs.h 헤더 파일은 무엇입니까? – izzzi