2019年7月2日 星期二

C 動態陣列 範例與解說

C 動態陣列 範例與解說

其實是看到有人在社團問問題,順道寫了程式,不過當我弄完的時候才發現早就關閉回應了QQ
好吧自己發部落格XD

動態陣列

顧名思義,意思是說當你需要用到多大的陣列才向系統要求多大的記憶體,一般如果直接寫在宣告上的陣列,是程序一打開的瞬間就向系統要求記憶體,這種一開始就要求的記憶體是有限的不能塞太大的。
其次使用動態陣列也可以節省空間,如果初期並不知道空間大小,而是計算後才能知道總共要多大,直接寫在宣告上,只能多寫一點避免到時候不夠。動態陣列就沒關係了,程序執行後計算出來再要求記憶體即可。

宣告方法

介紹最基本的兩個函式
int* p=NULL;
int len=5;

// 要求空間
p = (int*)calloc(len, sizeof(int));     // 陣列內容會初始化為0
p = (int*)malloc(len* sizeof(int));   // 陣列內容不會初始化,可能是亂碼垃圾值
兩個簡單就差別是否初始化,根據使用情況調整使用就好,其中要注意的是 malloc 只有一個參數,calloc則是有兩個參數,所以可以看到其中一個是逗號跟乘號(這不是打錯)。

檢測

獲取之後就可以使用了,但是再使用前要先檢查是否有成功要到記憶體,電腦的記憶體是有限的,如果你要求一個超大的,大於當前記憶體容量,系統不會給你的,這種情況下函式會返回NULL,所以類似於底下的方法就可以檢測是否成功。
if(p){
    printf("成功");
} else {
    printf("失敗");
}
當然啦現在電腦記憶體都很大,寫作業基本上應該是不會遇到NULL的情況,但是即便如此,我還是建議你養成習慣寫一下,以後寫大專案的時候你會感謝你自己的。
另外記憶體的不足不只發生在記憶體空間不構的情況,如果程序長時間運行,不斷的解構重購,會造成記憶體破碎,就是說一段有使用,一段沒使用,記憶體中間是有間格的,上述的兩種要求方法,要求的情況是連續記憶體,在這種記憶體破碎嚴重的情況下,即便記憶體充足也可能要不到,系統找不到足夠長的連續空間。

使用

使用就很簡單了,要求到的記憶體要用第幾個,直接加上去就好,編譯器會自動幫你計算位置的,最後再使用星號取值即可。
for (int i; i<len; ++i){
    prinf("%d", *(p+i));
}

解構

用完之後要記得把記憶體回收,告訴系統這個我不用了,這樣下次你要求空間的時候,原本這一段也可以被列入使用,不回收的話,這個空間就一直佔著誰也不能用。
如果你再還沒回收之前就把那個記憶體位址給丟失了,也就是那個P你改成別的值,那就再也沒有人知道,那一段記憶體在哪裡,你就沒有辦法釋放那塊記憶體了,這種情況叫做 memroy leak。
倒是不用擔心練習程式忘記釋放記憶體,結果記憶體被偷吃滿,以目前的作業系統來說是會自動幫你把記憶體回收掉的,不會讓你做這種傻事,作業系統知道這隻程式從頭到尾到底要了那些記憶體,既然都把程式關了,當然全部都回收瞜。
解構的方法很簡單,只是一個函式
free(self->p);
self->p=NULL;
free即可解構,後面的設置成NULL是一種保險,也是一種聲明,既然都解構掉了代表這塊記憶體不能用了,還留著指標幹嘛,不知道知情的人傻傻的拿去用了就罪過了(這個叫未定義行為)。當設置成NULL,別人就用不了了,同時也可以用if來判斷已解構。
不要想說反正記憶體充足就不解構,這個習慣真的很重要,以後寫大專案的時候沒有養成習慣,真的會抓蟲抓的不要不要的。不解構甚至過分點leak,不只影響到記憶體用量,有時候還可能導致非預期的行為,導致你抓蟲的時候沒得下手,怎麼想都奇怪,這時候就來不及了,只能加油吧,祝好運XDD。
抓蟲第一件事情,先把釋放還有leak做好,真的是不是開玩笑的,沒有嚴謹的照規矩寫的程式,很多時候補上就莫名其妙好了,然後完全不知道發生什麼了,乾怎麼好了!

範例

最後附上簡單寫的範例,可以對照著參考
/*****************************************************************************
Name : 動態陣列
Date : 2019/07/02
By   : CharlotteHonG
Final: 2019/07/02
*****************************************************************************/
#include <iostream>
using namespace std;

struct Arr {
    int* p;
    int len;
};

