実数も使えるようにする

これまでは使える数値は整数だけで実数を指定する方法がありませんでした 実数も使えるようにしてみましょう 仕組み 実数も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_comma 部分式_comma ::= 部分式_add_s…

単項演算子も使えるようにする

これまでは負の数を指定する方法がありませんでした 単項演算子をサポートすることで負の数も使えるようにしてみましょう 仕組み 単項演算子も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_comma 部分式_comm…

カンマ演算子も使えるようにする

実はカンマ(,)も演算子です このカンマ演算子を使えるようにしてみましょう 仕組み カンマ演算子も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_comma 部分式_comma ::= 部分式_add_sub 部分式_comma_ 部…

括弧も使えるようにする

演算子の優先順位というものを理解したところで、今度は括弧が使えるようにしてみましょう 仕組み 括弧も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_add_sub 部分式_add_sub ::= 部分式_mul_div_mod 部分式…

掛け算、割り算もできるようにする

足し算、引き算ができるようになったのですから、次は掛け算、割り算ができるようにしてみましょう 仕組み 掛け算と割り算も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_add_sub 部分式_add_sub ::= 部分式_…

足し算、引き算ができるようにする

まずは単純に数値の足し算、引き算ができるようにしてみましょう 仕組み パーサが処理すべき式はたぶん次のような形式になっているでしょう 完結式 ::= 部分式 部分式 ::= 数値 演算子 部分式 演算子 ::= + あるいは − 数値 ::= 16進数 あるいは 8進数 ある…

C++ 構文解析入門

はじめに 近年、組み込み環境でもスクリプト言語への関心が高まっていますが、そういった言語処理系を書く際に必要となってくるのが字句解析、構文解析です ここでは簡単な再帰下降型のパーサを例に、実際に実装してみながら構文解析について学んでゆきまし…

C/C++ ポインタ入門

