2017年3月20日 星期一

operator 取值與取址的重載

operator 取值與取址的重載

tags: C++ Concept
直接存取
operator T&()
與地址獲取
T* operator&()
你可以透過重載這兩個直接讓物件的存取等於物件成員的存取
如以下代碼,存取 a 的操作就完全等於存取 j 的操作
/*****************************************************************
Name : 
Date : 2017/03/20
By   : CharlotteHonG
Final: 2017/03/20
*****************************************************************/
#include <iostream>
#include <memory>

using namespace std;

template<typename T>
class Test{
public:
    // 建構
    Test(){
        cout << "this=" << this << endl;
        cout << "i=" << &i << endl;
        cout << "j=" << &j << endl;
        cout << endl;
    }
public:
    // 重載
    operator T&(){
        cout << "operator T&() : ";
        return j;
    }
    T* operator&(){
        cout << "T& operator&() : ";
        return &j;
    }
private:
    //init since c++11
    T i=1;
    T j=2;
};
/*=======================================================*/
int main(int argc, char const *argv[]){
    Test<int> a;
    // 呼叫 operator T&()
    cout << "a=" << a << endl;

    // 呼叫 T* operator&()
    cout << "a=" << &a << endl;

    // 在已經被重載的情況下取得真實地址
    cout << "real add=" << addressof(a) << endl;
    return 0;
}
/*=======================================================*/
執行結果
this=0x61fe30
i=0x61fe30
j=0x61fe34

operator T&() : a=2
T& operator&() : a=0x61fe34
real add=0x61fe30

2017年3月19日 星期日

C++ template 如何實現拆檔

template 如何實現拆檔

tags: C++ Concept
拆檔有兩種一種是在硬碟上拆檔,一種是在編譯時拆檔,兩者有很大的不同。

方法一

最簡單的方式,僅實現硬碟上拆檔實際編譯時仍然是一個檔案
// File "foo.h"
template<typename T>
void foo();
#include "foo.cpp"
// File "main.cpp"
#include "foo.h"
int main(){
  foo<int>();
}
// File "foo.cpp"
#include <iostream>
template<typename T>
void foo(){
  std::cout << "Here I am!\n";
}
使用命令
g++ main.cpp
在 Visual Studio 上就是別讓引入的檔案出現在左邊欄位即可,然後引入的檔案要複製到路徑內。


方法二

表明樣板的型態,這樣可以完全拆成兩個檔案,不過修改比較麻煩些也不自由
// File "foo.h"
template<typename T>
void foo();
// File "main.cpp"
#include "foo.h"
int main(){
  foo<int>();
}
// File "foo.cpp"
#include <iostream>
#include "foo.h"

template<typename T>
void foo(){
  std::cout << "Here I am!\n";
}
template void foo<int>();
使用命令
g++ main.cpp foo.cpp


2017年3月18日 星期六

光陽 G5 超5 雷霆 自動彈起坐墊 無力原因 及 維修費用

光陽 G5 超5 雷霆 自動彈起坐墊 無力原因


大概用個一年左右彈力就會開始慢慢減弱了,起初我也以為是彈簧疲乏了,最近因為坐墊完全壞了,更新全新坐墊,在沒有更換彈簧的情況下居然完全好了。

會出現的狀況(懶人包)

  • 彈力減弱
  • 無法開到接近90度
  • 蓋起來的時候會卡住(勾勾的位置向前移動導致沒對準洞口)
  • 開啟有喀嚓異音
以上都是坐墊鎖點斷裂造成的
車齡5年多,車廂已無力自動彈起,在只更換座墊的前提下卻完全恢復彈力,可以證實彈簧是不會疲乏的。
這種車種不能壓車廂他很脆弱,如果放太滿蓋不起來一壓下場就是直接小裂;小裂痕只會導致彈起無力不會導致損壞。

照片


如圖我的幾乎是全裂開的狀態了,判定完全沒救了我也不掙扎了直接買新的

