2012-05-01から1ヶ月間の記事一覧

単連結リストの整列 #26 バグを取る

C

サンプルコードにメモリリークのバグがあった。 リスト内容の表示関数printにおいて、リストを走査する反復子を取得しているが、これを解放していない。 というか、sclistモジュールに反復子を取得する関数はあるが、解放する関数自体を用意していなかった。…

単連結リストの整列 #25 名前とスコアが要素のリストを使ってみる

C

サンプルコードを書いてsclistを使ってみる。 test_sclist.c #include <stdio.h> #include <string.h> #include "sclist.h" #define UNUSED_ARG(x) (void)(x) static sclist_t make(void) { struct { char *n; int s; } *p, d[] = { {"Amelia", 6}, {"Barbara", 4}, {"Charlotte</string.h></stdio.h>…

単連結リストの整列 #24 名前とスコアが要素のリストを実装する

C

前掲のインタフェイスを実装してみる。 sclist.c #include <stdlib.h> #include <string.h> #include "sclist.h" #include "lsort.h" struct tag_sclist { scdata_t head; scdata_t tail; }; struct tag_scdata { scdata_t next; char *name; int score; }; struct tag_sciter { </string.h></stdlib.h>…

単連結リストの整列 #23 インタフェイスをほんのちょっとだけ修正

C

関数プロトタイプひとつを変更でなく修正。 sclist.h #ifndef SCLIST_H_INCLUDED #define SCLIST_H_INCLUDED typedef struct tag_sclist *sclist_t; typedef struct tag_scdata *scdata_t; typedef struct tag_sciter *sciter_t; sclist_t sclist_new(void);…

単連結リストの整列 #22 名前とスコアが要素のリストの操作のためのインタフェイス

C

このリストを操作するための最低限のインタフェイスを考えてみる。 sclist.h #ifndef SCLIST_H_INCLUDED #define SCLIST_H_INCLUDED typedef struct tag_sclist *sclist_t; typedef struct tag_scdata *scdata_t; typedef struct tag_sciter *sciter_t; scli…

単連結リストの整列 #21 名前とスコアが要素のリストのインタフェイス

C

ナル終端文字列の名前とint型のスコアを格納データとする要素を持つ単連結リストのインタフェイスを考える。 sclist.h ...snip typedef struct tag_sclist *sclist_t; typedef struct tag_scdata *scdata_t; typedef struct tag_sciter *sciter_t; ...snip …

単連結リストの整列 #20 面倒ごとを増やす

色々なデータに対してlsort関数で整列する例を示してきた。 しかし、データ構造への簡潔な制約とそれを扱う関数はlsortで独立したモジュールになっているが、 格納するデータに合わせた具象リストとその操作関数のまとまりと、 それを利用する利用者コードの…

単連結リストの整列 #19 複数のデータの組み合わせを整列する

C

これまでは単一のデータを保持しているものを要素とするリストを整列した。 複数のデータからなる要素の場合について行ってみる。 #include <stdio.h> #include "lsort.h" #define UNUSED_ARG(x) (void)(x) typedef struct tag_phys_node pnode_t; struct tag_phys_no</stdio.h>…

単連結リストの整列 #18 文字列を整列する

C

ナル文字終端な文字列をデータとして持つ要素についての整列を行ってみる。 #include <stdio.h> #include <string.h> #include "lsort.h" #define UNUSED_ARG(x) (void)(x) typedef struct tag_snode snode_t; struct tag_snode { snode_t *next; char *val; }; static int sup(</string.h></stdio.h>…

金星の太陽面通過

金環食は曇りがちだったものの短時間だが見ることができた。次は金星の太陽面通過だが、同じ仕組みによる現象とはいえ、 月による日食にくらべたら金星によるものは一般的な感覚では非常に地味だ。 金星の太陽からの平均距離は約0.723天文単位であり、その直…

単連結リストの整列 #17 この整列関数の問題点

C

整列関数lsortで扱うリストの要素では、 最初のメンバが次の要素へのポインタであるような構造体であることだけを制約として課している。 問題は、lsort.cと例えばtest_lsort.cであれば、 node_t型へのポインタとint_node_t型へのポインタをそれぞれ最初のメ…

単連結リストの整列 #16 整数を整列する

C

さっそくlsortを使って整列させてみる。 とりあえず、今までと同様にint型を要素が保持する場合について書いてみる。 test_lsort.c #include <stdio.h> #include "lsort.h" #define UNUSED_ARG(x) (void)(x) typedef struct tag_int_node int_node_t; struct tag_int_</stdio.h>…

単連結リストの整列 #15 要素の保持するデータ型が任意のものに対応した単連結リストの整列関数

C

lsort.hで宣言したインタフェイスに基づいた整列関数を実装する。 lsort.c #include <stddef.h> #include "lsort.h" typedef struct tag_node node_t; struct tag_node { node_t *next; }; static void node_swap(node_t *n) { node_t *p, *q; if (n == NULL || (p = n</stddef.h>…

単連結リストの整列 #14 少し余裕をもたせたインタフェイス

C

結局こんなインタフェイスでいくことに落ち着いた。 lsort.h #ifndef LSORT_H_INCLUDED #define LSORT_H_INCLUDED void lsort(void *base_ptr, int (*issup)(const void *, const void *, void *), void *arg); #endif /* LSORT_H_INCLUDED */ 順位付けを行…

演算子の多重定義こわい

