2007-02-01から1ヶ月間の記事一覧

マジックSysRqキーの使用例

何らかの原因でシェルからの入力が一切行えなくなった場合は、PCのリセットボタンを押してリブートするしかない。しかし、ハードディスクがクラッシュする可能性もあるので、可能な限り安全な方法でリセットしたい。そのようなときには、マジックSysRqキーを…

ピラミッドの描画

#include #define NUM 5 int spira(int n); int main(void) { spira(NUM); return (0); } int spira(int n) { int i; int j; for (i = 1; i 実行結果 [root@NAS src]# ./spira * *** ***** ******* *********

4種類の直角三角形を描画するプログラム

#include #define NUM 5 int trilb(int n); int trilu(int n); int triru(int n); int trirb(int n); int main(void) { printf("左下直角三角形\n"); trilb(NUM); printf("\n左上直角三角形\n"); trilu(NUM); printf("\n右上直角三角形\n"); triru(NUM); pri…

アルゴリズムとデータ構造

Cの文法の勉強はさしあたって終了とする。文法の勉強でも、例題を解きながら進めるとなると思いの外時間が掛かった。近い将来に聖典といわれるK&Rに挑戦したいところ。これから暫くはアルゴリズムの勉強をする。

構造体

構造体は以下の様に定義し、宣言する。 /* 構造体の定義 */ struct _person { char name[20]; char sex; int age; }; /* struct _person型変数 p の宣言 */ struct _person p 以下の様に簡略化できる。 /* 構造体の定義 */ /* 同時にperson_t という型を定義…

sizeof演算子

sizeof 式 sizeof(型名) sizeofは(演算子には見えないが)演算子である。「式」や「型名」で指定されたデータ型の大きさ(バイト単位)を計算する。また、「式」は実際には計算しない(例えば、++演算子が付いていてもインクリメントしない)。移植性を考慮する…

疑問7

malloc()はvoid型のポインタを返すが、これをキャストするか、しないかの二通りの意見があった。どちらがいいのだろうか。

今日はあまり進まなかった……

プログラムを書くことは処理の手順を日本語で詳しく説明することである。

某所でのプログラム教育には、まず紙と鉛筆を与えて処理を紙に起こすことから始めるらしい。後はそれをCなどの言語に置き換える。そういえば、情報処理技術者の勉強をしたときも似たようなことをした記憶がある。今ひとつ浪漫は感じないけれど現実的な話だな…

malloc(3)

void *malloc(size_t nmemb, size_t size); 実行時に決まるメモリサイズをヒープ領域から取り、void型のポインタを返す。これをメモリの動的な割り当てという。malloc()で確保したメモリはfree()で解放する必要がある。動的なメモリ割り当てで使う領域はヒー…

最適化のケーススタディ

8時間掛かっていた処理を以下のように最適化した。「現実的なCプログラミング」P.314より 浮動小数点演算専用プロセッサの使用(-2時間) 高速なマシンへの変更(-4時間) 関数をマクロに変更(-15分) 浮動小数点演算を整数演算に変更(-30分) scanf処理を辞めて…

操作・演算の相対費用

printf, scanf 1000 三角関数 500 浮動小数点演算 100 整数除算 30 整数乗算 20 関数コール 10 配列インデクシング 6 シフト 5 加算/減算 5 ポインタ逆参照 2 ビット演算 1 論理演算 1

今後の課題

デバッグと最適化。現在のところ素通りした。

配列を初期化する標準ライブラリ関数(memset)

memsetのように頻繁に使われるライブラリ関数は、アセンブリで書かれていることが多いらしい。以下使用例。 #include #include #define NUM 5 int main(void) { int num[NUM]; char str[NUM]; int index; memset(num, 0, sizeof(num)); memset(str, 'A', siz…

教科書の回答

教科のコードと比較する。write(2)で書き込むサイズとしてバッファ全体のサイズを指定していたことが間違いだと分かった。 /************************************************************* * copy -- アンバッファドI/Oを使用してファイルを複写する。 * *…

copyコマンドの自作1

システムコールを使用した、アンバッファドI/Oでのcopyコマンドの自作。まずは自分なりに作成してみた。コマンドラインからの引数エラーについはチェックしていない。 /************************************************************* * copy -- アンバッフ…

歴史のはなし

BC(Before Computer)の時代のテレタイプは、プリントヘッドが右端から左端へ移動するのに2/10秒(2文字分)かかった。このため、プリントヘッドが左端へ復帰動作しているときに次の文字が送られるとその文字は失われた。そこで、行末を2文字とすることでこの…

数字と数値の変換

数字を数値に変換するには、文字コードから48を引けばいい。以下のようにすれば簡単。 ch - '0' 上位4ビットを無視しても言い。0011 0001(== '1')の上位4ビットを無視すると数値の1になる。

ファイル内の文字数を数えるプログラム

#include #include #define FILE_NAME "/root/src/tmp00" int main(void) { int count = 0; int ch; FILE *in_file; in_file = fopen(FILE_NAME, "r"); /* ストリームを開く */ if (in_file == NULL) { printf("Can not open %s\n", FILE_NAME); exit(8); } …

