サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
flat-leon.hatenablog.com
C++11になり、後置き戻り値型、auto型、ラムダ式が導入され、戻り値の記述方法が大幅に増えました。またC++14でさらに新しい記述方法が加わったのでとてもややこしいことになっています。そこで戻り値型の記述方法をまとめてみることにしました。(勉強中のため間違っている箇所があるかもしれません) 戻り値型の形式( 前置き、後置き、省略 ) 前置き形式 後置き形式 省略形式 戻り値型の記述形式まとめ 戻り値型での型推論(auto) 戻り値型での型推論の記述方法 型推論の挙動 プレースホルダーとしての前置きauto 参照として型推論させる(auto&) 戻り値型としてのdecltype(auto) まとめ (おまけ)戻り値型の記述パターンまとめ 参考リンク 戻り値型の形式( 前置き、後置き、省略 ) 前置き形式 int Hoge( void ){ return 0; } int [](){ re
C++11から初期化子リストが導入されました。初期化子リストは簡単に見えて結構難しい機能です。そこで初期化子リストを大雑把に理解するための記事を書いてみることにしました。理解することを優先しているので言葉の定義などが不正確だったりするかもしれません。というか筆者もC++11を勉強中の身なので大嘘書いている可能性もあります。間違っていたらごめんなさい。 はじめに 「初期化子リスト」 〜 std::initializer_list<T>型オブジェクトを楽に構築 〜 「リスト初期化」 〜 オブジェクト構築時の()を省略 〜 「統一初期化」 〜 通常のコンストラクタでもリスト初期化記法 〜 変数定義以外での「リスト初期化」「統一初期化」 初期化子リストの注意すべき仕様 {}を使ってもstd::initializer_list<T>にならない場合がある 「初期化子リスト」は式ではない 「リスト初期化
C#を勉強中なのですが、C#はC++とかなり似ていながらも微妙な違いもあったりして、そこが結構ややこしいです。そこでC#とC++の違いをまとめてみました。 注意 C#はC#3.0(.Net Framework 3.5) を想定*1しています C++はC++14あたりを想定しています 「C#とC++の比較」というよりは、「C++との違いで理解するC#」という感じの記事です C++とC#の両方にある機能 C++とC#の両方にない機能 C#にしかない機能 C++にしかない機能 微妙に違うところ C++とC#の両方にある機能 すべて挙げるとキリがないので、大雑把に紹介 基本 コメント(文法も同じ) ブロック文(文法も同じ) 条件分岐(if,else if,else,switch,goto) *2 反復(while,do while,for,範囲for*3 ) プリミティブ型(型名もだいたい同じ)
C#によるゲームプログラミングで、コルーチンを使った状態遷移をやってみたら便利だったのでその方法を紹介します。 状態遷移とは 状態遷移をenumとswitch文で実装する コルーチンによる状態遷移の実装 コルーチンによる実装のメリット 見通しがよくなる 一連の流れを簡単に記述できるようになる 柔軟性が高くなる 状態間での値のやり取りが簡単になる コルーチンによる実装のデメリット 外部から状態の変更がしづらい 処理の共通化が難しい 状態遷移をコルーチンで実装しない方がよい場合 コルーチンによる実装の詳細 「待ち」ができるようにする 状態の初期化処理を記述する 状態の終了時処理を記述する 毎回呼ばれるようにする(毎回再開する) 現在の状態を取得できるようにする yieldを含む処理を関数として分ける (おまけ)Unityのコルーチンについて (おまけ)goto文を使わないバージョン まとめ 状
マクロとは マクロの役割 マクロを定義する 定数マクロの例 関数マクロの例 定義したマクロを削除する #ifでマクロが定義されているかどうかを利用する 組み込みマクロ 可変個引数のマクロ マクロ引数の文字列定数化 マクロ引数の連結 複数行に渡るマクロ定義を行う マクロ引数のマクロが展開されるようにする マクロの罠 演算子の優先順序 意図しない名前の上書き 無駄なマクロの使用を避ける まとめ マクロとは C++におけるマクロとは、ソースコードのコンパイル前のプリプロセス処理で行われるテキストの置換処理のことです。プリプロセス処理にはマクロの他に#includeや#ifなどがあります。 マクロの役割 マクロの利用場面は以下とおりだと思います。 マクロにのみ用意された機能を使う C++文法では実現できないことを行う コードの重複を除去する 意味的に本質的でないコードの隠蔽 マクロは言語に拡張性を
Windowsにはダブルクリックでスクリプトを実行できるバッチファイルという便利な仕組みがあります。Macにはバッチファイルというものはありませんが、拡張子を.commandにしたシェルスクリプトを用意することでバッチファイルと同じようにダブルクリックでスクリプトを実行させることができます。ところで、WindowsでもMSYS等を導入することでシェルスクリプトを実行することができるようになります。ということは、MacとWindowsで共通のバッチファイルを利用することも可能なのではないでしょうか。ということで、いろいろ模索してみた結果、実際に実現することができたのでその方法を紹介したいと思います。 執筆時の環境 Windows 10(1709) Msys2 (version 20161025) 注意 「バッチファイル」は正確にはWindowsの用語ですが、ここでは「ダブルクリックで実行でき
C++11から導入されたラムダ式はとても便利な機能ですが、その使われ方から不正な参照いわゆるダングリングポインタが発生しやすい機能でもあります。今回はその回避策を考えてみます。 なぜ不正な参照(ダングリングポインタ)が発生しやすいのか 不正な参照の発生例 弱参照による回避策 強参照(std::shared_ptr)による回避策 プリミティブ型への参照(ポインタ)の不正アクセス対策 参照キャプチャは控えるべき まとめ なぜ不正な参照(ダングリングポインタ)が発生しやすいのか ラムダ式は変数をキャプチャした上で、その呼び出しを遅延できるからです。C++のポインタや参照は、その参照先オブジェクトの寿命が切れることで簡単に不正な参照(ダングリングポインタ)となってしまします。ラムダ式は呼び出しをいくらでも遅延できるため、その間にキャプチャしたポインタや参照の指す先のオブジェクトの寿命が切れてしまい
Nimの勉強を兼ねて逆引きリファレンスとしてまとめてみようと思います。随時更新。(最終更新日:2022/4/10) この記事は「Nim Advent Calendar 2017」の記事として登録させてもらっています。 注意: 使用しているNimのバージョンは1.6.0です 間違っているかもしれません サンプルコードはテストしていないものが多いです 先に公式マニュアルなどを一通り読むことをおすすめします Nimツール Nimを普通に実行する : nim c -r Nimソースファイルパス 基本文法 コメントを記述する 変数を定義する 定数を定義する 文字列リテラルを利用する 数値リテラルを利用する プロシージャを呼び出す プロシージャを定義する 式の場所で文を記述する if文を利用する case文を利用する for文を利用する while文を利用する block文を利用する break文を利
この記事は「Nim Advent Calendar 2017」の記事として登録させてもらっています。 NimはNimソースコードをC言語ソースへ変換するトランスコンパイラ言語です。これは普段C++を使っている人にとって非常に重要なことです。なぜなら、C++(C言語)が使える環境なら基本的にはどこでもNimを使うことができるからです*1。もちろん、普段C++を使っている環境でNimを使うにはメモリ管理やC++側との連携についてなど考慮すべきことはいろいろあると思いますが、やはりC言語のソースコードが生成されるというのは大きなメリットです。普段C++やC言語を使っている人が現実的な選択肢としてNimの利用を考えることができるわけですから。というわけで、この記事ではC++とNimの書き方の違い、機能の違いなどを紹介したいと思います。 Nimの言語機能についての詳細は公式の Nim Manual
数年前、「Flan」というプログラミング言語を作っていました。このプログラミング言語は長い間C++でプログラミングをしてきて感じた不満をもとに、自分好みの最高のプログラミング言語を作ろうと、そういう考えで作っていました。「Flan」は言語機能的にはだいたい完成していたのですが訳*1あって開発は中断していました。 そして中断から数年経ったわけですが、このまま埋もれさせておくのももったいないなと思い、紹介だけでもすることにしました。公開予定は今のところありません。 サンプルコード プログラミング言語Flanの特徴 実行はバイトコードインタプリタ形式 静的型付け オブジェクト指向 文末にセミコロン不要 入れ子可能なコメントアウト 前方宣言不要 暗黙のreturn auto型(型推論)あり 初期化と代入で違う構文 明確な文法 交換演算子<=> 3種類の参照。所有、共有、弱参照。 すべてが参照ではな
先日、iOS用ゲームアプリ「センメツコースター」をリリースしました。このゲームの開発にはゲームエンジンは使っておらず、C++とOpenGLとOpenALなどで実装されています。最近はゲームエンジンを使うことが当たり前になっており、ゲームエンジンを使わないゲームの作り方があまり知られていない気がしたので「センメツコースター」を例にして、どうやってC++とOpenGLでゲームを作るのかを(大雑把に)紹介したいと思います。記事中で取り上げたツールやライブラリへのリンクは最後にまとめて掲載してます。 作業環境 最低限必要なもの ソフトウェアの生成 : C++コンパイラ 絵の表示 : OpenGL + GLFW 音の再生 : OpenAL + ALURE 入力の受付(マウス、キーボード、ゲームパッドなど) : GLFW ファイルの読み書き : C言語標準関数 メインループ : GLFW 現実的に必要
constメンバ関数 constメンバ関数のメリット constメンバ関数の使いどころ constメンバ関数内でもメンバ変数を変更したい場合 constメンバ関数の注意点 constメンバ関数のオーバーロード constメンバ関数を使うかどうかでソースコード全部に影響がでる constメンバ関数 メンバ関数につけるconstとは何か。これです。 class A { public: int m_Value; void Hoge( void ) const // ←このconstです { } }; メンバ関数の右側にconstをつけると、そのメンバ関数内ではメンバ変数の変更ができなくなります。このメンバ関数をconstメンバ関数と呼んだりもします。 constメンバ関数内では、メンバ変数を変更するような他の関数の呼び出しも禁止されます。 void SetZero( int& value ) {
Python2.7を対象とします。 コマンドライン引数の解析 argparseを利用する 逆引きリファレンス コマンドライン引数を指定して解析する 位置引数を追加する オプション引数を追加する オプション引数にデフォルト値を設定する 引数を文字列以外で受け取る(変換を行う) 引数をユニコード文字列で受け取る(変換を行う) オプション引数をフラグとして設定する 引数の個数を指定する 引数を複数回指定可能にする オプション引数を必須にする 引数の内容を限定する コマンドライン引数の解析 コマンドライン引数の解析とは、Pythonスクリプト起動時に渡されたパラメータを解析することです。起動時に渡されたパラメータは'sys.argv'で取得できますが、パラメータの意味の解析やエラーチェックなどは自分で行う必要があります。そのへんを便利にしてくれるのがPythonの標準ライブラリであるargpars
クロスプラットフォームなゲーム開発で音を鳴らすにはOpenALが定番っぽいです。Mac、Windows、iOS、Androidで利用可能だそうで。しかしOpenALだけではwavファイルなどの音声ファイルを扱うことができません。そこで良さげなのがOpenALのユーティリティライブラリであるALUREです。wavファイルはもちろん、Ogg Vorbis、FLACなどにも対応しています。 しかし、このALUREをiOSで使うための情報が見つからなかったので結構苦労しました。なので記事にまとめておこうと思います。 記事執筆時の環境 MacOSX 10.10(Yosemite) Xcode 7.2 ALURE 1.2 iOSでOpenAL+ALUREを使う OpenALの準備 iOSでは最初からOpenALが利用可能なので、XcodeのプロジェクトのLinked Frameworks and Li
役割分担でクラス化していく 役割を決めることで実装すべきものと実装すべきでないものが明確になる クラス名が役割を表すことになる 動作も役割分担の対象になる 役割を詳細に決めすぎる必要はない 役割分担でクラス化するかどうかは複雑さで考える 役割分担によるクラス分けのメリット 役割分担ではクラス分けできない場合もある まとめ 役割分担でクラス化していく プログラムを書いていきソースコードが増えるに従って、プログラムの複雑さはどんどん増していきます。プログラムが複雑さが増すと、機能の実装や修正や追加が行いにくくなっていきます。そしてこの状態が悪化していくとスパゲティコードと呼ばれる手に負えない状態になってしまいます。そうならないためにプログラムをクラスや関数に分けていくのですが、このときの分け方の目安になるのが「役割分担」です。 役割分担とはどういうことなのかというと、クラスを役割の担当者に見立
プログラミングを学ぶこつは「慣れ」と「模索」 プログラミングにはいくつもの壁があります。この壁の多さから挫折してしまうひとが沢山いるようです。自分がプログラミングを学んできて思うのは、プログラミングの学習で重要なのは「慣れ」と「模索」なのではないかということです。 ここでいう「慣れ」とは、 時間をかける 何度も触れる ということです。 また「模索」は、 試行錯誤 新しいことを学ぶ ということです。 この「慣れ」「模索」でプログラミングの壁をどうやって乗り越えるのかを説明したいと思います。 【壁1】難しい用語が出てきた プログラミングの学習をしていると新しい概念や機能が一気に出てきて全く理解できない、難しすぎると感じることがあるかもしれません。しかしこれらの概念や機能も、何回も触れていくうちに段々とわかるようになっていくものです【慣れ】。また実際に使ってみたり、あるいはその本の別の章や、別の
プログラミング言語の動作が気になったときに プログラミングをしていて、プログラミング言語の動作を確認したくなったことはありませんか。例えば、C++で複数の変数を一度に初期化したいと考えたとします。そして確かこんな書き方ができたはずと、int a, b = 7;のような書き方を思いついたとします。しかしこれが期待通りに動くのか不安です。そういうときに役に立つのがIdeoneです。 Ideoneとは Ideoneは様々なプログラミング言語をブラウザ上で実行できるWebサービスです。 画面はこんな感じになっています。 C、C++、C#、Perl、Ruby、Python、Java、JavaScriptのような有名どころはもちろん、マイナーな言語もかなりの数対応しています。 Ideoneを使う 先ほどのint a, b = 7;をIdeoneで試してみます。まずはプログラミング言語がJavaになって
オブジェクト指向の概要 オブジェクト指向の位置づけ 命令型から手続き型へ、そしてオブジェクト指向へ オブジェクト指向+αでメリットが出てくる (おまけ)良質なプログラミングとは何か まとめ オブジェクト指向とは何なのか考え抜いてみました。 オブジェクト指向の概要 用語の位置づけプログラミング(プログラム設計)の手法 用語の意味オブジェクトへのメッセージ送信でプログラミング(プログラム設計)を行うこと なぜ使われるのか1.手続き型プログラミングより自然な考え方になるから 2.プログラミング言語の機能によるサポート次第でより便利になるから 3.設計の工夫で良質なプログラミングが可能になるから オブジェクト指向の解説がわかりにくくなっているのは、「オブジェクト指向自体の解説」と「オブジェクト指向をより便利にする言語機能の解説」と「オブジェクト指向でよりよいプログラミングを行うための手法の解説」が
このページを最初にブックマークしてみませんか?
『Flat Leon Works』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く