Ubuntu apt 查詢套件可用版本

本篇介紹 Ubuntu apt 查詢套件可用版本,

使用 apt-cache search 搜尋套件的關鍵字

使用 apt-cache search 指令後面加關鍵字來搜尋相關套件,例如搜尋 git 套件的話,

1
apt-cache search git

他會列出跟 git 有相關的套件,包含描述裡有出現 git 關鍵字的套件也會被列出來。

使用 ubuntu 套件網站搜尋套件

以我 ubuntu 16.04 為例,可以安裝的版本如下,
https://packages.ubuntu.com/

  • xenial (16.04LTS)
  • bionic (18.04LTS)
  • focal (20.04LTS)
  • groovy (20.10)

使用 apt-cache madison 列出套件的可用版本

使用 apt-cache madison 可以列出套件的可用版本,

1
2
3
4
$ apt-cache madison git
git | 1:2.7.4-0ubuntu1.9 | http://tw.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
git | 1:2.7.4-0ubuntu1.9 | http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
git | 1:2.7.4-0ubuntu1 | http://tw.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

使用 apt-cache policy 列出套件來源及個別套件的優先性

apt-cache policy 顯示套件來源及個別套件的優先性,

1
2
3
4
5
6
7
8
9
10
11
$ apt-cache policy git
git:
Installed: 1:2.7.4-0ubuntu1.9
Candidate: 1:2.7.4-0ubuntu1.9
Version table:
*** 1:2.7.4-0ubuntu1.9 500
500 http://tw.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
100 /var/lib/dpkg/status
1:2.7.4-0ubuntu1 500
500 http://tw.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

其它相關文章推薦
Ubuntu 安裝 clang,clang 多版本切換
Ubuntu 安裝 gcc/g++,gcc/g++ 多版本切換

4 種 Python/C++/Java 線上編譯器

本篇介紹 4 個好用的 Python/C++/Java 線上編譯器,可以隨時來寫 C/C++、Python、Java 程式語言等等。要隨時寫程式突然手邊沒有編譯環境,又想測試一下這個寫法對不對,或者測試一下結果輸出對不對等等情形,以下我列出目前前 4 大熱門的線上編譯器,以下以熱門程度與使用者體驗來排序,越後面越好,分別為

  • ideone.com
  • onlineGDB
  • JDoodle
  • repl.it

並且我也順便整理列出一些功能比較,例如:好不好分享程式碼、有沒有廣告等等。那就開始吧~

ideone.com

網址:http://ideone.com/
支援語言:C, C++, Python, Java, PHP, Ruby, C#, Go, Objective-C, Javascript …等等,以官網顯示為主。
能否分享程式碼給別人:可以,要Run完就會產生一個新的獨立網址的頁面
執行完產生新的頁面:是
有無廣告:有
複製結果:可用 Ctrl + c 複製,可複製完整存文字的結果輸出
推薦指數:3.9/5.0

(我覺得後幾個更好用,這個是備用方案)

onlineGDB

網址:https://www.onlinegdb.com/
支援語言:C, C++, Python, Java, PHP, Ruby, C#, VB, Swift, Objective-C, Javascript, HTML, CSS…等等,以官網顯示為主。
能否分享程式碼給別人:可以
執行完產生新的頁面:否
有無廣告:有
複製結果:要用滑鼠右鍵複製,但會含有html格式
推薦指數:4.2/5.0

有 C++14、C++17 還有除錯工具 gdb (The GNU Project Debugger) 可以測試程式,寫 C++ 時除錯蠻方便的。

JDoodle

網址:https://www.jdoodle.com
支援語言:C, C++, Java, Python, C#, PHP, Ruby, Perl, Swift, Objective-C, Go, Scala, VB.NET, Kotlin, Node.js (JavaScript/TypeScript), HTML, CSS, Rust, Shell, SQL…等等,以官網顯示為主。
能否分享程式碼給別人:可以,但是要登入
執行完產生新的頁面:否
有無廣告:無
複製結果:可複製完整存文字的結果輸出(macOS 可以順利用 cmd + c)
推薦指數:4.2/5.0

