thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ 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>…

メモリー

C言語で通なければならない関門のメモリ。使ってるメモリが状態がどうなってて、何をどう使ってるのを把握しておかないとnull pointerでスタックトレースなんて生温い結果じゃなくて、segmentation fault。はい終了。原因なんて教えてくれれやしない。プログ…

キャスト(型変換)

値を設定する際に=を挟んで、左辺と右辺の型が違う場合にキャストを行います。明示的にキャストをする場合と、暗黙的に行われる2つがあります。 暗黙的に行われる場合とは、型の相違が有った場合にキャスト指定が無い場合には優先順を元に自動で変換されま…

アドレスとポインタ

C言語はメモリ空間を直接感じれる言語です。Javaとかスクリプト系の言語では余り感じられないと思います。あえて隠していますが。 メモリ空間を直接扱うのはとっても早いのですが、ひとつ間違うだけでエラー発生プログラム終了!高確率でフリーズ。下手する…

参考書

C言語を覚える時に、まず参考書を買う人は多いでしょう。最近はインターネットで調べることも多くなりましたが、やっぱり手元で開いて何度も読み返しながら勉強するのは学生の時からの性なのでしょうか。もちろん私もです。 昔から知ってる書籍をあげてみま…

低水準や高水準関数とは

C言語の本や説明の中に、よく低水準関数とか高水準関数とかの言葉が出てきます。これは用意されている関数が、OS(オペレーションシステム)に依存するような関数なのかどうか、明確な境界線はありませんが、OSに近い(OSが違ったら動かないかもしれなさそう)関…

ファイル操作(fopen,fgets,fputs,feof,fclose)

ファイルのやり取りする関数を使ってみましょう。ファイルを扱うには基本的な作法があります。まず最初にファイルを開く(open)しなければなりません。そして開いたファイルに対して読み込み(read)や書き込み(write)が行えます。またファイルを開く際には、読…

コーヒーブレイク(IOCCC)

プログラミングとスパゲッティは密接で、タコ足のコンセントなんか目じゃないほど、絡まりに絡まったソースプログラムは人の手を介す度に解かれず放置されたのか見て見ぬふりと言うか触らぬ神に祟り無しなのか、、、完全にブラックボックスと化したプログラ…

関数って、、

関数とは処理を一まとめにした塊を、いろんな所で使いたい!使いまわししたい時に、「関数」って枠組みで作っておくと、色々なところから使えるようになります。この「関数」を使うには作法というかルールがあり、そのルールの事を関数インタフェース仕様と…

コピー

プログラムで良く使うのが、変数に値を設定する事です。ここでは値の型によって設定する方法が異なったり、便利な関数を使ったりする方法をご紹介です。値の設定の基本は、"="を挟んで右から左に値をコピーします。あと同じ型同士でないとコンパイルの時にひ…

文字列(string)の闇

