サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
画力アップ
meryngii.hatenablog.com
この記事はEEIC Advent Calender 2016の12月22日分として書かれた. CRTPとは C++でのジェネリックプログラミングで広く知られたパターンとして, Curiously Recurring Template Pattern (CRTP) というものがある. この名前は実態から大分かけ離れているので, CRTPが何たるかを要約しておくと次のようになる. 「基底クラスに派生クラスの型を与えると, 基底クラスから派生クラスを触ることができる.」 基本的にはそれだけのことである. それだけのことなのだが, なかなかに興味深い性質を持っているのでわざわざ名前が付いている. template <typename Derived> class base { // ... }; class derived : public base<derived> { // ... }; CR
この記事はeeic Advent Calendar 2015の22日目の記事として書かれた. 最近動画エンコードについてよく聞かれるので,録画PCネタの続編ということで記事にすることにした. 私は動画処理に別段詳しいわけでもなく,専門分野もマルチメディアとはまるで関係ないのだが, x264やFFmpegといった動画変換ソフトウェアの使い方については日頃から色々試してはいるので, とても適当に今まで得た知見をまとめようと思う. おそらくこの記事には間違いも多々含まれているだろうから,コメントは随時募集している. 前置き 去年の夏,気が狂ったように深夜アニメを片っ端から録画してHDDに貯め始めた結果, 我が家の録画PCのHDDはあっという間に満杯になった. 放送波のデータはMPEG-2 TS (Transport Stream, しばしば単にTSと呼ばれる)で送られてくるが, その圧縮率は決し
JNI (Java Native Interface)ネタは、この記事で一応最後です。 前々回は、Javaから渡された配列や文字列を簡単に受け取る方法について述べました。配列の受け渡しに関しては、最悪だと呼び出し毎にネイティブヒープへのコピーが発生する可能性があるので、…
JNI (Java Native Interface)ネタは、この記事で一応最後です。 前々回は、Javaから渡された配列や文字列を簡単に受け取る方法について述べました。配列の受け渡しに関しては、最悪だと呼び出し毎にネイティブヒープへのコピーが発生する可能性があるので、ネイティブ側とVM側のどちらにデータを配置するのが正しいのかを考慮して設計する必要があります。 前回は、C++をJNI経由で呼び出す際の例外処理について述べました。STLに例外が必要となるわけですし、Android等でも基本的には-fexceptionsを有効にしてビルドした方がいいと思います。 さて、ここまでの知識だと、JavaからC言語のインターフェイス経由で関数を呼び出すということは出来ますが、C++のクラスをJavaから管理するとなるともう少し工夫が必要です。今回は、オブジェクト指向なやり方でC++のクラスを利用する
久々に記事を書こうと思い立ったので書きます。ブログという形態が情報共有に適切なのかどうかはさておいて、小さなひらめきであっても何らかの形で記録していかなければ自分の糧にならない、と改めて感じている今日この頃です。 最近Android NDKで作業する機会を得ていまして、C++をモリモリ書ける喜びを感じています。Androidデバイス本来の力を生かすにはネイティブコードは現状必須です。初期のAndroidのモッサリ感は、限られた資源の中でわざわざJava VM上にアプリケーションを実行しているせいだったのではないかと勘ぐることもしばしばです。 ネイティブコードを利用したAndroidアプリケーションを作るにはJNI (Java Native Interface)を使うことが必須となるのですが、このJNIがいろんな意味で非常に厄介です。JNIの問題点を適当にあげつらってみます。 グルーコードを
JNI関連の話が続きます。 今日は短いですが、JNIとC++例外について。 最近ではAndroid NDKもC++の例外(やRTTI)に対応していて、そのおかげで例外が必要なSTLなどのライブラリを自由に使えるようになっています。しかし、Java側はC++の例外を理解してくれないので、もしJNIを介した関数がネイティブ領域で例外をキャッチし損ねると、すぐにSegmentation Faultで落ちます。 解決策としては、JNIから呼び出されたC++側の内部処理を、noexceptな関数に閉じ込めてしまえばよいわけです。もちろんエラーが発見できないのもまずいので、JNIを使ってJava側の例外に変換してしまいます。 JNIEXPORT void JNICALL Java_Foo_bar (JNIEnv* env, jobject thisj) { jni_util::convertExcep
C++11 Advent Calenderの26日目の記事です。 クリスマスまで残り365日と迫りましたね。C++11 Advent Forever. さて、C++11で導入された機能の一つがTemplate Aliasesです。元々はTemplate Typedefなどとも呼ばれていました。他の主要な機能と比べて大して目立っていないですが、細かいポイントがいくつかあるような気がします。 Template Aliasesとは? C言語でもtypedefを使えば型に好きな別名を付けることができます。C++のクラスも型ですからtypedefできます。ではテンプレートクラスはどうかというと、C++03まではそのままの名前で使うしか無かったのです。Template Aliasesならテンプレートに別名を与えることができます。そう、C++11ならね。 template <typename T> us
パソコンに慣れている人ならLinuxの話を聞いたことくらいはあるだろうが、普段はWindowsを使っている人が大半だろう。Linuxも最近ではかなりユーザに優しくなっていて、日常作業の大半をこなせるようになってきている。 Linuxはサーバや組み込み用途で広く用いられているが、日常作業をこなすデスクトップOSとしてはあまり流行っていない。それでもLinuxで作業する理由はいくつかある。 APTなどのパッケージ管理が非常に便利 APTを使うと大抵のソフトはコマンド一行で、または数クリックでインストールできる。インストール済みのソフトも同様に丸ごとアップデートできる。Webサイトからインストーラを探してダウンロードするという工程が必要ないのだ。特にパッケージ管理の恩恵が感じられるのはLaTeXやLAMPなどで複数のソフトを混ぜて使う状況で、依存関係がきちんと管理されているおかげで面倒な設定が必
C言語では配列を返す関数を作ることができない。 int a[100]; int f()[100] // エラー:関数は配列を返せない { return a; } 本当は int[100] f() // エラー:構文エラー { return a; } と書きたいところだが、これはC言語の奇妙な文法に合致しない。 複雑な宣言 - meryngii.neta この現象は基本的にC++でも同様である。上のようなコードを書くとエラーになる。 しかし、C++には参照がある。関数は参照を返すことができるし、配列の参照を取ることもできる。 int (&f())[100] { return a; } ... f()[0] = 0; // OK なんとこれはコンパイルすることができる。参照ってすごいや。 だがこの例は文法がいささか変態的である。できることなら次のように書きたいところだが、 int[100]&
これまでGCCを使うためにCygwin・MinGW・andLinuxなど様々と試したのだが、GCCをmakeするたびに必ずエラーが起きて、さすがにもう懲り懲りになった。かといって普段の作業はWindowsでやっているから、このためだけにLinuxに乗り換えるのも難しい。そんなときVMware Player上でUbuntuを試してみたら、これがなかなか使いやすいので、しばらくこれで実験してみようと思う。 インストールするだけなら非常に簡単だったが、Windowsとファイルを共有するには少し手間がいる。すでにいろいろなサイトで紹介されているが、自分用にメモを残すことにした。 ちなみに私の環境は次の通り。 VMware Player 2.5.2 VMware Tools 7.7.5(VMware Server 2.0.1より) Windows Vista SP1 … ホストOS Ubuntu 8
C++でvolatile修飾された構造体はものすごく扱いにくい。 typedef struct { int x; } X; int main() { X n_1; volatile X v_1; /* コピー(代入ではない)*/ X n_2 = n_1; /* OK */ X n_3 = v_1; /* エラー */ volatile X v_2 = n_1; /* OK */ volatile X v_3 = v_1; /* エラー */ /* 代入 */ n_2 = n_1; /* OK */ n_3 = v_1; /* エラー */ v_2 = n_1; /* エラー */ v_3 = v_1; /* エラー */ return 0; } このコードはC++では大量のエラーが出るが、C言語ではコンパイルが通る。おそらくCとC++の非互換性の一つではないかと思われる。 原因はC++のデ
Visual C++ではC99で追加されたstdint.hが提供されていないが、それを補うものがあるのでメモ。 http://www.vector.co.jp/soft/win95/prog/se432866.html Boostにもある。こちらはもちろんC++限定だ。 http://www.kmonos.net/alang/boost/classes/cstdint.html 整数型というのは、異なる名前でもしばしばサイズがかぶってしまう。例えば32bit環境ではintとlongはどちらも32bitなわけだが、厳密なコンパイラだと暗黙の変換に警告を出したりする。この場合int32_tはlongで定義すべきなのだろうが、オーバーロードなどで問題が起きることもある。細かいようだが面倒なところだ。
このページを最初にブックマークしてみませんか?
『meryngii.hatenablog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く