JDoodle 不支援太舊的瀏覽器(可能顯示空白畫面),目前 JDoodle 是免註冊登入就可使用,也可以直接用下面幾個常用的程式語言連結,
Python 3 線上編譯器:https://www.jdoodle.com/python3-programming-online/
(python 3.9.9, python 3.7.4, python 3.6.5, python 3.6.3, python 3.5.1)
C++ 線上編譯器:https://www.jdoodle.com/online-compiler-c++/
(GCC 11.1.0, GCC 9.1.0, GCC 8.1.0, GCC 7.2.0, GCC 5.3.0)
Java 線上編譯器:https://www.jdoodle.com/online-java-compiler
(JDK 17.0.1, JDK 11.0.4, JDK 10.0.1, JDK 9.0.1, JDK 1.8.0_66)
Javascript 線上編譯器:https://www.jdoodle.com/execute-nodejs-online/
(node v17.1.0, node v12.11.1, node v10.1.0, node v9.2.0, node v6.3.1)
C# 線上編譯器:https://www.jdoodle.com/compile-c-sharp-online/
(Mono 6.12.0, Mono 6.0.0, Mono 5.10.1, Mono 5.0.0, Mono 4.2.2)

repl.it

網址:https://repl.it/languages
支援語言:Python, Node.js, Javascript, C, Java, C++, Ruby, HTML, CSS, Scheme, Go, Rust…等等,以官網顯示為主。
能否分享程式碼給別人:可以,但是要登入
執行完產生新的頁面:否
有無廣告:無
複製結果:要用滑鼠右鍵複製,可複製完整存文字的結果輸出(macOS 可以順利用 cmd + c)
推薦指數:4.2/5.0

目前 repl.it 是需要你先註冊登入才能夠使用,也可以直接用下面幾個我常用的程式語言點進去,
Python 3 線上編譯器:https://repl.it/languages/python3 (python 3.8.2)
C++ 線上編譯器:https://repl.it/languages/cpp (clang 7.0.0)
Java 線上編譯器:https://replit.com/languages/java (OpenJDK 11)
Javascript 線上編譯器:https://replit.com/languages/javascript (node v12.16.1)
C# 線上編譯器:https://replit.com/languages/csharp (Mono 6.8)

其它相關文章推薦
如果你對學習 Python 相關技術,可以參考看看我的 Python 教學文章
另外如果你對學習 C/C++ 相關技術,可以參考看看我的 C/C++ 教學文章
如果我的整理對你有幫助的話請分享與 Facebook 按讚支持一下!

Ubuntu 安裝 gcc/g++,gcc/g++ 多版本切換

本篇介紹 Ubuntu 安裝 gcc/g++ 以及 gcc/g++ 多版本切換方式,

使用 apt-get 安装最新版本的 gcc

使用 apt-get 安装最新版本的 gcc 與 g++ 指令如下,安裝前記得先 apt-get update 一下,

1
2
sudo apt-get update
sudo apt-get install gcc g++

使用 apt-get 安装指定的 gcc/g++ 版本

以我 ubuntu 16.04 為例,可以安裝的版本如下,

1
2
3
4
sudo apt-get install gcc-4.7 g++-4.7
sudo apt-get install gcc-4.8 g++-4.7
sudo apt-get install gcc-4.9 g++-4.7
sudo apt-get install gcc-5 g++-5

那怎麼看可以安裝哪幾種版本呢?
apt-cache showpkg gcc 列出來的資訊不太準,我用 apt-cache search gcc 列出來以後自己慢慢看比較準,不過需要一些經驗,用 apt-cache showpkg gcc | grep ^gcc- 列出 gcc- 開頭,或者 apt-cache showpkg gcc | grep ^gcc-[0-9] 列出 gcc-0 開頭 ~ gcc-9 開頭的選項,這樣看會比較輕鬆。

切換不同版本的 gcc/g++

假如你系統已經裝了兩個版本或以上的 gcc,例如已經裝了 gcc-4.7 與 gcc-5,你可以直接使用 g++-4.7g++-5 來編譯 C++ 程式,或者你可以透過下列方式來選擇預設 gcc/g++ 要使用哪個版本,假設我要把 gcc-5 作為我的預設 gcc,就輸入這樣的指令,把 gcc-4.7 優先權設定為 47,gcc-5 優先權設為 50 (越高越優先),