這是剛拆下來的狀態,完全卡死陷入坐墊內,明顯斷裂

需要料號的可以看坐墊上就有編號了
更換全新坐墊後馬上恢復到新車的彈力

症狀

第一階段

如果開始無力了,可能是已經開始有裂縫了,我大概用了3年左右,即便無力也還是可以用很久就是了,這個狀態倒是不用擔心壞掉,就只是無力而已,也不會在繼續壞。
可以透過調整上方的螺絲恢復彈力,不過可能也會導致裂的更快

第二階段

後來曾經倒車過,坐墊有彈出撞到,從那時候開始就變得有一點點卡的,這是第二階段,沒撞到或硬壓應該不用擔心會到這個階段。
這個階段開始就是一條不歸路了他會慢慢邁向全斷;最初只是蓋起來緊緊的需要出一點力氣壓一下,車廂開啟後也不會自動彈起,需要手動拉一下拉開才會談起,並且可以觀察到坐墊後方的小勾勾向前偏移,這是導致卡卡的主因。
我這種狀態大概持續了兩年,然就全斷了。

第三階段

後來越來越嚴重這是第三階段,新車的時候車廂可以打開接近90度,這個階段只能打開45度左右,角度會越來越小蓋起來卡的程度也會越來越卡;我直到最近完全開不起來,就是卡死只能開一點點縫隙,拆下來的時候已經如上圖那樣了。
可以根據你打開的角度來判定裂縫的嚴重程度
千萬注意這種彈簧車種絕對不能壓車廂,有東西蓋不起來硬蓋下場就是直接斷坐墊

價錢

原廠雙色一般大概 $1700左右,單色便宜 $150左右,副場大概 $1000。
我運氣還不錯有問到雙色 $1500左右比較便宜的店家。
以上是材料錢不含工資
彈簧就不用換了,我換新坐墊沒換彈簧彈力超強,無力都是鎖點內縮導致的。
要注意有分可彈起與不可彈起坐墊(舊版G5),價錢差蠻多的不要貪便宜買錯了。

需要的工具

我當時後是車廂卡死開不起來,我用板手去轉開的,正常還能全開的狀態下一隻10號的六腳起子就可以更新車廂了。總共6顆螺絲固定而已。

可以選色

我是意外朋友沒注意買了紅色的,不至於說不好看,車上也有紅色元素卡鉗與煞車桿,感覺還蠻搭的,就這樣直接上了。
另外我有觀察到上面的紋路不一樣,這一款比較好看。
這一款料號是900的,上面的花紋不一樣,我覺得好看很多

iterator 功用與為什麼要使用 它的必要性在哪裡

iterator 功用與為什麼要使用

tags: C++ Concept
iterator指的是對結構的元件做存取,一般他看起來就像是指標一樣的功能,可實際上只是人對程式的操作行為看起來一樣而已,實際上程式對資料的操作行為是不一樣的。
還有一大誤區就是當使用vector操作時給的反饋是一樣的,儘管他們內部的資料操作行為不一樣。
記住vector是保證記憶體連續的,只要記憶體是連續的就可以直接使用資料指標操作取得正確結果
在這段程式碼裡面你可以得到相同的結果
/*****************************************************************
Name : 
Date : 2017/03/18
By   : CharlotteHonG
Final: 2017/03/18
*****************************************************************/
#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main(int argc, char const *argv[]){
    vector<int> a{3, 2, 1};

    vector<int>::iterator it = a.begin();
    for(int i = 0; i < 3; ++i) {
        cout << *(it++) << ", ";
    } cout << endl;

    int* p = &(*a.begin());
    for(int i = 0; i < 3; ++i) {
        cout << *(p++) << ", ";
    } cout << endl;

    return 0;
}
/*==============================================================*/
但這並不代表他們是一樣的操作,在list的結構內並不保證資料的連續性,此時你並不能透過
由第一個頭地址++,推算第二筆資料位置
你根本不知道他們在記憶體的那些地方,透過 iterator 可以幫你獲取正確的位址
/*****************************************************************
Name : 
Date : 2017/03/18
By   : CharlotteHonG
Final: 2017/03/18
*****************************************************************/
#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main(int argc, char const *argv[]){
    list<int> a{3, 2, 1};

    list<int>::iterator it = a.begin();
    for(int i = 0; i < 3; ++i) {
        cout << *(it++) << ", ";
    } cout << endl;

    int* p = &(*a.begin());
    for(int i = 0; i < 3; ++i) {
        cout << *(p++) << ", ";
    } cout << endl;

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

