2025-02-28 Arduino勉強会/36-jtag2updiで最新のATtiny202を使う 2025-02-22 FrontPage 2025-02-15 sage/text/数の計算・基本的な関数 2025-02-06 AnalogDiscoveryを試す/03-LCノッチ・フィルタ 2025-02-01 avr/avrlib/I2Cを使う(マスター編)
何年か前に単純な興味からコンパイラ(A.V.エイホ、R.セシィ、J.D.ウルマン著、原田賢一訳。麻宮騎亜の漫画の方ではない)という本を読んだことがあるのですが、途中から yacc, lex といった解析プログラム作成プログラムの話になって「プログラム持っとらんけん実践できんやないの」とやるせなくなったことがあります。 で、Cygwin に yacc, lex の上位バージョンである bison, flex が入ってることが分かったので、その bison を使ってみることにしました。折角タダで用意してくれているので、info bison を読んでやってみることにしました。 今回のプログラマの友はその覚書のようなものです。bison を使おうと思ってるけど尻込みしている人の参考資料にでもなれば幸いです。 (註:用語には無頓着なので不正確なことがあります) bison とは? 構文解析の基本知識
近年、Linuxやcygwinの普及によってだれでもyacc/lexを使って新しい言語を作成し、その処理系を作成することができるようになってきた。 G・フリードマンの「Cコンパイラ設計」は、yacc/lexの使い方を丁寧に説明した名著であるが、英語の原本も日本語本も絶版で、amazonのオークションでも買えないため日本語訳本を借り、OCRから復刻することにした。 Linux、cygwinではbison, flexが使われているので若干本書と内容が異なる部分があるが、それも別枠で整理してみたいと考えている。 4章以降は、竹本 浩のページ(Wiki)に追加中2008/05/15 コンピュータの発達とともに、これまでにCOBOL,FORTRAN、Pasca1,Lisp、C等、数多くのコンピュータ言語が作られてきました。一般には,新たなコンピュータ言語、あるいはそのコンパイラを作るなどということは
Cコーディング・スタイル例 以前(2~4年前)に、社内向けにコーディング規約案を書いたことが あり、その残骸?があったのでコーディングスタイルの例として 出しておきます。 規約といってもラフなものですし、その当時の自分の スタイル/自衛手段を書き出し、これを叩き台にして他の人の要望 などを反映させたりしました。以下は、 社内事情や自分のスタイルに合わない個所をいくつか 削除しています(自分の習慣でない記述も残っていますが)。 単なる一般的な自衛手段だったり 完全に自分の好みのこともありますが、 一応、なぜ、そのようにするのか、を、書くようにしていたので、 何かの参考になるかもしれません。 あと、スタイルに関しては 『プログラミング作法』(書籍ですが)を みるのがいいでしょう。オンラインでは こちらなんか も結構いいです。 ■はじめに ■ ソース・ファイル ■ソース中の特殊文字コード ■動作
プログラムの設計 ファイルの分類 名前のつけ方 関数の作り方 システムライブラリの使用について 入出力 エラー処理 make その他 プログラムの設計 プログラムは、拡張性をもつように設計すること。 システムコールからの戻り値は、必ずチェックすること。 (malloc,fprintf,fopen) 一時ファイルを使うときは、TMPDIR が定義されているか調べ、 あれば、それを使う。 すべてのプログラムは、-v(version) と -h(help) をサポートしなければならない。 ファイルの分類 XXX.h は構造体の定義、記号定数名の定義、マクロの定義、 グローバル変数の定義、関数の定義、 システムのヘッダファイルの include など定義部を入れます。 複数の XXX.c が使うものをここで定義します。 また多重に include されてもいいように、先頭と
ポインタとは ポインタはC/C++言語の特徴的な機能のひとつである。ポインタ(pointer)を直訳すると「指し示すもの」であり、別の変数や文字列定数の場所を指し示すために使う。また、ポインタを指すポインタ(ポインタへのポインタ)というものも存在する。 このページをお読みいただいている読者にあっては、「C言語 ポインタ」「C++ ポインタ」などのキーワードでWeb検索をしたことがあるかもしれない。そうするとポインタに特化した内容の書籍をいくつか見つけられる。それだけ奥が深い機能ということである。 ポインタの用途 では、ポインタはどんなところで使われているのだろう。C/C++言語では、あらかじめ定義されている関数が多数存在するが、その一覧には、*(アスタリスクあるいはアステリスク)が付いているものをよく見かける。 これらはポインタを表し、主に文字列の操作やファイルをはじめとするデータの入出力
2. C プリプロセッサ 本章では、プリプロセッサに新たに加わったいくつかの機能と、プリプロセッサに対する変更点について説明します。 2.1 新しいコメント表記方法 今までのプログラミング言語 C でのコメントの表記法は、/* */ という表記を用いていました。次の例では、青色の部分が示している部分、つまり /* で始まり */ で終わる部分がコメントとして扱われました。 /* * 引数一覧表示プログラム (c)1999 seclan * ver1.00 1999/03/15 最初のバージョン */ #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i = 0; i < argc; i++){ printf("%d: %s\n", i, /* 添え字。今何番目を 表示しているか */ argv[i] /*
| 分割コンパイルと翻訳単位 | extern記憶クラス指定子 | リンケージ | オブジェクトモジュールとライブラリ | 演習問題 | [付録]nmコマンド | 分割コンパイルと翻訳単位 だんだん複雑なプログラムを開発するようになると ソーステキストが長くなり,一つのソースファイルで作成していると 全体を見通すのが難しくなってきます. またほんの一部だけを修正をしたときにも 全体をコンパイルし直さなければならないので, コンパイルに時間がかかるようになります. よって,プログラムをいくつかの部分に分けて 別々に開発したいという要求が自然に起こってきます. このような考えからプログラミング言語には 一つのプログラムを複数に分割できる機能が提供されることが多く, そのような各部分のことを一般にはモジュールと呼びます. C言語ではモジュールは翻訳単位と呼ばれ, おおまかには一つのソースファイル
WisdomSoft(旧) このサイトはすでに運用を停止しています。 新しいコンテンツはこちらをご覧ください ■Products■ 書籍 ソフトウェア 読本C 読本Java Javaアプリケーション作成講座 Windowsゲームプログラミング ゲームエンジン プログラミング C#ゲームプログラミング Cisqua Developers Network プログラミング システムとAPI C言語入門 C++入門 C#入門 D言語入門 Java言語入門 Objective-C入門 Lisp入門 Perl入門 PHP入門 アセンブリ言語入門 Win32 API入門 標準 Windows API コモンコントロール マルチメディア API Windows ソケット JavaAPI入門 AWT入門 Swing入門 ネットワーク入門 Microsoft .NET入門 DirectX入門 OpenGL入門
ある意味、餃子ブームだ。 == メールサーバってCだから、C向けのテスト手法はいろいろと調べたりすることが多いし、自分でツールを作ったりします。せっかく調べたので、C言語をターゲットとした単体テスト/ユニットテストツールを枚挙してみる。 CUnit http://sourceforge.net/projects/cunit/によるユニットテストフレームワーク。出力に「__FILE__」「__LINE__」を記載して、分析しやすく結果を表現する。XML出力モード(Automatedモード)で実行し、DTDとXSLスタイルシートによって、統計情報が見やすくなる。 CUnit for Mr.Ando 安藤利和さんによる「言語技術者のC言語技術者によるC言語技術者のための C言語テスティングフレームワーク」。ソースはhttp://sourceforge.jp/projects/cunitforan
鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ」関数の呼び出し これ以外の処理を記述しないこと! 説明: シグナル受信時に何らかの処理を行うためには、シグナルハンドラと呼ばれる関数を用意し、それをsigaction関数でシグナル名と紐付けておけばOKです。しかし、シグナルハンドラ内で行ってよい処理は、上記の通り非常に限定されています。これを把握しないまま奔放なコードを書くと次のような現象が起き得ます: 問題1: プログラムがデッドロックする危険がある タイミングに依存する、再現困難なバグの原因となる デッドロックの発生が典型例だが、それ以外にも関数の戻り値不正
その他にも、気になる個所はいっぱいあります。以上に述べたことほど重要ではありませんが、 でも、相当におかしい点です。プログラムの流れに沿って調べて行きましょう。 ■引数の書き方■ 66行を見てください。 関数call_melsecの第2引数はcccです。cccという名前のつけ方は実にいい加減ですね。 unsigned char ccc[200]; としていますが、文字列引数にサイズを直接書くのは相当「異常」と言えるでしょう。ふつうは、 unsigned char ccc[]; または unsigned char *ccc; と書くところでしょう。 ■signed と unsigned■ char型を使用するとき、必ず unsigned char として使っています。 char型は、signed になるか、unsigned になるかはコンパイラによって異なります。ただし、通 常の文字処理では
ポインタ虎の巻 初級篇~ポインタはなぜ難しいか? C言語を学ぶ上で、ほとんどの人が引っかかり、往々にCの勉強を放棄するきっかけとなるのがポインタである。しかし、ポインタはC言語という特定のプログラム言語だけではなく、コンピュータというものを理解する上で、必要不可欠な重要な機能である。C言語参考書では、ポインタを解説する上で「箱」のモデルを使って解説することが多いが、この虎の巻では、より突っ込んだ具体的な動作を解説することでポインタというものの本質を解明して見ようと思う。参考書ではC言語の抽象レベルの上で解説がされるのが通例だが、虎の巻では単純化されたアセンブリ命令を使って具体的に解説する。 初級篇目次 変数とは何か? 疑似アセンブリの定義 文字列の処理 アドレスの取得 ポインタの型 関数呼び出しの手法 構造体とポインタ リスト構造 NEW 二進木 NEW 中級篇~ポインタの高度な技 ポイン
Created: Kazuki Ohta, 2006/06/14 Last Update: Kazuki Ohta, 2006/06/14 「write(2)の正しい使い方」と同じく、OS演習でやった事の延長線の記事を書いてみる。お題は「UNIX上で大規模ファイルを最速でコピーする方法」だ。一般的に、UNIXでファイルをcopyする際には以下のような方法が有る。 read -> write read -> write with posix_fadvice mmap -> mmap -> memcpy -> fsync mmap -> mmap -> memcpy -> fsync with madvise mmap -> write mmap -> write with madvise read, write, mmap辺りは良いとして、posix_fadviseというシステムコールが有
3.1. ctags タグというのは、場所の情報を保持する類のものです。これは C 言語 を理解したりそのファイルを編集したりする場合に非常に役立つもの です。またある関数が呼ばれている場所からその定義場所にジャンプ したり、そこから戻ったりする場合にもとても役立ちます。 以下を例にとります。 今 foo() を編集中に関数 bar() まで行くとしましょう。さて、bar() が何をしているのかを知るにはタグを利用します。この関数の定義に ジャンプして、それから後で戻ってきます。必要なら bar() の中で 呼んでいる別の関数にジャンプして、戻ってくることもできます。 タグを使うには、最初にすべてのソースファイルで ctags プログラム を実行しなければなりません。このプログラムは tags というファイル を生成します。この tags というファイルにはすべての関数定義を 指している
初出: C MAGAZINE 1995年8月号 Updated: 1996-03-12 [←1つ前] [→1つ後] [↑質問一覧] [↑記事一覧] [ホームページ] ポインタ 前回は文字列を特集しましたが、文字列と密接に関係するのがポインタです。 初心者にとっては鬼門と呼ばれることもあるポインタですが、C言語を使いこなす には必要不可欠な概念でもあります。 経験的には、プログラムが思った通りに動作しない場合、ポインタの使い方を 間違っている確率は非常に高いようです。ポインタを十分理解することが、トラ ブルを少なくする近道の一つです。 Q 【ポインタ】 ポインタとは何か。 A それを詳しく説明すると他のQ&Aを書く頁がなくなってしまいます。:-) C言語に関する入門書の殆どが、ポインタとは何かというテーマで解説した章を 含んでいるはずなので、それらを読んでください。簡単なイメージとしては、実
第2回 C++アプリケーションの効率的なテスト手法(CppUnit編):連載 C++開発者のための単体テスト入門(1/4 ページ) 連載目次 前回は単体テストの重要性を示し、従来のC/C++でのテスト手法であるprintf関数やassertマクロを使ったテストを紹介しました。この2つのテスト手法は開発環境(コンパイラとライブラリ)さえあれば利用でき、その使い方も簡単です。しかしながら、いずれも系統立てて、効率よくテストを行うには力不足の感が否めません。 今回は、Visual C++ 2005 Express Editionを含むVisual Studio 2005(以後、VS 2005)で利用できる代表的な単体テスト・フレームワーク(Unit Test Framework)の1つである「CppUnit」を紹介します。 ■単体テスト・フレームワークとは? 前回、「バグは早期発見が望ましい。早
Cのソースコードに m = 195; とか n = 0xffffffff; とか書いたときの定数(右辺)の型って、なんであるかご存じでしょうか? また、C90(1990年版のISO C言語規格)とC99(1999年版のそれ)ではその型が微妙に異なったりすることがあるんですが、ご存じでしょうか? さらには、お使いのマシンがILP32であるかLP64であるかLLP64であるかによっても、微妙に型が違ってきたりするんですが、それについてはどうでしょうか? えーもちろん、普段は「Uがついてなかったらint, Uがついてたらunsigned intジャネーノ?」くらいの理解でも殆ど不自由しないわけですが、詳細な理解がないとハマるケースも稀にあります。 私はというと、上に書いたような事は、C90/99の差違を除いてはだいたい理解しているつもりだったのですが、C90/99の差異について無頓着だったがため
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く