2017-12-18 92 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

相關問題