タグ

プログラミングとC言語に関するrichard_rawのブックマーク (40)

  • 2で割ることと3で割ること - Qiita

    この記事でお題にするのはCPUレジスタ上の整数除算です。以下、単に除算とも書きます。 除算は非常に高コストな演算なため、コンパイラは最適化によって、できるだけ整数除算を別の計算に置き換えようとします。 最適化ができる場合の一つとして、割る数が定数である場合があります。頭のいいコンパイラは、除算を乗算とビットシフト等を駆使した演算に置き換えます。この記事では、そういった最適化の背景にある理屈を部分的に解説します。 計算機環境としてはモダンなx86 CPUを仮定します。したがってレジスタは32/64ビットであり、負数は2の補数表現になっています。ある程度は他の命令セットでも通用する話になっているかもしれません。 そもそも整数の除算とは プログラミングにおける整数の除算の定義について確認します。整数$n$を整数$d$で割るとき $$ n = q \times d + r $$ が成り立つように除

    2で割ることと3で割ること - Qiita
    richard_raw
    richard_raw 2020/12/09
    なるほど、3の場合はこうなるのか。
  • Linuxカーネルで学ぶC言語のマクロ - 覚書

    はじめに 記事は電子書籍版もあります。 linuxカーネルはC言語のマクロを駆使して書かれています。それらのうち、凝ったマクロになじみの無い人には初見では意図がわからない&わかってみれば面白いであろうものをいくつか紹介いたします。対象読者は、C言語のユーザだけれども、マクロは定数定義くらいにしか使わないというライトなマクロユーザです。 マクロを使用する場所に依存するエラーを防ぐ 次のマクロは、二つの引き数の値を置換するだけの単純なものです。 #define swap(a, b) \ do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0) 注目すべきはマクロの定義全体を囲んでいるdo { ... } while (0)という表記です。初見の人には何のことかわからないと思います。考えられる最も単純な定義から遡って、なぜこ

    Linuxカーネルで学ぶC言語のマクロ - 覚書
    richard_raw
    richard_raw 2020/06/30
    空のdo whileは真似して使っています。引数の文字列化は試してみたい。
  • 【C言語】引数なしの関数には void を書いた方がよいという話 - 0x19f (Shinya Kato) の日報

    C言語で引数なしの関数を書くときに void を書かないのと書くのとで挙動が違うなんて話を聞いたことはないでしょうか? つまり void func() {} と void func(void) {} で挙動が違うという話ですね。 自分も話だけ聞いたことがあったものの2つがどう違うのかはわかっていなかったため、C言語の規格を読みながら何が違うのかを調べてみました。 結果だけ述べると、この2つの書き方は同じように見えて実は明確な違いがあり、引数がない関数を定義/宣言する場合には後者を使うのが適切です。 とは言え、2つの書き方で違いがあるとかほんとかよ?と思う方もいると思うので、まずはこの二つがどう違うのか見ていきましょう。 2つの関数の書き方の違い 早速ですが、以下のプログラムを見てみましょう。 // func_empty.c void func() {} int main(void) { f

    【C言語】引数なしの関数には void を書いた方がよいという話 - 0x19f (Shinya Kato) の日報
    richard_raw
    richard_raw 2019/04/19
    voidがないとチェックされない、と。知らなかった……。/ニューラルネットのソースがK&Rスタイルだったなあ。
  • 【Python C API入門】C/C++で拡張モジュール作ってPythonから呼ぶ -前編-|はやぶさの技術ノート

    こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。 仕事の都合もあり「C言語 ⇒ C++Python」の順にプログラミング言語を習得しました。 最近は、PythonとC/C++両方を使って仕事をしています。 Pythonでプログラミングをしていると…

    【Python C API入門】C/C++で拡張モジュール作ってPythonから呼ぶ -前編-|はやぶさの技術ノート
    richard_raw
    richard_raw 2019/01/21
    なるほどなるほど。/無言ブックマークばっかりですな!
  • _T("")マクロだのL""マクロだのLPCTSTRだのの世界一詳しい解説

    _T("")マクロについて 初心者の方へ 下の説明を読むのが面倒なら次のように設定を変更すれば わずらわしい思いはしなくてもよくなります。 また、下の設定をすればLPCTSTRとか訳の分からないものはconst char *と同じ意味になり、 自分でコードを書く時にも_T("") などと書く必要もなくなります。 VisualStudio2005での設定例(2003や2008でもほとんど同じです): プロジェクト名で右クリックしてプロパティを選択 (ここでは太文字でcppTestと書いてあるやつ) 左側のツリーで構成プロパティ→全般を選択するとこのようなものが出てくる。 デフォルトでは文字セットのところが『Unicode 文字セットを使用する』となっているはず。 これを『マルチバイト文字セットを使用する』に変更してOKを押すと設定完了。 上級者向けの説明 おそらくVisual Studio2

    richard_raw
    richard_raw 2018/01/16
    なんか文字化けしまくると思ったらこれか!
  • 非推奨だった bool 型に対するインクリメント演算子を削除 [P0002R1] - cpprefjp C++日本語リファレンス

    このページはC++17に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 C++17ではbool型に対する前置および後置のoperator ++を削除する。 bool型に対する前置および後置のoperator ++とはC++98の時点で非推奨になっていた機能である。 具体的にどのような働きをするのかというと、以下のように値をtrueに書き換える機能をもつ。 #include <iostream> int main() { bool b = false; const bool b1 = ++b; std::cout << std::boolalpha << b1 << std::endl; // => true const bool b2 = ++b; std::cout << std::boolalpha <<

    richard_raw
    richard_raw 2017/07/19
    「これに起因するバグで少なくとも6つの過度の放射線被曝事故を引き起こし、3人が死亡した例がある。」ワァオ。
  • linuxカーネルで学ぶC言語のマクロ - Qiita

    はじめに 記事は電子書籍版もあります。 linuxカーネルはC言語のマクロを駆使して書かれています。それらのうち、凝ったマクロになじみの無い人には初見では意図がわからない&わかってみれば面白いであろうものをいくつか紹介いたします。対象読者は、C言語のユーザだけれども、マクロは定数定義くらいにしか使わないというライトなマクロユーザです。 マクロを使用する場所に依存するエラーを防ぐ 次のマクロは、二つの引き数の値を置換するだけの単純なものです。

    linuxカーネルで学ぶC言語のマクロ - Qiita
    richard_raw
    richard_raw 2017/03/03
    黒魔術だ……。/さっそく、何もしないマクロ定義を利用させていただきます。
  • 標準出力と標準エラー出力 - printfデバッグTips - 碧色工房

    プログラミングを行う上で、printfを使った標準出力は 一番最初の「Hello World」から登場し、 当にずっとお世話になるものだ、 デバッグをする上でデバッガが使えるようになっても、 完全にprintfなしでとは行かないかもしれない。 というわけで、 このprintfを使ったデバッグ出力を行う上でのTipsについて、 いろいろと解説してみようと思う。 では、早速だが、printfの他に、 ファイルへの出力を行うときに利用するfprintfという関数がある。 最初期ではないにせよ、プログラミングの勉強のかなり始めうちに使うことになるはずだ。 manを使って定義を確認すると以下のようになっている。 #include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char *

    標準出力と標準エラー出力 - printfデバッグTips - 碧色工房
    richard_raw
    richard_raw 2017/01/11
    なぜかperror()を知っててstrerror(errno)を知らなかったのでブックマーク。
  • CPP(コンパイルしない方の関数型なC言語)プログラミング入門。とりあえずFizzBuzzまで - Qiita

    CPPでプログラミングする記事です。 みなさんれっつCPPプログラミング! CPPって何だよC++じゃねーのか じゃねーんだよ。悪かったな。 いや、まあ、C++に入門する記事を期待したみなさんには申し訳ない限りです。でもBoostとかにもCPPは結構使われているので、知っていて損は無いと思います。 C言語には、マクロという機能があります。これは構文解析の前(プロプロセス時)に行なわれる単純な字句展開機能で、例えば、 // 「#define 名前 値」という形式で宣言する #define MAC 42 // ソースコードにその名前が現れると、値に置換される MAC // 関数みたいにもできる #define F(x) x + 20 // 関数みたいに呼び出す F(22)

    CPP(コンパイルしない方の関数型なC言語)プログラミング入門。とりあえずFizzBuzzまで - Qiita
    richard_raw
    richard_raw 2016/09/28
    面白い!まさかプリプロセッサでループできるとは思わなかった。
  • Microsoft、C言語を拡張する「Checked C」を開発中

    fossBytesに6月14日(米国時間)に掲載された記事「Microsoft Open Sources "Checked C" — An Extended Version Of C To Avoid Coding Errors」が、Microsoftにより開発が進められている「Checked C」と呼ばれる技術について伝えた。「Checked C」はC言語を拡張する機能で、より安全なコーディングが可能になるとされている。 Microsoftのソフトウェアの多くはC/C++で開発されている。C言語はポインタの扱いを間違えると来アクセスしてはいけないメモリを指した操作をしてしまうことがあり、これがバグや脆弱性の原因の1つになっている。「Checked C」はこうした問題を回避することを目指してC言語の機能を拡張するもので、ポインタに対してあらかじめ範囲情報を持たせておき、ポインタの指し示す

    Microsoft、C言語を拡張する「Checked C」を開発中
    richard_raw
    richard_raw 2016/06/17
    Cppcheckがなんだって?(違う)
  • C言語でターミナルで表示される文字をカラー表示させる : Serendip – Webデザイン・プログラミング

    サンプルコード #include <stdio.h> int main(void) { /* 背景色の指定 */ printf("\x1b[40m"); /* 背景色を黒に */ printf("背景が黒\n"); printf("\x1b[41m"); /* 背景色を赤に */ printf("背景が赤\n"); printf("\x1b[42m"); /* 背景色を緑に */ printf("背景が緑\n"); printf("\x1b[43m"); /* 背景色を黄色に */ printf("背景が黄色\n"); printf("\x1b[44m"); /* 背景色を青に */ printf("背景が青\n"); printf("\x1b[45m"); /* 背景色をマゼンタに */ printf("背景がマゼンタ\n"); printf("\x1b[46m"); /* 背景色をシア

    richard_raw
    richard_raw 2016/05/24
    C言語でも簡単にカラフル文字出力できたのか。/ちなみにシェル組み込み関数のprintfだと「x1b」の代わりに「e」ですな。
  • Cプログラミング診断室 - 藤原博文

    はじめに 開院準備 昔むかし/ レベル差/ 教育/ ネットワーク/ 情報集め/ 隠すことについて/ プログラムコンテスト/ ドキュメント/ 楽するように/ 手抜きと下手の違い/ 開院 第1部 外来 第1章 普通の初心者 最初から充実した(!?)プログラムが登場 関数を短くし、コメントを改善する 上手になる秘訣/ プログラムの紹介/ 何だ、このプログラムは!!/ 短くするには/ コメントについて/ 無駄な努力をやめよう/ 名前/ 気になる個所/ 修正プログラム/ 課題/ まとめ 第2章 これでもプロ 売りものであるにもかかわらず、超きたない! 構造的な欠陥の指摘〜引数、ポインタの活用 プログラムの紹介/ 「超」基的問題点/ 関数分解/ 構造的欠陥/ 引数を使おう/ ポインタ/ その他/ まとめ(修正プログラム) 第3章 上司が問題 まさに驚異的なプログラムの見というべき 内容の修正から、

    richard_raw
    richard_raw 2016/05/18
    大量のグローバル変数を宣言したヘッダファイルに遭遇したので第5章を参考にしました。というか全部読みたい。
  • Online Python Tutor - visualize, debug, get AI help for Python, Java, C, C++, and JavaScript

    Online Compiler, Visual Debugger, and AI Tutor for Python, Java, C, C++, and JavaScript Python Tutor helps you do programming homework assignments in Python, Java, C, C++, and JavaScript. It contains a unique step-by-step visual debugger and AI tutor to help you understand and debug code. Since 2010, over 20 million people in more than 180 countries have used Python Tutor to visualize over 200 mil

    richard_raw
    richard_raw 2016/03/24
    PythonだけでなくJava, JS, Ruby, C++までビジュアライズしてくれるサービス。使ってみよう。
  • 2016年、C言語はどう書くべきか (前編) | POSTD

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

    2016年、C言語はどう書くべきか (前編) | POSTD
    richard_raw
    richard_raw 2016/02/19
    やばい全然馴染みがない。もうC++でいいや(えー
  • コールグラフを描く2つのツール(EgyptとCodeViz) by Inquisitor

    休日(でなくてもいいけれど)の読書の題材としてコンピュータ・プログラムを選んだとき、単にコードを読むだけでなく、何か図形的な補佐が欲しいと思うことがある。 オブジェクト指向の言語だとUML図が便利だが、別のパラダイムではあまり役に立たない。 たとえばC言語では、プログラムの構成要素である関数(というか手続き)の呼び出し合う関係を視覚化できると少しうれしい(「すごくうれしい」とまではいかない)。 次のようなコードがあったとする。 #include <stdio.h> int fib(int n) { if (n<3) return 1; return fib(n-2)+fib(n-1); } int main() { int i; for (i=1; i<=10; ++i) { printf("fibonacci(%d) = %d\n", i, fib(i)); } return 0; }

    コールグラフを描く2つのツール(EgyptとCodeViz) by Inquisitor
    richard_raw
    richard_raw 2015/08/24
    静的なコールグラフを出力したいなーと思って探したら見つけた。どちらもUbuntuのパッケージには無さそう。
  • C言語分かってなかった (I Do Not Know C) - Qiita

    Dmitri Gribenko氏によるBlog記事 "I Do Not Know C" より訳出。原文および訳文のライセンスは CC BY-SA 3.0 に従う。 この記事の目的は、皆に(とくにCプログラマに)「C言語分かってなかった」と言わせることです。 C言語の死角は思っているよりも身近にあり、よくある単純なコードですら 未定義動作(undefined behavior) を含む可能性があると示したいと思います。 記事は質問に対する回答の形をとります。全ての例示コードは別々のファイルに分かれていると考えてください。 (訳注:Qiita/Markdown表現の制約から、読中ネタバレ防止のため文章順序を変更しています。前半には質問のみを、後半には質問と回答の対を訳出しました。) 質問編 1.

    C言語分かってなかった (I Do Not Know C) - Qiita
    richard_raw
    richard_raw 2015/03/11
    コンマ演算子とかオーバーフロー時の動作定義とかC言語全ッ然分かってなかった感すごいorz
  • C言語の開発者によるgoto文の使い方を対象とした実証研究の結果、「goto文は無害だと考えられる」 | スラド デベロッパー

    Edsger Dijkstra氏がgoto文の危険性を主張したのは1968年。それから50年近く経過した現在もgoto文は使われ続けているが、Dijkstra氏が懸念したようなgoto文の無制限な使用が行われているのかどうかという点や、それがバグの原因となるような有害なものなのかどうかといった点については、よくわかっていなかったという。こういった点に関する実証研究が家/.で紹介されている。 家/.「Empirical Study On How C Devs Use Goto In Practice Says "Not Harmful"」より 200万近いC言語のファイルと1万1千件を超えるプロジェクトからランダムに抽出した統計的に有効なサンプルを質的および量的に分析したところ、開発者はほとんどの場合gotoの使用を適切に制限しており、Dijkstra氏が懸念したような無制限な使用は行わ

    richard_raw
    richard_raw 2015/02/16
    そう言えば最近、初めてgoto文を使ったCのプロダクトコードを見ました。なんでreturnを使わないんだ……。/危険なコードとか公開しないだろうと考えるのは甘いんですかね。
  • 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

    richard_raw
    richard_raw 2014/12/15
    マクロで要素数を計算してる。
  • ご注文は機械学習ですか? - kivantium活動日記

    先日書いたOpenCVでアニメ顔検出をやってみた - kivantium活動日記の続編です。アニメ顔を検出するところまではうまくいったので、今度はキャラの分類をやってみようと思います。環境はUbuntu 14.10です。 ひと目で、尋常でない検出器だと見抜いたよ まずは分類に使う学習用データを用意します。投稿から半年以上経つのにまだランキング上位に残っている驚異の動画ご注文はうさぎですか? 第1羽「ひと目で、尋常でないもふもふだと見抜いたよ」 アニメ/動画 - ニコニコ動画を使います。 動画のダウンロード Ubuntuならaptで入れられるnicovideo-dlというツールを使います。 sudo apt-get install nicovideo-dl nicovideo-dl www.nicovideo.jp/watch/1397552685その後avidemuxでOP部分だけの動画を

    ご注文は機械学習ですか? - kivantium活動日記
    richard_raw
    richard_raw 2014/11/27
    C++選択理由がなるほど(ぇ/OpenCV使ってるけど、そう言えば私は顔認識処理はノータッチでした。
  • 問.Cでオブジェクト指向プログラミングを行なえ - 株式会社CFlatの明後日スタイルのブログ

    問.Cでオブジェクト指向プログラミングを行なえ。ただし「オブジェクト指向プログラミング」とは、次のような特徴を持つプログラミング技法であるものとする: オブジェクトの実装はオブジェクトのユーザーからは隠蔽される(カプセル化/隠蔽) 同一型のオブジェクトと同一メソッドを与えた時、実際のメソッドの動作はオブジェクトの内容により変化する(ポリモーフィズム/多態性) なお、ユーザーが既存のオブジェクトをカスタマイズして新たなオブジェクトを作成する機能は、必要ないものとする。 この問いの狙い よく、「オブジェクト指向プログラミング」と「オブジェクト指向言語」は混同されます。が、前者はプログラムを設計する上での考え方で、後者はその考え方を容易にソースコードに書けるような仕様になっている言語の事で、全く違うものを指しています。 その証拠を示すため、「非オブジェクト指向言語」たるC言語で「オブジェクト指向

    問.Cでオブジェクト指向プログラミングを行なえ - 株式会社CFlatの明後日スタイルのブログ
    richard_raw
    richard_raw 2014/10/20
    やべー、ポリモーフィズムが自力で出来そうにないorz/なぜかGTK+でメモ帳もどきを作ったことを思い出しました。