C言語の型として1文字の「文字」(char)は有りますが、連続した文字の「文字列」という型は存在しません。しかしC言語を使ってシステムを作成するには文字列を避けて通れません。数字のみの学術系なら別ですが。 この文字列を表現するのに、連続した文字(char…

配列

値の領域が連続している状態を指します。これを型のサイズ分だけ繰り返して参照させる仕掛けとして、変数に""として表記すると容易に参照できる仕掛けを配列と呼びます。 注意点としては内に型サイズの移動個数を指定できますが、最初は移動しないので0とな…

繰り返し(for)

条件が合う間は処理を繰り返す 書式 for(初期処理 ; 条件 ; 後処理) 処理 一般的に使う場合は、初期処理で値をセットし、条件で判定させ、後処理で値を変更させる事が多いです。 例題:値aを0から1づつ増加させ、10以下の間は処理を繰り返す。 int foo(void)…

繰り返し(do-while)

特定の条件において処理を繰り返ししますが、処理後に判定のケース 書式 処理 do - while(条件) ; 例題:処理後にaが1の場合は繰り返す。 int foo(void) { int a =1; int b =0; do { printf("foo\n" ); b++; if ( b > 10 ) a = 0; } while ( a == 1 ) ; }

繰り返し(while)

特定の条件において処理を繰り返しします。 書式 while(条件) 処理 ; 例題:aが1の場合は処理する。を繰り返す。 int foo(void) { int a =1; int b =0; while ( a == 1 ) { printf("foo\n" ); b++; if ( b > 10 ) a = 0; } }

ジャンプ(go to)

特定の場所へ移動することが出来ます。 ただ、作り的に煩雑になるので、あまり使われません。 書式 goto 場所名; int foo(void) { int a =1; if ( a == 1 ) { goto err; } printf("ok\n" ); return 0 ; err: printf("ng\n" ); return 0 ; }

条件分岐(三項演算)

条件分岐(三項演算) if文以外にも三項演算と言う分岐ができます。 書式的は: 条件 ? 正の式 : 負の式 条件が合えば、正の式に分岐し、合わなければ負の式に分岐します。 ただifと違って複数の式は使えません。 例題 もし値aが「1」(if)なら"ok"を表示、その…

忘れられた三男

main関数には三番目の引数が有ります。良くある教本では省略されている事が多いですが、有っても余り利用する機会が無さそう。 書式: int main(int argc, char *argv, char *envv) argc : 引数の数。引数なしの状態で1です。 argv : 引数の配列。最初は[0]プ…

条件分岐(switch)

多数の判定をして分岐をさせます。 例題 もし値aが「1」(if)なら"ok"を表示、他で値aが「2なら」(else if)なら"bingo"を表示、その他(else)なら"ng"を表示する。 int main() { int a = 3; // aの値で振り分ける switch( a ) { case 1: // 1ならここ printf("…

条件分岐(if-else if-else)

複数の判定をして分岐をさせます。 例題 もし値aが「1」(if)なら"ok"を表示、他で値aが「2なら」(else if)なら"bingo"を表示、その他(else)なら"ng"を表示する。 void foo(void) { int a =1; if ( a == 1 ) { printf("ok\n"); } else if ( a == 2 ) { printf…

条件分岐(if-else)

判定をして合致する場合としない場合を分岐をさせます。 例題 もし値aが「1」(if)なら"ok"を表示する。その他(else)なら"ng"を表示する。 void foo(void) { int a =1; if ( a == 1 ) { printf("ok\n"); } else { printf("ng\n"); } return 0 ; }

条件分岐(if)

判定をして分岐をさせます。 例題 もし値aが「1」(if)なら"ok"を表示する。 void foo(void) { int a =1; if ( a == 1 ) { printf("ok\n"); } return 0 ; }

値を保存する場所は必ず型を持っています。(void*は先の話として) ですので値を保存する場合には、型にあった場所に保存しましょう。 良く使う型 int (整数)※マイナス有りですが、小数点などの実数じゃない short (整数)※2byteサイズ。 long (整数)※4byteサ…

コンパイル

コンパイルって何ぞや?って躓かないようにちょっと一息。プログラム言語には色々種類がありますが、この種類を大別すると、「高級言語」と「低級言語」にわけられます。 まず高級言語とは別にブランド品とかお高いとかではなくて、人間に分かりやすく文法で…

hello

いろいろな言語で良くある始めの一歩と言えば、画面にhelloと出すプログラム。では行ってみよう! 画面と言ってもコンソールというかターミナル(標準出力)にだす関数[printf]のお勉強。 vi main.c #include <stdio.h> int main(int argc,char **argv) { printf("hello</stdio.h>…

環境です

OSはLinuxでCentOSをちょいす。コンパイラはgccエディタはemacs時々viです。両刀遣い

鉄の掟

C言語を頑張るうえで、いろいろルール(鉄の掟)を決めてみた。・C言語は、K&R的なANSI規格準拠。逸脱ごめん・極力素のC言語を知るために、IDEやら何やらの便利ツールを使わない。・GUIが絡むと途方にくれるので、UIはCUIのみ・誰でも使えるいわゆるフリーソフ…

C言語はじめました

最近とんと見ることが無くなったC言語ですが、まだまだメジャーなソフト(apacheなど)はC言語で書かれているので、ソースを読めるようなるのと、メジャーなソフトを書ける?までがんばる!ので、C言語を始めました。