プログラム

プログラムの「写経」

元エントリは プログラミング学習手段としての写経について - 西尾泰和のはてなダイアリーエントリでおっしゃっていることは、全くそのとおりだと思う。 しかし「写経」の語感が問題。写経は修行としてお経を一字一句そのままに書き写していくもの。 そこで…

Bad System Call

cygwinでメッセージキューを試そうとしたら、"Bad System Call"とよくわからないランタイムエラーが出た。ちょっと調べたら、別の環境ではまりそうだったのでメモ。元ネタはこちら cygwin "Bad System Call" - よそ行き顔でポイントは cygserver-configを実…

Cygwin メッセージキュー

Cygwin上でのメッセージキューの使用は色々制限がありそうで敬遠していた。しかし社内の勉強会で、非同期プログラムを扱いたくて調べてみた。本当はIPでやる方がつぶしが利くのはわかっているが、どうしてもネットワーク周りの知識が必要になる。メッセージ…

オブジェクト指向に関するありがちな間違い。

絶賛炎上中に付き、コメントする余地も無いかもしれないけど、どうにもつっこみたい部分があるので敢えて書く。実はオブジェクト指向ってしっくりこないんです!:気分はstatic!:エンジニアライフみながわさんが、「実はオブジェクト指向ってしっくりこな…

GBA crt.o

crt.oだけど未だにはまっている。結局、初期化子付きの定義だけうまくいかない。通常の代入処理をすればOK。ただの変数であれば、2ステップになるだけだし、宣言と同時に初期化って、好きではないのでこれ自体はかまわない。しかし、配列や、構造体の初期化…

crt.o

やはりcrt.oとリンカスクリプトの問題だった。通常のコンパイラ使っている分には気にするところじゃないし、devkit-advでもやはり端から用意されているもの使っていれば、Cの感覚で使える。今のままだと初期化ができないので、テーブル設定が面倒くさくて仕…

crt.o

グローバル変数がうまく動作していないのは使用しているcrtのせいだった。今使っているcrtはエントリポイントをmainにするためだけのものになっている。グローバル変数が使えるようにするにはこいつをいじらなきゃならない。GBAdevのソースを参考にしてみよ…

 GBAプログラミング

