タグ

C言語に関するyowanoのブックマーク (31)

  • POINTER「配列とポインタの完全制覇」「C言語 ポインタ完全制覇」

    タイトルは「C言語 ポインタ完全制覇」。 このページの書籍化とはいえ、内容の大半は書き下ろしですので、 既にWebで読んでおられる方にも決して損はさせません。 詳細はこちらへどうぞ。 「C言語 ポインタ完全制覇(第2版)」書籍情報 「C言語 ポインタ完全制覇」書籍情報(旧版) 技術評論社さんによる書籍案内はこちら。 第2版 旧版 修正履歴は、このページの末尾にあります このページについて 全くもって僭越ながら、恐れおおくも偉そうにも、 こんな文書をWWWで公開させていただくことにしました。 この文書は、もともと社内向けの教科書として作成したものです。 私は、一介の文系出身プログラマであり、 特に情報関係の教育を受けたわけでもなく、 プログラミング言語に深い造詣を持っているわけではありません。 この文書にも多くの誤りや、誤解を招く表現があるかと思います。 そのような記述を見付けられた方は、ぜ

    yowano
    yowano 2014/06/14
    配列とポインタのまとめ。
  • [PDF] Cプログラマのための カッコつけないプログラミング の勧め

    カッコつけないプログラミング 光成滋生(サイボウズ・ラボ) Cプログラマのための の勧め 自己紹介 