ポインタとは ポインタとはアドレスの入れ物です ただそれだけですおしまい ポインタとアドレス わかっていれば本当にそれでおしまいなのですが、ではそのアドレスというのは何かというと、アドレスというのはメモリ上の場所を表す値で、ただの整数です (実…

C/C++ 変数宣言の読み方入門

読み方のコツ 具体例 const の読み方 読み方のコツ 規則は単純です。この二点だけ押さえましょう: ポインタの* より 配列の[] や 関数の() の方が優先順位が高い 日本語の人は左から右へ読む。ただし () の中は後で読む英語の人は逆に変数名(一番内側の括…

浮動小数点数の詳細

文字列化する関数を書くんでもない限り別に知らなくてもいいんだけどfloat でも double でも別に指数部と仮数部のビット幅が違うだけでその解釈は同じです MSB.............................LSB S EXPONENT MANTISSA 符号 指数部 仮数部 浮動小数点数は基本…

C++ 基底クラスのアクセス指定子

private 継承や protected 継承がよくわからないということをよく聞きますクラスの継承というと is-a 関係だの is-implemented-in-terms-of 関係だのという言葉が出てきてしまうのが何となく難しそうに感じさせている一因だと思いますが、では本当に難しいこ…

FizzBuzz

FizzBuzz のルール 3 の倍数のときには fizz と表示する 5 の倍数のときには buzz と表示する 3 と 5 の倍数(15の倍数)のときには fizz buzz と表示する それ以外はその数を表示する ループ すぐにいろいろ思いつかない場合はまずシンプルなものから考える…

ループを使わずに配列の順序を逆にする

ループ ループを使わずにと言われてもすぐに思いつかない場合はまずはそのループを使った実装を考えてみましょう ループを使わないように変形するのはその後で構いません template<typename _value_type,int _size> _value_type (&reverse_array( _value_type (&a)[_size] ))[_size]{ _value_</typename>…

指定された数値Xが素数であるかどうかを判定する

素数判定法 簡単な公式は無いので地道に頑張る というか公式を見つけたら大発見ある数の素数性を得るためのフェルマー法とかミラー法とかミラー・ラビン法とかを使えば相当の高速化が期待できるから十分に知っているなら使ってもいいとは思うけど、あくまで…

数値Xのフィボナッチ数を計算する

フォボナッチ数とは フォボナッチ数列は各項が直前の二項の和になっているような数列 フィボナッチ数はその各項漸化式は一般に Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)ただし n は 2 以上、0 と 1 のときは 0 と 1 Fibonacci(0) = 0 Fibonacci(1) =…

ホワイトボードプログラミング

プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集にある「ホワイトボードプログラミング」の解答例 → 翻訳記事 http://japan.zdnet.com/sp/feature/07tenthings/story/0%2c3800082984%2c20409456%2c00.htm → 原文 http://blogs.techrepu…

コメント入門

今回はコメントについて学びましょうコメントは実行時の動作に影響を与えないので疎かにされがちですが、コメントは別に無駄に付いている機能ではありません コメントはプログラムのコードだけでは表せないプログラマの意図を表現するために存在するもので、…

拡張可能なインターフェイス

今回は拡張可能なインターフェイスというものについて考えてみましょう今 Fig.1 のような抽象基底クラスがあるとします Fig.1 struct ISamplePlugin : public ISampleUnknown { virtual void* DynamicCast( int classid ) = 0; virtual unsigned long AddRef…

dynamic_castを使わないRTTIの実装

RTTI は実行時型情報(RunTime Type Information)あるいは実行時型識別(RunTime Type Identification)と呼ばれる仕組みです C++でこれをサポートするための構文が dynamic_cast ですが、これはC++の言語に特有の機能ですからこれをそのままC言語などから…

RTTIの薦め

RTTI は実行時型情報(RunTime Type Information)あるいは実行時型識別(RunTime Type Identification)と呼ばれる仕組みです C++でこれをサポートするための構文が dynamic_cast です 今回はこのC++の dynamic_cast について復習しましょうまず Fig.1 を見…

コールバックの真価

前回、「関数のポインタ」を使って「コールバック」について考えてきましたが、「コールバック」は何も「関数のポインタ」でなければ実現できないわけではありません 今回は他の方法も見てみましょう そして「コールバック」の真価へと迫りましょう 関数オブ…

コールバックの薦め

「コールバック関数」ってよく聞きますよね 今回はその「コールバック」の使い方を覚えましょう その前に その前に、関数のポインタがなんだかわからないという人や、関数のポインタの宣言の仕方がわからないという人は C/C++ 変数宣言の読み方入門 や C/C++…

リファレンスカウンタの真価

さて、まずは前回の宿題への回答から行きましょう 前回の宿題は次の3つでしたね※1 それより、自分で設計する時にはこの例で使っている GetClassObjectみたいな仕様にしちゃダメですよ。これはただ例のために使ってるだけですからね。 どういったところが問…

テンプレートで楽をしよう

さて今回はいきなりですがまず Fig.1 を見てください Fig.1 struct IBaseObject { virtual void DeleteMe() = 0; virtual bool QuerySupport( OBJECT_CLASS_ID clsid ) = 0; virtual IBaseObject* GetClassObject( OBJECT_CLASS_ID clsid ) = 0; ・・・ }; s…

リファレンスカウンタの薦め

「リファレンスカウンタ」あるいは「参照カウンタ」は「そのインスタンスを参照(リファレンス)しているオブジェクトが幾つあるか」というカウンタです つまりオブジェクトのインスタンスの寿命を管理するものですFig.1 を見てください 実装はたったこれだ…

The ABC's of ABC

今回は「Abstract Base Class(抽象基底クラス)」についてお話しましょう「抽象基底クラス」とは「pure virtual function(純粋仮想関数)だけからなるクラス」のことです 「純粋仮想関数」というのは実装を持たない仮想関数のことです ここで言う「実装を…

CプログラマのためのC++オブジェクト指向入門

さて今回はC++と「オブジェクト指向」について簡単に話してみましょう 「オブジェクト指向」の話は難しそうだからと拒否反応を示す人もいるかもしれませんね。でも本当は全く難しいことなんてないんです その証拠に Fig.1 を見てくださいFig.1 FILE* fpi = f…

はじめに

新人教育などの授業用に書いたもののうちからいくつかをここに置くことにしました実際に授業に使ったものもありますし、書いただけで使っていないものもあります。中にはずっと昔に書いたものもあるので幾分古い感じのするものもあるかもしれませんが現在で…