1
2
3
4
# gcc-4.7 g++-4.7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 47 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
# gcc-5 g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 --slave /usr/bin/g++ g++ /usr/bin/g++-5

這邊我是一起設定 gcc 與 g++ 一起作動,你可以單獨分開設定,後面不要加 --slave 就可,

這時候你可以用 gcc --versiong++ --version 指令來檢查確認一下當前 gcc 使用的版本,

1
2
3
4
5
6
7
8
9
10
11
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

輸入 sudo update-alternatives --config gcc 來選擇使用哪一種版本

1
2
3
4
5
6
7
8
9
10
$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/gcc-5 50 auto mode
1 /usr/bin/gcc-4.7 47 manual mode
2 /usr/bin/gcc-5 50 manual mode

Press <enter> to keep the current choice[*], or type selection number:

然後在 selection number: 輸入 1 按 enter 的話,會手動切換成 gcc-4.7 與 g++-4.7(原本為 0 自動模式是按優先權決定)之後再用 gcc --version 去確認一下當前 gcc 使用的版本應該就切換成 gcc-4.7 了,

1
2
3
4
5
$ gcc --version
gcc (Ubuntu/Linaro 4.7.4-3ubuntu12) 4.7.4
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gcc update-alternatives 連動更多相關程式的版本

稍早有介紹將 gcc 與 g++ 的版本使用 update-alternatives 一起連動,但通常還有更多的 gcc 相關工具也要一起連動,例如:gcc-ar、gcc-nm 等等,以下提供一個方便的腳本來連動這些事情,有些執行檔舊版本不一定有,可以註解掉,挑選你想要連動的相關程式就好,

update-alternatives-gcc.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env bash

function update-alternatives-gcc() {
local version=$1
local priority=$2

update-alternatives \
--install /usr/bin/gcc gcc /usr/bin/gcc-${version} ${priority} \
--slave /usr/bin/g++ g++ /usr/bin/g++-${version} \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${version} \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-${version} \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${version} \
--slave /usr/bin/gcov gcov /usr/bin/gcov-${version} \
--slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${version} \
--slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-${version} \
--slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-${version} \
--slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-${version}
}

update-alternatives-gcc $1 $2

例如我要將 gcc-4.7、g++-4.7、gcc-ar-4.7、gcc-nm-4.7 … 加入 update-alternatives --config gcc 的選項裡的話,執行 update-alternatives-gcc.sh 腳本後面接上版本優先權這樣就可以了!

1
sudo update-alternatives-gcc.sh 4.7 47

如果是要將 gcc-5、g++-5 … 加入 update-alternatives --config clang 的選項裡的話,就這樣下,

1
sudo update-alternatives-gcc.sh 5 50

其他參考
update-alternatives · GitHub
https://gist.github.com/lopesivan/6f638631552ed7090e2236cd83358028

其它相關文章推薦
Ubuntu 安裝 clang,clang 多版本切換

WHOIS 查詢網域到期

本篇介紹幾個 WHOIS 網站可以查詢網域到期日期,以及註冊日期,查看網站由誰擁有,除了網站之外還有 whois 的指令,本篇也會順便一起介紹 whois 的指令怎麼使用,

GoDaddy

https://tw.godaddy.com/whois

PCHome

http://myname.pchome.com.tw/tool/whois.htm

whois365

https://www.whois365.com/tw/

用 whois 指令查詢

在 linux 下直接使用 whois 指令,用法如下,Ubuntu 如果沒有裝 whois 指令的話可以透過 sudo apt install whois 來安裝,

1
$ whois <domain name>

請自己將網址去掉 http 或 https ,www 也去掉,這樣才是 domain name,例如:

1
$ whois pchome.com.tw

在 windows 內建沒有 whois 指令,要去微軟官網下載,作業系統最低需求至少 Windows Vista 以上,表示 Windows 7/10 可以用,

