網頁

2017年11月2日 星期四

20171102 資結程設

hw3
DBTable::sort(constant struct)
::sort()(_table.begin(), _table.end(),s);

function object
DBSort::operator() (const DBRow& r1, const DBRow& r2)

for (n=0;  n=_sortOder.size(); n++) {
    size_t c = _sortOder[I]
......
}

struct DBSort
{

}

2017年10月31日 星期二

20171031 GPU

1. Atomics
處理變數在每個thread進行read-modify-write的操作時會有dependency,例如x++。
利用shared memory處理atomicAdd可以減少對global memory重複讀取,增加效能。

2. Stream
cudaHostAlloc()和malloc()不一樣在於malloc()是page host memory,而cudaHostAlloc()是 page-locked (有時稱之為pinned memory)。在run time時,page-locked會讓buffer不會被swapped out到硬碟,會加速記憶體的讀取。最重要是如果今天有兩個stream。假設今天stream0進行kernel運算時,stream1利用cudaHostAlloc()可以讀取非現在kernel運算的陣列不會影響kernel的運算,否則用malloc()可能在kernel會無法使用原本的陣列來運算。

















這種方式會造成copy engine跟kernel engine會有較大空閒時間。














這種方式雖然也會造成copy engine跟kernel engine有空閒時間,但kernel engine比上一種快一格進行,而且stream0和stream1的kernel之間也縮短兩格。












這種方式是最佳的。

所以結論是利用breath-first或round-robin的assignment工作方式到stream是最好的。

2017年10月29日 星期日

20171019

static在C++的種類有五種使用方式

1. Static variable in a file
2. Static variable in a function
3. Static function
4. Static data member of a class 5. Static member function of a class
static在三種scope下有不同功能
1. global
global variable宣告static會讓global scope變file scope,意思是說當兩份cpp檔如果都有相同變數名稱時,他們各自屬於他們file內的變數,彼此之間沒有關係。
2. function
在function裡,local variable宣告static時,不會因為function被回收讓變數也被回收。
3. class
static data member
(i)不管產生多少個相同class的物件,static的members只會複製一份,而且共享給每一個物件。
(ii)不必在class scope內初始化。利用::在class外部初始化,如果沒有,系統會自動初始化為0。
static member function
只能用::access,即使沒有產生物件。
只能access “static” data member,enum, or nested types。
不能access到this pointer

2017年10月26日 星期四

20171026 資結程設

begin是管理記憶體空間的開頭
end是管理記憶體空間的尾
new size_t的倍數
假設A是200 bits
P1=new A
P2=new A[5]
P3=new A[5]
delete []P2

MemMgr的_activeBlock
new一個P2假設產生208 bits
_ptr指向8個bits前面
P2指向200前面

recycle list(RL)
recycle會先找記憶體容量相同的
first要先用型態A的pointer P2強迫轉型成size_t 把前面8 bits減掉還要把值設成0
first指向8個bits後面的位置
delete []P2
delete []P3
前面8 bits用P2指
first=P3指向下一個後面要刪除的200 bits

假設delete []P5 (261 bits)
空間只有255 >end
再要一個_activeBlock

vector<MemTestObj*> _objList;
vector<MemTestObj*> _arrList;deleteObj

delete _objList[ix];
...

_objList[i]? 'o' : 'x' (如果是NULL會印o)

#define toSizeT(t)
假設38 bits會把size變40 (8的倍數)

2017年10月25日 星期三

20171025 計結

EDA playground
https://www.edaplayground.com/

t_Full_Adder.v (testbench)放左邊
Full_Adder.v (module)放右邊
檔案用貼上別upload

Tools & Simulators
Icarus Verilog

Full_Adder FA_1(.a(a), .b(b), .ci(ci), .sum(sum), .cout(cout));
input reg 
output wire

$dumpfile("Full_Adder.vcd");
$dumpvars;
輸出file可以看waveform

initial #1000 $stop;
經過一千個單位時間會停下來

verilog-ex
// Code your design here
timescale 1 ns/ 1 ns

