タグ

cに関するserihiroのブックマーク (70)

  • その53 C言語を使ったことがない人がびっくりしそうなC言語の特徴

    C言語を使ったことがない人向けに、いまどきの言語ユーザが見ると面らいそうなC言語の特徴を説明しました。使われる場面が減りつつあるとはいえ今もC言語が現役で使われ続けている理由についても述べています。 テキスト https://speakerdeck.com/sat/cyan-yu-wozhi-ranairen-gabitukurisisounacyan-yu-note-zheng

    その53 C言語を使ったことがない人がびっくりしそうなC言語の特徴
    serihiro
    serihiro 2022/11/01
  • GitHub - cesanta/mongoose: Embedded Web Server

    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert

    GitHub - cesanta/mongoose: Embedded Web Server
  • セルフホストできるCコンパイラを作ってみた - Qiita

    低レイヤを知りたい人のためのCコンパイラ作成入門 (以下 コンパイラブック) を一通り読んでCコンパイラを作ってみました。 このはまだ完全でなく(2020/09/01現在)、例えば構造体の実装の説明などは文章としては存在せず、このの参照実装である chibicc を写経がてら作っていきました。 (実際には今現在進行中の @rui さんの Cコンパイラ作成のオンラインコースを始めます の参加者のみに現状は公開されているchibiccよりもうちょっと改善されたcコンパイラ実装が参照実装だそうです) もともと構文解析とかはちょっと興味があったりして、qiitaでも [ruby] Parsletで構文解析する[その1] [ruby] Parsletで正規表現をパースしてvm型のエンジンを実装してみる[その1] パース〜ASTまで みたいな記事は書いていたんですが、あんまりややこしいパーサーは書

    セルフホストできるCコンパイラを作ってみた - Qiita
  • 【C言語】文字列をコピーする方法【危険なstrcpy関数と安全な文字列複製】

    C言語の文字列型(const char *)や文字配列(char [])は、代入演算子(=)による文字要素のコピーが行えません。いずれの型もポインタで表現されているため、代入演算子による処理はあくまでポインタのアドレスをコピーするものとなり、参照先の実体は同一のものとなります。 const char *s = "abc"; const char *t = s; // 要素のコピーではなく、ポインタの値コピー (void *)t == (void *)s; // true(同じアドレス) *t = 'A'; *s == 'A'; // true(同じ参照先であるため書き換わってしまう) // 配列へのコピー代入も不可 char a[4] = s; // error: array initializer must be an initializer list or string literal

    serihiro
    serihiro 2019/08/28
  • C Programming/String manipulation - Wikibooks, open books for an open world

    serihiro
    serihiro 2019/08/21
  • The syntax of C in Backus-Naur form

    The syntax of C in Backus-Naur Form<translation-unit> ::= {<external-declaration>}* <external-declaration> ::= <function-definition> | <declaration> <function-definition> ::= {<declaration-specifier>}* <declarator> {<declaration>}* <compound-statement> <declaration-specifier> ::= <storage-class-specifier> | <type-specifier> | <type-qualifier> <storage-class-specifier> ::= auto | register | static

    serihiro
    serihiro 2019/08/06
  • JPCERT C Secure Coding Standard 日本語版 - プリプロセッサ (PRE) (#c01)

    CERT C コーディングスタンダード 00. はじめに 01. プリプロセッサ (PRE) 02. 宣言と初期化 (DCL) 03. 式 (EXP) 04. 整数 (INT) 05. 浮動小数点 (FLP) 06. 配列 (ARR) 07. 文字と文字列 (STR) 08. メモリ管理 (MEM) 09. 入出力 (FIO) 10. 環境 (ENV) 11. シグナル (SIG) 12. エラー処理 (ERR) 13. Application Programming Interface (API) 14. 並行性 (CON) 49. 雑則 (MSC) 50. POSIX (POS) AA. 参考情報 BB. Definitions CC. 未定義の動作 DD. 未規定の動作 XX. お問い合わせ 00はじめに このページでは、JPCERTコーディネーションセンターが翻訳を行っている CE

    JPCERT C Secure Coding Standard 日本語版 - プリプロセッサ (PRE) (#c01)
    serihiro
    serihiro 2019/07/03
  • C++でうっかり無限ループを書くと鼻から悪魔が出てくる - Qiita

    C++で副作用のない無限ループを書くと未定義動作になります。 「未定義動作」というのは口に出すだけでC++プログラマーを震え上がらせる力を持った言葉です。「鼻から悪魔が出てくる」という言葉で説明されるように、未定義動作を含むコードを実行した結果は何も保証することができず、バグの発見やデバッグすら困難にさせます。未定義動作下においてはコンパイラの気分によってコード片が消え、trueとfalseが同時に成立し、タイムトラベルを引き起こします1。 そのためC++ではうっかり未定義動作が埋め込まれないよう注意が払われるのが普通です。 さて、以下のC++のコードは未定義動作を引き起こします。 下の例は実際にclang/LLVMで最適化を有効にしてコンパイルするとでたらめな値を返す関数ができました。 この話をしたところ、何人かに驚かれたり異論を受け取ったりしたので、この話題について少しまとめてみました

    C++でうっかり無限ループを書くと鼻から悪魔が出てくる - Qiita
    serihiro
    serihiro 2019/01/24
  • CのfscanfによるCSV(カンマで区切られたファイル)の読み込みメモ - Qiita

    初心者によるメモ fscanfにおいて,%sは空白文字(スペース,改行,タブ,改ページ…)で自動的に区切られる. カンマは文字列の一部として読み込んでしまうので,カンマで区切られた文字列を読みこむときには%[^,]を用いる. fscanf(fp, "%[^,],&[^,],%s", buf1, buf2, buf3); (行末はカンマでなく改行で区切られる点に注意) #include <stdio.h> int main(){ FILE *fp; char *fname = "sample.csv"; int ret; char buf[3][10]; double data[3]; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } printf("\n")

    CのfscanfによるCSV(カンマで区切られたファイル)の読み込みメモ - Qiita
    serihiro
    serihiro 2018/11/26
  • 低レイヤを知りたい人のための Cコンパイラ作成入門

    はじめに このオンラインブックは執筆中です。完成版ではありません。フィードバックフォーム このには一冊のに盛り込むにはやや欲張りな内容を詰め込みました。書では、C言語で書かれたソースコードをアセンブリ言語に変換するプログラム、つまりCコンパイラを作成します。コンパイラそのものもCを使って開発します。当面の目標はセルフホスト、すなわち自作コンパイラでそれ自身のソースコードをコンパイルできるようにすることです。 このでは、コンパイラの説明の難易度が急に上がりすぎないように、様々なトピックを書全体を通じて次第に掘り下げていくという形で説明することにしました。その理由は次のとおりです。 コンパイラは、構文解析、中間パス、コード生成といった複数のステージに概念的に分割することができます。よくある教科書的アプローチでは、それぞれのトピックについて章を立てて解説を行うことになりますが、そのよう

  • SIMDの使い方メモ - Handwriting

    勉強を始めたばかりなので間違ってるところもあるかもしれないので、ツッコミがあると嬉しいかも。 SIMD - Simple Instruction Multiple Data 単一命令で複数データを扱う仕組み。イメージとしては と4回足し算するよりも の方が足し算一回で速いだろ?って感じ。 実際の実装としてはIntelのSSE(=Streaming SIMD Extensions)とかその後継のAVX(=Advanced Vector eXtensions)がある。 例えばSSEは128bitレジスタをCPUに用意していて、単精度浮動点小数点数(float型)の場合なら32bit×4個の計算を同時に行うことができる。 実際に見てみると、例えばHaswellだと浮動点小数点数の加算命令FADDのレイテンシは3クロックであるのに対して、SSEの加算命令ADDPSも同じく3クロックである。 演算結

    SIMDの使い方メモ - Handwriting
    serihiro
    serihiro 2018/08/26
  • 【C/C++】 2次元配列の引数渡し - 日々此精進

    今日、ふと悩んだ2次元配列を関数引数で渡す方法。 やりたいのはつまり... static void sub_func( ☆ ) { /* ここで2次元配列A[5][3]の各要素をA[x][y]のように読み書きする */ } void func( void ) { int A[5][3]; sub_func( A ); } という事。 問題となるのは「☆」の部分をどのようにすれば良いのか? いくつか方法を思いつきますね。 1. static void sub_func( int* a ) これはあくまで2次元配列の先頭アドレスをポインタ変数として受け取る形。この形式で渡すと2次元配列を格納したメモリにアクセスする事はできるけど、2次元配列である情報が渡らない。つまりA[x][y]のような形式でアクセスできない。 よく見かけるコートは、この方法でアドレスを渡して、その後中の要素番号を計算しつつ

    【C/C++】 2次元配列の引数渡し - 日々此精進
    serihiro
    serihiro 2018/08/25
  • C言語で2次元配列を動的に割り当てる4つの方法 - FLYING

    2次元配列を動的割り当てしたいそんなとき,C言語ならキモくなるかも。 検索エンジンから来る人がそれなりに居るようなので,解説画像を追加しました(2014/12/05)。 各行のデータを保持する配列と各行へのポインタを保持する配列に分けて確保 おそらく最も基的なやり方。 int **matrix; int i, j, n, m; n = 100, m = 100; matrix = malloc(sizeof(int *) * n); for (i=0;i<n;i++) { matrix[i] = malloc(sizeof(int) * m); } for (i=0;i<n;i++) { for (j=0;j<m;j++) { matrix[i][j] = i * m + j; printf("%d\n", matrix[i][j]); } } for (i=0;i<n;i++) { f

    C言語で2次元配列を動的に割り当てる4つの方法 - FLYING
    serihiro
    serihiro 2018/08/25
  • プログラミング言語処理

    プログラミング言語処理 講義資料 一覧 全講義資料 pdf版(version 1.1, 108ページ)は、 こちら 言語処理系とは インタプリタとコンパイラ 言語処理系の基構成 例題:式の評価 BNFと構文木 解釈実行:インタプリター コンパイラとは ソースコード 字句解析の基礎:正規表現によるパターンマッチ 字句解析と正規表現 自動字句解析生成プログラム:lex 数式の構文解析:top-down parserの作り方 構文規則 top-down parser の作り方 構文解析の基礎 top-down parserとbottom-up parser 上向き構文解析と還元 演算子順位構文解析法 LR構文解析法 構文解析生成プログラムyacc tiny Cについて tiny Cの言語仕様 tiny Cの文法 ソースコード tiny C 処理系のデータ構造 構文木(AST)のデータ構造 AS

  • Linuxプログラミング - プログラミング解説 - 碧色工房

    Linuxプログラミングについて解説していこうと思う。 開発言語は今のところC言語のみを想定しているが、 C言語解説のカテゴリで扱うには少し不適切な、 Linuxのシステムに大きく依存した内容をここで説明したいと思う。 基的にはPOSIX準拠としたいが、 おそらくはGNU拡張や、Linuxでのみ通用する内容を含むことになるだろう。 車輪の再発明 既存のコマンドなどで実現されていることについて、 どうやって作るかを実際に作りながら説明していこうと思う。 通常はこのような行為は「車輪の再発明」とよばれる無駄の象徴のような行為なのだが、 学習という意味では、そこで使われる技術に手軽に、かつ深く理解できる良い方法だと思う。 lsっぽいコマンドを作る ディレクトリエントリの取得2015/12/12作成 隠しファイルのフィルタリング2015/12/13作成 タイプ識別子の表示2015/12/27作成

    Linuxプログラミング - プログラミング解説 - 碧色工房
  • 旧時代のC言語を使うのはそろそろやめよう。 - Qiita

    まず、何も言わずに下記の記事をお読んでください。 How to C (as of 2016) 英語は・・・という方は、下の翻訳をお読みください。 2016年、C言語はどう書くべきか (前編) 2016年、C言語はどう書くべきか (後編) これからのC言語を考える。 さて、上の記事を読みましたか?まだ読んでない?いや、読みましょうよ、ということで読んだことを前提でお話しします。 C言語知っているぜ!と言っている諸兄の方々の中には、何これ?と思ったのもあったかと思います。聖典 K&R は仕方が無いとしても、C言語入門を謳う書籍やサイトの中では C90 止まりが多く見られます。どうやら、彼らは20世紀で時間が止まっているようです。 レガシーなコンパイラをサポートするため、古くからあるコードが存在するため、そういった理由で C90 を使い続けるのが駄目というわけではありません。例えば MRI (R

    旧時代のC言語を使うのはそろそろやめよう。 - Qiita
    serihiro
    serihiro 2018/02/14
  • How to C (as of 2016)

    How to C in 2016 This is a draft I wrote in early 2015 and never got around to publishing. Here’s the mostly unpolished version because it wasn’t doing anybody any good sitting in my drafts folder. The simplest change was updating year 2015 to 2016 at publication time. (Update: Many people have submitted revisions, notes, and improvements. All contributions have been incorporated throughout the pa

    serihiro
    serihiro 2018/02/14
  • Geekなぺーじ : selectを使う

    普通の状態では、recvやrecvfromはデータが受信できるまでブロッキングします。 ソケットを一つしか利用していない場合にはブロッキングは非常に便利なのですが、ソケットが複数になると困ってしまいます。 複数のソケットを扱うとき、片方のソケットでブロッキングしたままになってしまうと他のソケットにデータが到着しても受信が出来なくなってしまいます。 そのため、複数のソケットを扱っていると、どのソケットからデータが受信可能か知りたくなります。 ブロッキングとは、関数が返ってこない事を表します。 例えば、recvはデータを受信して関数が戻ってきます。 言い方を変えると、データを受信するまでブロックしています。 recvやrecvfromをブロッキングしないノンブロッキング方式で使う事も可能ですが、ここではブロッキング方式のまま使う方法を説明します。 そのような機能を提供するのがselectです。

  • ICU の BreakIterator を使って書記素を1つずつ取り出す - Qiita

    #include <stdio.h> #include <unicode/ubrk.h> void print_each_grapheme(const char *); int main(void) { const char* str = "葛\U000E0101飾区"; print_each_grapheme(str); return 0; } void print_each_grapheme(const char *str) { UText *ut; UBreakIterator *bi; UErrorCode status = U_ZERO_ERROR; int32_t current; int32_t previous; int32_t size; ut = utext_openUTF8(NULL, str, -1, &status); bi = ubrk_open(UBRK_CH

    ICU の BreakIterator を使って書記素を1つずつ取り出す - Qiita
    serihiro
    serihiro 2018/01/21
  • C言語でのUTF-8文字列の正確な長さを取得する

    苗字や地名の異体字や国旗、色違いの絵文字など、複数のコードポイントで構成される書記素クラスターを考慮する必要がある場合、ICU の BreakIterator を使います。書記素クラスターに対応していない文字列関数を使うと、知らないうちに書記素クラスターを壊してしまうおそれがあります。 Twitter のようにコードポイント単位で短い文字数制限をかける場合、ヒンドゥー語やチベット語など、結合文字を多用するアジア諸国の言語のユーザーにとって、使い勝手がわるくなる可能性があることも配慮する必要があります。 漢字の異体字をあらわすには基底字の次に異体字セレクターや Standardized Variant を続けます。葛飾区の「かつ」は <U+845B U+E0101> であらわすことができます。国旗は2文字の国コードを該当するコードポイントであらわします。日の国コードである JP は <U+

    C言語でのUTF-8文字列の正確な長さを取得する
    serihiro
    serihiro 2018/01/21