將 WhoIs.zip 工具下載後解壓縮,將 Whois.exe 檔案放到 C:\\windows\system32C:\\winnt\system32 這樣命令提示符 console 就可以使用。

電源供應器單獨啟動電源?

本篇紀錄如何讓電源供應器單獨啟動電源?以及用圖示意電源供應器啟動腳位在哪個孔。
最近我的桌機有莫名的小噪音,像是風散轉動的基基基聲,但我的電腦已經沒有獨立顯示卡,所以剩下的可能性只剩電源供應器與CPU風扇,

後來想到一個方法就是我先想辦法讓電源供應器單獨啟動電源,再看看還有沒有這個噪音就知道是不是電源供應器的風散問題了

在上網查了一番資料,在這篇知道怎麼讓電源供應器單獨啟動電源了,以下介紹電源供應器啟動腳位,
先了解你的插頭是20Pin還是24Pin的,將 PS_ON# 腳位和 COM 腳位連通即可,
第一版本20Pin: 如下圖,右邊第二列第4腳位與第5腳位接在一起
第二版本24Pin: 如下圖,右邊第二列第4腳位與第5腳位接在一起
(不用管什麼顏色,每個牌子顏色都不太一樣,但是每支腳位的功能一定是一樣的)

(圖片來源:Mobile01)

或者「面向插頭,插銷扣向上」,上排左邊數來第4腳位與第5腳位接在一起

(圖片來源:Mobile01)

先把電源供應器斷電,拿隻迴紋針將 PS_ON# 這支接腳和 COM 腳位接在一起就可以開機了,怕被電就先插好迴紋針再開POWER,測試玩在關POWER即可。

參考
電源供應器風扇噪音問題 - Mobile01
https://www.mobile01.com/topicdetail.php?f=501&t=5599821
ATX 電源供應器手動啟動(不接主機板啟動) - 電腦各種硬體討論 - 麻辣家族討論版版
http://forum.twbts.com/thread-188-1-1.html
電腦有噪音?如何更換電源散熱風扇? @ Xian的家 :: 隨意窩 Xuite日誌
https://blog.xuite.net/axian/blog/304229272

C/C++ 3個求最大值的方法

本篇介紹 C/C++ 3 個求最大值的方法,分別為兩數求最大值、傳統陣列求最大值以及 C++ vector 求最大值。

兩數求最大值的方法

以下為兩數中求最大值的方法,要自己寫一個 max 函式也不是不行,只是如果想快速開發的話,使用 std::max 會方便快速些,不需要遇到每種類型的 max 都要寫一遍,使用 std::max 即可應付各種變數類型,

cpp-find-max-value.cpp
1
2
3
4
5
6
7
8
9
10
11
12
// g++ cpp-find-max-value.cpp -o a.out
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
cout << std::max(3, 5) << "\n";
cout << std::max(10, 6) << "\n";
cout << std::max(15.6f, 17.1f) << "\n";
return 0;
}

輸出:

1
2
3
5
10
17.1

以上面的例子,整數與浮點數都能處理,
關於 C++ std::max 的更詳細的用法與範例可參考我之前寫的這篇

傳統陣列求最大值的方法

以下為標準 C 在陣列中求最大值的方法,
一開始準備好一個陣列後,接下來就是在這個陣列中找出最大值,先將 max 值等於陣列的第一個值,如果一路尋找下來都沒有比這個值還大的話,那麼它就是最大值。

接下來用迴圈在 num 裡尋找有沒有比當前的 max 值還要大的數值,有的話就更新一下目前最大的 max 值。

等到迴圈迭代完後,該 max 值就是這個陣列中的最大值了。

cpp-find-max-value2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ cpp-find-max-value2.cpp -o a.out
#include <iostream>

using namespace std;

int main() {
int num[6] = {4,2,-6,5,1,3};
int max = num[0];
for (int i=1; i<6; i++) {
if (num[i] > max)
max = num[i];
}
cout << "max: " << max << "\n";
return 0;
}

輸出:

1
max: 5

C++ vector 求最大值的方法

