迷いませんか?

継続しないを座右の銘に

vectorをinsertしようとしたらabortしたから原因と直し方

vector結合しようとしたらabortした

abortっていうのはwhat(): vector::_M_range_insertってのが出てくるやつです
これが起こるときの例はこちらです

class Test{
private:
    vector<int> v;
public:
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    コンストラクタとか
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    vector<int> getVector();
};

int main(void){
    Test t;
    vector<int> v2; 
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    Testのvとv2は適当に初期化
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    v2.insert(v2.end, t.getVector().begin(), t.getVector().end());

    return 0;
}

こんな感じです
〜〜〜〜で区切ってるところは中略と思ってください
t.getVector()とやった時に返ってくる値は、vのコピーであるため、
一回目と二回目のt.getVector()は違うものです!!!
内容は同じかもしれないけれど、begin()、end()が変わってきます!!!
ならどうすればいいのか?

コピーが返ってくるならコピーを返さなければいいじゃない

ということです!
つまり、

//before
    vector<int> getVector();
//after
    const vector<int>& getVector();

でいいです

仮想クラスをデリートするときのワーニング

ゲーム作成をしてたら、ワーニングが発生したので一応直し方
正直、有名だとは思うけど

warning: deleting object of abstract class type ’xxx ’ 
   which has non-virtual destructor will cause undefined behaviour

というワーニングが発生した
これはxxxという仮想クラスであるクラスをdeleteしようとすると発生した
こちらの場合はファクトリーメソッドを使用していたため、仮想クラスに派生クラスを入れていた

まあわざわざ備忘録として書くほどでもないと思うけれども
そのまま書いているように、

仮想クラスの型である’xxx ’をdeleteしていますが、
仮想でないデストラクタを持っているため、未定義の動作を起こすかもしれない

みたいなことです なので、デストラクタをvirtualにするだけでワーニングは消えた

P.S.
赤軸は使いやすいけれども
タイプミスをしかけてやめようとしても間に合わなかったり
底打ちしないように心がけるとタイプできてないことがある
青軸も使ってみたいわ〜

ラジコン〜PS3コントローラ接続編〜

昨日に続いて今日はPS3コントローラ接続編です!
しかし、今日のと明日のは備忘録として残しておきたいので、
2つに分けて残りは明日投稿したいと思います
今日で終わらせる予定だったけど明後日まで掛かりそう

PS3コントローラ接続

基本的に、 工作と小物のガラクタ部屋を参考にしています

まず、Raspbianを使っているのであればこの下のようにやればできます
残りのディストリビューションは知りません
いやー、apt-get便利ですわー

下のコマンドでBluetoothを使えるようになります

sudo apt-get update
sudo apt-get install bluetooth bluez-utils bluez-compat bluez-hcidump
sudo apt-get install libusb-dev libbluetooth-dev

そしてBluetoothが働いてるかチェック

/etc/init.d/bluetooth status
#Bluetooth is runningみたいなのが表示されればOK

#もしも表示されなければ
#下のコマンドを打てばOKだと思う(ヘルプ見た感じ)
/etc/init.d/bluetooth start

PS3コントローラをペアリングするコードをダウンロードしてコンパイルする

wget "http://www.pabr.org/sixlinux/sixpair.c" -O sixpair.c
gcc sixpair.c -o sixpair -lusb

そしたらUSBケーブルでRaspberryPiにコントローラをつないだあと

sudo ./sixpair

でなんかアドレスが出てきたら進む
次はQtsixとかいうのをダウンロードしてインストールする

wget "https://sourceforge.net/projects/qtsixa/files/QtSixA%201.5.1/QtSixA-1.5.1-src.tar.gz/download” -O QtSixA-src.tar.gz
tar zxf QtSixA-src.tar.gz
cd QtSixA-1.5.1/sixad
make
sudo make install

sudo sixad -start

最後の行はsixadを起動してるけど、そしたらPSボタンをおして
Connect〜〜〜みたいなのが表示されるのを待つ、
表示されなければやり直し
表示されたら自分の場合は勝手に終わらなかったのでCtrl+Cで強制終了しました
ここまでやれば/dev/input/js0にコントローラの入力などの情報が表示されてる(バイナリ)

長くなったので一回切る
明日は、コントローラの何ボタンが押されているのかという情報を受け取るコードを載せる予定です

Written with StackEdit