2016-09-20 14 views
1

のtypedef私は、コンパイル/リンクエラーを持っています。 typedef構造体に何か問題があったのですか? main.cは単にinitialize()を呼び出します。 initialize()関数は以下の通りです。簡潔にするために、私はすべての#defineマクロを取り出しました。メインはコードのさらに下に含まれています。リンカエラーは、次のように構造体

ありがとうございました。

//globals.h 
#ifndef memory_manager_globals_h 
#define memory_manager_globals_h 

/******** Memory Table Entry Data Structure**********/ 
typedef struct 
{ 
    uint32_t block_address; 
    uint32_t next_free_block; 

}mem_table_entry_t; 

/******** Memory Table Data Structure**********/ 
typedef struct 
{ 
    mem_table_entry_t two_kib[8]; 
    mem_table_entry_t one_kib[16]; 
    mem_table_entry_t half_kib[32]; 
    mem_table_entry_t quarter_kib[64]; 
    mem_table_entry_t eighth_kib[128]; 

}mem_table_t; 

extern mem_table_t memory_table; 

#endif 

...

//MAIN.C 
#include <stdio.h> 
#include "globals.h" 


void initialize(void) 
{ 

    int block_count = 0;   // 
    uint32_t dynamic_address = HEAP_START; 

    while(block_count <= INITIALIZE_BLOCK_COUNT) 
    { 
     if((block_count >= TWO_KIB_LO) && (block_count < TWO_KIB_HI)) 
     { 
      memory_table.two_kib[block_count].block_address = HEAP_START; 
     dynamic_address = dynamic_address + 0x800; 

     memory_table.two_kib[block_count].next_free_block = dynamic_address; 
     block_count++; 
    } 
... 

次のように.hファイルの正しい形式があるべき[SOLVED]:

/******** Memory Table Entry Data Structure**********/ 
typedef struct 
{ 
    uint32_t block_address; 
    uint32_t next_free_block; 

}mem_table_entry_t; 


/******** Memory Table Data Structure**********/ 
typedef struct 
{ 
    mem_table_entry_t two_kib[8]; 
    mem_table_entry_t one_kib[16]; 
    mem_table_entry_t half_kib[32]; 
    mem_table_entry_t quarter_kib[64]; 
    mem_table_entry_t eighth_kib[128]; 

}mem_table_t; 

    mem_table_t memory_table; 

    extern mem_table_t memory_table; 
+0

そして今 'mem_table'の**定義**を持つファイルを表示:

は連結問題を解決するために、あなたのCファイルに次の行を追加します。 – Olaf

+0

@Olaf - ありがとう。 – Darrell

+0

これは間違っています!ヘッダは決して_definitions_を持つべきではありません( 'inline'関数は例外ですが、それは別の主題です)!良いCの本は、ここでpssibleよりもはるかに良い詳細を述べる - 申し訳ありませんが、我々は家庭教師もいません。 – Olaf

答えて

3

をあなたがmemory_tableの定義が欠落しています。 extern行は宣言であり、定義ではありません。

mem_table_t memory_table; 
+0

ああ、そうです。そうですか。愚かな間違い。どうもありがとうございました。 – Darrell

関連する問題