2012-05-01から1ヶ月間の記事一覧
サンプルコードにメモリリークのバグがあった。 リスト内容の表示関数printにおいて、リストを走査する反復子を取得しているが、これを解放していない。 というか、sclistモジュールに反復子を取得する関数はあるが、解放する関数自体を用意していなかった。…
サンプルコードを書いて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>…
前掲のインタフェイスを実装してみる。 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>…
関数プロトタイプひとつを変更でなく修正。 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);…
このリストを操作するための最低限のインタフェイスを考えてみる。 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…
ナル終端文字列の名前とint型のスコアを格納データとする要素を持つ単連結リストのインタフェイスを考える。 sclist.h ...snip typedef struct tag_sclist *sclist_t; typedef struct tag_scdata *scdata_t; typedef struct tag_sciter *sciter_t; ...snip …
色々なデータに対してlsort関数で整列する例を示してきた。 しかし、データ構造への簡潔な制約とそれを扱う関数はlsortで独立したモジュールになっているが、 格納するデータに合わせた具象リストとその操作関数のまとまりと、 それを利用する利用者コードの…
これまでは単一のデータを保持しているものを要素とするリストを整列した。 複数のデータからなる要素の場合について行ってみる。 #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>…
ナル文字終端な文字列をデータとして持つ要素についての整列を行ってみる。 #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天文単位であり、その直…
整列関数lsortで扱うリストの要素では、 最初のメンバが次の要素へのポインタであるような構造体であることだけを制約として課している。 問題は、lsort.cと例えばtest_lsort.cであれば、 node_t型へのポインタとint_node_t型へのポインタをそれぞれ最初のメ…
さっそく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>…
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>…
結局こんなインタフェイスでいくことに落ち着いた。 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はGMPのmpf_t型に関する計算を含む形で拡張されているので、 GMPだけで閉じたいとかでないようなら、 MPFRを使うことも検討した方がいいかもしれない。 でもこの場合はやりたければ簡単に計算の丸めを制御できるくらいで、 あまりMPFRにする意味はないか…
いや、もちろん今度の金環食は日本では午前に起きるのであって午後の現象ではない。為念。地球-月系においては潮汐現象による地球の自転に対する制動に伴い、 地球の持つ角運動量が月へ移っているため、 次第に地球の自転が遅くなり月の公転半径が長くなって…
前述のコードは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を使ったコードについて言及した記憶はあるけれど、 それは整数型mpz_tに関するものであって、 浮動小数点数型mpf_tを使ったコードについて書いたことあったかな? と思って記事のローカルバックアップ、というか…
はてなダイアリーではアクセス時のリファラを示すリンク元のリストが自動的に作られる。 それをたまに見ると、検索エンジンで検索した時に欲しい情報がないのに、 複数日の記事が一つのページ内にあるのでそれが複合して間違ってここがリンク先になっていた…
利用者側は具象リストへのポインタを抽象リスト型でキャストして整列関数に渡すという使い方で、 整列関数側は抽象リスト型に対する操作で統一的に扱うという方針だった。 しかし別に具象リストが正当なものかどうかをチェックするわけでもなく、 単にコンパ…
利用者コードに対する抽象化された単連結リストのインタフェイスを考えてみる。 必要なのはリスト型と整列関数の宣言だけでいいか。 list.h ...snip typedef struct tag_list *list_t; void list_sort(list_t list, int (*issup)(void *, void *)); ...snip …
これまでリストに格納する値はint型で固定だったので、 他のデータ型を格納したリストも整列できるようにしたい。 最も素直でお手軽で原始的な方法は、 リストの作成から整列に至るまで各データ型専用のデータ構造と関数を用意することだろう。 でも面白みに…
前回示した方法を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>…
関数gettimeofdayはマイクロ秒単位の時刻を得ることができたが、 IEEE Std 1003.1-2008によれば、 > Applications should use the clock_gettime() function instead of the obsolescent gettimeofday() function. とのこと。obsoleteになりかけ/なってるも…
標準関数timeの戻り値は1秒単位なので、繰り返して実行する間隔が短くなると、 同じ値が乱数の種として与えられるようになり、同じ乱数列が出現することとなる。 この問題はtimeの戻り値の分解能が原因なので、 簡単な解決策としてはもっと分解能の高い値を…
前に述べた、乱数生成器の初期化関数srandの引数にtime関数の戻り値を与えているプログラムを、 1秒は超えるがさほど長くない時間間隔で繰り返し実行した時にrand関数が最初に返す数値が、 msvcrtやBorlandにより提供されている標準関数を使うとある程度簡単…
今まで昇順になるようにしか整列させなかったので、 利用者側が任意の順序関係を定義して、 それに基づいた整列を行うように変更してみる。 list.h ...snip void list_sort(list_t list, int (*issup)(int, int)); ...snip 関数list_sortが二つ目の引数とし…
ヘッダで宣言したインタフェイスを実装する。 基本的にtest_node.cの各関数に沿った形になっている。 list_t型はtest_node.cにおけるダミー要素にあたるheadメンバーを管理する。 このダミー要素や実データを収納する要素はこれまでと同様にnode_t型である。…
書いてきたコードを整理する。 まずはリストとその利用者とのインタフェイスを定める。 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…