void Arr_ctor(Arr* self, int len) {
    int*p = NULL;
    p = (int*)calloc(len, sizeof(int));

    if(p){
        self->p   = p;
        self->len = len;
    } else {
        printf("Error Arr_ctor.");
    }
}
void Arr_set(Arr* self, int idx, int num) {
    int* p = self->p;
    int len = self->len;

    if(idx>=0 && idx < len){
        *(p+idx) = num;
    } else {
        printf("Error Arr_set");
    }
}
void Arr_dtor(Arr* self) {
    free(self->p);
    self->p=NULL;
    self->len=0;
}
void Arr_print(Arr* self) {
    for(size_t i = 0; i < self->len; i++){
        int* p = self->p;
        printf("%d, ", *(p+i));
    } printf("\n");
}
//=============================================================================
int main(int argc, char const* argv[]) {
    // 陣列長度
    int len = 10;

    // 建立陣列 (初始值為0)
    Arr array;
    Arr_ctor(&array, len);
    // 打印
    Arr_print(&array);
    // 更改數值
    for(size_t i = 0; i < len; i++){
        Arr_set(&array, i, i+1);
    }
    // 打印
    Arr_print(&array);
    // 釋放資源
    Arr_dtor(&array);

    return 0;
}
//=============================================================================

2019年6月8日 星期六

如何完整的轉移 安裝 chrome 已下架的擴充套件

如何完整的轉移 安裝 chrome 已下架的擴充套件

我繞了好長一段路,失敗了好幾次都是用封裝的方式,問題在於下架之後是不允許安裝的,
我還特地去弄了如何讓chrome允許第三方的方法
最後也是失敗告場,雖然沒有出現允許打開了,可是打開還是爆掉…….
抽取 chrome 已下架的擴充套件安裝後會顯示錯誤,最後還是失敗收場
最後是我不死心的又測試了一次,終於成功了!
主要的想法之前有看過一篇文章是直接整個資料夾複製下來,不封裝直接轉移到新電腦,然後要把某個資料夾內容刪除,那是原本使用者上的電腦。我找不到這篇文章了,我就沒砍直接整份過來,然後就成功了!連設置也一起過來了,嗚哇天啊太好了。
不過這可能是因為我是使用同一個帳號!不同帳號可能要砍那個資料夾,我印象中記得是 _locales
好啦正文開始,剛剛弄好太開心了,這篇會以 Flavr - Custom New Tab & Google™ Background 來介紹轉移過程。

複製檔案資料

第一步先到你原先有安裝的電腦上的這個位置
%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\Extensions
這是相對位置,直接貼上資料夾上位址處即可,近來之後要找到你的套件的ID
也就是這一個,資料夾名稱就是這個整個複製下來就是了。
然後轉移到新的電腦上,在chrome擴充元件的頁面上先打開,開發人員模式就可以載入為封裝程序了。
這邊要注意,資料夾的位置先想個位置放好,如果事後刪除了該資料夾,那麼在chrome上擴充元件也會失效。
然後就是選到你的資料夾之後按確定就好了!不過我不知道為什麼按第一次之後資料夾消失,且並沒有出現,我是按第二次才好了。

後續

  • 實際上,上一篇系統管理範本是不需要安裝的,我後來移除了了一切正常。
  • 開發人員模式安裝完畢就可以關閉了。
  • 你的擴充元件上面會有一個紅色的標記,說你這是未封裝軟件。

2019年6月3日 星期一

Youtube 自動暫停播放 怎麼讓它不暫停

Youtube 自動暫停播放 怎麼讓它不暫停

不知道什麼時候改版之後YT播放清單變得不像以前可以一直撥了,撥到一定時間之後就自動暫停了,解決辦法是直接安裝插件繼續播放,不過還是會看到暫停畫面就是了,但是會繼續撥。
安裝之後重新啟動瀏覽器就有作用摟~

2019年5月27日 星期一

Adobe Reader 開啟時自動隱藏右邊搜索工具列

Adobe Reader 開啟時自動隱藏右邊搜索工具列

到設定裡面更改這個設置
然後再把右邊的小框框關閉,下次開起的時候就會維持關閉狀態了。

2019年5月3日 星期五

[圖文] Python-OpenCV 4.1.0 安裝配置在 Visual Studio 2019

[圖文] Python-OpenCV 4.1.0 安裝配置在 Visual Studio 2019

如果是配置自己環境上的Python可以參考這篇
https://charlottehong.blogspot.com/2015/08/windows-install-opencv-for-python.html

這篇會從頭開始講~包含怎麼布置python的執行環境。
Visual Studio 2019已經做得相當完備了,功能也簡化了,不再是以前2017與2015版本很多功能可能不是很好使,這會是我優先推薦的編譯器。
唯一的缺陷就是太肥了吧,不過這在VS19也有很大的改善,整理效能損耗減少非常之多,詳細可以搜尋相關文章,至少記憶體需求減少了非常之多,這次微軟真的是猛起來想把VS19做好了。
事前不需要到 Python 官方下載安裝,VS19會自己有自己的Python。如果已經安裝了預設也是使用內建的,但是可以選用自己安裝的Python。

布置環境