module alu (src_a, src_b, c, data_out);

input [7:0] src_a, src_b;
input [2:0] c;
output [7:0] data_out;

/* implement here */
reg [32:0] temp;
assign data_out = temp[32];

initial begin
if(c == 1) begin
  temp = src_a + src_b;
end
else if(c == 2) begin
  temp = src_a - src_b;
end
else if(c == 3) begin
  temp = src_a & src_b;
end
else if(c == 4) begin
  temp = src_a | src_b;
end
else if(c == 5) begin
  temp = src_a ^ src_b;
end

end


endmodule

20171018 計結

sign extension

rising edge or falling edge

clock cycle

MUX

數位系統

資結程設hw2

1. using C++ implements the terminal state without echo input, like login when asking for the password

參考資料
https://www.svbug.com/documentation/comp.unix.programmer-FAQ/faq_4.html

1. CmdParser cmd
    初始化_readBufPtr(_readBuf), _readBufEnd(_readBuf),_historyIdx(0), _tempCmdStored(false)
2. cmd.readCmd()
    呼叫另一個成員函式readCmdInt(cin) {
        (1) 呼叫另一個成員函式resetBufAndPrintPrompt() {
            初始化_readBufPtr = _readBufEnd = _readBuf;*_readBufPtr = 0;
            呼叫另一個成員函式printPrompt()印出cmd> (初始化和cout可以寫在.h)
        }
        (2) while (1) {
            (a) ParseChar pch = getChar(istr)
                (i) getChar(istream& istr)是一個global function回傳型態是enum
                (ii) 呼叫mygetc(istr)是一個global function回傳型態是ch
                () char mygetc(istream& istr)
                (ii) enum回傳LINE_BEGIN_KEY等字串
            (b) pch == INPUT_END_KEY 離開
            (c) switch (pch)
        }
    }

20171024 GPU

1. Texture memory
    texture memory被cash on chip,比off-chip DRAM更可以減少使用記憶體需求,提供更有效bandwidth。在二維晶格,因為CPU處理周遭晶格時在記憶體無法連續情況下無法被cash together。因此,texture memory非常適合處理"between a cell and neighbors"這種需要讀取周圍記憶體位置的情況,也比前一張使用shared memory的方式來的好。
    以課本例子因為有固定熱流點dev_constSrc,所以在anim_gpu function裡先把常數的部分先copy_const_kernel寫進dev_insrc,然後再呼叫blend_kernel把dev_inSrc覆寫後算出dev_outSrc。利用一維texture<float>或二維texture<float,2>的不同處理方式下,差別在二維會自動處理邊界問題,但兩者效能其實是差不多的。

2. Graphics interoperability
    和之前章節差別在這邊使用多張顯卡讓CUDA結合OpenGL和GLUT calls,不必像前幾章利用CPU執行CPUBitmap,減少使用CPU系統。特別的是,把圖片長寬跟datablock寫到GPUAnimBitmap function引數,會透過initialize讓cudaCHooseDevice自動搜尋適合這張圖的顯卡。

2017年10月18日 星期三

2017年10月10日 星期二

前置處理器 指示詞

Preprocessor directives
前置處理器 指示詞(Preprocessor directives)用#(hash sign)來表示。在編譯開始前,前置處理器會先檢視指示詞。因為前置處理器 指示詞沒有用;(semicolon)做結尾,所以前置處理器只能解析一行code為基準,若超過一行要在末行加上\(backslash)。

