thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

C言語

可変引数

関数を使ってると引数の個数を可変にしたいなーって思う時があります。これまた難しいのですが、よく使う関数printf系が可変なので身近で使っているから簡単に出来そうなんて思う今日この頃。 可変長引数はコンパイラなど環境依存と言いますがお行儀依存しま…

配列の個数

静的に定義した構造体の配列の個数を後で知りたいときに便利です。 仕組み的にはアドレス辺りで説明しましたが、静的にとられた値は全体の領域がsizeofで取れるので、構造体1つのsizeofで割れば良いだけです。これはマクロなんかで用意しておく定番ですね。…

実践編:リスト2

前回のリスト形式の拡張で、特定の値から前の値に手繰れるように拡張します。 前回は新たに作成した時に、一つ前の情報に次の情報を保存しましたが、今回は、作成した情報に1つ前の構造体のアドレスを保存しておく事により、特定の情報を見れれば、前の情報…

実践編:リスト

そろそろC言語の言語から良く使う手法等のステップアップして実践編へ進みます。(と言うより言語ネタは尽きてきた) 特定の値をリスト形式にしたい場合に、特定の値の中に次の値に辿れる様にする事があります。この特定の値とは構造体で好きな形として定義…

関数ポインタ

状態により実行する関数を変えたい!動的に変えたい!などの場合に、実行する箇所で関数ポインタを元に実態の関数を呼ぶようにします。 qsortのブログでもサラッと利用しててスルッと説明を簡略しましたが、目的は同じです。 例:四則演算の関数をポインタを…

ビットシフト

名前のとおりビット単位で全bitをシフトします。右(小さく)へシフトさせる場合に[>>]を、左(大きく)へシフトさせる場合には[<<]を指定します。 ビット幅を超えたbitはなくなります。逆に出現したら(逆側から出てきたbit)0です。 #include <stdio.h> void _print(unsi</stdio.h>…

ビット計算2

ビットを扱うときに、0と1で表示したいなーと誰もが思うはず。たぶん。きっと。かな。。 ここで良くググると見つかる、2進数を表示する関数を書いてみました。 関数[_print]です。1byte(8bit)限定ですです。 予め8bit目が1の値(msk)を用意して(10進数で128…

マスク計算

真偽だけのフラグを良く使うことがありますが、さらに種類を設けて1つの値で表現する時などに使います。 例えば、ログ出力用に値を設けて、更に、デバック用・警告用・エラー用・通知用など、場合によって指定したものだけ出したい時に、1つの値で表現でき…

ビット計算

パソコンの扱う値は突き詰めれば0と1(2進数)です。char型の値も1byteで8bitですから、8個のビットが並んでいます。 これらビットを計算で数式がなりたっています。予め2進数を覚えておきましょう。 00000000 (10進数で0です) 00000001(10進数で1です) …

反転っす!

ifなので真(1以上)か偽(0)を判定する場合に、結果を入れ替えて解釈して欲しいことがあります。 これは単に反対の判定文すれば良いんですが、関数の結果で0を真として扱いたい、とか反対で判定すると、他の判定とことなり意味的に真なのか偽なのか統一感がな…

マクロ

プログラムを長く書き始めると、決まった値や簡単な書式を繰り返し書くのが面倒になったり、変えたい時に全部を変えなければいけなくて1つ忘れたら大変なことに。。。this is バグ. そんな時に定義(define)してしまいましょう。 使い方は同じですけど、一般…

設定(イコール)

いまさらだけど、設定って[=]で左辺に右辺の値を同じにする事ですが、書式的に連続しても同じになります。 int main() { int a; int b; int c; a = c = b = 10; printf("a:%d\n",a); printf("b:%d\n",b); printf("c:%d\n",c); } ■実行結果 $ gcc main.c $ ./…

実用:並び替え(qsort)

そろそろプログラム的な事も混ぜてきしょう。っでソート。 良くある実用事例で、沢山有るデータを何らかの基準を設けて並べる(ソート関数)を使ってみましょう。もちろん自分でソート関数も作ることは出来ますが、ここままず、標準である二分岐ソート(qsort…

型作っちゃうぞ

構造体や列挙体などいちいち宣言するのが長いものや、既存の型を、ちょっと分かりやすく名称をしたい場合に利用します。 作る場合の宣言として[typedef]を利用します。ちなみに、本当に新しい型を作れるものでないので要注意。てかC言語は未知の型は作れませ…

列挙型(emun)

列挙型とはちょっと分かり難いけど、実値にこだわらず沢山の定数が必要な時に便利です。実値はユニークが保障されているし列挙した順に1から順に振ってくれます。 enum TODOU { HOKKAIDO, AOMORI, IWATE } ; int main() { enum TODOU admin; printf("[%d]\n…

構造体(struct)

沢山の変数を扱うときに決まった並びや、それを繰り返し利用する際に、この体系を定義するのを構造体と言います。 名前は何でもよいです。(予約名は除く)例えばint,int,char[10]の変数の並びの構造体を、kata と言う名前として定義も可能です。 struct kat…

ちょっと一息(include)

インクルード(include)とは、#include と書いた位置に指定したファイルを埋め込みます。同じ記述を使いたい場合にはincludeで読み込みましょう。どんな感じに読まれるのはコンパイラのプリプロのブログ参照してください。 よく使うのはヘッダファイルと言わ…

文字区切りstrtok

文字列を特定の文字ごとに区切りたい時など便利か関数=strtokです。例えば"123-456-78-9-0A"の文字列が在った時に、-で区切って簡単に取得したいときに便利です。 が、、、、この関数には2つの悪魔が住んでるので要注意。後から説明します ■サンプル #inclu…

printf

C言語では最もよく使う関数でしょう(派生も含め)。この関数は色んな型の値を指定した書式で表示(標準出力)してくれる関数ですが、この指定の仕方が沢山あって覚えるのが大変なのですが、基本的なものは覚えましょう。 ■printf書式 printf("フォーマット",値1…

四則演算

すこし基本に戻って四則演算を頑張ってみる。 基本的には数式と変わり有りませんが、ちょっと記号が異なるので要注意。 + :足し算 - :引き算 * :掛け算 / :割り算 % :余り ■サンプル(intの例) #include <stdio.h> int main() { int s; int d; s = 11; d = 5; printf("</stdio.h>…