fgetc

int fgetc(FILE *stream)は、stream から次の文字を unsigned char として読み int にキャストして返す。ファイルの終りやエラーとなった場合は EOF を返す。EOFが文字の値ではない為、このような措置が必要となった。

ファイル入出力

Cは、プログラム起動時に3つのファイルを自動的にオープンする。即ち、stdin/stdout/stderr。

問2

では、以下のように変更して実行すると意図した結果とならない。何故か。 #include /***************************************************** * tmp_name -- テンポラリファイルの名前を返す。 * * コールされるたびに新たな名前を返す。 * * * * 返り値 * *…

問1

以下のプログラムは妙な物をプリントする。何故か。 #include /***************************************************** * tmp_name -- テンポラリファイルの名前を返す。 * * コールされるたびに新たな名前を返す。 * * * * 返り値 * * テンポラリファイル…

ポインタの演習

名前/姓の形式の文字列を分割するプログラム #include #define NUM 80 /***************************************** * my_strchr -- 文字列中の指定文字を探す * * * * パラメータ * * find -- 指定文字 * * string_ptr -- 調べる文字列 * * * * 返り値 * * …

列挙型(enum)

一定の限られた範囲の値しかない、というタイプの整数型偏すには、#defineを沢山書くよりも列挙型を使う方がベター。(現実的なCプログラミングP.200) #include /* enum(列挙型)の定義 */ enum week_day {SUNDAY, MONDAY, TUESDAY, WENDESDAY, THRSDAY, FRIDA…

偶数/奇数判定マクロ

2進数では偶数は最終ビットが0になることから、ビット毎のand演算で判定できる。 #define EVEN(x) ( ( (x) & 1 ) == 0 ) 未知数xが偶数ならば、( 0 == 0 ) となり、マクロの結果は真となる。

gcc

-E: プリプロセス処理が終了したところで停止します。コンパイルは しません。出力はプリプロセス済みのソースコードであり、標準 出力へと送られます。

再帰関数

関数は自分自身を呼び出すことが出来る。再帰関数は次の2つのルールを守らなければならない。 再帰が終わる地点がある 再帰によって問題がよりシンプルになる 再帰の例。main()がfact(3)をcallし、fact(3)がfact(2)をcallし……fact(0)まで行った後戻っていく…

与えられた文字列の単語数をカウントするプログラム(wc)

多分良い出来ではないと思うがとりあえず完成。 #include #define NUM 16 /* 関数定義 */ /* 引数として与えられた文字がASCIIコード0〜32か127の場合、1を返す*/ int char_jadge (const char character) { if ( ( (int)character ) { int index; /* 配列の…

bash

IFS Internal Field Separator の略。実際に設定されているものを見るには以下のようにするといい。 # echo -n "$IFS" | od -b -a 0000000 040 011 012 /* 8進数表示 */ sp ht nl /* 名前表示(ASCII文字コード表参照) */ 0000003 # IFS=$'\n' /* IFSを改行の…