[問題] 請益標頭檔內的結構共用問題

作者: wargods8402 (維尼X維尼)   2020-01-30 18:13:10
開發平台(Platform): (Ex: Win10, Linux, ...) win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
Atmel studio GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
小弟第一次在這發文,如有不對煩請指證,謝謝!
目前正在學習韌體開發,遇到一個結構與標頭檔使用的問題,問題如下:
我在範例程式專案中加入了我自己寫的Library,分別為a_measure.c、
a_measure.h、a_REG.h,結構都放在a_REG.h裡面。
範例為b.c、b.h
現在我想把a_measure.c運算後的結果存放進a_REG.h的一個名為temp的結構裡面
,並且讓b.c能夠存取temp的內容。
我的認知中,應該是只要在b.c#include "a_REG.h" 這個標頭檔即可使用temp
這個結構,並能賦值與取值。
目前的各函式include內容:
a.c => #include a.h
#include a_REG.h
b.c => #include a_REG.h
但是,在實作的後卻出現a_REG.h多重定義的錯誤。
將a_REG.h從b.c拿掉後卻又造成temp undeclared。
怎麼做都不對...故想請問各位先進該如何解決呢?
或是有參考的資料,謝謝!
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
抱歉,程式內容過於龐大,無法貼上來...請見諒
補充說明(Supplement):
作者: Lipraxde (Lipraxde)   2020-01-30 18:47:00
恩...你知道 definition、declaration 的差別嗎?
作者: chuegou (chuegou)   2020-01-30 22:44:00
#ifndef A_REG_H #define A_REG_H (中略) #endif
作者: LPH66 (-6.2598534e+18f)   2020-01-31 01:29:00
我的水晶球看起來可能也是樓上這個但還是想請你貼一下完整的錯誤訊息 (不要只有錯誤那行)
作者: Lipraxde (Lipraxde)   2020-01-31 11:59:00
我猜他可能是寫了 struct { ... } temp = { ... };
作者: tsoahans (ㄎㄎ)   2020-01-31 14:33:00
使用別的檔案的變數沒有extern?
作者: Lipraxde (Lipraxde)   2020-01-31 16:24:00
通常是在標頭檔放 declaration,在原始檔案 definition。Linker 找不到 definition 就會出現 undefined reference 啊不然你找找看編譯參數有沒有 -fno-common資源就官方範例、論壇、datasheet、google
作者: kobe8112 (小B)   2020-02-01 10:29:00
你想太多了,才不會是大家不太願意分享技術勒= =重複include的速解2樓跟你說了,變數你直接宣告在某.c,其他要用的.c直接extern最快
作者: loveme00835 (髮箍)   2020-02-01 14:47:00
因為你連基本常識都不會,所以就算前幾樓把答案直接打出來,你也會以為人家藏步。如果有好好買本書看完基本上連這個問題都不會遇到
作者: Lipraxde (Lipraxde)   2020-02-01 18:41:00
官方論壇啊,還會有他們的人員專門處理問題。如果你是用中斷更新 temp 的話 讀的時候要暫時關掉中斷
作者: Schottky (順風相送)   2020-02-01 22:52:00
MCU 的 C 程式碼可以在這問,純粹討論 Datasheet 可以到 Electronics 板這些沒什麼好藏的,都是公開資訊不是門派機密
作者: descent (「雄辯是銀,沉默是金」)   2020-02-03 08:48:00
Uart 沒辦法print出浮點數, 請問這是什麼意思?
作者: chuegou (chuegou)   2020-02-04 01:40:00
我猜library給的printf是輸出到uart然後設定可能是tiny之類 所以有些型別不能輸出
作者: easypro   2020-02-04 19:39:00
MCU用的Lib有些printf會被精簡掉,需要設定成full才會全函數能使用,不然可以用sprintf的方式來做輸出,這種通常內部實作不會精簡。不同.c 呼叫外部的變數時請加extern 變數類型 變數名稱;這樣編譯器才會知道這變數是要找外部變數教學文件 就datasheet 你要的是application note用example code 如果說一般通訊模組無帶通訊協議通常都會有給,帶通訊協議則看各廠家規範,有些需要花錢或簽訂NDA才會給
作者: descent (「雄辯是銀,沉默是金」)   2020-02-05 08:46:00
https://descent-incoming.blogspot.com/2014/11/for-stm32f4discovery-10.html怎麼印出 float 的作法, 給你參考一下。

Links booklink

Contact Us: admin [ a t ] ucptt.com