C

switch文のcaseでのブロック

C C++

switch文のcaseの中で変数宣言する場合は注意が必要です。 #include <iostream> using std::cout; using std::endl; int main () { switch(1) { case 1: int i = 0; break; case 2: int i = 0; break; } return 0; } $ cl /W4 /EHsc main.cpp Microsoft(R) 32-bit C/C+</iostream>…

A-starアルゴリズム

人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。この問題をC言語の勉強がてらやってみました。幅優先探索とか色々方法はあるみたいですが、A-starなんてアルゴリズムがあるらしく、折角なので調べながらやってみました。A* - Wikipedia #inclu…

int i;とint(i);の違いについて

C C++

色々勉強したり試したりしてて分からないことがあったので記録。以下のようなコードなのですが int main () { int(i); int j; return 0; } CでもC++でも問題なく動きます。つまりこれは変数宣言する際に、括弧で囲っても囲まなくてもまったく同じ意味になる…

nの符号を求めるテクニック

ロベールのC++入門講座 03-12真偽値が1と0なのを利用した、ある整数の符号を求めるテクニックの紹介がありました。 int sign = (n > 0) - (n < 0); nがもし正の整数の場合「(1) - (0)」となり、「sign=1」になります。nがもし負の整数の場合「(0) - (1)」と…

ハッシュ実装の話

C

次の内部ハッシュの実装(C言語のプログラムの一部)には誤りがある。誤っている部分を正しく修正せよ。ただし、Bはハッシュ表のサイズ、hashはハッシュ関数である。ハッシュ表の要素は正の整数とし、要素の個数はハッシュ表のサイズBより小さいとする。 本…

const付の変数をconst無しの関数とかに渡したい場合

C C++

ってどうするのが一番なんだろうか。例えばこういうコード int func (const char* s1,const char* s2) { char* p; p = strstr(s1,s2); if ( p == NULL ) return 0; return 1; } main.cpp(5) : error C2440: '=' : 'const char *' から 'char *' に変換できま…

strftime関数でフォーマット指定して日付の出力

C K&R

K&R本 付録B10printfのようなフォーマット指定子で日付の出力ができるみたいです。さっそくやってみました。 #include <stdio.h> #include <time.h> int main (void) { time_t t = time(NULL); struct tm tm; char str[81]; localtime_s(&tm,&t); strftime(str,sizeof(str),"%</time.h></stdio.h>…

strpbrk関数

C K&R

K&R本 付録B3第二引数のどれかの文字にマッチしたらそのポインタを返す。使ってみます。 #include <stdio.h> #include <string.h> int main (void) { printf("%c\n",*strpbrk("foobar","abc")); return 0; } $ main b文字検索とかで使う?のかな。</string.h></stdio.h>

strspn関数とstrcspn関数

C K&R

K&R本 付録B3 size_t strspn(cs,ct)ctに入っている文字よりなるcsの接頭辞の長さを返すsize_t strcspn(cs,ct)ctにない文字よりなるcsの接頭辞の長さを返す なんかよく意味がわからないので実際に使ってみる。 #include <stdio.h> #include <string.h> int main (void) { printf(</string.h></stdio.h>…

rewind関数

C K&R

K&R本 付録B1.6ファイルポインタの位置を先頭に戻す関数。これはfseekとclearerrの組み合わせと同じ結果になる。 fseek(fp,0,SEEK_SET); clearerr(fp); rewind(fp)で一発で書けるので先頭に戻したいときはこれ使ったほうが楽だね。

C言語ポインタ完全制覇読了

とても面白い内容でした。ただJavaに対する不満が節々に表れていて少しくどいような気もしました。まぁ面白かったからそれはそれで良いと思いますが。特に勉強になったのが2章と3章あたり。この辺はWebで勉強してたときにあまり詳しく出てなかった内容なので…

汎用的な連結リストを構築する

C言語ポインタ完全制覇 5-2-4連結リストは得てして同じような実装を量産する。そこで実際に持つべきデータをvoidポインタにしておくことで何でも格納可能な連結リストを実現できる。ただし何でも入ってしまうが故、何が入ってるのかわかりにくくなるので慎重…

C言語学び始めて今日で一ヶ月

C

しかしながら全然進んでない・・・。こんな調子でちゃんと覚えられるんだろうか。C++の勉強もしたいんだけど結局まだ手がつけられていない。C言語で精一杯。結構頑張ってやってるんだけどダメダメだなぁ。メゲソウ。

scanfよりもfgets&sscanf(or sscanf_s)を使うこと

C言語ポインタ完全制覇 2-1書き忘れ。 scanfを使うと、マッチしなかったデータが入力ストリームの残ってしまうので次のscanf等の呼び出しでおかしくなってしまう可能性がある。それをさせないためにまずfgetsで改行までの入力を先に全て取得し、改めてsscanf…

細かいreallocはフラグメンテーション化を助長する

