タグ

Cに関するryochackのブックマーク (30)

  • Rustのプロジェクトの中でCを使う - ryochack.blog

    この記事ではRustのビルドシステムであるCargoを使って、Cのコードをビルドし、それをRustのコードから呼び出す方法について紹介します。 ※記事作成時のRustのバージョンはrustc 1.33.0です。 この記事で取り扱うRustの知識とクレートは次の通りです。 build.rs Build Scripts - The Cargo Book Specifying Dependencies - The Cargo Book Cargo.toml Cargo Workspaces - The Rust Programming Language クレート cc bindgen libc また、この記事に載っているソースコードは全て次のリポジトリに置いてあります。 ryochack/rust-ffi-c-tutorial 事前準備 cargo-editというCargo.tomlへのクレート

    Rustのプロジェクトの中でCを使う - ryochack.blog
    ryochack
    ryochack 2019/04/12
    cc,bindgen,libc,build.rsあたりについて書いた
  • コンパイル中にコンパイルする「コンパイル時Cコンパイラ」をつくった話 - kw-udonの日記

    僕は先日、「コンパイル時Cコンパイラ」なるプログラムをつくって、公開した。 「コンパイル時Cコンパイラ」とは、コンパイルするとC言語プログラムのコンパイルが行われるというようなC++プログラムである。 C++のコンパイル中に C言語プログラムのコンパイルを行う、 "コンパイル時Cコンパイラ"をつくりました #ELVMhttps://t.co/kKiLU3rLFX— うどん (@kw_udon_) 2016年11月18日 自分で書いておいてなんだが、「なんのこっちゃ」という感じではある。(ちゃんと記事中で説明する。) 実際、変なプログラムではあるのだが、とても嬉しいことに多くの人に面白がっていただき、予想だにしなかった大きな反響をいただいた。 Hacker Newsで1位になったり、LLVMの公式ブログで紹介されたり、果てはC++の作者であるBjarne Stroustrupにも言及されるに

    コンパイル中にコンパイルする「コンパイル時Cコンパイラ」をつくった話 - kw-udonの日記
  • 【みんな】Caffeより手軽かつ高速! Cで書かれた必要十分な深層学習フレームワーク darknetを試す【意外と知らない】:電脳ヒッチハイクガイド:電脳空間カウボーイズZZ(電脳空間カウボーイズ) - ニコニコチャンネル:生活

    チャオ! オレだ。 深層学習を手軽に使いたいというニーズは日に日に高まっているはずなのに、ガクシャ先生どもと来たら、やれMatlabだ、やれPythonだのと軟弱言語の話しかしやしねえ。どこかに気骨溢れたナイスガイはおらんのか! と思ったら、居た。 それが今回紹介するdarknetだ。 darknetという名前から想像する異常にダークである。 バーン どうよこのダークネス感 いまどき黒いページというのは珍しい。 そして無駄に凝った魔法陣のようなロゴ。ダークだ。 しかしダークネット、厨二満開とせせら笑っていられるのもいまのうちだ。 このダークネット、実に必要十分な機能を最短で試せる超絶優れたツールなのである。 CaffeやTensorFlowほどの知名度はないが、実用性皆無なTensorFlowに比べてdarknetはものすごく実用的。Cが分かる人ならばこれほど使いやすいものもちょっと他にな

    【みんな】Caffeより手軽かつ高速! Cで書かれた必要十分な深層学習フレームワーク darknetを試す【意外と知らない】:電脳ヒッチハイクガイド:電脳空間カウボーイズZZ(電脳空間カウボーイズ) - ニコニコチャンネル:生活
  • 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

    ryochack
    ryochack 2016/09/13
    "特定の型の引数を任意の個数とる関数に限っては、マクロを使うことで型安全性を確保することができます。"
  • Checked C(プログラミング言語)

    連載目次 Checked Cとは Checked Cは、C言語(以下、単に「C」とする)に境界チェック機能が追加されたもの。マイクロソフトが開発し、オープンソースなプログラミング言語として公開されている。稿執筆時点(2016年6月28日)では、その仕様書のバージョンは0.5となっている。 Cでは、ポインターと配列を同一視できる(ポインターを使って配列=メモリ上の連続した領域をアクセスできる)場面がある。このことは、プログラミングを容易にする面がある一方で、バッファオーバーランなどのエラーの種にもなる。Checked Cは配列やポインターでアクセス可能な範囲(境界)を定め、境界チェックを行うことにより、より安全にプログラミングを行えるようにするものだ。 また、Checked Cでは、既存のCコードはその意味を変えることがなく、そのまま実行できることを目指しており、従来のCコードとCheck

    Checked C(プログラミング言語)
  • C言語のインライン関数について - OSのようなもの

    GCCや多くのコンパイラーは,C言語の標準(C99)にインライン関数が取り込まれるずっと前からインライン関数をサポートしていた。そのためかインライン関数の定義は様々で,同じ書式でも各コンパイラで挙動が異なる場合がある。 今回は,インライン関数の定義をまとめ。それぞれ出力されるアセンブラコードを比べてみる。 概要 先頭に inline という言葉を付けて関数を宣言すると,コンパイラーはそれをヒントにコードをインライン化――関数のコードを呼出し元に展開する。これにより,関数呼び出しのオーバーヘッドが取り除かれ実行が早くなる。 inline はコンパイラに対するヒントであって指示ではないから,様々な理由からヒントが無視され,インライン化されず実際の関数として出力される場合がある。例えば,その関数のアドレスが参照される場合や,関数定義内の再帰呼出しなどはインライ化できないし,コンパイラーの最適化を

    C言語のインライン関数について - OSのようなもの
    ryochack
    ryochack 2016/05/17
    inlineの挙動の違いについて
  • 2016年、C言語はどう書くべきか (後編) | POSTD

    (前編はこちら: 2016年、C言語はどう書くべきか (前編) ) (編注:2020/08/18、いただいたフィードバックをもとに記事を修正いたしました。) システム依存の型 まだ「32 bitのプラットフォームでは32 bitのlong型、64 bitのプラットフォームでは64 bitのlong型がいい」という不満があるようですね。 プラットフォームに依存する2つの異なるサイズを使うため、 故意に コードを難しくすることを考えたくなければ、システム依存の型のために long を使おうとは思わないでしょう。 この状況では、プラットフォームのためにポインタ値を保持する整数型、 intptr_t を使うべきです。 モダン32-bitプラットフォームでは、 intptr_t は int32_t です。 モダン64-bitプラットフォームでは、 intptr_t は int64_t です。 int

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

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

    2016年、C言語はどう書くべきか (前編) | POSTD
    ryochack
    ryochack 2016/02/18
  • 明日使えるCの無駄知識 - Qiita

    明日使えるCの無駄知識(順不同) 以下の文章が全て正しいとは限りません.当かどうかは各自で調べてください. もし間違っていたらコメントで教えてください. compound literalを書くときに配列なら(int[]){[10]=11,[100]=1},構造体なら(struct a){.a=1}なんてことができる.詳しくはググれ compound literalは実は左辺値 main関数に限ってreturnを書かなくても良い 規格上(処理系定義でない)mainの定義方法はint main(void)かint main(int,char**)のみ forやwhileやifやswitchはぶら下がり防止のために暗黙のうちに{}が入る. _Static_assert ( constant-expression , string-literal ) ;というコンパイル時アサーション機能がある

    明日使えるCの無駄知識 - Qiita
    ryochack
    ryochack 2015/12/23
  • Big Sky :: ちっちゃなビルドシステム qo が激しく便利だった件

    « Re: VimでURLをドメインだけに置換するコマンドを正規表現でうったら、当に正規表現って意味不明なフォルムと思った。 | Main | golang のリファクタリングには gofmt ではなく、gorename を使おう。 » golang には go build というビルド機能があり、C言語と golang をまぜた cgo というC言語拡張も同じコマンドでビルド出来ます。 その際、ソースコードのコメントに CFLAGS や LDFLAGS を自ら指定する事が出来るので package gtk // #include "gtk.go.h" // #cgo pkg-config: gtk+-2.0 import "C" import ( "fmt" "log" "reflect" "runtime" "strings" "unsafe" "github.com/mattn/g

    Big Sky :: ちっちゃなビルドシステム qo が激しく便利だった件
  • SQLite C言語向けAPI チートシート - Qiita

    SQLite C言語向けAPI チートシートです。 自分以外の需要があるかどうか不明ですが、頻繁に使うもの、便利そうなものについて逐次メモしていきます。 環境 SQLite:3.8.6 ビルド環境:gcc 4.8.1 必要なもの 家ダウンロードから、ソースコードもしくはWindows用DLLを落としきて利用できるようにしておいてください。ヘッダファイルはソースコードが入っているzipの中にあります。 参考サイト 家イントロダクション 家リファレンス c/c++sqliteを使う方法 - ぴょぴょぴょ?-Linuxとかプログラミングの覚え書き- 「SQLite3」に関するページ - idocsq.net データベースの基的な使用方法 とりあえず、これさえおさえておけば使うことはできる!とうわけで、 DBファイルを開いて、データの挿入と抽出をする方法について記します。 DBファイルの

    SQLite C言語向けAPI チートシート - Qiita
  • C/C++ Interface For SQLite Version 3

    C-language Interface Specification for SQLite This page is intended to be a precise and detailed specification. For a tutorial introductions, see instead: SQLite In 3 Minutes Or Less and/or the Introduction To The SQLite C/C++ Interface. This same content is also available split out into some smaller pages. Experimental And Deprecated Interfaces SQLite interfaces can be subdivided into three categ

  • C言語パズル集:Cにまつわる興味深い問題あれこれ | POSTD

    ビジターの皆さんへ C言語に関心を寄せていただきありがとうございます。このページは、C言語の面白い問題、パズルのリストです。これまでに友人たちからeメールで送ってもらったり、で読んだり、インターネットで見つけたり、あるいは自分でC言語でコーディングしていて気づいたりしたプログラムを集めました。 多くのプログラムは、コンパイル、実行され、その振る舞いを示すものです。問題は大まかに次のカテゴリに分けられます。 一般的なタイポエラー。C言語プログラマが頻繁に犯すミスであり、かつ追跡が困難。 初見では非常に理解しがたい小さなプログラム。これらの問題は、他人が書いた優れたコードを読み解く良い訓練になります。 また、全てにGnu/Linux/gccを使っています。掲載順は、それぞれの難易度とは関係ありません。問題解決の助けが必要な場合は、気軽に私に問い合わせてください。連絡先は こちら です。また、

    C言語パズル集:Cにまつわる興味深い問題あれこれ | POSTD
    ryochack
    ryochack 2015/07/31
  • http://blog.monoweb.info/blog/2012/07/14/c99-array/

    ryochack
    ryochack 2015/06/09
    この配列初期化方法は知らなかった
  • わずか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」 | ソフトアンテナ
  • zlib Home Site

    A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by Patents) (Not Related to the Linux zlibc Compressing File-I/O Library) Welcome to the zlib home page, web pages originally created by Greg Roelofs and maintained by Mark Adler. If this page seems suspiciously similar to the PNG Home Page, rest assured that the similarity is completely coinc

  • Tags for Mixed Assembly and C

    ryochack
    ryochack 2014/06/22
    AssembleyからCへのctagsジャンプTips。CからAssemblyへのジャンプはできない
  • 橋渡しとしてのAPI - もなもなもなかのページ

    前回 の続き. たぶんこれで件に関する一応の最終回. APIは世界の境界線 異なる世界観の端境にあって,両者の言い分を理解して橋渡しをする. API の設計は,端的には橋渡しに尽きる. API の直交性など,細かく言うと設計上気をつけるべき点はある. しかし,それは,より美しく使いやすい API であるための付加価値である. 大事だけれども質ではない. API の代表例として,OS が提供するものがある. システムコールとかサービスコールという名で呼ばれる. フリーダムなユーザランドと,好き勝手されては困るOSとの間の橋渡しをする. 一例として,リアルタイムカーネル TOPPERS/JSP のサービスコール関数の冒頭を引用する. 心配ない. RTOSのコードなんて読んだことが無いよ,という方でもざっくりと理解できれば十分. /* * メールボックスへの送信 */ #ifdef __sn

    ryochack
    ryochack 2014/06/15
  • 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言語は,上の例のように保持できる値の範囲が小さい変数への

    ryochack
    ryochack 2014/06/15
    “学校などで無邪気に語られる「C言語には移植性がある」などというのは嘘っぱちも甚だしい. C言語プログラマは,細心の注意をもって,自ら移植性を担保しなければならない.”
  • C Magazineが電子書籍で復刻! - WWW.SBCR.JP トピックス

    コンピュータ勃興期の1989年9月に創刊しました『C Magazine』が電子書籍として帰ってきました! 1989年はNEC PC-98シリーズ全盛であり、東芝のダイナブックシリーズの初代が発売された年でもありました。 『C Magzine』は人気プログラミング雑誌として刊行を続け、2006年4月号を最後に休刊になりました。刊行冊数は199冊にもなり、日プログラマーに長く愛された雑誌であることは間違いありません。 人気連載を担当されていた方の多くは、現在も当社各種IT書籍の執筆陣として活躍しています。 今回は愛読者だった方からの熱い要望に答える形で電子書籍として復刻致します! ■配信フォーマット 電子書籍版はEPUB固定フォーマットか、PDF(準備中)での販売を行います。また、今回配信するのは創刊から100号までになります。 ■ご注意 1)この電子書籍は紙の印刷物をスキャンしたデータを

    C Magazineが電子書籍で復刻! - WWW.SBCR.JP トピックス
    ryochack
    ryochack 2014/06/13
    お、文字検索できるっぽい