2017-12-18 93 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(); 

,你会做这样的

Player new_player(); 

它模拟带班好多工作的过程中,IMO。此外,无论谁告诉你使用void main()是非常失去联系。除非你正在编写内核或微控制器或其他东西,否则千万不要使用它。对于几乎所有的编程环境,它都是int main(void)。如果您的程序已成功运行,请确保您的号码为return 0;

+1

'return 0;'也是失去联系 - 自1999年以来,结束主要没有返回语句相当于'返回0;' –

3

那么有几点: - 如果结构不是太大,你可以这样做。 这是完全正确的

malloc在计算上比从函数返回时复制变量更昂贵。如果结构尺寸较大,那么应该是malloc它。这样你就不会在堆栈中使用大量的内存。

您应该尝试考虑让代码可重用。你可以保留一个打印结构的函数。就像(为了获得一个struct实例一样,你保存了一个独立的函数)。

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

这样,任何时候你试图打印它 - 你只需要调用它。这样可以避免重复多次打印相同的代码。

另一件事是,你可以typedefstruct player更可读。在这种情况下,player本身可读,但在某些情况下,typedef有帮助。但是,那是debatable

另外,main()应该是(操作系统要求使用整回)

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

您可以将功能printPlayernew_player至头本身的声明。这更有意义。

另一件事是使用合适的名称。structs.h不是头文件的好名字。在这个项目中不会有任何struct头文件?保留名称Player.hGame.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

相关问题