strchr() ではまった話 標準Cライブラリに strchr() という関数があります。文字列の先頭から指定した文字を探すという単純な関数なのですが、先日、意外な仕様を知りました。 以下のコードを見てみます。 if (strchr("+-*/", c)) { // c は四則演算の記号かな? ... } この if 文は c が + - * / のいずれかの場合に条件が真となり、ブロック中が実行されます。…と、思いきや、実は条件が真になるケースがもうひとつありました。c が '\0' の場合です。 まさかと思って手元の Linux の man を見ると、文字列の終端のナル文字 ('\0') の扱いは明記されていません。 The strchr() function returns a pointer to the first occurrence of the character c i
なんかオレオレ言語が流行ってるみたいなので、参加してみる。 #include <stdio.h> #include <stdlib.h> #define define(ret, name, args, block) \ ret name args { return block; } #define if(expr, block1, block2) expr ? block1 : block2 #define eq(a, b) a == b #define sub(a, b) a - b #define scale(a, b) a * b define(int, fact, (int n), if(eq(n, 0), 1, scale(n, fact(sub(n, 1))))) define(int, main, (void), (printf("%d", fact(10)), EXIT_S
#1 C言語のポインタが難しくて挫折した経験 プログラマーになれる人なれない人 という記事を読んでて、ポインタと再帰が難しいという話が出てきた。 俺が昔、プログラミングができなかった頃、C言語にチャレンジして挫折したのは、やはりポインタだった。 解説書を読み、「ポインタはデータのメモリアドレスが参照できるもの」みたいな説明を読んでああなるほどね、と簡単に理解した。プログラミングができないとはいっても、BASICでゲームを作って遊んでた事はあるし、マシン語でメモリの特定番地から何バイトデータをもってくるみたいな事はやってたから、別にメモリアドレス云々はすぐ理解できた。 が、俺はここで悩み込んでしまった。みんなポインタは難しいって言ってる。理解できないって言ってる。俺はポインタをメモリ番地だと理解したけど、それで合ってるのか? メモリアドレス以外の何かがあるのか? もしかして俺はとんでもない勘
できた。試行錯誤している内に無駄に凝った作りになってしまった。ここまで来ると完全に手段が目的と化しているな。 fib.h: #ifndef __FIB_H__ #define __FIB_H__ typedef void (*destructor_t)(); typedef struct object { int ref_count; size_t size; destructor_t destructor; } *object_t; void addRef(object_t obj); void release(object_t obj); object_t newObject(size_t size, destructor_t destructor); void deleteObject(object_t obj); typedef void* (*func_t)(); typedef
黎明日記 : Cの底力 * Wataru's memo(2003-10-07) - 関数=変数=メモリー 驚愕したのでメモ。 リンク先の西田さんの記事もまだ甘い.今,ナウでヤングな若者 (ゴルファー) は,インラインアセンブラなんて使いません (コードを書きたいので,トラックバックで.コメントだとインデントがぐちゃぐちゃになるから) 極端な話,こんなコードも通ります (0x0000007b == 123.リトルエンディアン環境なので,7b 00 00 00). $ 猫 simple_func.c int main(){ int (*simple_func)(void) = (void *)"\xb8\x7b\x00\x00\x00\xC3"; return simple_func(); } $ gcc -o simple_func simple_func.c $ ./simple_func
「The International Obfuscated C Code Contest」という面白いコンテストがあります。 1984年から行われているこのコンテストは、どれだけ読みにくいC言語プログラムを書けるか競うものです。 wikipediaでは、以下のように説明されています。 IOCCCとは「The International Obfuscated C Code Contest(国際邪悪なCコードコンテスト)」の略称。汚く読みづらいC言語コードをあえて書き、その汚さを競うというC言語ハッカーの奇祭である。むろんただ汚ければよいというわけではなく、目にした瞬間のインパクト、実行結果の美しさなど、さまざまな要因でアーティスティックなものが選ばれる。多くのコードはそもそも全くC言語に見えない。コード全体がアスキーアートになっているものなどが典型的である。 第一回大会は1984年に行われ、
「Why I hate C」という記事がありました。 私は個人的にはC言語が好きですが、C言語が嫌だという視点も面白いので要約してみました。 かなり削っているので詳細は原文をご覧下さい。 C言語は組み込みに使うには良い言語ですが、その他の99.9%のアプリケーションを作るには最適とは言えません。 現在、アセンブラが一般的なアプリケーションを書くための良い解では無いことは自明です。 ここでは、もはやC言語もそうでは無い理由を述べたいと思います。 C言語の最も大きな問題はプログラマが間違いを犯しやすい事です。 私も良く間違えます。 どんなプログラマであっても数千行のコードを書いてバグが一つも無いということはありません。 コード量が少ないということは間違いの数も少ないということになります。 C言語は、言語のデザイン上、より多くのコードを書く事を要求します。 また、新しく開発されたプログラミング言
注意:応募期間が過ぎましたので、申し込みは締め切りました 結城浩です。2006年8月末に『新版C言語プログラミングレッスン』の入門編・文法編が刊行されます。 本書は1994年の発売以来、多くの読者の支持を受け、増刷および改訂を行ってきたC言語入門書のロングセラーです。このたび、MS-DOSが中心であった部分をWindows中心に改めたり、現在の処理系にそぐわない記述を改めるなどの修正を行いました。 日ごろの感謝を込めて、『新版C言語プログラミングレッスン』を無料プレゼントいたします。送料も無料です。 当選人数:7人(「入門編」と「文法編」とあわせて一人分、つまり当選すると2冊送られます) 応募期間:2006年8月29日(火)〜9月4日(月) 応募条件:以下の(A)(B)(C)のいずれかを実行してください。 (A) あなたのWebサイト(mixi可)に「結城浩」という文字列を含むエントリを書
「偽札対応済み」って書いてある両替機。 川口市立中央図書館…本屋の上にある図書館。に行ってきた。特に何もないけど。あと、マイコンショップ川口つぶれてた。 ある程度能力を持ってるなら、成果を残せるか残せないかは自信を持ってるか持ってないかの違いだけかもしれないというような話。 最近思うのだけど、使えない奴(例えば、僕のような)の特徴として、「どうせ自分が何をどうやっても、何もどうにもならない」的な思考があると思う。 例えば、上の一行で言うと、「使えない奴(例えば僕」とか、そういったような思考。 こういった思考は、いったん根付いてしまうと、循環するので、なかなかやめられない。「どうせ自分は何もできないんだ→何もできないから何もやらない→何も成果を残せない→どうせ自分は何もできないんだ」とかいった感じで。 矯正しようと思っても、「いや、こういう性格だから、矯正は無理だし。」と、いう思考になってし
実践プログラミング CとC++プログラミングに関するいくつかの例題と解説. 単なるプログラミングテクニックや文法の解説ではなく, 背後にある考え方の習得(アルゴリズム,データ構造,数学など)を重視して いる. プログラムをじっくり眺めそこから技法を学び取る. 最大値 [HTML] 曜日の計算 [HTML] 平均値,分散 [HTML] 2次方程式の解 [HTML] 最小自乗法 [PPT], [HTML] 待ち行列シミュレーション [PPT], [HTML] アーランの即時式モデル [PPT], [HTML] 行列のLU分解 [PPT], [HTML] ニュートン法による非線型方程式の解 [PPT], [HTML] 数値積分 [PPT], [HTML] 2分探索木 [PPT], [HTML] ヒープソート [PPT], [HTML] クイックソート [PPT], [HTML]
Cのプログラムの中でブレークポイントを設定する Cのプログラムをデバッグする際には GDB などのデバッガが役立ちます。通常、ブレークポイントはデバッガの中から設定しますが、デバッグ対象のCのプログラムの中で設定することもできます。 Linux なら #include <signal.h> して、任意の箇所に raise(SIGTRAP); を挿入すれば OK です。 raise() 関数を用いて SIGTRAP シグナルを発生させています。 あるいは x86 限定なら __asm__("int3"); でも OK です。ここでは SIGTRAP を発生させるために int3 (0xcc) 命令を埋め込んでいます。GDB もソフトウェア的にブレークポイントを設定するときは当該箇所に int3 を書き込んでいるので、やっていることは割と似ています (GDBの場合は int3 を書き込む部分の
あるAnonymous Coward曰く、"1989年創刊で、国内で最も歴史が長いプログラミング専門誌の一つと思われるC MAGAZINE(月刊/ソフトバンク クリエイティブ発行)が休刊となるようだ。ニュース元はIT関連メディア専門の広告代理店であり、IT系メディアのニュースサイトを運営しているf/x(エフエックス)の2006年1月13日の記事で、同じくソフトバンク クリエイティブ発行の「パソコン購入ガイド」誌と共に、3月発売号で休刊となるそうだ。 ソフトバンク クリエイティブは最近ライトノベルを刊行したり、レイザーラモンHGの関連本を出したりと、一般向けの書籍に力を入れている様子。一方でPC関連雑誌は次々と休刊されており、これから同社の他のPC関連雑誌も同様に、切り捨てられる可能性も考えられる。 個人的にはC MAGAZINEは学生時代からの読者であり、今の自分のプログラミング技術はこの
はじめに 開院準備 昔むかし/ レベル差/ 教育/ ネットワーク/ 情報集め/ 隠すことについて/ プログラムコンテスト/ ドキュメント/ 楽するように/ 手抜きと下手の違い/ 開院 第1部 外来 第1章 普通の初心者 最初から充実した(!?)プログラムが登場 関数を短くし、コメントを改善する 上手になる秘訣/ プログラムの紹介/ 何だ、このプログラムは!!/ 短くするには/ コメントについて/ 無駄な努力をやめよう/ 名前/ 気になる個所/ 修正プログラム/ 課題/ まとめ 第2章 これでもプロ 売りものであるにもかかわらず、超きたない! 構造的な欠陥の指摘〜引数、ポインタの活用 プログラムの紹介/ 「超」基本的問題点/ 関数分解/ 構造的欠陥/ 引数を使おう/ ポインタ/ その他/ まとめ(修正プログラム) 第3章 上司が問題 まさに驚異的なプログラムの見本というべき 内容の修正から、
特集 Cプログラミングの秘訣 最終更新: 2006-03-28 このテキストはC MAGAZINE 1992年4月号に掲載された原稿のオリジナルテキストを元にしてHTMLに変換したものです。掲載文章と細部が異なっていると思われます。また、気付いた個所をいくつか修正してあります。 当時はまだWindows 95もないような時代で、現在の状況から見ると違和感のある内容も結構あるかもしれませんが、時代背景を想像しながら補正しつつ読んでいただければ幸いです。 ※2006年3月28日追記: 何が原因か知りませんがこのページのアクセスが増えているそうなので、 HTML のおかしなところを修正しました。 文章の変更はありません。 なお、このサイト(表ページ)は現在休眠状態ですが、 裏ページ や 裏の裏ページ の方を、細々と更新していたりします。 目次 Part1 よいプログラムを書く条件 Part2 明
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く