GBAプログラミングを社内勉強会のネタにしようと思って、西田亙さんの(http://memo.wnishida.com/)「Linuxから目覚めるぼくらのゲームボーイ」を参照してコードを書き始めた。一つはまったことがあるのでメモっておく。BGがらみのレジスタを指すポインタを通…

イテレータパターン(リンクリスト版)

前回までBookShelfはBook*の配列として実装していた。これをリンクリストを使用したもので実装し直してみる。なお配列版と比較してmain側が変更してあるのは汎用性を高めるためである。実際に使用しているコードであるのならば、使用しているコードを優先す…

イテレータの利点

三日にわたって長々と説明してできたことは、たかだか配列をなめ回しただけじゃん、と思うかもしれない。main関数だけ見ればこれだけのことをするには、以下のコードで十分では?と思うだろう。 #include<stdio.h> #define ARRAY_SIZE_OF(array) ((sizeof(array)) / (</stdio.h>…

イテレータを使ったサンプルコードドライバ

#include <stdio.h> #include <stdlib.h> #include "BookShelf.h" int main(void) { BookShelf *pBookShelf; Iterator *pIte; Book *pBook; /* 本棚生成 */ pBookShelf = CreateBookShelf(4); /* 本棚に本を詰める */ AppendBook(pBookShelf, CreateBook("Around the World in a</stdlib.h></stdio.h>…

Cでイテレータパターン

シリーズもの今回はイテレータ構造体。まずはイテレータインターフェイスに当たるヘッダファイルIterator.h #ifndef ITERATOR_HEADER_FILE_INCLUDED__ #define ITERATOR_HEADER_FILE_INCLUDED__ /*! Iterator構造体 */ typedef struct Iterator_tag Iterator…

Cでイテレータパターン

まずはアグリゲータインターフェイスに当たるヘッダファイル。宣言している関数はイテレータインスタンスを生成して返すCreateIterator関数。戻り値がIterator*であるためIterator.hをインクルードしている。このIterator.hはhasNext()とnext関数の宣言がさ…

Cでオブジェクト指向っぽいことをする。

また社内勉強会用のネタ。C言語でオブジェクト指向プログラムを試みる。Cはオブジェクト指向プログラムをサポートしていないのでいろいろ面倒くさいことになる。またオブジェクト指向プログラムはポインタを使いまくることになるのでガベージコレクタが無いC…

 ポインタ演算について

例によって社内研修用のネタ。覚え書きとして。ポインタの概念はほとんどの、高級言語で実装されている。しかしポインタに整数を加減算したり、ポインタ同士の差をとることができる高級言語を、筆者はC/C++(一応C#も)以外には知らない。 ポインタ演算は、配…

勝手に添削

新人研修用に演習問題のネタを漁っていたらヒットしたブログで気になったので勝手に添削してしまう。 まずはコードから。元のコードはだいぶ一般的なコーディングをはずれていたのでK&Rスタイルにして書き直す。 #include<stdio.h> /* 先頭4要素に2,4,6,8を代入する関</stdio.h>…

 BMPファイルフォーマット

毎度C勉強会のネタ。今回はファイルの読み書きでもするべと思ってBMPファイルを取り上げてみることにした。テキストファイルを扱うのは初学者向けの本でも解説が多いのでバイナリファイルがいいだろうと思ったのだ。となると生でデータの入っているBMPがよか…

マクロ関数

たとえばint変数の値を入れ替えるマクロを考える。初めに考えるだろうマクロはこんな感じか #define SWAP(x, y) int tmp; tmp = x; x = y; y = tmp; しかし、これだとC89準拠にならない。ブロックの途中で変数の宣言ができない制限があるためだ。よって次の…

構造体の代入について

構造体は通常の変数と同じようにまとめて代入できる typedef struct Hoge_tag { int x; char y[100]; } Hoge; Hoge hoge = {0, "Hello", }; Hoge fuga; fuga = hoge; メンバに配列があっても問題なく代入可能。ちゃんとコンパイラが面倒見てくれる。 ただし…

設計とコーディング

http://d.hatena.ne.jp/Einherjar/20071006/p1 のエントリに結城さんからコメントをいただいた。元エントリはこちら http://www.hyuki.com/d/200606.html#i20060616 実際にコーディングしなければわからないことがたくさんある。それと同じように実際に本文…

今開発中のプログラムでのこと。関数が大きくなり見通しが悪いので処理を外だしした。そのたびに設計書を起こし直さなきゃならない。そのこと自体はかまわないが、設計してからコーディングせよ、と言われる。 そのこと自体も筋は通っていると思うのだが、設…

Cの型について

何度も同じネタを書いているけど、今日もプログラム関連の検索をしていると怪しい説明を見つけたので書いてみる。Cにおいて変数の型名は宣言から識別子を抜いたものである。 int a; /* 型名int */ double b;/* 型名double */ char c; /* 型名char */ これは…

Cで汎用リストコンテナの実装

Cで汎用のリストコンテナを実装することを考えてみた。とりあえず構造体は次のようなものでいいであろう。 struct List_tag { void *obj; /* 値 */ List *next; /* 次のノードを指すポインタ */ }; void *objが要素の実体を指し、それがリストでつなげていく…

Cでイテレータ

また社内研修ネタ。Cでリスト構造を扱うときに、リストを使用する関数側に実装を公開しないやり方。 単純に言うとヘッダファイルlist.hでリスト構造体の宣言だけして、定義はlist.c側で行う。もちろんこれだけではリストの操作ができないのでリスト操作用の…

 リスト構造のメソッド

社内勉強会のネタだけど、リスト構造を扱うことにした。勉強会の中では初めてまともにmallocを扱ったりする。新人君たちはついてきてくれるだろうか。 JavaAPIのAbstractListのメソッドを確認してみた. ListCreate: コンストラクタ ListDispose: デストラク…

配列とポインタ

社内の勉強会用のネタ資料を作っていたんだけどはてなをたぐっていると似たようなネタがあったのでTBしてみる。 「式の中では」配列名はその配列の先頭要素をさすポインタと同意(※例外あり) 例外の場合を除けば、有効な領域を指しているポインタは配列と同…

mallocの戻り値

mallocの戻り値の型はvoid*なのだけれどこれをキャストする人がいる。Cの入門的なサイトはWeb上にたくさんある。戻り値がvoid*なので格納するポインタの型にあわせてキャストしろっていうような解説が非常に多い。 C++ではキャストが必要だが、そもそもC++で…

<>と

昨日の続き。フィルタプログラムのようなスクリプトの場合リダイレクトするのもファイル名を引数として渡すのも大差はない。しかしファイル名以外をオプションとして渡すような場合は問題になる。ファイルハンドルSTDINを明示するスクリプトと、略したスクリ…

<>演算子

id:stdio:20070707さん の<>演算子*1 *2について尻馬に乗ってみる。 @ARGVが空であれば、<>は標準入力を求めるようになり、 @ARGVに何かが入っていれば、<>はその引数を取り扱う。 これは今まで知らなかったな。ほとんど標準入力経由で使っていたから。ラク…

ブロックは画面に収まるくらいに

仕事で不具合調査をしていてぶち当たったコード。当然そのまま出すわけにはいかないので具体的な処理を覗いた部分をのせる。 int func(void) { while(1) { if ( A ) { if ( B ) { if ( C ) { } } else { if ( D ) { if( E ) { if ( F ) { if ( G ) { } } els…