2017年3月11日 星期六

NVIDIA HDMI 螢幕偏白

NVIDIA HDMI 螢幕偏白


NVIDIA 使用HDMI預設會是電視模式,輸出並不是 0~255 會顯得偏白,接上電腦螢幕手動到驅動內設定
如果設定了還是沒有作用可能是驅動程式問題,更新到最新版就好了

筆記型電腦

筆記型電腦的 nvidia 選項會看不到上圖選項,他包含在Initel的驅動內,可以參考這裡。

2017年3月9日 星期四

你的帳號存在異常,需要邀請一位微信用戶輔助驗證你的身分後才能解除限制

你的帳號存在異常,需要邀請一位微信用戶輔助驗證你的身分後才能解除限制


我是沒驗證就解鎖了,實際原因我也不清楚,我把過程記錄下來不是確定的解法。
真的要解封可以到 淘寶搜尋微信解封 有專門在做這個的賣家,可以花錢解決這個問題。
有讀者反映,改版後就算被鎖了也可以登入微信,並且可以在內直接購買電話卡之類的儲值卡,如果裡面有太多錢,可以購買這些卡再售出把錢轉出來。

微信帳戶一早醒來就被封鎖…
根據提示要找一個條件很嚴苛的帳號解封
  • 微信帳號註冊時間長於半年並正常使用
  • 微信號已經綁定銀行卡
  • 近期沒有超出輔助驗證次數限制 (1次/月、2次/6個月、3次/年)
有幾個帳號是綁訂微信帳號的,等同於一起被封鎖…

貌似還有另一種版本的解鎖條件

  • 兩位朋友
  • 綁銀行卡1年以上
驗證者驗證時需輸入自己的大陸身分證
由此推論估計我的狀況應該也要大陸身分證…
所以沒大陸朋友帳號差不多就半永封了

解決過程

因為莫名其妙就好了,這是記錄下來的過程
這裡會要你輸入,我輸入的微信號是中國門號 (不知道台灣號有沒有影響)
之後就怎麼樣對方都收不到訊息,簡訊也沒有
他要我試試看別人,可是我這邊沒辦法輸入下一個人;大概等了2~3小時左右,再次進入彈出超過驗證時間類似的訊息,回到一開始要你輸入手機號的畫面,
之後我做了兩件事 (也可能是不相干的事)
  • 把手機網路轉為4G網路而不使用Wifi (因為wifi開得到專欄會怪怪的)
  • 微信一直待在上圖第二個畫面,之後我回到手機首頁,點擊微信開啟,結果他就回到輸入帳密頁面了,等待驗證的頁面被洗掉了。
然後就這樣過了好一段時間,等待下一位朋友答覆我;答覆我之後,我向他要了手機號,一樣回到微信登陸,結果就進去了。

總結一下過程

  • 輸入大陸門號
  • 使用3G/4G網路
  • 跳出超時之後縮小微信由圖示重啟

2017年3月6日 星期一

關閉 Windwos Defender 即時保護或掃描

關閉 Windwos Defender 即時保護或掃描


有兩種方式的關閉,一種是關閉即時掃描,執行軟體時不會跑出來擋你,這種情況下他還會自動在一定時間,快速掃描一次電腦。另一種就真的完全關閉了。
搜尋群組原則
關閉即時掃描
這部分先前的文章有寫過一篇,透過軟體關閉的執行即可。可以參考站內連結
完全關閉