以下為 C++ vector 求最大值的方法,使用 C++ 的好處是內建的 STL 有很多函式庫供你使用,但前提是要會使用,就像有車子可開但不會開車也是枉然,但學會開車能讓你比起走路或騎車達到目的地的時間大幅縮短,寫程式遇到要急迫快速開發的情況時,這時對於 STL 的掌握精準度就變得很重要,以下就來示範使用 C++ std::max_element 在 vector 容器裡求最大值,

宣告好 vector 容器並初始化填好元素後,使用 std::max_element 並指定範圍是 v 的最頭部到最尾部,完畢後的 result 迭代器就是指向最大值的元素了,

cpp-find-max-value3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ cpp-find-max-value3.cpp -o a.out -std=c++11
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
std::vector<int> v{4,2,-6,5,1,3};
std::vector<int>::iterator result;

result = std::max_element(v.begin(), v.end());
std::cout << "max element: " << *result << "\n";
return 0;
}

輸出結果同上。

以上就是 C/C++ 3個求最大值的方法介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
關於 C++ std::max_element 更詳細的用法與範例請看這篇

其他參考
std::max_element - cppreference.com
https://en.cppreference.com/w/cpp/algorithm/max_element
max_element - C++ Reference
http://www.cplusplus.com/reference/algorithm/max_element/
c++ - std::array finding max value function - Stack Overflow
https://stackoverflow.com/questions/33344566/stdarray-finding-max-value-function

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::max_element 用法與範例
std::max 用法與範例
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ 類別樣板 class template
std::sort 用法與範例
std::find 用法與範例
std::queue 用法與範例
std::map 用法與範例

C++ static_assert 與 assert 的差異

本篇 ShengYu 來介紹 C++ static_assert 與 assert 的差異,assert 是 C/C++ 都有的巨集,static_assert 是 C++11 才新增的,

assert 的用法

assert 會在執行時間測試判斷陳述句,這邊來複習一下 assert 的用法,assert() 是如果它的條件陳述句回傳 false 的話會輸出錯誤訊息到 stderr 然後呼叫 abort 結束程式執行,

assert 最常是使用在檢查空指標 assert(p != NULL)
這邊我們示範是檢查 n 變數數值的大小,用來確保程式執行到這個時間點時數值應該是我們所預期的範圍,

C 要用 assert 需引用 <assert.h>,C++ 要用 assert 請引用 <cassert>
要關閉 assert 的話,在引用 <cassert> 前定義 #define NDEBUG,assert 就會被關閉,

cpp-assert.cpp
1
2
3
4
5
6
7
8
9
10
// g++ cpp-assert.cpp -o a.out
#include <iostream>
#include <cassert>

int main() {
int n = 5;
assert(n > 10);
std::cout << n << "\n";
return 0;
}

執行時期的錯誤輸出如下,