好きな言語 ‣ C++, Xbyak(自作x86/x64用C++用JITアセンブラ) ‧ C++WG小委員会エキスパート 
まあまあ使う言語 ‣ Python, JavaScript, Haskell 
サイボウズ・ラボで最近やってること ‣ 暗号の高速実装研究 ‣ 自然言語処理(まだ始めたばかり) 普通じゃないプログラミング2010 9/21 / 202 昨今の言語 
多機能,高度な概念 ‣ C++0x ‧ 型推論,ラムダ式,move semanticsなどが追加される ‣ Haskell ‧ 高階関数,参照透過性,モナド,非正格評価… 普通じゃないプログラミング2010 9/21 / 203 難しい概念は理解も使用も大変 
人にものを教えるには,その7倍の理解が必要 (要出典) 
プ

    yowano
    yowano 2014/02/28
    型のない変数の宣言とincludeディレクティブのみ(制御分はもちろん、main関数を含め関数を1つも使わない)でプログラムを完成させるネタ。
  • 文字列リテラル - mkubara.com

    概要 C/C++でよく記述する、ダブルクォーテーションで囲まれた文字列を文字列リテラルと呼び、プログラム実行時に利用する文字列を表現するために利用します。文字列リテラルは普段何気なく使っているにもかかわらず、その実装はなかなかに興味深いものです。稿はそれを記述していきます。 文字列リテラル 文字列リテラルとは C/C++ではダブルクォーテーションで囲まれた文字列を文字列リテラルと呼びます。リテラルとは質的には定数を表します。(定数として実装されているかは実装系依存です) コード: 文字列リテラル 文字列リテラルはプログラム実行開始時に、メモリ領域中の特殊な領域に文字配列として確保されます。よって領域定義としては char [] に近いものです。ただし我々が普段使っているスタック領域(関数内で変数宣言したときに使う)やヒープ領域(newやmallocで取得する領域)とは違った箇所に領域を

    yowano
    yowano 2014/01/06
    規格上、文字列リテラルの書き換えは未定義とされているが、文字列リテラルは char * で受けることができてしまうため、容易に書き換えられてしまう。書き換えた場合は予期しないエラーが発生する。
  • ロベールのC++教室 - 第14章 前へならえ -

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

    yowano
    yowano 2014/01/03
    メンバ変数の構造体の先頭からの位置は、stddef.h に定義された offsetof マクロで取得することができる。
  • もう一度基礎からC言語 第47回 特殊な画面制御~コンソール入出力関数とエスケープシーケンス エスケープシーケンスによる画面制御

    コンソールモードのOSには、ANSI(米国標準協会――American National Standards Institute)の制定した画面制御機能が備わっています。これを使うと、文字に色を付けたり、表示位置を変更したりできます。 特殊記号で画面を制御する コンピュータが登場した初期の頃には、さん孔式のカードやテープが基的な入出力でした ※1 。後にディスプレイ(出力)とキーボード(入力)が誕生し、「ディスプレイにメッセージを表示し、それを受けてユーザーがキーボードからデータを入力する」という形式が標準となりました。 それ以降、ユーザーが操作しやすい親切な画面設計が重要になっていきます ※2 。単純な処理なら、画面の左端から、それも黒地に白でメッセージを表示するだけで済む場合もあるでしょう。しかし、専門家でない普通の人々が間違えないように入力を誘導するためには、メッセージの出力位置を

    yowano
    yowano 2013/12/11
    コンソールモードのOSで、ANSIの制定した画面制御機能で使用する方法の解説、エスケープシーケンスの主な一覧。DOS窓での使用方法が存在するが、XP以前でしか使えない。
  • ゲームプログラミングにおけるC++の都市伝説 - ソフトウエア研究会in秋葉原 - PukiWiki

    ゲームプログラミングにおけるC++の都市伝説 † この記事は、C++ Advent Calendar 2012 22日目の記事です。 Prev 21日目の記事 CEANによる配列操作 Next 23日目の記事 構造化並列プログラミング 時間の関係で3つの都市伝説しかご紹介できませんでしたが、またの機会があれば他の都市伝説についてもお話したいと思います。 2012/12/22 written by h.godai @hgodai 目次 初めに 都市伝説1 C++は遅いのでゲームには向いていない 都市伝説2 boost::poolはゲームには向いていない 都市伝説3 boostライブラリは怪しいライブラリだ。使うと呪われる。 ↑ 初めに † かつて、8bit時代はゲームのプログラムはアセンブラが主流でした。やがて、ゲームのプラットフォームが16bitから32bitになるに従い、C言語でゲーム

    yowano
    yowano 2013/11/15
    C++は遅いのでゲームには向いていない、boost::poolはゲームには向いていない、boostライブラリは怪しいライブラリだ。使うと呪われる、という三つの都市伝説に対する検証と結論。
  • signed intでの配列アクセスはマジヤバイ(こともある) - memologue

    次のC/C++なコードには問題があります。 #define A_SIZE 6 static int a[A_SIZE]; void vuln(int n, int val) { assert(n < A_SIZE); a[n] = val; }配列アクセスの添字となる変数aの方が signed int なのが問題です。nとして負数を渡すと面白い(というか恐ろしい?)動作をします。 ええと・・(int)(0x80000000U + n) を vulnの第一引数として渡すと*1、vuln内の配列xのx[n]に書き込むことができてしまうのです。もちろん、配列の境界チェックは行われません。だから、 int main(void) { // test1: a[4] = 123; と同じ。 // これはまぁ配列の範囲内だからいいけど・・ vuln(0x80000004U, 123); // test2:

    signed intでの配列アクセスはマジヤバイ(こともある) - memologue
    yowano
    yowano 2013/10/28
    配列の添字が signed int型 の場合、添字に負数を指定することができてしまい、結果として危険なメモリ書き換えを許してしまう。そのため、配列の添字は size_t型 を使うとより良い。
  • assert マクロを使う―C/C ―水無瀬の部屋

    assert( expression ) 関数型マクロ assert() は式 expression が 偽 の場合に診断メッセージを表示して関数 abort() を呼び出します。 ヘッダファイル assert.h がインクルードされる前にマクロ NDEBUG を定義するとマクロ assert() の呼び出しは除去されます。 assert() マクロは簡単な論理エラーを検出するために役立つ道具の一つです。 前提条件を仮定している場所に assert() マクロを挿入しておくと論理エラーを発見しやすくなります。 たとえば次のような前提条件を検査できます。 // 例えば引数にポインタ NULL を認めない関数の先頭で引数の仮定を検査するために // ポインタ p は NULL ではないはずだ! assert( p ); // ストリーム fp の現在位置はファイル終端ではないはずだ! asse

    yowano
    yowano 2013/10/28
    assertマクロの簡単な解説と実用例。
  • 実行時型情報

    オブジェクトの型を知る C++のようなオブジェクト指向言語では、ポリモーフィズムをサポートしています オーバーライドで知ったように、場合のよっては実行されるまで性質がわからないオブジェクトが存在します この柔軟性はプログラムの効率に非常に大きな影響を与えます しかし、実行中に現在のオブジェクトの型を知る必要があるケースもあります といって、コンパイル時にオーバーライドされた仮想関数の型を知ることはできません そこで実行時型情報という機能を用いて、実行中にその型を調べる必要があります 実行時型情報は RTTI(Run-Time Type Identification) とも呼ばれます この機能を用いることで、ポリモーフィッククラスの型の操作などが動的に行えます 実行時型情報を得るには typeid 演算子 を用います この演算子は const type_info & を返します type_i

    yowano
    yowano 2013/10/25
    オブジェクト(変数など)の型を知ることができるtypeid演算子の解説。
  • 可変長引数

    可変長引数をとる関数をつくるには,va_*マクロを使う. 大雑把な流れは以下のとおり. foo(type1 x, ...) { va_list args; va_start(args, x); while (ナントカ) { type2 arg = va_arg(args, type2); } va_end(args); 詳細 具体例がないとわかりにくいと思うので,次のような関数を例に説明する. プロトタイプ

    yowano
    yowano 2013/10/17
    可変個数引数(可変長引数)を扱う関数の記述の仕方。va_start、va_arg、va_endの引数や動作について、一番分かりやすく解説してある。
  • サービス終了のお知らせ

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

    yowano
    yowano 2013/09/26
    int printf(const char* format, ...) のような、...によって複数の仮引数を指定できる関数の宣言・定義の仕方と、具体的な実装方法。
  • データ型のアラインメントとは何か,なぜ必要なのか?

    以前このサイトとブログに,何度かアラインメントに関する記事を書きました (サイト内関連ページ参照). そのせいか「アラインメント」で検索して来てくれる人が多いので, 過去の記事に加筆修正してこのページを新たに作成しました. 加筆した点は次のとおりです. アラインメントとメモリアクセス回数の関係をわかりやすくするため, (ほんの少し) 図を導入しました. 「データがアラインされていないとメモリアクセス回数が増える」 と言葉で説明しているサイトは多いのですが, 図で示しているところはまだ見たことありません. アラインされていないアドレスにデータを書き込む場合, 読み出しの場合以上にメモリアクセス回数がかかる可能性があることを追記しました. 以前は「複合データ型 (配列,構造体,共用体) のアラインメント」はほとんど自明のことだと思っていたので軽く流していましたが, 意外なことにこれを解説してい

    yowano
    yowano 2013/09/10
    プログラミング言語(というよりハードウェア)におけるアラインメントの意味から、その存在理由、注意点まで、詳細丁寧な解説。
  • C言語の正しいヘッダファイルの書き方 - saito’s blog

    最近、仕事でC言語での組み込み系の開発に携わっています。 開発中のコードを眺めていると、ヘッダファイル内にstatic関数のプロトタイプ宣言を記述していたり、ヘッダファイル内で不必要に他のヘッダファイルをインクルードしているなど、ヘッダファイルの書き方が分かっていないと思われる箇所が多々見られました。 実際、C言語の入門書でもヘッダファイルの書き方を詳しく説明しているものは、僕の知っている限りでは存在しないので、C言語を使っていてもヘッダファイルの正しい書き方を知らない人が少なくないのではないかと思われます。 そこで、このエントリでは、C言語のヘッダファイルの書き方について、僕が知っているテクニックをまとめてみました。 インクルードガードを書く ヘッダファイルファイルで他のヘッダファイルをインクルードしていると、いつの間にか同じヘッダファイルを2回インクルードしてしまうことがあります。 例

    C言語の正しいヘッダファイルの書き方 - saito’s blog
    yowano
    yowano 2013/09/10
    『staticグローバル変数をヘッダファイルに記述してしまうと、そのヘッダをインクルードしたソースごとに別々の変数の実体が作成されてしまう』など、駄目な理由を示しつつ、ヘッダの正しい書き方の解説。
  • C言語のファイルを分割するときにグローバル変数に「extern」を使って、多重定義を防ぐというものを聞いたのですが、いまいちよくわかりませ... - Yahoo!知恵袋

    C言語のファイルを分割するときにグローバル変数に「extern」を使って、多重定義を防ぐというものを聞いたのですが、いまいちよくわかりません。 まず一つ目は、ヘッダーファイル内で宣言されたグローバル変数がどのような扱いをされるのかということです。 私が考えた事は、 まず、グローバル変数をヘッダーファイルの中で定義して、それをソースファイルにインクルードしますよね。 つまり、そのソース内でそのグローバル変数が定義されていることになり、 そのソースの中で再びその変数を定義する必要はなく、そのまま使える、と思っていたのですが・・ エラーが出てしまいました>< その時のソースコードが以下の通りです。 // func.h #include <stdio.h> int num = 0; void numplus(); // file_div.c #include "func.h" int main(v

    C言語のファイルを分割するときにグローバル変数に「extern」を使って、多重定義を防ぐというものを聞いたのですが、いまいちよくわかりませ... - Yahoo!知恵袋
    yowano
    yowano 2013/09/10
    あらゆる場所で使うグローバル変数をヘッダ内にまとめて定義し、複数ファイルでそのヘッダをincludeする際、変数の実体を一度だけ生成してそれ以外はexternとして処理するのを単一のヘッダで行う方法。
  • コンパイラ(gccコマンド)の使い方

    gccはジーシーシーと読む.GNUが作成し,UNIX,Windowsなどで動作するフリー のコンパイラである. ここでは,C言語をコンパイルする際のgccの利用方法を説明するが,C++の場合 にはgccというところをg++に変更すればほぼそのまま利用可能である. イタリック体は,実行時には適当に変えること.ここでは,サンプルとし て,test.cをコンパイルしてtest.o(オブジェクトファイル)または test(実行ファイル)を作成する場合についての説明をする. 主なオプション一覧 -g   (コンパイル,リンク時) コンパイル,リンク時にDEBUG情報を付加する.dbx,gdbなどのデバッガ を使用するときに必要. -c   (コンパイル時) コンパイルのみ行う(オブジェクトファイルを生成する). ex: gcc -c test.c   → test.oを生成 -o test.o  (

    yowano
    yowano 2013/08/19
    gccの基本的な使い方とその具体例。
  • http://www.am.sanken.osaka-u.ac.jp/~mukaigaw/misc/Makefile.html

    yowano
    yowano 2013/08/19
    Makefileの書き方。その文法の解説。
  • 標準 Windows API - WisdomSoft

    サンプルソースは C 言語としてコンパイルしてください。 C++ としてコンパイルした場合、エラーが発生する場合があります ※誤ったプログラムを実行すると、Windowsが不安定になることもあります 重要なシステム上では実験を行わないで下さい この講座は、C言語を熟知していることが前提です

    yowano
    yowano 2013/08/09
    WindowsAPIの基本的な機能について解説している。初めの方はサンプルコードが20行程度であったりと、無理のない分量でじっくり教えてくれるので、挫折しにくい。
  • ディレクティブ:# (シャープ) ##(シャープシャープ) - No1.バグクリエイターの雑記

    ■ディレクティブ C言語プリプロセッサのディレクティブは、シャープ(#)が頭に付く。 (ディレクティブ:プリプロセッサに対する命令) ■ # シャープ C言語では#(シャープ)はディレクティブの先頭につけるがその他にも使用方法が存在する。 1.ディレクティブの先頭文字 2.空白行 3.マクロ引数の文字列化 4.識別子の結合 ■ サンプルソース #define TEST1( str1 ) "str1"  // 引数関係無し #define TEST2( str1 ) str1    // 引数(文字列)を返す #define TEST3( str1 ) #str1   // 引数の変数名を文字列として扱う #                             // 空白行 // 引数の文字列と、##以前の文字列と結合し識別子として扱う #define TEST4( i , j ) st

    ディレクティブ:# (シャープ) ##(シャープシャープ) - No1.バグクリエイターの雑記
    yowano
    yowano 2013/08/08
    C言語のソースで扱われる#には、以下の用途がある。(1)ディレクティブの先頭文字。(2)空白行。(3)マクロ引数の文字列化。(4)識別子の結合。ただしこの用途では、##というように、#を二つ書く。
  • GrapeCity

    帳票・レポート 日仕様の帳票開発に必要な機能を搭載したコンポーネント ActiveReports for .NET ActiveReportsJS 表計算・グリッド Excel風のビューと表計算機能を実現するUIコンポーネント SPREAD for Windows Forms SPREAD for ASP.NET SPREAD for WPF SpreadJS 入力支援 快適な入力を実現する日仕様入力コンポーネントセット InputManPlus for Windows Forms InputManPlus for ASP.NET InputManPlus for WPF InputManJS 多段明細 1レコード複数行&日付表示に 最適なグリッドコンポーネント MultiRowPlus for Windows Forms 戻る コンポーネントセット Visual Studioで利用す

    GrapeCity
    yowano
    yowano 2013/07/01
    a = b++ において、後置演算子が最も優先順位が高いのに、代入後にインクリメントが行われる仕様に疑問を覚えたが、演算子には、優先順位の他に『性格(動作の法則)』があるからそうなる、ということかな?
  • 字下げスタイル - Wikipedia

    この記事には複数の問題があります。 改善やノートページでの議論にご協力ください。 出典がまったく示されていないか不十分です。内容に関する文献や情報源が必要です。(2018年5月) 脚注による出典や参考文献の参照が不十分です。脚注を追加してください。(2018年5月) 独自研究が含まれているおそれがあります。(2018年5月) 出典検索?: "字下げスタイル" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL 字下げスタイル(じさげスタイル)またはインデントスタイル(英: indent style)とは、プログラミングにおいてプログラムの構造を明らかにするために、コードのブロックの字下げをどうするかを決めたものである。項ではC言語やそれに類似した言語を主に扱うが、他のプログラミング言語(特に括弧を使用し

    yowano
    yowano 2013/05/07
    基本的にはK&Rのスタイルを採用して、細かな書き方はLinuxのソースを参考にして決めようと思う。