顯示具有 Program 標籤的文章。 顯示所有文章
顯示具有 Program 標籤的文章。 顯示所有文章

2026年9月14日 星期一

Shell(.sh)


1. 在終端機螢幕上顯示文字、變數內容,或將訊息輸出到檔案中

    echo "Hello World"

2. 定義變數

    <variable name>=<data>

規則:

    a. 等號前後,不能有空格

    b. 變數名稱只能是英文和數字,且數字不能在開頭 

    c. 變數內容,如需空白,可放在雙引號 "" 或是單引號 '' 裡面

        -雙引號中若有特殊字元,例如 $,會保有原本的特性。

        -單引號中所有的字元即為一般字元,沒有任何功能 。

    d. 反斜線 \, 可以跳脫其後接的第一個字元本身的功能  

3.  取得變數內容

    $<variable name>
    ${<variable name>}

4. 指令內容,可以使用 $(command) 或是 `command` 取得其他指令的值。

    username=$(whoami)
    echo $username
    user 

5. 取消變數設定

    unset username

6. 取得所有環境變數

    env

7.  自訂變數轉成環境變數

    export <variable name> 

8.  查看目前開放哪些環境變數

    export

9.  列出所有的變數:自訂變數,環境變數,bash 本身變數

    set

10. 語系相關

    a. 查看目前語系變數:locale

    b. 查看支援哪些語系:locale -a 

    c. 暫時修改語系的變數:export LANG=zh_TW.utf8

        只要有設定 LANG 或是 LC_ALL,則其他的變數就會被這兩個變數自動取代。

    d. 永久修改語系的變數:打開 /etc/locale.conf, 加入或更改:LANG="en_US.utf-8"

11.  讀取鍵盤輸入,當作變數值

    read <option> <variable name>

    option :
        -a : array,變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
        -p : prompt,跳出提示字串。
        -t : timeout,設定秒數內沒有完成則結束。 

12. 宣告變數的類型,沒指定,預設為字串。只有整數才可運算。 

    declare <option> <variable name>

    option :
        -a : 變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
        -i : 整數類型,可以進行數值運算,但是預設只能做到整數型態。
        -l : 將變數內容轉換為小寫。
        -r : 變數僅為 readonly,不可被更改也不可以被 unset。
        -u : 將變數內容轉換為大寫。
        -x : 開放變數轉換成環境變數,等同使用 export。

 

13. 比較符號:

    字串比較符號:
        =:等於(字串相等)
        !=:不等於(字串不相等)
        <:小於(按字典序比較)
        >:大於(按字典序比較)
        -z:檢查字串是否為空(長度為零)
        -n:檢查字串是否非空(長度大於零)

    數字比較符
號:
        -eq:等於(數字相等)
        -ne:不等於(數字不相等)
        -lt:小於(數字小於)
        -le:小於或等於(數字小於或等於)
        -gt:大於(數字大於)
        -ge:大於或等於(數字大於或等於)

14. 檔案測試符號: 

    -e FILE:如果 FILE 存在,則為真。
    -f FILE:如果 FILE 存在且為一個檔案,則為真。
    -d FILE:如果 FILE 存在且為一個目錄,則為真。
    -s FILE:如果 FILE 存在且檔案大小不為零,則為真。
    -r FILE:如果 FILE 存在且可讀取(有讀取權限),則為真。
    -w FILE:如果 FILE 存在且可寫入(有寫入權限),則為真。
    -x FILE:如果 FILE 存在且可執行(有執行權限),則為真。
    -L FILE:如果 FILE 存在且為一個符號連結(軟連結),則為真。
    -p FILE:如果 FILE 存在且為一個命名管道(FIFO),則為真。
    -c FILE:如果 FILE 存在且為一個字元特殊文件,則為真。 

15. 流程控制:

    a. if, then else fi 

        if 條件
        then
            # 如果條件為True,執行這裡的命令
        else
            # 如果條件為False,執行這裡的命令
        fi

    b. if … elif … fi

        if 條件1
        then
            # 如果條件1為真,執行這裡的命令
        elif 條件2
        then
            # 如果條件2為真,執行這裡的命令
        else
            # 如果以上所有條件都不滿足,執行這裡的命令
        fi

    c.  case

        case 值 in
            條件1)
                    條件1匹配時執行的命令

                    ;;
            條件2)
                    條件2匹配時執行的命令

                    ;; 
            *)

                    沒有任何匹配時執行的命令

                    ;;
        esac

    d. for

        for 變數 in 列表; do
            執行的命令
        done

    e. while

        while 條件
            do
                # 當條件為真時執行的程式碼
        done