1
2
cpp-assert: cpp-assert.cpp:9: int main(): Assertion `n > 10' failed.
Aborted (core dumped)

在 C++ 11 前靜態檢查的作法

這邊舉個最常會用到靜態檢查的例子,就是檢查 struct 的大小,就是我要確保程式在別的平台下 struct AAA 的大小也要是 8,但是用 assert 的話是執行到 assert 這一行才判斷的,如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ cpp-assert2.cpp -o a.out
#include <iostream>
#include <cassert>

struct AAA {
int a; // 4 bytes
int b; // 4 bytes
}; // 8 bytes

int main() {
assert(sizeof(struct AAA) == 8);
std::cout << sizeof(struct AAA) << "\n";
return 0;
}

可是 struct 的大小這件事是在編譯時期就可以知道的事,為什麼不能在編譯時期檢查提早發現呢?

所以這邊利用了前置處理器的技巧來達成這件事,在 C++ 11 之前就會是這樣子寫,

cpp-assert3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ cpp-assert3.cpp -o a.out
#include <iostream>
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]

struct AAA {
int a; // 4 bytes
int b; // 4 bytes
}; // 8 bytes

int main() {
C_ASSERT(sizeof(struct AAA) == 8);
std::cout << sizeof(struct AAA) << "\n";
return 0;
}

看見上方的 #define C_ASSERT 的範例,我們可以瞭解在前置處理階段時先來判斷陳述句,

如果改成 C_ASSERT(sizeof(struct AAA) == 10) 的話,就會出現下面這樣的編譯錯誤訊息,

1
2
3
4
5
6
7
cpp-assert3.cpp: In function ‘int main()’:
cpp-assert3.cpp:3:55: error: size of array ‘__C_ASSERT__’ is negative
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
^
cpp-assert3.cpp:11:5: note: in expansion of macro ‘C_ASSERT’
C_ASSERT(sizeof(struct AAA) == 10);
^

這樣就達成了編譯時期的靜態檢查,除了上述的使用場合,也常使用來

  • 檢查兩個 struct C_ASSERT(sizeof(struct_a) == sizeof(struct_b))
  • 檢查兩個 array C_ASSERT(sizeof(arrar1) == sizeof(array2))
  • 宣告的緩衝大小是否超過路徑的最大長度 C_ASSERT(buffer_size <= MAX_PATH)
    等等這些情形。

C++11 把 static_assert 納入標準後,我們就不需要使用各平台或各函式庫各自實作的 static assert,使得更容易地跨平台開發。

C++ 11 static_assert 的用法

C++11 的 static_assert 宣告會在編譯時期測試判斷陳述句,
由於編譯器已知 struct AAA 結構的大小,因此會立即計算運算式的值。

cpp-static_assert.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ cpp-static_assert.cpp -o a.out -std=c++11
#include <iostream>

struct AAA {
int a; // 4 bytes
int b; // 4 bytes
}; // 8 bytes

int main() {
static_assert(sizeof(struct AAA) == 8, "struct AAA size is not 8 bytes");
std::cout << sizeof(struct AAA) << "\n";
return 0;
}

執行結果為,

1
8

如果把改成 sizeof(struct AAA) == 10呢?編譯時期就會報錯,錯誤輸出如下,

1
2
3
4
cpp-static_assert.cpp: In function ‘int main()’:
cpp-static_assert.cpp:10:5: error: static assertion failed: struct AAA size is not 8 bytes
static_assert(sizeof(struct AAA) == 10, "struct AAA size is not 8 bytes");
^

總結

總結一下,static_assert 是 compile time 編譯時期來檢查陳述句 statement,而 assert 是 run time 執行時期來檢查陳述句 statement。

以上就是 C++ static_assert 與 assert 的差異介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 字串轉數字的4種方法
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ 類別樣板 class template
std::sort 用法與範例
std::find 用法與範例
std::queue 用法與範例
std::map 用法與範例

Python 寫入 yaml 檔案

本篇介紹如何用 Python 寫入 yaml 檔案,yaml 檔案格式是常用設定檔格式,以下將示範如何用 python 搭配 yaml 套件的 yaml.dump() 來寫入 yaml 檔案。

PyPI:https://pypi.org/project/PyYAML/
Github:https://github.com/yaml/pyyaml/

安裝方式

透過 pip 安裝 pyyaml,注意在程式裡是 import yaml

1
pip install pyyaml

寫入 yaml 檔案

以下示範寫入 yaml 檔案,首先要準備好資料存放在字典 dict 裡,之後在使用 yaml.dump() 寫入檔案,
程式碼如下:

python3-yaml-write.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import yaml

d = {'name':'Amy', 'age':'20', 'languages':['English', 'French']}

with open('output.yaml', 'w') as f:
yaml.dump(d, f)

輸出的 output.yaml 如下,

output.yaml
1
2
3
age: '20'
languages: [English, French]
name: Amy

下一篇介紹 讀取 yaml 檔案

其他參考
PyYAML Documentation
https://pyyaml.org/wiki/PyYAMLDocumentation

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

std::max_element 用法與範例

本篇介紹 C++ std::max_element 的用法與範例,

傳統陣列用 std::max_element

以下為傳統陣列使用 std::max_element 的用法,

std-max_element.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ std-max_element.cpp -o a.out
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
int num[] = {3, 1, -14, 1, 5, 9};
int len = sizeof(num) / sizeof(int);
std::cout << "max element: " <<
*std::max_element(num, num+len) << "\n";
return 0;
}

輸出:

1
max element: 9

vector 用 std::max_element

以下是在 C++ vector 容器裡使用 std::max_element 找最大值的範例,std::max_element 會回傳一個迭代器,這個迭代器會指向該容器範圍內最大值的元素,

std-max_element2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ std-max_element2.cpp -o a.out -std=c++11
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
std::vector<int> v{3, 1, -14, 1, 5, 9};
std::vector<int>::iterator result;

result = std::max_element(v.begin(), v.end());
std::cout << "max element: " << *result << "\n";
return 0;
}

進階(懶人)寫法,直接跳過迭代器

這是比較進階(懶人)的寫法,直接回傳指向的元素並且複製到新的 max 變數裡,

std-max_element3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ std-max_element3.cpp -o a.out -std=c++11
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
std::vector<int> v{3, 1, -14, 1, 5, 9};

int max = *std::max_element(v.begin(), v.end());
std::cout << "max element: " << max << "\n";
return 0;
}

以上就是 std::max_element 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
std::max_element - cppreference.com
https://en.cppreference.com/w/cpp/algorithm/max_element
max_element - C++ Reference
http://www.cplusplus.com/reference/algorithm/max_element/
c++ - std::array finding max value function - Stack Overflow
https://stackoverflow.com/questions/33344566/stdarray-finding-max-value-function
C++ max_element函数找最大元素 min_element函数找最小元素 STL算法_A_Eagle的专栏-CSDN博客
https://blog.csdn.net/A_Eagle/article/details/7373165

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::max 用法與範例
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ 類別樣板 class template
std::sort 用法與範例
std::find 用法與範例
std::queue 用法與範例
std::map 用法與範例

Python while 迴圈用法與範例

本篇 ShengYu 介紹 Python while 迴圈的用法與範例,在寫 Python 程式時重複性的事情就會使用到迴圈。跟 for 迴圈相比,while 迴圈適用於不清楚迴圈次數要執行幾次的情形,接下來的教學將介紹如何使用 Python 寫 while 迴圈。

基本的 while 迴圈寫法

最簡單的 while 迴圈寫法如下,

1
2
while 條件判斷式:
# 程式碼

while 後的條件判斷式(conditions)會決定迴圈是否繼續執行,如果條件判斷式的結果為 True 就會繼續執行迴圈內容,如果條件判斷式的結果為 False 就會離開迴圈,

下面舉個範例,當 count 小於 5 時就繼續執行 while 迴圈,並且印出 count 值,直到 count 等於或大於 5 就結束 while 迴圈繼續往下執行,

1
2
3
4
count = 0
while (count < 5):
print('Count:' + str(count))
count += 1

輸出結果如下,

1
2
3
4
5
Count:0
Count:1
Count:2
Count:3
Count:4

while 迴圈搭配 else 語法

我們來看另一個例子,while … else 的用法是在條件判斷式為 False 時執行 else 語句區塊的程式碼,

1
2
3
4
while 條件判斷式:
# 程式碼
else:
# 迴圈結束時會執行這裡, 但 break 跳離時不會執行到這裡

這邊舉個例子,當 count 小於 5 時就繼續執行迴圈,並且印出 count 值,直到 count 等於或大於 5 就執行 else 程式碼區塊然後繼續往下執行,

1
2
3
4
5
6
count = 0
while (count < 5):
print('Count:' + str(count))
count += 1
else:
print('else, Count:' + str(count))

輸出結果如下,

1
2
3
4
5
6
Count:0
Count:1
Count:2
Count:3
Count:4
else, Count:5

無窮迴圈的寫法

要寫無窮迴圈的寫法就是把條件判斷式的結果弄成 True,所以一般大概都這麼寫,但通常會配合一個 break 來跳離結束這個迴圈,

1
2
3
4
while True:
# 程式碼
if 條件判斷式:
break

下一篇將介紹 function 函式

其它相關文章推薦
Python 新手入門教學懶人包
Python 取得鍵盤輸入 input
Python if else elif 用法教學與範例
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例
Python 讀檔,讀取 txt 文字檔
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python PIL 讀取圖片並顯示
Python OpenCV resize 圖片縮放