• 5

請問程式設計C++的include和namespace要怎麼解釋最容易了解呢?

unl7911 wrote:
Google了很多資(恕刪)


江湖一點訣講破無價值~~

>>請問程式設計C++的include和namespace要怎麼解釋最容易了解呢?
一個是住台北的叫"小明"
一個是住台中的也叫"小明"
程式碼中遇到這種情況
就要寫台北."小明"或台中."小明"
namespace就是用來定義變數或類別所屬的區域

include 引用外部定義檔(.h檔)
.h檔像是餐廳的菜單
菜單有提供的可以點來吃
點菜單上沒有的
餐廳(系統)會說無法提供此服務

補充:
過去手動輸入指令進行編譯的年代
定義檔存在
但沒有cpp檔時
編譯會過
執行時會失敗
現在的IDE通常會幫你檢查
如果沒有對應的話會提示

冷知識:
include <stdio.h> 用<>表示是引用內建的
include "hello.h" 用""表示是引用自定義的
在C語言中透過include的技巧
可以實現class private的功能
</stdio.h>
chunchiahsieh wrote:
江湖一點訣講破無價值(恕刪)


這樣描述的確有比較容易瞭解

謝謝啦!


像是寫程式要使用printf()這個函式
程式的開頭要include 這個‹stdio.h›函式庫才可以使用此函式
就是可以把別人寫好的函式庫直接拿來使用,或者是自己也可以寫一個函式庫來使用
(函式庫的檔名都是.h結尾)
這樣就不用每次寫程式都從頭開始寫
寫的落落長,很浪費時間


建議可以買Arduino這類開發板來玩
學習起來比較不會無聊
可以實際寫程式去執行,如果程式無法執行
再來debug
debug的過程中就會知道程式要怎麼寫
為什麼不能這樣寫
然後再去google搜尋程式裡每個詞代表的定義
比較能記得起來
(arduino在網路上的教學資源最多,所以推薦它,也最容易在網拍、電子材料行買到)

_________
我不是學電子的,也不是學軟體的,也不是靠這個吃飯的,所以以上內容可能有錯誤的地方



guest2000

既非學軟體的又非吃飯用的,您已經很厲害了,讚.

2022-06-28 9:13
coolllyes

感謝稱讚!當初是學好玩的XD,工作之後就用不到了,除了寫excel的巨集加減會用到寫程式的概念

2022-06-28 22:18
pointer放的就記憶體位址
因為硬體會有記憶體上的位置
用pointer才有辦法直接存取到硬體中的值
一般寫firmfawe才會遇到
早期工具不多很多需要對硬體直接做操作特別記憶體配置與管理
不過現在很多語言都做掉囉
所以如果不是寫firmfawe通常就用不到指標
對嗎?
unl7911 wrote:
Google了很多資(恕刪)


為什麼會有指標pointer這種東西呢?

當我們定義變數/array/struct/class時
會向記憶體申請一段空間
其中空間長度就是所謂的"資料型態"
記憶體除了存放內容外
還有所謂的記憶體位置
例如:
一整排房子門牌號碼從0~9
編號5的房子住三個人
一整排房子代表記憶體本身
編號0~9代碼記憶體長度(0~2G)
三個人代表代號5的記憶體位置存放的內容

class 到 object的實體化過程
對電腦而就是 memory allocation
new這個動做就是實體化
classA A = new classA();
這一段Code實際上會在記憶體中
申請兩個空間
變數A在stack區
new classA()在heap區
程式關閉時
stack區的記憶體會自動被釋放
heap區的記憶體不會釋放
GC就是為了釋放heap區的記憶體資源

記憶體怎麼分配的
參考:https://dotblogs.com.tw/daniel/2017/10/20/174725
文章中提到Globle/Heap/Stack 記憶體三區
從物理的角度來看
記憶體只有stack/heap兩區
stack從低位元往高位元配置記憶體
heap從高位元往低位元配置記憶體
當stack旗標跟heap旗標相撞時
就是記憶體用光了

程式載入的過程
類似於電腦開機需要一個開機磁區
可以想像成該區就是Globle區
當變數此用static定義時
會將變數放到此區域
程式碼中全範圍都可以看到該區的變數
此區域直到程式卸載後才會釋放
備註:事實上該區還是stack區

function載入的過程
會在heap區產生一段可執行的區間
當function return時
程式回到當初呼叫時的記憶體位置
每次呼叫func在heap區都會產生一段一樣空間
但其記憶體位置是不一樣的
因為這樣的機制
延伸出:call by address / call by value /遞迴
所謂的遞迴就是func自己呼叫自己

以C++來說
.h檔 對應到 stack區
.cpp檔 對應到 heap區
如果要了解程式整個載入詳細過程
請參考作業系統的書籍

在32位元中
不論是void*/int*/double*
只要是指標當是固定長度4byte
印象中剛好是2G

我離開學校快20年了
當初書沒讀得很好有錯誤的地方請多見諒
chunchiahsieh wrote:
為什麼會有指標pointer...(恕刪)


pointer的用法
理解完程式的載入與配置方式後
才有辦法開始理解pointer的神奇之處