macro definitions (#define, #undef)
#define identifier replacement
當前置處理器看到這個指示詞,會將code裡任一個identifier用replacement取代,可以是expression, statement,block或者simply anything。

ex
1
2
3
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
int table2[TABLE_SIZE];

 
#define getmax(a,b) a>b?a:b

1
2
3
4
5
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
#undef TABLE_SIZE
#define TABLE_SIZE 200
int table2[TABLE_SIZE];

function macro definitions兩種特別運算元#和##在replacement。#後面的參數名字會被字串字母的引數取代 (就像是被雙引號框住)。
1
2
#define str(x) #x
cout << str(test);

##連接兩個引數使他們之間沒有空白
1
2
#define glue(a,b) a ## b
glue(c,out) << "test";
參考文獻

2017年10月9日 星期一

linux centos終端機顏色

修改ls顯示資料夾名稱顏色
cp /etc/DIR_COLORS ~/.dir_colors
vim ~/.dir_colors

第59行:DIR 01;34(01:粗體,34:藍色)
修改為:DIR 01;33(01:粗體,33:黃色)

參考資料

改txt亮顯、行號
vi ~/.vimrc

hi Comment ctermfg =blue
set nu

2017年10月6日 星期五

20171005資結程設

map是一種associated container。insert pair(key跟value)後可以利用find輸入key搜尋到相對應value。搜尋法為紅黑樹概念,complexity為log(n)。此外,也可以將key和value進行刪除或清空。
因為map的key不能重複,所以可以使用multimap來允許duplicate key的操作。

參考連結:
http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html

strtok()是將一連串string藉由設定delimiters來分割出個別字串

example
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

使用方法:
在程式裡面會有兩次function call。第一次function call引數(argument)為string,為了擷取這些string,每個string的第一個character(不包含delimiter)被用來當作scan的起始位置。當scan到delimiter時,會分割string而且包含delimiter,然後scan到null character終結function。因為第一個function call有static pointer指向string,所以第二個function call當string被scan到delimiter時,會回傳NULL pointer。

前置處理器運算子(Preprocessor)
運算子動作
字串化運算子 (#)以雙引號將實際對應的引數括住
字元化運算子 (#@)以單引號造成對應的引數會將和視為字元 (Microsoft 專用)
語彙基元帶入的運算子 (##)允許做為實際引數的語彙基元會串連形成其他語彙基元
DEFINED 運算子簡化的語式是否正確文字在某些巨集的指示詞
前置處理器指示詞(Preprocessor Directive)

2017年9月29日 星期五

MAC OSX vim設定

Mac OSX 的vimrc存放位置在
/usr/local/share/vim/.vimrc
為全域設定 會影響每個使用者
但是我們無法直接在裡面進行設定
因此直接cd到家目錄創一個.vimrc
local設定只會影響目前的使用者
$ cd 
$ vi .vimrc

以下是設定參數
1. set ruler 
會顯示行列數
2. set hls
    set nohls
搜尋時會高涼反白/取消高亮反白
3. set incsearch
搜尋為完畢前就會開始搜尋
4. syntax on
開啟突顯
5. set tabstop=4
按tab會跳四個字元
6. set showmatch
括號配對
7. set nocompatible
vi不會影響vim功能
8. set shiftwidth=4
自動縮進字元數 (先用V選取要縮進的行然後再按=)
9. set backspace=2
按BACKSPACE會縮進任何東西包含在行首時會刪除前一行行末
10. set number
左邊顯示行數

2017年9月25日 星期一

VS Code Mac設定

1. 開啟資料夾
2. 檢視 -> 擴充功能 -> C/C++
3. command+shift+P -> C/Cpp: Edit Configuration (標頭檔路徑產生在c_cpp_properties.json)
4. command+shift+P -> Tasks: Configure Task Runner -> Others (選編譯器跟寫編譯script)

4. command+shift+B (compile產生a.out)
5. command+shift+P -> Debug Open launch.json -> C++ (GDB/LLDB)
6. "program": "enter program name, for example ${workspaceRoot}/a.out",
修改成"program": "${workspaceRoot}/a.out",
7. Debug

參考資料:
https://code.visualstudio.com/docs/languages/cpp

ps.
如果在main function有char** argv
要在launch.json文件裡"args": []的中括號裡輸入值

2017年9月22日 星期五

20170922資結程設



1. VS code

2. chmod 777 修改檔可讀寫屬性的方法

3. 1 >> 8 (1 shift 8)

4. char(8) ASCII8 退格

2017年7月29日 星期六

重灌Mac


1. 安裝HomeBrew
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. 安裝iterm2
http://iterm2.com

設定
Preference -> Keys -> Show/hide iTerm2 with a system-wide hotkey
Preferences -> Profiles -> Window -> Top of Screen

Mac已經有內建zsh (zsh --version 查版本)
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

設置主題powerLine
$ git clone git://github.com/jeremyFreeAgent/oh-my-zsh-powerline-theme ~/.ohmyzsh-powerline
$ cd .ohmyzsh-powerline/
$ ./install_in_omz.sh
$ cd ~
$ vim .zshrc
將ZSH_THEME=”robbyrussell”修改成ZSH_THEME=”powerline”

安裝Powerline專屬字型
$ git clone git://github.com/powerline/fonts ~/.powerline_fonts
$ cd ~/.powerline_fonts
$ ./install.sh

設定iterm2字型(原始是Monaco)
iTerm -> Preferences -> Profile -> Text
Font -> Change Font


設定提示字元

Powerline主題預設會顯示username、hostname與日期,並且只顯示目前路徑。

若不想顯示這些資訊,且想顯示完整路徑的話,請依照以下方式設定。

取消hostname與日期
$ vim ~/.zshrc
在第一行加上
POWERLINE_HIDE_HOST_NAME="true"
POWERLINE_DISABLE_RPOMPT="true"
POWERLINE_FULL_CURRENT_PATH="true"

取消username
$ vim ~/.ohmyzsh-powerline/powerline.zsh-theme
將此行改成
PROMPT="%k%f%F{white}%K{blue}"$POWERLINE_CURRENT_PATH"%F{blue}"$POWERLINE_GIT_INFO_LEFT" %k"$'\ue0b0'"%f "








4. 安裝fira code font
download 
到ttf資料夾選擇要安裝的形式

5. 安裝終端機自動命令提示
$ brew install zsh-autosuggestions

確認是否有zsh-autosuggestions.zsh (路徑要確認是否為0.4.0版本)
$ cd /usr/local/Cellar/zsh-autosuggestions/0.4.0/share/zsh-autosuggestions

zsh-autosuggestions.zsh放入~/.zshrc文件中
$ source /usr/local/Cellar/zsh-autosuggestions/0.4.0/share/zsh-autosuggestions/zsh-autosuggestions.zsh
$ source ~/.zshrc

6. 安裝OpenMP和MPI
Installing OpenMP
如果還沒安裝gcc
$ brew install gcc --without-multilib
如果已經安裝gcc
$ brew reinstall gcc --without-multilib
compile指令
$ gcc-7 -fopenmp
Installing MPI (https://shawnliu.me/post/configuring-openmp-and-mpi-on-mac/)
$ brew install openmpi --build-from-source --cc=gcc-7
compile指令
$ mpicc <your source code>

7. 安裝 Homebrew Cask
$ brew install brew-cask-completion
$ brew cask install google-chrome

8. 更新
$ brew update && brew upgrade brew-cask && brew cleanup

9. 安裝Anaconda
https://www.continuum.io/downloads

啟動 Jupyter Notebook
$ jupyter notebook

10.安裝FileZilla
$ brew cask install filezilla

11. 安裝The Unarchiver
https://itunes.apple.com/app/the-unarchiver/id425424353

12. Sublime Text 3
https://www.sublimetext.com/3

2017年6月18日 星期日

GPU on OSX

Q: zsh: command not found: nvcc

A:



export PATH=/Developer/NVIDIA/CUDA-8.0/bin${PATH:+:${PATH}}

export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-8.0/lib\

${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}

Q: nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

A:













nvcc -gencode arch=compute_30,code=sm_30 hello.cu -o hello

Q: nvcc fatal : The version ('80100') of the host compiler ('Apple clang') is not supported

A:












1. 下載Xcode 8.3.3 (https://developer.apple.com/download/more/)
2. Unzip "Xcode8.3.3.xip" and movie it to "Application folder" as /Applications/Xcode.app3. $ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
4. $ /usr/bin/cc --version
移除xcode
sudo rm -rf /Applications/Xcode.app
sudo rm -rf /Library/Preferences/com.apple.dt.Xcode.plist
rm -rf ~/Library/Preferences/com.apple.dt.Xcode.plist rm -rf ~/Library/Caches/com.apple.dt.Xcode rm -rf ~/Library/Application\ Support/Xcode
rm -rf ~/Library/Developer/Xcode rm -rf ~/Library/Developer/CoreSimulator rm -rf ~/Library/Developer/XCPGDevices

2017年2月25日 星期六

nvcc warning

nvcc無法compile

解決方法:到 https://developer.apple.com/download/more/ 
下載新的Command_Line_Tools



出現警告

nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

$ nvcc -arch=sm_60 -std=c++11 vectorAdd.cu

ps. SMS ?=  30 35 37 50 52 60都可以

2017年2月24日 星期五

C++ 冒號(:) 雙冒號(::) 的定義與應用

轉載於: http://www.itread01.com/articles/1478394912.html
1.冒號(:)用法

(1)表示機構內位域的定義(即該變量占幾個bit空間)

typedef struct _XXX{

unsigned char a:4;

unsigned char c;

} ; XXX

(2)構造函數後面的冒號起分割作用,是類給成員變量賦值的方法,初始化列表,更適用於成員變量的常量const型。

struct _XXX{

_XXX() : y(0xc0) {}

};

(3) public:和private:後面的冒號,表示後面定義的所有成員都是公有或私有的,直到下一個"public:”或"private:”出現為止。"private:"為默認處理。

(4)類名冒號後面的是用來定義類的繼承。

class 派生類名 : 繼承方式 基類名

{

派生類的成員

};

繼承方式:public、private和protected,默認處理是public。

2.雙冒號(::)用法

(1)表示“域操作符”
例:聲明了一個類A,類A裏聲明了一個成員函數void f(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,
就要寫成void A::f(),表示這個f()函數是類A的成員函數。

(2)直接用在全局函數前,表示是全局函數
例:在VC裏,你可以在調用API 函數裏,在API函數名前加::

(3)表示引用成員函數及變量,作用域成員運算符

例:system::Math::Sqrt() 相當於System.Math.Sqrt()

VC中如下

::是C++裏的“作用域分解運算符”。比如聲明了一個類A,類A裏聲明了一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。
  :: 一般還有一種用法,就是直接用在全局函數前,表示是全局函數。當類的成員函數跟類外的一個全局函數同名時,考試,大提示在類內定義的時候,打此函數名默認調用的是本身的成員函數;如果要調用同名的全局函數時,就必須打上::以示區別。比如在VC裏,你可以在調用API函數時,在API函數名前加::。(編輯:)
這篇文章將總結C/C++中的冒號的用法。

1、位域定義
這個在前面關於位結構體的文章裏說得夠多的了,不再重復了。

2、類構造函數(Constructor)的初始化列表
先說下什麽叫構造函數吧(是不是啰嗦了?C++的人應該都知道了吧,還是以防萬一一下)。所謂構造函數,就是與類同名的函數,它與普通函數的區別在於,它沒有返回類型。
在構造函數後面緊跟著冒號加初始化列表,各初始化變量之間以逗號(,)隔開。下面舉個例子。
class myClass
{
public :
myClass();// 構造函數,無返回類型,可以有參數列表,這裏省去
~myClass();// 析構函數
int a;
const int b;
}

myClass::myClass():a(1),b(1)// 初始化列表
{
}
上面的例子展示了冒號的這個用法,下面對這個用法進行幾點說明:
1)初始化列表的作用相當於在構造函數內進行相應成員變量的賦值,但兩者是有差別的。
在初始化列表中是對變量進行初始化,而在構造函數內是進行賦值操作。兩都的差別在對於像const類型數據的操作上表現得尤為明顯。我們知道,const類型的變量必須在定義時進行初始化,而不能對const型的變量進行賦值,因此const類型的成員變量只能(而且必須)在初始化列表中進行初始化,即下面的代碼將會出錯:
myClass::myClass()
{
a = 1;// 沒錯,效果相當於在初始化列表中進行初始化
b = 1;// 出錯,const變量不能進行賦值操作;
}
2)初始化的順序與成員變量聲名的順序相同。
先看一下下面的程序:
myClass::myClass():b(1),a(b)
{
}
這樣的執行結果a,b各是多少呢?b=1,a=1?不是,b=1而a是個隨機數。這一點是相當重要的哦,一般在初始化列表中進行初始化時,初始化的順序應與聲明的順序保持一致,防止出現不必要的錯誤。
3)對於繼承的類來說,在初始化列表中也可以進行基類的初始化,初始化的順序是先基類初始化,然後再根據該類自己的變量的聲明順序進行初始化。

3、聲明基類。
假設我們重新定義一個類,繼承自myClass類。定義方式如下:
class derivedClass : public myClass
{
// 略去
}
這裏的冒號起到的就是聲名基類的作用,在基類類名前面可以加public/private/protected等標簽,用於標識繼承的類型,也可以省略,省略的話,用class定義的類默認為private,用struct定義的類默認為public,至於具體各個標簽有什麽區別這裏就不說了。
與初始化列表一樣的,這裏也可以聲名多個基類,各基類之間用逗號(,)隔開。

4、條件語句(? :)
與?構成條件語句,作用相當於if else,如下;
int a,b,c;
a=3;
b=2;
c=a>b?a:b;// 如果a>b成立,則反a賦給c,否則把b賦給c
條件語句的結構為:
條件表達式?表達式1:表達式2
當條件表達式為true時,表達式的值為表達式1的值,否則為表達式2的值。
幾點說明:
1)?:可以嵌套,但不推薦使用(難懂),下面的表達式你能看懂啥意思不?
int max = i>j ? i>k ? i : k : j>k ? j : k;
腦袋大了吧,呵呵。
2)?:具有很低的優先級,這個要註意哦,下面的程序執行結果是啥呢?
int i = 3;
int j = 2;
cout << i>j?i:j;// 出錯,<<比>具有更高的優先級,執行順序為 ((cout<<i)>j)?i:j,相當於是比較cout<<i與j的大小,然後根據比較結果決定表達式值為i或j,這顯然要出錯的,cout<<i的值是cout,不能跟整型數j進行比較。
cout << (i>j)?i:j;//輸出1或0,相當於(cout<<(i>j))作為判決條件,來決定表達式的值為i或j,而cout<<(i>j),i>j則輸出1否則0,然後再將(cout<<(i>j))作為?:的條件,如果cout正確執行則為1(true),否則為0(false),以此決定表達式值為i或j
cout <<(i>j?i:j);//i>j則輸出i,否則輸出j,表達式值為true如果cout正確執行,否則為false
更多的關於優先級的問題就不說了。

5、語句標簽
通常跟goto配合使用,如:
step1: a = f1();
....
goto step1;
這種作法也不是很推薦,原因在於它破壞了語句的順序執行,這樣的代價大家應該清楚吧。不過存在即為合理嘛,既然它還存在,肯定還是有它的用處有它的好處的,比如說,多層嵌套的退出(會比break continue直觀一點吧),也可以避免重復代碼之類之類的

6、switch語句中case後。

7、匯編指令模板
參考:http://developer.e800.com.cn/articles/2006/43/1144846933898_1.html

1、 
作用域符號::的前面一般是類名稱,後面一般是該類的成員名稱,C++為例避免不同的類有名稱相同的成員而采用作用域的方式進行區分
如:A,B表示兩個類,在A,B中都有成員member。那麽
A::member就表示類A中的成員member
B::member就表示類B中的成員member 

2、 
全局作用域符號:當全局變量在局部函數中與其中某個變量重名,那麽就可以用::來區分如: 

char zhou; //全局變量 

void sleep() 

{ 

char zhou; //局部變量 

char(局部變量) = char(局部變量) *char(局部變量) ; 

::char(全局變量) =::char(全局變量) *char(局部變量); 

} 

3、 
::是C++裏的“作用域分解運算符”。比如聲明了一個類A,類A裏聲明了一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。例如

[cpp] view plain copy

  1. 01  class CA {    
  2. 02  public:    
  3. 03    int ca_var;    
  4. 04    int add(int a, int b);    
  5. 05    int add(int a);    
  6. 06  };   
  7. 07      
  8. 08  //那麽在實現這個函數時,必須這樣書寫:    
  9. 09  int CA::add(int a, int b)    
  10. 10  {    
  11. 11    return a + b;    
  12. 12  }    
  13. 13      
  14. 14  //另外,雙冒號也常常用於在類變量內部作為當前類實例的元素進行表示,比如:    
  15. 15  int CA::add(int a)    
  16. 16  {    
  17. 17    return a + ::ca_var;    
  18. 18  }   
  19. 19      
  20. 20  //表示當前類實例中的變量ca_var。  

2017年1月29日 星期日

Makefile

Target:Prequeite

$@ Target的檔名

$% 程式庫成員中的檔名元素

$< 第一個prequeite的檔名

$? Timestamp 在Target之後的Prequeite

$^ 所有的Prequeite的檔名 但不包含重複部分

$+ 所有的Prequeite的檔名

$* Target的主檔名


Makefile的賦值運算符(=, :=, +=, ?=)

1. ?=

這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值

如果已經有值了 就不進行任何變動

2. =

在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開

所以就可以先定義 後續再補數值

以下提供一個例子

CFLAGS = $(include_dirs) -O

include_dirs = -Ifoo -Ibar

如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容

然後這樣子的特性可能會帶來兩個壞處

第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正

CFLAGS = $(CFLAGS) -O

CFLAGS要被使用時會造成無限迴圈

另外一個壞處是跟效能有關的:

因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次

所以效能就可能不太好

3. :=

在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開

所以一旦跑完:=後 就不再存在任何reference在變數中

4. +=

最後一個是+= 用來增加敘述在原有已經定義的變數中

如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded variable.

如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable

ex

1. =

make會將整個makefile展開後,才決定變數的值。也就是说,變數的值會是整個Makefile中最後被指定的值。看例子:

x = hello
y = $(x) world!
x = hi

all:
@echo $(y)

在上例中,輸出結果將會是 hi world! ,而不是 hello world!

2. :=

變數的值在Makefile展開途中就會被給定,而不是整個Makefile展開後的最终值。

x := hello
y := $(x) world!
x := hi

all:
@echo $(y)

輸出結果 ====> hello world!

2017年1月23日 星期一

git 團隊

下載遠端數據庫
git pull #才能從別的相同clone資料夾或別的電腦看到github的commit

遠端衝突
A和B都pull remote repository commit
A修改後commit push
B修改後commit push會顯示衝突
B pull remote repository commit
此時pull的檔案會是merge A和B的檔案

存放網頁空間流程
Setting -> Github Pages -> Source -> 選分支後上方會出現網址

小型團隊分支協作
A在master先分支一個develop
B在develop用一個分支
B開發完後A在develop merge B的分支
最後A再回到master merge develop
然後push master和develop到remote repository


git pull = git fetch + git merge
練習完 pull 時,可以知道他就是將遠端的分支將你的本地分支進行合併 merge 的動作,
但有時候你不希望 pull 下來導致自己的數據庫太亂又擔心有衝突時,可以先使用下面這個指令。

git fetch origin(遠端數據庫) branch1(遠端分支)

此時你的分支會多一個 FETCH_HEAD 的分支,這個就是遠端數據庫的分支,可以等到你看過沒問題後,
再合併 FETCH_HEAD 也 ok。

push branch 到 remote repository

沒有要推送分支的話
$ git push

git remote #查詢遠端數據庫
git remote rename 原名稱 修改名稱
git push origin branch名稱 #origin:clone預設遠端主機名稱

push local repository
git remote add origin https://github.com/chiustin/python.git
git push origin master/branch

git暫存

儲存一個暫存檔
另外也可以將此暫存檔移到另一個分支
$ git stash #暫時儲存暫時目錄
$ git stash list #瀏覽git stash 列表
$ git stash pop #還原暫存
$ git stash drop #清除最新暫存
$ git stash clear #清除全部暫存

git 標籤

git tag #查詢標籤
git tag -n #查詢詳細標籤
git tag -d #刪除標籤
git tag 標籤名稱 #新增輕量標籤
git tag -am "備註名稱" 標籤名稱 #新增標示標籤
git checkout 標籤名稱 #切換到標籤的commit

分支

HEAD 是目前所在位置指標
git branch #瀏覽目前分支
git checkout commit識別碼 #將HEAD指向之前的committed
git checkout master #將HEAD指回原本committed

分支
git branch 名稱
git checkout 名稱

合併

case 1
開分支再將此分支commit
git merge 分支名稱 #在master位置

#分支還是保持一樣檔案內容

case 2 分支合併到修改過的master
開分支"插入"新的內容
再將此分支commit
接著將master也做修改commit
git merge 分支名稱
會將master跟分支修改的東西一起合併

 case 3 衝突
開分支"修改"原本的內容
再將此分支commit
接著master也修改剛剛分支修改的內容再commit
git merge 分支名稱
會顯示HEAD跟分支的內容
手動修改






2017年1月22日 星期日

gitignore

目的是如果想要測試東西時
不想讓git status追蹤的話
可以使用

touch 名稱.gitignore
*.html #忽略檔案
folder/ #忽略資料夾

2017年1月21日 星期六

Markdown

# 課堂中的範例
## 粗體或斜體
**This is bold**
---
*This is tilt*
## 機器學習演算法的清單
- 分類
    - 決策樹
    - 羅吉斯回歸
    - ...etc
- 分群
    -
    -
    -...etc
- 迴歸
    -
    -
    -...etc

## 不想被執行的程式

這是一個 Inline code: `print(Hello World)`

這是一個 Code chunk:

```python
print("Penny Lane")
```

## 我最喜歡的樂團

|樂團名|主唱|
|-----|----|
|May  |Sien|
|Come |GG  |


## 參考連結

- [Penny Lane] - (https://backlogtool.com/git-guide/tw/reference/)
- [other] - (https://zlargon.gitbooks.io/git-tutorial/content/branch/commit_tree.html)

- 圖片:

![](https://www.qnap.com/QPKG/img/python_640x400.png)


---

> "This is Python"

git檔案管理

檔案狀態可以分成三種
Changes to be committed #執行git add後
Changes not staged for commit #已經git add後再修改檔案
Untracked files #建立新的檔案

#一個檔案可以同時Changes to be committed
#Changes not staged for commit

檢視檔案
$ git status #顯示修改檔案清單
$ git diff #查看修改檔案差異
$ git log #顯示commit紀錄
$ git show #查看commit的詳細記錄

註冊檔案或目錄到index
$ git add

刪除檔案
$ git rm 

#會先把檔案移除index變成Changes not staged for commit
#等commit -m之後才會真正刪除檔案

還原和刪除檔案

已註冊到index的檔案做"修改"後
狀態也會從Changes to be committed變成
Changes not staged for commit
如果要把Changes not staged for commit檔案
"還原檔案"變成
$ git checkout -- file

#此時檔案狀態也會改回Changes to be committed
#不管是modified或deleted都可以還原檔案內容

把檔案狀態從Changes to be committed變成
Changes not staged for commit
也就是檔案"取消index"
$ git reset HEAD file

還原工作目錄和index
和最後commit一樣
先將Changes to be committed
Changes not staged for commit
Untracked files
三種狀態index先變成Changes to be committed

$ git add. #先全部變成Changes to be committed
$ git reset --hard #將Changes to be committed檔案刪除