16. 函式(Function)結構: 

    function 函式名稱 {
        # 函式的程式碼
        # 可以使用傳遞給函式的參數
        # 函式的操作
        # ...
        # 返回值(可選)
    }

 

17. 結果輸出導向: 

    a. >(複寫導向)

        echo "Hello" > output.txt

    b. >>(附加導向):將指令的標準輸出以附加(Append)的方式存入檔案。它不會刪除舊資料,而是將新資料寫在檔案的最末端。

        echo "Hello" >> output.txt

    c. &>(全輸出導向):標準輸出(stdout)和標準錯誤輸出(stderr)「同時」存入同一個檔案中。無論指令執行成功還是發生錯誤,所有的訊息都會被寫進檔案(並採覆寫模式)。&> 與較傳統的寫法 > 檔案名稱 2>&1 效果完全相同。)

        echo "Hello" &> output.txt

    d. 2>&1 :將標準錯誤輸出(stderr,代號 2)重新導向至標準輸出(stdout,代號 1)

        在 Linux 與 Bash 中,每個執行中的程式都有預設的資料流代號: 

            0:標準輸入(stdin,鍵盤輸入)

            1:標準輸出(stdout,正常顯示的訊息)

            2:標準錯誤(stderr,錯誤或警告訊息) 

 

18. 管線命令 (pipe):管線命令使用『 | 』,上一個指令輸出,給下一個指令使用。
    例:ls -al /etc | less
    ls 指令輸出後的內容,給 less 讀取

  

  

19. Shell Script基本結構元素:

    1. Shebang行:通常以#! 開頭後面接著一個解釋器(interpreter)的路徑,用來告訴系統使用哪種shell來執行script,系統會自動使用指定的解釋器執行script。

        #!/bin/bash

    2. 註釋:使用 # 符號來添加註釋。註釋不會被執行僅供備註閱讀。

        # 這是一個註釋

    3. 變數:

        variable="Hello World!"

    4. 特殊變數:

        $0, ${BASH_SOURCE[0]}:這個變數代表目前shellscript程式的檔案名稱(包括路徑)。

         $1, $2, ... $n:用於獲取命令行參數傳遞給程式的值。$1代表第一個參數,$2代表第二個參數,依此類推,$n代表第n個參數。

    5.  特殊的環境變數

        $HOME:代表當前的主目錄路徑,通常用於訪問家目錄。
        $USER:代表當前使用者名。
        $PWD:代表當前工作目錄的路徑。
        $SHELL:代表當前所使用的Shell的路徑。
        $PATH:包含了Shell用於查詢可執行命令的目錄列表。

    6. 指令:

        echo "This is a shell script."

    7. 流程控制:(如 if、else、case)和迴圈(如 for、while)來執行流程控制
        if [ $age -ge 18 ]; then
            echo "You are an adult."
        else
            echo "You are not yet an adult."
        fi

    8. 函數:函數能夠接受參數與返回值。

        function afunc {
            echo "Hello, $1!"
        }
        afunc "Alice"

 

 參考網站:

    Shell 的變數設定 

    Shell Script 基礎介紹 

 

 

2026年8月24日 星期一

Visual Studio Code(C/C++ Auto Format)

C/C++ Auto Format

1. File --> Preferences-->Settings

2. Extensions-->C/C++-->Formatting

3. C_Cpp: Clang_format_fallback Style

4. Sample: {BasedOnStyle: LLVM, BreakBeforeBraces: Stroustrup, SpaceBeforeParens: Never, AllowShortIfStatementsOnASingleLine: true, MaxEmptyLinesToKeep: 8, ColumnLimit: 0, UseTab: Always, IndentWidth: 4, TabWidth: 4, PointerAlignment: Right}


