タグ

Cに関するvalinstのブックマーク (26)

  • 2016年、C言語はどう書くべきか (前編) | POSTD

    (訳注:2016/3/2、いただいた翻訳フィードバックをもとに記事を修正いたしました。) (訳注:著者のMattより、「文中で明言はしていないが、この記事の内容はx86-64 Unix/Linux/POSIXでアプリケーションをプログラミングする場合にフォーカスしている。他のプログラミング領域では、対象とするシステムに応じた(例: 8-bitの組み込みシステム、10年前のコンパイラ、多くの異なるCPUアーキテクチャで動く必要のあるアプリケーション、Win/Linuxでのビルド互換性など)特有のアドバイスが必要」との補足を頂いております。) 以下の文章は2015年の始めに書いたドラフトで、今まで公開していませんでした。私のドラフト用フォルダの中で誰の目も引かなかったため、大部分が書いた時のままです。公開するにあたり、単純に2015年を2016年に変更しました。 必要な修正、改善、苦情があり

    2016年、C言語はどう書くべきか (前編) | POSTD
  • C/C++言語 開発環境

    gistfile1.md Windows/Linuxで両方で動作する成果物を想定。 有償のツールは理解が得られる方が稀なので除外。 仕様書 外部仕様 Word/Excelが手軽だけど差分が追いにくい。 Markdown+PandocかSphinxでPDF提出がいいかな? Pandoc - About pandoc Sphinx-Users.jp :: ドキュメンテーションツール スフィンクス Sphinx-users.jp 内部仕様 きちんと書いてあればDoxygenで十分だと思う。 Cしか対応していないみたいだけどdocuriumの方がgitとの親和性が高くて(tag付された結果をまとめて解析してくれるみたい)出力結果も今風にできてる。 Doxygen github/docurium インセプションデッキ 作っておくと上司/部下/協力メンバで方針を合わせやすい。 ネスケラボ » インセプ

    C/C++言語 開発環境
  • C言語で可変長引数をとる関数を、型安全に書く方法

    C言語の可変長引数は、型安全でない(まちがった型の引数を渡してもコンパイルエラーにならない)とされています。これは言語仕様の理解としては正しいのですが、特定の型の引数を任意の個数とる関数に限っては、マクロを使うことで型安全性を確保することができます。 任意の個数のdoubleを引数にとり、その和を返す関数「sumf」を例にあげて説明します。 C言語の可変長引数機構を使ってsumfを定義すると、以下のようになります。 #include <math.h> #include <stdarg.h> #include <stdio.h> static double sumf(double nfirst, ...) { double r = 0, n; va_list args; va_start(args, nfirst); for (n = nfirst; ! isnan(n); n = va_a

  • わずか500行のCソースコードで作られたCコンパイラ「CC500」 | ソフトアンテナ

    Cコンパイラといえばとてつもなく複雑なプログラムというイメージがあります。ところが、このCコンパイラを(サブセットとはいえ)わずか500行ほどのCのソースコードで実現した「CC500」名付けられたプログラムが公開されています。 ソースコードは可読性を維持するためにつけられた空行やコメントを含めると、実際は750行ほどになるそうですが、それでもこれだけコンパクトなソースコードで実行可能なELFバイナリ(Linux用のバイナリ)を生成できるのは興味深いのではないでしょうか。 以下実際にLinuxでコンパイルしてみました。 自己コンパイルできる このコンパイラはC言語のサブセットで、自分自身のソースコードをコンパイルできるところがおもしろいところです。まず「cc500_1」という実行ファイルを生成します。 gcc cc500.c -o cc500_1 生成された実行ファイル「cc500_1」を使

    わずか500行のCソースコードで作られたCコンパイラ「CC500」 | ソフトアンテナ
  • C言語でプログラミングする際の覚書(Notes on Programming in C) - YAMAGUCHI::weblog

    はじめに こんにちは、Go界のシャールト・コプリーです。気がついたら最後のエントリから3ヶ月も経ってました。 Goを始めると「なんでこういう書き方になってるんだろう」とか、「そもそもなんでこういう仕様になってるんだろう」とか思うことがちらほらあると思います。これは大いにGoの作者の一人であるRob Pike氏の思想に依るところがあるのが見受けられます。彼のプログラムに対する考え方が25年前に公開され「Pike Style」として知られていますが、いまもその考え方は大きくは変わっていないと思われます。せっかくなので翻訳しました。文はC言語に関する文章ですがその質は言語に依らないものだと思います。 Notes on Programming in C (追記)25年前なのでコンパイラの動作に依存する部分(includeに関する記述)などは古い部分もありますが、プログラミングスタイルに関する部

    C言語でプログラミングする際の覚書(Notes on Programming in C) - YAMAGUCHI::weblog
  • Cコンパイラをスクラッチから開発してみた(日記)

    以前に8ccというCコンパイラをゼロからひとりで開発していたときのログです。40日でセルフコンパイルできるところまで到達しています。日付はすべて2012年です。コードとヒストリはすべてGitHubで見れます。 3月4日 というわけでコンパイラを作っているわけだけど、1000行くらい書いたらそれなりに動き始めてきた。こんなのも動くし: int a = 1; a + 2; // => 3 こういうのも通る。 int a = 61; int *b = &a; *b; // => 61 文字列は文字の配列として扱っていて、配列をポインタに成り下げる振る舞いも実装しているので、こういうのも通る。関数呼び出しもある。 char *c= "ab" + 1; printf("%c", *c); // => b 前回もこのあたりはがんばって実装したからここまで作るのはわりと単純作業かも。二回目だから配列とか

    Cコンパイラをスクラッチから開発してみた(日記)
  • C言語における暗黙の型変換とAPI設計 - もなもなもなかのページ

    #include <stdio.h> #include <stdlib.h> int main(void) { int a = 65535; char b; b = a; printf("%d %d\n", a, b); return EXIT_SUCCESS; } 「a に 65535 を代入し,b に a の値を代入しているのだから,b も 65535 になるはず.」 などとLL言語(JavaScriptRuby など)に慣れていると思ってしまいがちだが,そうはならない. なぜなら,一般に,char 型の変数が保持できる値の範囲は,int 型の変数が保持できる値の範囲よりも小さいから. 概ね(…とボカす理由は後述),char は -128 から 127 までの整数しか保存できない. この性質は,ときどき,極めて恐ろしい. C言語は,上の例のように保持できる値の範囲が小さい変数への

  • C99の仕様

    長い歴史を持ちながら、依然として人気の高いC言語。その最新仕様の情報にキャッチアップするための連載スタート。今回は1999年に策定された「C99」を取り上げる。 連載 INDEX 次回 → C言語(以降、単にC)はDennis Ritchieによって1969~1973年の間にベル研にて開発されたプログラミング言語である。長い歴史を持つと共に非常にポピュラーな言語で、プログラマーでCを知らない人はまずいないと言っていいだろう。プログラミング言語のシェアを調査しているTIOBEでも、ここ最近は常に1、2位を占めている。 Cの言語仕様は今から25年近く前である1989年に初めて規格化され、これは一般に「ANSI-C」と呼ばれている。ANSI-Cは長らくCの言語仕様のスタンダードの位置を占め、世の中の大半のプログラマーは、このANSI-Cに慣れ親しんでいることだろう。しかし、実はCの言語仕様はその

    C99の仕様
  • パワーポイントでC言語プログラミング

    どこの会社もそうですが、パワーポイントの資料作るのが得意なエンジニアはたくさんいるのですが、実際にプログラムでコードを作るのが得意なエンジニアはあまりいなくて、当に困ります。

    パワーポイントでC言語プログラミング
  • strlcpy - Wikipedia

    strlcpy はC言語で文字列を安全にコピーするための関数である。ISO/IEC で規定された標準Cライブラリの関数ではないが、BSD libc などに含まれている。危険な使い方をしてしまいがちな関数strcpyやstrncpyの代替として、Todd C. MillerおよびTheo de Raadt (テオ・デ・ラート) が開発した[1]。 概要[編集] 関数プロトタイプ(宣言)は以下である。 ポインタsrcの指すアドレスから最大でsize - 1バイトの文字列をdstにコピーし、dstの指す文字列が必ずNUL文字[注釈 1]で終わるようにする。つまり、dstのバッファの実際の大きさをsizeに指定すれば[注釈 2]、バッファオーバーランしないことが保証される。 strncpyは似たプロトタイプchar *strncpy(char *dest, const char *src, siz

  • BohYoh.com - 柴田望洋後援会オフィシャルホームページ by 言語科学研究所

    13,500をこえるページから構成されるサイトは、コンピュータ・プログラミング・情報処理技術者試験対策・中国武術などに関する情報が満載です。また、多くのプログラムや約1,000ページ分のPDFファイルを閲覧・ダウンロードできます。ゆっくりとご覧ください。 What's New 2023/9/5(火) ■ 『新・明解Python入門 第2版』の「索引」のPDF全17ページを公開しました。 2023/8/30(水) ■ 『新・明解Python入門 第2版』のソースプログラムを公開しました。 2023/8/29(火) ■ 著書のコーナーに、新刊『新・明解Python入門 第2版』のページを開設しました。 2023/3/6(月) ■ 著書のコーナーに、新刊『新・明解C言語実践編 第2版』のページを開設しました。 2022/9/29(木) ■ 『新・明解C言語中級編 第2版』の「索引」のPDF全1

  • C言語は今でも価値のある言語か?

    Couchbaseの作者Damien Katz氏は,C言語はバックエンドプログラミングにおいて現在でも優れた言語である,という意見を持っている。しかし他の開発者は,C言語はあまりにも欠陥が多いとしてC++Javaを支持するもの,あるいはいずれも好まないというものなどさまざまだ。 CouchDB の開発者であるDamien Katz氏は,The Unreasonable Effectiveness of C と題した先日のブログ記事において,C言語がバックエンドのための優れた言語であると断言した。氏はC++Java,さらにはErlangやRubyのようなより現代的な言語よりも,今後もC言語を支持していくつもりだという。ただし単純に,C言語を他のどれよりも優れた言語だと言っている訳ではない。"言語自体のパフォーマンスと信頼性が重視される場面においては,C言語に比類する言語は皆無である",別

    C言語は今でも価値のある言語か?
    valinst
    valinst 2013/02/03
    プログラマやるなら一番最初にC言語をやればあとあと苦労しないよ?ってのはあると思う。いや、プログラマってもWeb系だとそうでもないのかな。
  • へ、変態っ!!読めないからやめてっ!bit使ったデータ構造・アルゴリズム実装集 - Negative/Positive Thinking

    この記事はCompetitive Programming Advent Calendar Div2012の2日目の記事です。 12月20日追記: Darseinさんが20日目の記事で、ビット演算についての詳しい説明を紹介してくださっています!必読ですね!!!!:) はじめに Y^´       ∨// /,∠ ,. ' /l/// /, ' , '/ ! | l }´     〈 〉    変  〈/ , ' // ̄`>< /// /// _,.=‐|'"´l l〈  変  / 〈    態.   ∨, '/l|   ,.'-‐、`//`7/  /''"´__ | ハ l丿  態   { 人)   ! !   (/!  |ヽ〈_ ・.ノ〃  〃 /  '/⌒ヾ.! ,' !く   ! !  (_ ト、__/   ヽ、_,.イ    /l l |:::::::```/:::::/...´..

    へ、変態っ!!読めないからやめてっ!bit使ったデータ構造・アルゴリズム実装集 - Negative/Positive Thinking
  • https://www.akanko.net/marimo/data/rfc/rfc1321-jp.txt

  • ロベールのC++教室 - 第14章 前へならえ -

    構造体のサイズを確認してみたことはありますか? 構造体をファイルに保存したことはありますか? やけにサイズが大きかったり、ゴミが保存されたりはしませんでしたか? 今回は、そういうことがなぜ起こるのかについてのお話です。 では、今回の要点です。 構造体のメンバはぎっちり詰まっていないことがある。 #pragma pack でアラインメントを変更できる。 メンバ変数の構造体の先頭からの位置は offsetof マクロで取得できる。 では、いってみましょう。 次のような構造体を考えてみましょう。 strcut SPerson { char szName[21]; // 名前 int nAge; // 年齢 char nBirthmonth; // 誕生月 char fSex; // 性別 }; さて、問題です。この構造体のサイズはいくらになるでしょうか? 先ず、szName のサイズは21バイト

    valinst
    valinst 2012/06/16
    知らなかった>stddef.h というヘッダファイルに offsetof というマクロが定義されています。
  • C言語の変数値にリトルエンディアン・ビッグエンディアンは関係あるのですか - C言語の、変数値にリトルエンディアン・ビッグ... - Yahoo!知恵袋

    C言語の変数値にリトルエンディアン・ビッグエンディアンは関係あるのですか C言語の、変数値にリトルエンディアン・ビッグエンディアンは関係あるんですか? 例えば int n = 1;と代入した場合 x86系?のCPUだと0x10000000 他のCPUだと、 0x00000001 という感じにメモリに記録されるのですか?? 今、C言語で、リトルエンディアン方式で記録されているバイナリファイルの読み書きするプログラムを作っているのですが 例えばファイル内の4バイトをint型の数値としてプログラムの変数に読み取る場合、 memcpyなどでそのまま4byte代入すれば良いのでしょうが、 もしプログラムを使用してるコンピュータがビッグエンディアン方式のものの場合、 逆さにして読み描きしなければらないのですか?

    C言語の変数値にリトルエンディアン・ビッグエンディアンは関係あるのですか - C言語の、変数値にリトルエンディアン・ビッグ... - Yahoo!知恵袋
  • Cでのポインタの読み方

    Cでのポインタの読み方 Cのポインタの読み方は、ルールを知らないと摩訶不思議です。 ルールを覚えれば、 int (*p[5])[3]; char (*(*fp)(void))(int); なんてのも解読する事ができます。 大事な前程 ポインタを読む際には、「英語で読む」必要があります。 「え~、英語~」 と思う方もいるかもしれませんが、逆に日語で読む方が大変です。 基ルール ルール 後置演算子が優先。 関数の() 配列の[] 前置はあとで。 要は、「後ろに何かあったら、後ろが優先」です。 演算子の英語での読み方 * pointer to ... () function returning ... [] array of ... Lesson 1 まず、演算子が単独で出てくる場合です。 Lesson 1-1 pointer to ... int *p; これは、まずpを見ましょう。 i

    valinst
    valinst 2012/01/22
    解説としてはわかりやすくて良いけど、実際にプログラミングするときには「int (*p[5])[3];」みたいなのは極力使わないようにするべき。
  • サービス終了のお知らせ

    サービス終了のお知らせ いつもYahoo! JAPANのサービスをご利用いただき誠にありがとうございます。 お客様がアクセスされたサービスは日までにサービスを終了いたしました。 今後ともYahoo! JAPANのサービスをご愛顧くださいますよう、よろしくお願いいたします。

    valinst
    valinst 2011/12/26
  • switch文 - Wikipedia

    switch文(スイッチぶん、英: switch statement)とは、プログラミング言語において、ある式の値に応じて多分岐を行なう文である。最適化の仕方にも左右されるが、場合によってはテーブルジャンプなどに展開されることで、条件判断を繰り返すif文よりも効率的に実行されることがある。言語によっては、値を返す式として記述できるものもある。また、検査対象の式のランタイム型(実行時型情報)に応じて分岐するような、複雑なパターンマッチングの機能を持つ言語もある[1]。 言語ごとの構文[編集] C言語[編集] 構文は以下の通り。 switch (制御式) { case 値1: 文 文 ……… break; case 値2: 文 文 ……… break; default: 文 } 上記の「case」ラベルはいくつでも記述することができる。caseラベルの「値」はコンパイル時に決まる整定数式 (i

    valinst
    valinst 2011/07/10
    知らんかった>caseによる分岐は以下のようにdo-while文と組み合わせることも可能である。
  • #include の魔力 - Cube Lilac

    何気なく呟いた言葉が確変状態になっていました。 それで、反応を眺めていると「何をやってるか分からない」と言うものがいくつかあったので、一応簡単な補足説明を載せておきます。 #include は指定したファイルの内容をその位置に追加します。 1, 2, 3, 4, 5, 6, 7, 8, 9,例えば、上記の内容を hoge.csv と言う名前で保存して、 int hoge[] = { #include "hoge.csv" }; と記述すると、(プリプロセスが終了すると)以下のように記述した事と同じになります*1。 int hoge[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, }; このように、#include を利用することによって、内容が変化しない*2データ配列などの定義を自力で打ち込んだりコピペしたりせずに済むようになります(なることがあります)。s/int/co

    #include の魔力 - Cube Lilac
    valinst
    valinst 2010/09/05
    その発想はなかった