パスタコードとか無秩序とかが好きなので、 構造化とかオブジェクトとか言われると、何それ美味しいの? だ。 #include <iostream> #include <iomanip> #include <gmpxx.h> int main() { mpf_t f; mpf_init2(f, 200); mpf_set_ui(f, 29); mpf_class x = 29, y(29, 200), z(1 / y), w(f); </gmpxx.h></iomanip></iostream>…

MPFRを使って逆数を求める

MPFRはGMPのmpf_t型に関する計算を含む形で拡張されているので、 GMPだけで閉じたいとかでないようなら、 MPFRを使うことも検討した方がいいかもしれない。 でもこの場合はやりたければ簡単に計算の丸めを制御できるくらいで、 あまりMPFRにする意味はないか…

地球の長い午後の微睡みに金環日食の夢を見るか?

いや、もちろん今度の金環食は日本では午前に起きるのであって午後の現象ではない。為念。地球-月系においては潮汐現象による地球の自転に対する制動に伴い、 地球の持つ角運動量が月へ移っているため、 次第に地球の自転が遅くなり月の公転半径が長くなって…

もう少しシンプルにmpf_t型で

前述のコードはmpf_t型同士の除算の説明のためだったので、 単にmpf_t型で29の逆数を必要な精度で求めるだけなら、 #include <gmp.h> int main(void) { mpf_t c; mpf_init2(c, 200); mpf_set_ui(c, 29); mpf_ui_div(c, 1, c); gmp_printf("%.60Ff\n", c); mpf_clear</gmp.h>…

gmpで除算でmpfで

こういう検索語群もあったのだが、あれ? GMPを使ったコードについて言及した記憶はあるけれど、 それは整数型mpz_tに関するものであって、 浮動小数点数型mpf_tを使ったコードについて書いたことあったかな? と思って記事のローカルバックアップ、というか…

javaでコマンドプロンプトで入力で空入力で

はてなダイアリーではアクセス時のリファラを示すリンク元のリストが自動的に作られる。 それをたまに見ると、検索エンジンで検索した時に欲しい情報がないのに、 複数日の記事が一つのページ内にあるのでそれが複合して間違ってここがリンク先になっていた…

単連結リストの整列 #13 さらにシンプルに

C

利用者側は具象リストへのポインタを抽象リスト型でキャストして整列関数に渡すという使い方で、 整列関数側は抽象リスト型に対する操作で統一的に扱うという方針だった。 しかし別に具象リストが正当なものかどうかをチェックするわけでもなく、 単にコンパ…

単連結リストの整列 #12 利用者コードから見えるインタフェイス

C

利用者コードに対する抽象化された単連結リストのインタフェイスを考えてみる。 必要なのはリスト型と整列関数の宣言だけでいいか。 list.h ...snip typedef struct tag_list *list_t; void list_sort(list_t list, int (*issup)(void *, void *)); ...snip …

単連結リストの整列 #11 リスト要素の値の型を変えたい

これまでリストに格納する値はint型で固定だったので、 他のデータ型を格納したリストも整列できるようにしたい。 最も素直でお手軽で原始的な方法は、 リストの作成から整列に至るまで各データ型専用のデータ構造と関数を用意することだろう。 でも面白みに…

乱数の種の元についてBCC32でも確認する

C

前回示した方法をBCC32でもコンパイルして確認する。 BCC32の場合、インクルードするヘッダファイル ...snip #include <sys/types.h> #include <unistd.h> ...snip を ...snip #include <process.h> ...snip に変更すると問題なくコンパイルでき、 C:\foo> FOR /L %i IN (1,1,5) DO @get_rnd 94</process.h></unistd.h></sys/types.h>…

同時刻でも大丈夫な乱数の種の元を考える

C

関数gettimeofdayはマイクロ秒単位の時刻を得ることができたが、 IEEE Std 1003.1-2008によれば、 > Applications should use the clock_gettime() function instead of the obsolescent gettimeofday() function. とのこと。obsoleteになりかけ/なってるも…

短時間に繰り返す時の乱数の種

C

標準関数timeの戻り値は1秒単位なので、繰り返して実行する間隔が短くなると、 同じ値が乱数の種として与えられるようになり、同じ乱数列が出現することとなる。 この問題はtimeの戻り値の分解能が原因なので、 簡単な解決策としてはもっと分解能の高い値を…

特別な状況下での乱数の種

C

前に述べた、乱数生成器の初期化関数srandの引数にtime関数の戻り値を与えているプログラムを、 1秒は超えるがさほど長くない時間間隔で繰り返し実行した時にrand関数が最初に返す数値が、 msvcrtやBorlandにより提供されている標準関数を使うとある程度簡単…

単連結リストの整列 #10 任意の順序関係を指定する

C

今まで昇順になるようにしか整列させなかったので、 利用者側が任意の順序関係を定義して、 それに基づいた整列を行うように変更してみる。 list.h ...snip void list_sort(list_t list, int (*issup)(int, int)); ...snip 関数list_sortが二つ目の引数とし…

単連結リストの整列 #9 代り映えしないが

C

ヘッダで宣言したインタフェイスを実装する。 基本的にtest_node.cの各関数に沿った形になっている。 list_t型はtest_node.cにおけるダミー要素にあたるheadメンバーを管理する。 このダミー要素や実データを収納する要素はこれまでと同様にnode_t型である。…

単連結リストの整列 #8 リストとのインタフェイス

C

書いてきたコードを整理する。 まずはリストとその利用者とのインタフェイスを定める。 list.h #ifndef LIST_H_INCLUDED #define LIST_H_INCLUDED typedef struct tag_list *list_t; list_t list_new(void); void list_dispose(list_t list); int list_add(l…