如果想存取某class private的變數或函式
透過pointer可以輕鬆達到
當寫程式時有上下層引用關係時
要將結果回傳或做出對應的動作時
可以使用callback

以外掛為例
就是透過pointer對某段記憶體進行修改
比方說原本總血量只有100
我們可以將其設定100,000
只要怪物對我造成傷害不要超過本身的血量
不要被秒殺
備註:這只是對變數做更新而以

在物件體向中:封裝/繼承/多型
小弟的理解
封裝:對變數的整理
多型:對函式的整理
繼承:不重複的程式碼
介面也是function pointer

個人認為其中的多型是最重要的
透過多型可以將程式碼整理得更好
舉design pattern strategy來說
可以消去很多if else的冗長設計
https://blog.csdn.net/zhizhengguan/article/details/122336432

使用pointer對開發者來說也是危險的
只要記憶體位置算錯
系統會崩潰或產生無法預期的解果
而且指錯位置只能在runtime時才有發現

EX:寫Windows驅動時指錯位置
就會出現經典的藍白畫面
此時系統已經崩潰了
你也沒辦法debug
chunchiahsieh wrote:
pointer的用法(恕刪)


學會pointer有什麼用?
比較好理解程式設計而已
很多常用的工具很多都是透過pointer來完成的
例如List
這只是選擇問題沒有對錯

回覆中有人提到GC
小弟最近工作上也剛好遇到類似問題
一個載具(類似購物時的推車)
被使用了就不能刪除或變更使用者
如果是你會怎麼設計呢?
其實有研究過GC設定原理的話
這題很輕易地就解開了

當初會去理解GC的契機
是因自己在釋放記憶體時常出錯
後來用了GC
真心感覺超好用
才去研究其細節
想知道自己與別人的差距到底有多少

GC本身是一種pattern
透過counter的計數來認定
該obj是否還在使用中
印象中叫counter pattern
但剛我上網搜尋後找不到相關資料
可能記錯名稱了

寫這麼多篇回覆
小弟想表達的是
學習的過程中
你並不會知道何時會使用到
直到你需要使用到時
當下你會有"書到用時方恨少"感觸

這些基礎與觀念
其實很多業界的工程師都不一定懂
相關的知識還有
前處理器
macro技巧與用法
task/process/thread的區別與觀念
IPC方法
chunchiahsieh wrote:

GC本身是一種pattern
透過counter的計數來認定
該obj是否還在使用中
印象中叫counter pattern



GC: Garbage Collector
Java, .Net 都是使用 GC 管理記憶體,搜尋一下就有很多資料。GC行程的觸發主要是基於記憶體資源的配置,和 Counter 沒有關係。例如可用記憶體不足、單一物件使用大量記憶體,或是由程式呼叫 gc.collect()

傳統的 COM 則是使用 counter,透過 IUnknown 的AddRef(+1), Release(-1),counter 歸 0 時就可以回收。但是萬一 A 參考 B,B 參考 C,C 參考 A,那就永遠不會被釋放了。 相關說明就搜尋 iunknown interface

至於C++ 自己配置的記憶體自己回收

我在20年前用C++寫了一套 mail server,整個核心編譯完只有 76K,但是光是記憶體配置問題就把我搞死了。經過這種訓練,後來不論是設計 .Net 或是 Java 系統,會很習慣的減少記憶體的濫用,也會更注意記憶體的配置與回收狀態。

如果沒猜錯,樓主應該今年要上交大吧,上了頂大就玩深一點吧!
本生物已配置全天候戰鬥系統~ 手機不通、Skype 離線時,請託夢,或留言!
chunchiahsieh

當初是看COM的設計沒錯

2022-06-28 12:54
guest2000

理解,敝人以前也遇過一個類似的案例,可能該例程式寫的不好,抓一個RS-232 Port的訊號時成時敗,但其實可以抓16個Port也不至於失敗.

2022-06-28 13:40
感謝大家的熱心回覆

特別是chunch...大的詳細解説
我自己當年是在應數系,學的是Pascal和C,出社會前8 年工作用的是Unix,Oracle,VB,之後就沒碰技術,到現在這16 年都在做SA,UAT,PM,Support,Pre-sales

小女高中學的是Python,語法和邏輯都能看懂適應,接下來就是要去交大 (R大猜對了),讀的是同學眼中開卡車運貨的系,不過仍想利用暑假閒餘時間,先修youtube蘇承芳的微積分和圖書館C++入門,打好基礎,之後比較不會因挫折太大而放棄AI或大數據分析的專業輔修
chunchiahsieh wrote:
當我們定義變數/array/struct/class時
會向記憶體申請一段空間
其中空間長度就是所謂的"資料型態"


這些資料結構不是非用指標不可的 ....

我以前學 c 時,喜歡把指標 *ary 轉成陣列用法 ary[ndx],因為這樣比較容易理解。三維陣列要用 3 個引數會有點煩,轉成一維或二維陣列即可。

譬如

int[][][] ary[5][6][7];

int[] row = ary[1][1];

for (int i = 0; i < 7; i++) total += row[i];
  • 5
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?