Tab(Keep tab, Don't change to space key)

1. File --> Preferences-->Settings

2. Search: "Insert Spaces"

3. UnCheck:

        Editor: Insert Spaces

        Editor Detect Indentation

2026年7月30日 星期四

Install Qt6 in Ubuntu 22.04

Install:

1. sudo apt install qtcreator

2. sudo apt install qtcreator-data qtcreator-doc

3. sudo apt install qt6-base-dev

4. which qmake6 (Get qmake6 location)


Env settings:

Qt Creator: Tools->Options->Kits->Kits

    Manul->Desktop(Default)->Qt version: Qt 6.2.4(System)

Qt Creator: Tools->Options->Kits->Qt Versions

    qmake path: /usr/bin/qmake6


2026年7月28日 星期二

Library 降版(Dangerous)

The behavior is dangerous.


 始因:Ubuntu 22.04,安裝gtkmm 3.0出現,lib版本不相容問題。


例:

sudo apt install libgtkmm-3.0-dev

The following packages have unmet dependencies:

 libpango1.0-dev : Depends: gir1.2-pango-1.0 (= 1.50.6+ds-2) but 1.50.6+ds-2ubuntu1 is to be installed

                   Depends: libpango-1.0-0 (= 1.50.6+ds-2) but 1.50.6+ds-2ubuntu1 is to be installed

                   .....


需要從1.50.6+ds-2ubuntu1,降版1.50.6+ds-2


1. 更新apt資料庫

    sudo apt update

2. 檢查是否有此library

    apt-cache policy gir1.2-pango-1.0

3. 降版本(可能有多個library需要降版)

    sudo apt install gir1.2-pango-1.0=1.50.6+ds-2 --allow-downgrades

    sudo apt install libpango-1.0-0=1.50.6+ds-2 --allow-downgrades


4. 降版完成,安裝gtkmm

    sudo apt install libgtkmm-3.0-dev


2026年7月26日 星期日

Library:static、shared與dynamically loaded in Linux

 

Static libraries :

    Static 程式庫用於靜態連結,把一堆 object 檔,用 ar (archiver) 包裝集合起來,檔名以 `.a' 結尾。

    優點:執行效能快,且因靜態連結,不易發生執行時找不到 library 或版本問題。

    缺點:檔案較大,維護度較低


Shared libraries :

    Shared library 程式執行起始時載入,而不是執行中用到才載入。連結階段需要有該程式庫才能進行連結。

    優點:維護彈性較好。

    soname:library 的名稱,例: libmylib.so.1 

    real name:實際放有library程式的檔案名稱,例:libmylib.so.1.0.0

    linker name:連結時的名稱,通常是不含版號,例: libmylib.so


    使用範例:

        * Complie :

            # gcc -c -fPIC LibData1.c LibData2.c

                -fPIC 產生 position-independent code。也可以用 -fpic 參數。

            # gcc -shared -Wl,-soname,libmylib.so.1 LibData1.o LibData2.o -o libmylib.so.1.0.0

                -shared 表示要編譯成 shared library

                -Wl 用於參遞參數給linker,-soname與libmylib.so.1會被傳給linker處理。-soname 用來指名 soname 為 limylib.so.1

                library 會被輸出成 libmylib.so.1.0.0(real name), 若不指定 soname 的話,在編譯結連後的執行檔會以連時的library檔名為 soname,並載入他。否則是載入 soname 指定的 library 檔案。


        * 用 ln 來建立 soname 與 linker name 兩個檔案 :

            # ln -s libmylib.so.1.0.0 libmylib.so.1 <- 連結soname

            # ln -s libmylib.so.1.0.0 libmylib.so    <- 連結函式庫名稱


        * 使用方法 : 與 static library 同 :

            gcc main.c libmylib.so.1.0.0

            or

            gcc main.c -L. -lmylib    #-lmylib ->libmylib.so,透過上面ln取得libmylib.so.1.0.0


            如果目錄下同時有 static 與 shared library 的話,會以 shared 為主,可以使用 -static 參數可以避免使用shared連結。


版本號:

第1碼:原介面有移除或改變,與舊版不相容時。

第2碼:有新增加介面,但相舊介面沒改變,所以與舊版本相容。

第3碼:用於程式內容的修正,介面完全沒有改變。


Dynamically loaded libraries :

    像 windows 所用的 DLL ,在使用到時才載入,編譯連結時不需要相關的 library。動態載入庫常被用於像 plug-ins 的應用.

    動態載入是透過一套 dl function來處理,預設 API如下 :

        #include <dlfcn.h>

        void *handle = dlopen(const char *filename, int flag); // 根據檔名開啟library並回傳handle

        void (*func)(void);                                                         // 宣告function

        func = dlsym(void *handle, const char *symbol);         // 根據symbol,取得function記憶體位置

        int dlclose(void *handle);                                               // 關閉library  

        char *dlerror(void);                                                         // 傳回最近所發生的錯誤訊息。


    使用方法:與Shared Library同,只差別在使用程式碼,如上。


Ref:

[Linux 教學] 用gcc 自製 Library

Program Library HOWTO

Linux 的動態連結與載入 (Dynamic Linking)


2026年7月22日 星期三

Linux Man(Manual) Page - (線上手冊)

 章節分類(Sections):

1. 可執行的程式或是 shell 指令

2. 系統呼叫(system calls,Linux 核心所提供的函數)

3. 一般函式庫函數

4. 特殊檔案(通常位於 /dev)

5. 檔案格式與協定,如 /etc/passwd

6. 遊戲

7. 雜項(巨集等,如 man(7)、groff(7))

8. 系統管理者指令(通常是管理者 root 專用的)

9. Kernel routines(非標準)


線上查詢:

    https://man7.org/linux/man-pages/index.html

Program部份:

    gcc : https://man7.org/linux/man-pages/man1/gcc.1.html

    g++: https://man7.org/linux/man-pages/man1/g++.1.html


參考網址:

    第六章、Linux 檔案與目錄管理 - 鳥哥 - 基礎學習篇 - CentOS 7.x

    善用 man 指令查詢 Linux 線上手冊(Man Page)


Visual Studio Code(VS Code) tutorial


1. install VS code

    Download the corresponding version

    https://code.visualstudio.com/download?_exp_download=fb315fc982

    sudo apt install ./<file>.deb

Ref:

    https://code.visualstudio.com/docs/setup/linux

    https://code.visualstudio.com/docs/setup/windows


2. install extension for C/C++ or other

    Start app

    Enter extensions and install: C/C++, C/C++ Extension Pack, C/C++ DevTools, Bookmarks by Alessandro

Ref:

    https://code.visualstudio.com/docs/languages/cpp


3. first program(Hello World) and do debug

    Please check the under link.

    .vscode -- some setting file

        tasks.json (compiler build settings)

        launch.json (debugger settings)

        c_cpp_properties.json (compiler path and IntelliSense settings)

    Debug: 

        a. Open main.cpp in VS code.

        b. Add a breakpoint in source code

        c. Press the play button(in the right-up location),  select Debug C/C++ File in the drop-down

Ref:

    https://code.visualstudio.com/docs/cpp/config-linux


4. Debugging with Multiple Files

    Previous step will generate tasks.json. Modify task.json.

    Replease

    "${file}",

    to

    "file1.cpp",

    "file2.cpp",

Ref:

    http://antares.cs.kent.edu/~csi/blog/vscodemultiple.html



2026年7月6日 星期一

Lambda Expression in C++, [=] (int x) mutable throw() -> int

 

支援條件:

=>GCC 4.5:需要指定 -std=c++11 參數。

=>Intel C++ Compiler 11:需要指定 /Qstd=c++0x 參數。

=>Microsoft Visual C++ 2010(包含在 Visual Studio 2010 之中)


語法如下:

[=] (int x) mutable throw() -> int {

    int n = x;

    return n;

}


各部件解說:

[=]:lambda-introducer,也稱為 capture clause。如何將目前 scope 範圍之變數抓至 lambda expression 中使用

(int x):lambda declarator,也稱為參數清單(parameter list)。定義此匿名函數的傳入參數列表。不需要傳入任何參數的話,可以連同小括號都一起省略。

mutable:mutable specification。可以讓 lambda expression 直接修改以傳值方式抓取進來的外部變數,若不需要此功能,則可以將其省略。

throw():例外狀況規格(exception specification)。指定該函數會丟出的例外。如果該函數沒有使用到例外的功能,則可以直接省略。

-> int:傳回值型別(return type)。如果定義的函數很單純,只包含一個傳回陳述式(statement)或是根本沒有傳回值的話,這部分就可以直接省略,讓編譯器自行判斷傳回值的型別。


重點參考:

[]:只有兩個中括號,完全不抓取外部的變數。

[=]:所有的變數都以傳值(by value)的方式抓取。

[&]:所有的變數都以傳參考(by reference)的方式抓取。

[x, &y]:x 變數使用傳值、y 變數使用傳參考。

[=, &y]:除了 y 變數使用傳參考之外,其餘的變數皆使用傳值的方式。

[&, x]:除了 x 變數使用傳值之外,其餘的變數皆使用傳參考的方式。

-----------------------------------------------------------------------------------------------

(int x)定義傳入參數列表,基本的用法跟一般函數的傳入參數列表一樣,不過多了一些限制條件:

    不可指定參數的預設值。

    不可使用可變長度的參數列表。

    參數列表不可以包含沒有命名的參數。



參考網址:

C++11 Lambda Expression

2022年7月7日 星期四

OpenGL中,gult/freeglut/glfw/glew/glad差別

 1.OpenGL(https://opengl.org/)

OpenGL只定義framework框架,也就是說只有functions定義,並沒有實現內容,有點像interface。

實際function內容的,又有顯卡廠商,自行轉寫與優化。


OpenGL API分為:

gl: 核心library

glu:實用library(對gl封裝)

aux:輔助

glut:實用library工具(跨平台的OpenGL程序的工具包)

glx、agl、wgl:不同平台相關


2.1 gult(https://www.opengl.org/resources/libraries/glut/glut_downloads.php) - OpenGL Utility Toolkit

此函示庫已過於老舊,不建議使用。

對應開原版為freegult


2.2 freeglut(http://freeglut.sourceforge.net/) - Free-software/open-source alternative to the OpenGL Utility Toolkit (GLUT) library

因OpenGL無視窗相關控制的函式,所以網路上很多高手加入相關功能,像早期glut,與現在的freeglut。

freeglut完全相容glut,是glut的代替品。freeglut 3.0版本較穩定,推薦使用。


2.3 glfw(https://www.glfw.org/)

lightweight、Open、跨平台。支持OpenGL及OpenGL ES,包含視窗管理、檔案存取、事件處理等。

少量的API,即可達到目的。

glfw目的一樣是取代glut。



3.1 glew(http://glew.sourceforge.net/) - The OpenGL Extension Wrangler Library

glut或freegult,主要是OpenGL 1.0的基本函式功能

glew使用OpenGL 2.0之後的工具函式功能

使用glew.h文件,就可以使用gl,glu,glext,wgl,glx相關函式(包含廠商開發一些函式)

glew包含了OpenGL所需的核心


3.2 glad(https://glad.dav1d.de/) - Multi-Language GL/GLES/EGL/GLX/WGL Loader-Generator

glad為gl3w、glew之後,目前最新OpenGL規範接口的第三方函式庫。glad是glew的升級版。



4. 結論

gl相關函式

舊:glut/freeglut

新:glfw


函式接口

舊:glew

新:glad


開發組和

(1)freeglut + glew -->較舊穩定搭配

(2)glfw + glew

(3)glfw + glad -->目前最新搭配



參考文章:https://blog.csdn.net/libaineu2004/article/details/105879521

2019年10月30日 星期三

make file

基本結構如下:

#--------------------------------------------------------------
target(要生成的文件): dependencies(被依賴的文件, Prerequisites)
#命令前面用的是「tab」而非空格。誤用空格是初學者容易犯的錯誤。
        command1
        command2
        command3
          .
          .
          .
        commandn
#可用「\」表示換行繼續,「\」後不能有空格
#--------------------------------------------------------------

說明:
1. target與dependencies中間用冒號(:)分隔開來
2. command前面是tab,不能是空白符號( ),會有錯誤,指令最後面也不能有空白符號( )
3. 註解(comment):符號為#
4. dependencies: 要完成target或產生target檔案,所需要的檔案
5. target: 透過dependencies與下面的command來完成


特殊target:

#--------------------------------------------------------------
clean:
        command1
        command2
        command3
#--------------------------------------------------------------
說明:
1. 這種沒目標文件或間接關聯,不會自動執行,不過我們執行: make clean

偽目標 .PHONY

#--------------------------------------------------------------
.PHONY: clean
clean:
        rm *.o
        rm *.exe
 #--------------------------------------------------------------
說明:
.PHONY 會將目標設成假target,使 make目錄下沒有目標檔案或目標檔案為最新時,仍可執行 make <target>
make預設的假target有 all, install, clean, distclean, TAGS, info 和 check

變數

#--------------------------------------------------------------
cc = gcc
src = a.cpp b.cpp c.cpp
program : $(src)
        $(cc) -c $(src)
#--------------------------------------------------------------
說明:
1. 變數宣告時,使用 = 或 := 給予初始值
2. 取用時,加入$(),如上面的$(src)
3. 特殊變數
3-1. $@ : target檔名
3-2. $< : 第一個dependencies檔名
3-3. $^ : 所有個dependencies的檔名, 並以空格隔開這些檔名(已經拿掉重複的檔名)
3-4. $* : target主檔名,但不含副檔名
4. 特殊等號
4-1. ?= : 若變數未定義,則替它指定新的值。否則,採用原有的值。
4-2. := : 變數的值決定於它在 Makefile 中的位置,而不是整個 Makefile 展開後最終的值
4-3. = : 變數的值為整個 Makefile 展開後最終的值
4-4. += : 把+=後面的內容,放入+=前面

萬用字元

#--------------------------------------------------------------
CC = gcc

%.o: %.c
  $(CC) -c -o $@ $<
#--------------------------------------------------------------
說明:
makefile中所用的萬用字元是 %,代表所有可能的字串。
target、個dependencies檔名可以接指定的字串來表示某些固定樣式的字串。
例:%.c 表示結尾是.c 的所有字串。

特別字元

#--------------------------------------------------------------
.PHONY: clean
clean:
    @echo "Clean..."
    -rm *.o
#--------------------------------------------------------------
說明:
1. @ : 不要顯示執行的command,因執行make後,會在終端機印出正在執行的指令
2. - : 即使執行出錯,也不會中斷執行,因make只要遇到錯誤,就會中斷執行。
故像上面沒有任何檔案可以rm時,rm傳回錯誤值,會導致 make 中斷執行。
利用 - 來關閉錯誤中斷功能,讓make不會因而中斷。

範例:

用makefile 建立資料夾
#--------------------------------------------------------------
OBJDIR = ./obj
$(OBJDIR):
    mkdir -p $@

makeDir: ${OBJDIR}
#--------------------------------------------------------------

2019年10月18日 星期五

const

A. 變數宣告

1. const char *tVar;
2. char const *tVar;
3. char * const tVar;
4. const char * const tVar;

加上括號方便了解

1. const (char) *tVar;-->把*tVar當作一個變數,所以*tVar的值,不可變
2. (char) const *tVar;-->同上
3. (char *) const tVar;-->tVar型別為(char *),tVar指標不可變, 右邊語法為一樣意思:const (char *) tVar;
4. const (char *) const tVar;-->指標與和指標所指到值,都不可變


B. Function內有const變數

1. void function(const int Var);
2. void function(const char *Var);
3. void function(char * const Var);

加上括號方便了解,其實就與需告變數同

1. void function(const (char) tVar);-->tVar傳function內,變數值不可變(無意義,tVar本身就傳進去參數)
2. void function(const (char) *tVar);-->*tVar型別為(char),*tVar的值不可變
3. void function((char *) const tVar);-->tVar型別為(char *),tVar指標不可變(無意義, tVar也是傳進去參數)


C. const 放在Function的回傳值

1. const int function()
2. const int *function()
3. int * const function()

加上括號方便了解,其實就與需告變數同

1. const (int) function()-->因回傳值是被assign的,所以沒意義
2. const (int) *function()-->把function()當成變數,應該較很清楚,*function()的值不可變。使用方式:const int *tValue = function();
3. (int *) const function()-->function()型別為(int *),回傳指標不可變。使用方式:int * const tValue = function();


D. const 拿來形容 object / object pointer / object reference

const 形容的物件,表示該物件為const物件,所以物件的任何member都不能改。object pointer / object reference 指到的物件也是一樣。
const 形容的物件,該物件的任何非const成員函數都不能被呼叫用,因為任何非const成員函數都可能有修改成員變數的企圖。

例:
class A
{
    void func1();
    void func2() const;
}

const AAA aObj;

aObj.func1();-->錯誤
aObj.func2();-->正確


const AAA* aObj = new AAA();

aObj->func1();-->錯誤
aObj->func2();-->正確


E. const 形容 class內的變數

class中有const的成員的值固定,不能被修改,且只能在初始化時,給值。
class A
{
    const int mVal;

    A(int mVal): nValue(mVal) {}; //初始化,給值
}


F. const 形容 class內的Function

class中有const的函數,不能修改class中任何非const成員函數。一般把const寫在函數最後。

class A
{
    void function() const; //const函式, 不改變物件的成員變數. 也不能呼叫任何非const成員函數。
}


G. const與define區別

1. compiler行為不同
define-->在compile前,即作取代動作
const-->compile時,處理

2. 類別和檢查行為不同
define-->沒有型別,不做型別檢查,只是展開。
const-->型別型別資訊,在compile時,會檢查。

3. 存儲方式不同
define-->僅展開,不會分配記憶體。
const-->會在記憶體中分配

參考網址:
const 放置位置的意義

2019年10月17日 星期四

Class Inheritance - Constructor, Destructor

#include <iostream>
using namespace std;

class A {
public:
    A() {
        cout << "A Constructor" << endl;
    }

    ~A() {
        cout << "A Cestructor" << endl;
    }
};

class B : public A {
public:
    B() {
        cout << "B Constructor" << endl;
    }

    ~B() {
        cout << "B Cestructor" << endl;
    }
};

int main() {
    B f;

    cout << endl;

    return 0;
}

執行結果:
A Constructor
B Constructor

B Cestructor
A Cestructor

static, extern in C, C++

extern

例:
xx.h
extern int a;

xx.cpp
int a = 100;

即:
    當別的cpp檔,include xx.h時,即告知linker a不在此.h與.cpp內,要去其他.o檔找。而build xx.h與xx.cpp時,會告知此a變數,可以給其他.o找到



Function或variable非class member


static function();(此變數宣告不在function裡)
static variable;(此變數宣告不在function裡)


A static function is a function whose scope is limited to the current source file.

即:
    此function只會在自己對應的.h與.cpp內被看到,當.h與.cpp被build成.o檔時,其他程式如果
需要link此function會看不到。同理,此變數只在此.h與.cpp內看的到。

static variable;(此變數宣告在function裡)

即:
    call完此function後,此variable依然存在,不會消失。



Function或variable是class member

class xxx{
  static int a;
  static void function();
}

即:
    此variable不屬於任何instance,而是屬於此class的,所有instance共用此變數,可用此變數來計算instance個數。
    此function不屬於任何instance,而是屬於此class的,未有instance即可呼叫此function。



參考:
[C/C++] 靜態函式 (static function) 2011
C/C++ 中的 static, extern 的變數

2019年5月27日 星期一

Excel Function

=RAND()-->Random一個值,介於0~1( >= 0, < 1)

=RAND()*(b-a)+a-->Random一個值,介於a~b( >= a, < b)

=INT(RAND()*X)-->Random一個值,小於X的整數

=RANDBETWEEN(B1,C1) -->Random一個值,介於儲存格B1, C1

=IF(MOD(RANDBETWEEN(Parameters!B1,Parameters!C1), 2)=0,"+","-") -->Random一個值,介於儲存格B1, C1,再Mod 2,1的話顯示+, 2的話顯示-

=EVALUATE(A1&B1&C1),EVALUATE可以把字串當運算式,運算

Ctrl + F3(開名稱管理員)-->新增Function
Name: calculate(隨便命名)
參照=EVALUATE(A1&B1&C1)

在儲存格,輸入=calculate

2015年9月10日 星期四

integer <--> char string, float(double) <--> char string

integer -> char string
char * itoa ( int value, char * str, int base );
http://www.cplusplus.com/reference/cstdlib/itoa/

char string -> integer
int atoi (const char * str);
http://www.cplusplus.com/reference/cstdlib/atoi/


float(double) -> char string
char * gcvt ( double value, int ndigits, char * buffer );
http://www.kev.pulo.com.au/pp/RESOURCES/cplusplus/ref/cstdlib/gcvt.html
說明:gcvt()將num轉成ASCII code,ndigits顯示位數。
gcvt()與ecvt()和fcvt()不同的地方在於,gcvt()轉換後的字串包含小數點或正負符號。

char * ecvt(double value, int ndigit, int *decpt, int *sign);
char * fcvt(double value, int ndigit, int *decpt, int *sign);
說明:ecvt把double轉成字串。value要轉換的double,儲存最多ndigit個char,並加('\0')作結尾。如果value數字個數超過ndigit,低位數字被捨入。如果少於ndigit個數字,以'0'填滿。
  只有數字才存儲在該字串中,小數點位置和+-,會存在decpt和sign中。decpt指小數點位置,0或負數指出小數點在第一個數字的左邊。sign指正負符號,正數或0,sign為正數,否則為負數。

  fcvt() 和 ecvt() 的一個不同的地方是第 2 個參數表示的是小數點後顯示的位數,它的轉換也是四捨五入的。fcvt()->全部顯示幾個位數,ecvt()->小數點後面幾個位數


char string -> float(double)
double atof (const char* str);
http://www.cplusplus.com/reference/cstdlib/atof/

scanf(Read formatted data from stream(File *))

Function define: int scanf(const char * format,.......);

Header: #include<stdio.h>

函數說明: scanf()會將輸入的數據根據參數format來轉換並格式化數據

Scanf()格式轉換的一般形式如下
%[*][size][l][h]type

以中括號括起來的參數為選擇性參數,而%與type則是必要的。
* 代表該對應的參數數據忽略不保存。
size 為允許參數輸入的數據長度。
l 輸入的數據數值以long int 或double型保存。
h 輸入的數據數值以short int 型保存。

type的幾種形式
%d 輸入的數據會被轉成一有符號的十進制數字(int)。
%i 輸入的數據會被轉成一有符號的十進制數字,若輸入數據以「0x」或「0X」開頭代表轉換十六進制數字,若以「0」開頭則轉換八進制數字,其他情況代表十進制。
%0 輸入的數據會被轉換成一無符號的八進制數字。
%u 輸入的數據會被轉換成一無符號的正整數。
%x 輸入的數據為無符號的十六進制數字,轉換後存於unsigned int型變量。
%X 同%x
%f 輸入的數據為有符號的浮點型數,轉換後存於float型變量。
%e 同%f
%E 同%f
%g 同%f
%s 輸入數據為以空格字符為終止的字符串。
%c 輸入數據為單一字符(char)。
[] 讀取數據但只允許括號內的字符。如[a-z]。
[^] 讀取數據但不允許中括號的^符號後的字符出現,如[^0-9].

返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

Sample:
Read a line
while(EOF != fscanf(streams, "%[^\n]\n", buffer)) {
printf("%s\n", buffer);
}

Read a lot of varibles
while(fscanf(streams, "%d %s %s %s", &d1, &s2, &s3, &s4) != EOF ){
printf("%s\n", s2);
}

Reference:
http://stackoverflow.com/questions/20108334/traverse-file-line-by-line-using-fscanf
http://www.cplusplus.com/reference/cstdio/fscanf/
https://msdn.microsoft.com/zh-tw/library/6ybhk9kc.aspx

2014年6月29日 星期日

fscanf, fscanf_s

scanf(), scanf_s()會將輸入的數據根據參數format字符串來轉換並格式化數據。

Scanf() 格式轉換如下
%[*][size][l][h]type

中括號括起來的參數為選擇性參數,而%與type則是必要的。

*代表該對應的參數數據忽略不保存。
size 為允許參數輸入的數據長度。
l 輸入的數據數值以long int 或double型保存。
h 輸入的數據數值以short int 型保存。

type的幾種形式
%d 輸入的數據會被轉成一有符號的十進制數字(int)。
%i 輸入的數據會被轉成一有符號的十進制數字,若輸入數據以「0x」或「0X」開頭代表轉換十六進制數字,若以「0」開頭則轉換八進制數字,其他情況代表十進制。
%0 輸入的數據會被轉換成一無符號的八進制數字。
%u 輸入的數據會被轉換成一無符號的正整數。
%x 輸入的數據為無符號的十六進制數字,轉換後存於unsigned int型變量。
%X 同%x
%f 輸入的數據為有符號的浮點型數,轉換後存於float型變量。
%e 同%f
%E 同%f
%g 同%f
%s 輸入數據為以空格字符為終止的字符串。
%c 輸入數據為單一字符。
[] 讀取數據但只允許括號內的字符。如[a-z]。
[^] 讀取數據但不允許中括號的^符號後的字符出現,如[^0-9].

返回值
成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

Sample:(一次讀一行)
fscanf_s(fp, "%[^\n]\n", &buffer, 20)

2014年3月9日 星期日

struct(C++/CLI)

public value struct Sname {
    Int32 aa;
};

private不能跨assembly,public才能跨assembly(預設為private)

value, ref 差異:value struct在stack,ref struct在heap
       一般來說,struct都很小,適合建在stack,速度較快。