首先打開他的環境配置,可以直接在開始搜尋 Visual Studio Installer 這個就可以找到並打開了。
然後按下變更
把這個勾起來就可以使用了,勾好之後右下角的變更按下去就會開始安裝了

運行代碼

然後開打VS,選擇建立新專案
建立之後選擇Python
名稱可以自由修改我這邊是打 OpenCV_Test 打好之後就建立吧
紫色框框的部分是可以自由選擇版本的,這裡的環境是VS自己內建的不是你系統上自己安裝的。
那個下拉選單點擊之後可以新增環境,如果需要用自己系統上安裝的環境,可以手動新增進去然後就可以使用了。
測試可以先隨意打幾行代碼
# -*- coding: utf-8 -*-
print('Test')
然後按下F5就可以執行了

安裝Python套件

點擊python旁邊禮物形狀的按鈕,可以打開套件管理介面。
然後搜尋 opencv-python 安裝 opencv-contrib-python 這個版本,
[1] 左上角看到我有兩個版本 Python2.7 與 Python3.7,這邊2.7版是我自己到官方下載安裝的,內建只會有 Python3.7版)
[2] contrib會多安裝那些在商業上需要付費,但是個人使用免費的函式庫。如果沒用到,安裝最下面那個不帶contrib字樣也是可以使用。
[3] 我有發現VS19安裝好python就自帶numpy了,如果沒有這個要自己安裝。跟上面安裝方法一樣,在套件管理處搜尋 numpy 安裝就可以了。
然後會跳出來說要提高權限,按第一個提高即可。
安裝完畢就貼上測試的代碼試試看
# -*- coding: utf-8 -*-
import cv2
import numpy as np

#  畫布大小
img = np.zeros((720,1280,3), np.uint8)
# (位置),大小,(顏色)粗度
cv2.circle(img,(200,200), 100, (0,0,255), 2)
# (第一個座標)(第二個座標)(顏色),粗度
cv2.rectangle(img,(350,100),(550,300),(0,255,0),3)
# (第一個座標)(第二個座標)(顏色),粗度
cv2.line(img,(600,100),(800,300),(255,0,0),10)

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))

font = cv2.FONT_HERSHEY_SIMPLEX
# (座標),大小,(顏色),粗度
cv2.putText(img,'Charlotte.HonG',(0,500), font, 5,(255,255,255),10)

while(1):
    cv2.imshow('Dring',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()
直接執行吧~
恭喜完成瞜~

2019年4月30日 星期二

打開 word 跳出 the resource dll cannot be loaded

打開 word 跳出 the resource dll cannot be loaded

最近一打開 word 跳出 the resource dll cannot be loaded,不知道怎麼樣突然跳出這樣的警告,選項內有看到日文,猜測可能跟我電腦有改過日文語言有關,紀錄一下解決辦法。
先到選項內,找到增益集,然後依照圖中所選
再來把這個項目取消打勾就好

2019年4月22日 星期一

Google Chrome 如何安裝第三方擴充插件

Google Chrome 如何安裝第三方擴充插件

某些插件被下架之後會看到「這個擴充功能未列在 Chrome 線上應用程式商店」就無法使用了,預設是封鎖的要特別安裝白名單群組原則才能使用。


會發這篇主要是我在用的一個擴充軟件過期被下架了。網路上有給出解法但是關鍵的 chrome.adm 檔案不知道從哪裡來的怕怕的不敢隨意下載,這邊會給出官方的載點,直接到google官方下載最安全。附註,我最後是安裝成功了,可是卻出現錯誤不能打開….
最後的解決辦法可以參考這篇 https://charlottehong.blogspot.com/2019/06/chrome.html

本機群組原則

這個功能要專業版才有,如果不專業版的可以蒐一下網路上的資源,有人從專業版複製出來,手動安裝進去就可以使用了。
篇幅有點長~有空再做這部分教學文章了
在開始前先到官方下載管理範本
https://cloud.google.com/chrome-enterprise/browser/download/?hl=zh-TW

這邊備份一下我自己上傳的版本(20220110)
https://gist.github.com/hunandy14/6d468318ec2fa34c3d3deedd933bb066

在這個地方可以載到
檔案的位置在解壓縮之後的
# 舊版
policy_templates.zip\windows\adm\zh-TW\chrome.adm

# 新版
GoogleChromeEnterpriseBundle64.zip\Configuration\adm\zh-TW\chrome.adm
關鍵在於 chrome.adm 這一份檔案,拿到就可以繼續下一步了
讓我們開始吧

打開你的開始,直接打字搜尋 gpedit.msc 就可以看到了,打開他會看到這個畫面
然後對著系統管理範本按右鍵,點選新增移除範本
選擇 chrome.adm 新增
然後回到chrome上的擴充程式上,可以看到每一個程式都有ID
把你無法安裝被阻擋的擴充程式ID先把它複製下來
然後找到 擴充功能許可清單 點擊兩下開啟
新增擴充程式的ID
然後按下確定輸入即可完成~