C言語ポインタ完全制覇 4-2-1realloc関数で必要な分をその都度確保していたらフラグメンテーション化の恐れがあるので、一般的にはreallocで一時変数を確保&拡張し使いまわすというのが正しいやり方のようです。ということで前に実装したファイルの内容を行…

ポインタの共用体

C言語ポインタ完全制覇 5-2-4あまりにもサイズの違うデータを共用体で宣言する場合は共用体のポインタを使うほうが良い。 union { Foo *foo; Bar *bar; Baz *baz; } u; ただし、mallocによるメモリ確保と、freeしなければならないというデメリットもある。ト…

フラグメンテーションとrealloc関数

C言語ポインタ完全制覇 2-6-5、2-6-6 このあたりは凄く有用ですね。mallocを使うことで小さな空きブロックが溜まっていくのでメモリ効率が悪くなる。reallocだとその場所から拡張するので、うまく空きブロックに当たれば効率はいいが、無かった場合にコピー…

malloc関数の戻り値をキャストするなという話

C言語ポインタ完全制覇 2-6-1 よけいなキャストは書かないほうが、すっきりして読みやすいと思えるのですが。(中略)malloc()の戻り値をキャストするのはもうやめましょう。CはC++じゃないんですから。 僕は今のところmallocの戻り値を明示的にキャストしてい…

ヒープソートって難しい

http://www.geocities.jp/ky_webid/algorithm/022.htmlヒープソートです。木構造に見立てた?ソートのようです。読んでみたのですが、ややこしい・・・。もの凄いややこしいです・・・。ヒープの構築であるinsert_heap関数はわかりました。ですがヒープから…

Cの作者による言語Limbo

C言語ポインタ完全制覇 3-1-3C言語の開発者の1人、Dennis Ritchieが開発したLimboという言語があるらしい。全然知らなかった。機会があれば調べてみよう。

Cはメモリをどう使うのか

C言語ポインタ完全制覇 第2章 ここの説明は凄くいいですね。かなり勉強になってます。スタック構造で実行されているという部分も図解入りで凄くわかりやすかったです。また領域を破壊して無限ループしてしまうというサンプルもあり、すんなり頭に入ってきま…

可変長引数の関数は自重せよ

C言語ポインタ完全制覇 2-5-3 可変長引数の関数では、プロトタイプ宣言による引数の型チェックがききません。また、呼び出された側では、呼び出し側が正しく引数を渡していると全面的に信用して動くことしかできません。これらの点から、可変長引数を使った…

2次元配列の動的確保

C

C言語で2次元配列を動的に割り当てる4つの方法 - FLYINGcallocでいいのでは?と思ったんだけどよく考えたらcallocでもmallocでも書き方が違うだけで結局同じだよね、確か。(callocだと0クリアが入るという違いはあるものの)で、2次元配列なんですが、色…

マージソート

http://www.geocities.jp/ky_webid/algorithm/021.htmlマージソートです。いっぱいありますね、ソートって。 マージソートの最大の特徴は、配列のような直接アクセス(配列であれば添字によるアクセス)ができないリスト構造であっても、ソートを行える点に…

配列を関数の引数として値渡ししたい場合

C言語ポインタ完全制覇 1-3-6通常、配列は関数にそのまま渡すことはできません。関数に渡した時点でポインタ型でしか受け取れないからです。ですが、構造体を経由すれば可能であるということ。なるほど。実際にうまくいくか試してみます。 #include <stdio.h> struct </stdio.h>…

p++とp[i]の効率上の問題

C言語ポインタ完全制覇 1-3-4例えばループの中で何度もp[i]、つまり*(p+i)と書いてデータを参照するよりも、ループの初期化等でp++しておいたらループの中では*pで参照できるので効率が良い。 と、いうのは古の効率化手法らしい。今時のコンパイラなら最適化…

ポインタはあくまで型である

C言語ポインタ完全制覇 1-2-1ポインタという変数、という考え方ではなくて「ポインタ型の変数」と考えろってことか。確かにその辺混同するとわけがわからないことになるかもね。

C言語ポインタ完全制覇購入しました

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)作者: 前橋和弥出版社/メーカー: 技術評論社発売日: 2001/01/01メディア: 単行本購入: 22人 クリック: 147回この商品を含むブログ (75件) を見るK&R本も読み終わったので、次はこの本をじっくり読み進…

K&R本一通り読み終えて

C K&R

付録以外の1〜8章まで全て読み終わりました。基本的な部分は勉強済みだったので割とスンナリ読めました。ただ最後の最後、8.7の記憶割り当ての話はちょっと難しすぎて今の段階では良くわからなかったです。この辺の話をわかりやすく説明してる書籍やWebサイ…

低水準入出力の速度比較

C K&R

K&R本 演習8-1とりあえずファイルのオープンだけでやってみました。 #include <io.h> #include <fcntl.h> #include <stdio.h> #include "mylib.h" #define BUFSIZE 1024 void stdio_cp (void) { FILE *fp; errno_t err; char buf[BUFSIZE]; if ( (err = fopen_s(&fp,"test1.txt","r")</stdio.h></fcntl.h></io.h>…