タグ

Cに関するyukimori_726のブックマーク (125)

  • 私はC言語を知らない | POSTD

    (注:2017/04/27、いただいたフィードバックを元に翻訳を修正いたしました。) この記事では、皆さん(特にC言語のプログラマ)に「自分はCを分かっていなかった」と気付いてもらうことを目標にしています。 Cの落とし穴は、思っているよりもずっと身近なところにあります。ちょっとしたコードにも 未定義の動作 が潜んでいることを以下で示しましょう。 この記事はQ&A形式になっており、それぞれの例題は独立したソースコードとして扱ってください。 1. Q: これは正しいコードでしょうか? (変数の二重定義エラーが発生するでしょうか。上述の通り、これは独立したソースファイルであり、関数体や複合ステートメントの一部ではありません) 解答 A: 正しいコードです。1行目は仮定義であり、2行目でコンパイラが処理した後に “定義” になります。 2. extern void bar(void); void

    私はC言語を知らない | POSTD
  • 【保存しなくてもフレンズ版】C言語おすすめ本 中級上級9冊 ゲームプログラマ教師が選んだよ – プログラミング書籍の館

    わーい、ここではC言語の中級上級向け書籍を紹介するよー。 低水準を知って「脱・初級者」だ C言語の強みは低水準(ハードに近い)処理ができること。 設計思想や言語仕様の根を理解すれば、色あせない武器になります。 文句を挙げたら色々( [ ]の扱い、ポインタ宣言文とか)ありますが、私はC言語が好きです。 シンプルな言語仕様、野心的な設計で世界中に広がったのも頷けます。 もともと仲間内だけで使う言語だったので、変な仕様があるのは仕方ないよ。 でも、メモリアロケート(malloc)には当に気を付けようね。 確保したけど解放し忘れるミス(メモリリーク)をやらかすと ・一見動いてるけどなんかおかしい… ・時々いきなり強制終了する ・起動して1週間後にクラッシュする みたいな怪奇現象に見舞われるので。。。 そんな不可解バグに遭遇した時、助けてくれるのは、やっぱり低水準の理解です。 困ったら、メモリの

    【保存しなくてもフレンズ版】C言語おすすめ本 中級上級9冊 ゲームプログラマ教師が選んだよ – プログラミング書籍の館
  • 行列行列積の高速化手法 - Qiita

    記事では、行列行列積に焦点を当てて、高速化を行う上で重要な事項に関して、既存の資料よりもできるだけわかりやすく説明することを心がけて記載する。 アーキテクチャの詳細など細かい技術的なことが知りたい人はHPCで検索すれば溢れかえるほどの資料が出てくるはずなので、ここでは言及しない。 *内容が間違っている場合は指摘いただけると嬉しいです。 追記:ループアンローリングでは、最外側のループからアンロールを行なった方が高速なので、プログラムを変更しました。 #序論 コンピュータの高速化を行う際にどのような計算に対して高速な処理を行うのかというのは、いろいろな議論が起こっている。 TOP500は世界のコンピュータの中で高速なコンピュータの上位500位までをランク付けするもので、年に2回行われている。 かつて、日富士通が開発したK computerが世界1位を取ったということでニュースになったのも

    行列行列積の高速化手法 - Qiita
  • c言語で待ち時間を示すスピナーの簡単な表示法|キャリッジリターン

    C言語での実装 100秒間のループ中にスピナーを表示するコードを示します。 #include <stdio.h> #include <unistd.h> int main(void) { const int spinner_c[] = {'/', '-', '\\', '|'}; const int spinner_len = sizeof(spinner_c) / sizeof(spinner_c[0]); unsigned int i; for (i = 0; i < 100; i++) { (void) sleep(1); printf("\r%c", spinner_c[i % spinner_len]); fflush(stdout); // バッファを強制的に出力. } puts(""); // 改行表示. return 0; } コード解説 配列 spinner_c は風車ア

    c言語で待ち時間を示すスピナーの簡単な表示法|キャリッジリターン
  • 整数オーバーフローと符号エラー - ももいろテクノロジー

    整数に関係するバグについてのメモ。 環境 Ubuntu 14.04.4 LTS 64bit版 $ uname -a Linux vm-ubuntu64 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.4 LTS Release: 14.04 Codename: trusty $ gcc --version gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 整数オーバーフロー(Integer Overflow) 整数オ

    整数オーバーフローと符号エラー - ももいろテクノロジー
  • 変数がメモリ上でどのように配置されているかメモ - Qiita

    概要 変数がどのようにメモリ上に配置されているのか。 様々なパターンで検証、その個人的メモ。 環境 Visual Studio 2013 グローバル変数 全てint型

    変数がメモリ上でどのように配置されているかメモ - Qiita
  • メモリ書き込み構文 - 七誌の開発日記

    対象環境を限定できる場合、バイト配列にリトルエンディアンで32bit値を書き込むときに、私は以下のように書いていました。 char buf[32]; *(int *)&buf[6] = 0x12345678; 非常に分かりにくいとご指摘を受けて色々と変形しましたが、どれもしっくり来ません。 ポインタ演算 *(int *)(buf + 6) = 0x12345678; 記述を分割 int *p = (int *)&buf[6]; *p = 0x12345678; アドレスをポインタで表現しているため、キャストに惑わされてメモリ操作のイメージが湧きにくいのではないかと思いました。そこで敢えて即値だけを使い、理屈抜きで基構文として覚えてもらおうという趣旨のスライドを作ってみました。 アセンブリ言語 まずアセンブリ言語でメモリに書き込むコードを提示します。 MOV BYTE PTR[0x0000

    メモリ書き込み構文 - 七誌の開発日記
  • void *とintptr_t - 七誌の開発日記

    今まで何度かvoid *の説明を求められましたが、なかなか納得してもらえませんでした。説明を工夫するだけでは限界があると感じたので、別の方法でどうにかならないかを考えてみました。 前回の記事の延長線上で説明します。サンプルコードを再掲します。 mov byte ptr [0x00000001], 0x12 mov word ptr [0x00000004], 0xfeca mov dword ptr [0x0000000a], 0xefbeadde これを機械的にC言語に書き換えます。 *(char *)0x00000001 = 0x12; *(short *)0x00000004 = 0xfeca; *(long *)0x0000000a = 0xefbeadde; これを提示した意図は、ポインタの意味に深入りしないで、出発点になる基構文を覚えてもらおうということです。 レジスタ アド

    void *とintptr_t - 七誌の開発日記
  • [C言語] void *型とは?: プログラミング研究室

    【まず読もう】 ・Seesaaブログで、ソースコードを表示させる方法 【一覧】 ・Webサイト一覧 ・API一覧 【おすすめサイト】 ・Geekなぺーじ ・バシャログ ・ネットワークプログラミングの基礎知識 【プログラミング言語】 ・C ・C++ ・C# ・JavaPerlPHPRubyPython ・ActionScript ・HTMLCSSJavaScript ・Flex ・Apache ・MySQL ・その他 ・雑記 【プロトコル】 原理を覚えよう ・HTTP 【API】 ・YouTube API ・ニコニコ動画

  • __asm__ を試してみた - memologue

    g++でインラインアセンブラを使ってみることにした。g++ -S でアセンブリリストを見ることは多々あったが、思えば__asm__を自分で書いたことはなかったのでした。引数の "=r(ほげほげ..)" の意味など把握しなければならないことがたくさん。 書いてみた とりあえず書いてみました。以下自分用の備忘録です。 dWの記事や"GCCでインラインアセンブリを使用する方法と留意点等 for x86"などを参考にさせていただいた。あとGCCのマニュアル中の、"C の式をオペランドとするアセンブラ命令"(原文)も。 最初は出力パラメータの"=r"と"=m"の違いがよくわからなかったんだけど、gcc -S をしてみて納得。 int foo; __asm__("movl $1, %0;" : "=r"(foo)); の場合は、 #APP movl $1, %eax; #NO_APP movl %ea

    __asm__ を試してみた - memologue
  • GCCのインラインアセンブラの書き方 for x86 - OSのようなもの

    試行錯誤してインラインアセンブラのチュートリアルが完成した。 やったぞ,なんだか分からないけど俺はやったんだ! GAS構文の概要 まず,GAS のシンタックスについて見ていく。GAS は標準で AT&T 記法を使用しているが,.intel_syntax ディレクティブにより intel 記法を使うこともできる。忌々しい AT&T 記法とはおさらばだ! intel 記法を使うには,アセンブラファイルの先頭に次の行を置く。 .intel_syntax noprefix また,C ファイルから作成される GAS を intel 記法で出力させる(又は,インラインアセンブラで intel 記法を使う場合)には GCC にこんなオプションを加えてやる: gcc -masm=intel ... intel 記法が手に入りテンションが上がってきたところで,さっそく構文の説明を始めることにしよう。一応注意

    GCCのインラインアセンブラの書き方 for x86 - OSのようなもの
  • Programming Language [No.002] : Inline function in C - Qiita

  • main関数を別の関数から実行する - Qiita

    gccでwrapオプションを利用すると、main関数を別の関数から実行することができます。 コンパイルの時にwrapオプションで指定した関数を実行する時、その前にwrap関数を割りこませる、という表現の方が実態に近いかもしれません。あと、これでwrapできるのはlibcでサポートしているシステムコール限定かもしれません。 ソースコードをコンパイルし、生成されたオブジェクトファイルをリンクしていく仕組み、プログラムが起動する仕組みをちゃんと勉強すればもう少しまともな説明ができそうな気もしますが、その辺は後々。 サンプルコード 其の一 #include<stdio.h> #include<unistd.h> // こが実際のmain関数らしい... int __real_main(int argc, char *argv[]); // コンパイルする時「wrap,main」を指定するとmain

    main関数を別の関数から実行する - Qiita
  • 構造体ぐぐるのめんどくさいねw っていうプログラム。 - ひたむきに生きたい。

    Linuxネットワークプログラミングバイブル 作者: 小俣光之,種田元樹出版社/メーカー: 秀和システム発売日: 2011/01メディア: 単行購入: 1人 クリック: 24回この商品を含むブログ (10件) を見る ゆういちろうとこのを読んでいるとき、 struct addrinfo *res0; ... getnameinfo(res0->ai_addr,res0->ai_addrlen,.... 「getnameinfoってなんだっけなー。manでも見ようー」 int getnameinfo(const struct sockaddr *sa, socklen_t salen,.... 「あ? 第一引数の saはポインタを必要としてて、第二引数は普通のsocklen_t... やのに、なんで『res0->』っていう形は一緒なんじゃよ!」 という感じで、ゆういちろうとブチギレてると

    構造体ぐぐるのめんどくさいねw っていうプログラム。 - ひたむきに生きたい。
  • 3.1 配列の要素数を返す. - C/C++ 関数・マクロ集 ((ほぼ?) 処理系・OS 非依存)

    「C/C++ 関数・マクロ集」というタイトルですが, そのうちのいくつかはC専用だったりします.(苦笑) 2007/06/24(日) 追記 高木さんより, Cの規格上移植性に問題がある点をご指摘いただいたので, 現在修正中です. (たくさんあります….orz) とはいってもその多くは, めったにお目にかかれないような珍しい処理系とか, 「そんなの実在するの?」という処理系に移植する場合の話なので, 実用上ほとんどの場合は問題ないと思います. (一部そうとはいえないものもありますが.) Cの規格に照らして完全に「処理系・OS 非依存」 にするのは困難な場合もあり, 完璧な移植性にこだわるあまりプログラムが書けなくなっては末転倒なので, タイトルに「ほぼ?」を入れました.orz 2007/06/21(木) 追記 このページを含め,私が C/C++ 関連記事を書くに当たりたびたび参考に&リンク

  • container_of という大変便利なマクロ関数の存在を知った - big-eyed-hamster’s diary

    今更ながら、include/linux/kernel.h container_of が相当使えるマクロ関数だと気づきました. 一見わかりにくいのですが、なんと「変数が入っている構造体へのポインタ」をコンパイル時に計算してくれるのです. container_of を用いることで、API に縛られず、データのひも付けを行うことができます. 以下のような感じです*1: struct callback_timer{ struct hrtimer timer; void (*callback)(unsigned long data); unsigned long data; int index; } struct callback_timer cb_timer[128]; // タイマが点火したときに呼ばれる関数. enum hrtimer_restart handle_hrtimer (struc

    container_of という大変便利なマクロ関数の存在を知った - big-eyed-hamster’s diary
  • The International Obfuscated C Code Contest

    The source winners of the 27th IOCCC have been released. Congratulations! The IOCCC is currently CLOSED. Right now, you CANNOT register as a contestant with the IOCCC, nor can you submit an entry because the IOCCC is yet NOT open. Please see the watch the IOCCC news below for information on the next IOCCC. You may also check on the status.json for the current status of the IOCCC. Goals of the Cont

  • C、C++のプログラミング勉強に良いソースを教えてくださ

    私は、C、C++を少しかじった程度なんですが、これからもっと勉強していきたいと思っています。 目標は、●Linuxフリーソフト(システム関係のもの)の開発 ●(Windowsでも何かアプリケーションを作る(フリーの)) です。 そこで質問なのですが、どのようなソースコードを読めば、より上達が早まるでしょうか? または、読んでおいた方がいいソースとかあるでしょうか? 基からなので、Linuxのものから始めたいと思っています。 (今使っているのは、Vine Linuxです。使いこなせてないですが・・・。) いきなりカーネルのコードを読むのはハードルが高いような気がするし、実際見てもよく分かりませんでした。 ある程度簡単なものからステップアップして、最終的にカーネルを読んで、理解できるようになりたいです。 どなたか教えてください。よろしくお願いします。

    C、C++のプログラミング勉強に良いソースを教えてくださ
  • C言語(C11)で可変長の配列を使う方法 - Qiita

    【注意】下記はC言語での話であって、C++言語の話ではありません。混同しないように! 配列の長さを実行時に指定したい! 配列はプログラミングにおいて、重要な要素の一つである。しかし、C言語の配列は、コンパイル時に長さを固定化する必要があるため、実行時に長さを指定することができない。実行時に長さを指定して配列を作成するには、malloc等でメモリを動的に確保する必要がある。 と、思っていた時期が私にもありました。最新のC言語ではなんとかallocなんてよくわからないものを使う必要はありません。 可変長配列 (variable length array, VLA) 下のは、入力した値までの素数を数え上げるプログラムです。 #include <stdio.h> int main(void) { int n; printf(u8"自然数をいれてね: "); fflush(stdout); if (

    C言語(C11)で可変長の配列を使う方法 - Qiita
  • 論文紹介: The Evolution of C Programming Practices: A Study of the Unix Operating System 1973–2015 - みずぴー日記

    ICSE 2016勉強会に参加するために論文リストを確認していたら、40年間のC言語のプラクティスの変遷を追った論文がおもしろかったので紹介する。 対象の論文 論文: The Evolution of C Programming Practices: A Study of the Unix Operating System 1973–2015 論文中で使われれたデータ: https://github.com/dspinellis/unix-history-repo 要約 過去40年間のUnixのソースコードを分析し、コーディングスタイルの変化を調査した。その結果、以下のことが分かった。 新しい言語機能は価値のあるものならば採用される レジスタ割り当てをコンパイラに任せるようになる スペースをどこにいれるかなどのコードの書き方が統一されていく 分析対象 1972年以降にリリースされた計66個

    論文紹介: The Evolution of C Programming Practices: A Study of the Unix Operating System 1973–2015 - みずぴー日記