Humanity

Edit the world by your favorite way

C

macOS Mojave で Vim のソースコード (C 言語) のデバッグをする (clang, lldb)

C Vim

もし lldb でも良いならそっちを使ったほうが良いです.leak detector は LLVM の msan とか使ってるのが最近は多い気がします— ドッグ (@Linda_pp) July 3, 2019 src/Makefile の CC, CFLAGS を変更 diff --git a/src/Makefile b/src/Makefile index 9c4a42…

#if 0 〜 #endif や 関数定義を折り畳む

Vim C

ふとそんなftpluginを書こうかと思ったのですが、 見てみたら公式のsyntax/c.vimで実現されていたので autocmd FileType c setlocal foldmethod=syntax だけでいけました。(新しくないと実装されてないかも?) ちなみに 自分は~/.vim/after/ftplugin/c.vimを…

Cスクリプト

C

これまではUbuntuでコンパイルした実行ファイルをそのままつっこんでたんだけど それだとcygwinとかで動かせないのでその場でコンパイルするようにした。 #if 0 CC="gcc"source="$0" bin="$0-bin"if [ -f "$bin" ]; then exec "$bin" fi $CC -x c -o "$bin" …

Perlの演算子

毒にも薬にもならないエントリ。 なんかPerlについて語ってたらいつの間にか長くなった。 ここでソート用関数で int comp_func(const int *a, const int *b) { return *a - *b; } とかやると値域が限定されてオーバーフローとか起こすよって話題があって、 …

CでもSTLっぽいの作る

http://github.com/tyru/nstllibdatastructにないものは自分で作るしかないなーということで作った。名前センスなさすぎわろた テストにはnanotap.hとかPerlとか使ってる。 今のところlistしかない。 STLのインターフェースに合わせた関数などを定義してある…

double2string

C

適当だなぁ。 あとstring2double()もそうだけどstring2double([from], [to])な引数なのがちょっと紛らわしいかも。 1.00000 -> 1とかせずに最初からsnprintf()使わず自前で変換すればうんたらかんたら。 bool digit2token(double digit, char *str, size_t m…

string2double

C

使わなくなったので晒し。 元はman strtolからパクったんだったと思う。 bool string2double(char *str, double *digit) { char *end_ptr; errno = 0; *digit = strtod(str, &end_ptr); if (errno == ERANGE || (errno != 0 && *digit == 0)) { return false…

ポインタ同士の加減算

C

なぜかポインタ同士で差を求めようとするとバイトでのオフセットが返ると思ってた。あぶないあぶない。 正しくはそのポインタ間での要素数が返る。 #include <stdio.h> int main(void) { int arr[] = { 1,2,3 }; int *p1 = &arr[0]; int *p2 = &arr[3]; // sizeof(int</stdio.h>…

void*に対して加減算をすると何Byte進むのか

C

答え: 1Byte。 コンパイルエラー(gcc以外では)。(コメント欄にてid:pi8027さんにvoid*に対して加算できるのはgcc拡張だと教えていただきました。詳しくはid:pi8027さんのコメント欄のURLを参照してください) 歴史的な理由があるらしくて、char*と同じになっ…

変数を定数値として扱う

C

キャストすることによって「定数値であるべき変数」に対して代入を抑制する方法。 #ifndef __cplusplus extern #else extern "C" #endif signed char _mb_cur_max; #define MB_CUR_MAX ((int)_mb_cur_max) ...MB_CUR_MAXマクロの定義で、int型にキャストして…

Cで二重typedefを避ける

C

今日id:mattnさんのブログで前見たハックを実際に使う場面があった。 apr.h typedef int uid_t; perl.h typedef long uid_t; もちろんこのヘッダを同時に読み込むとエラーになるんですが、こういう場合に私がよく使う手として #define uid_t _uid_t #include <apr.h></apr.h>…

libdatastructにパッチ送った

送ったのは何日か前だけど作者のブログでも取り上げてもらったのがうれしかったので。 libdatastructというのはid:pi8027さんのライブラリ。 Associative array stack queue double-ended queue (deque) といういろいろ便利なデータ構造を扱える優れもの。で…

今更だけどポインタって便利

NULLで何もないことを表せて、その上NULLでない場合には値をも表現することができる。 intでも特定の値をNULLと同じ役割にすればいいけどその値使えなくなっちゃうし。 C++の参照は素晴らしいけど、どうも俺は.よりも->のが好きらしい。 感覚的すぎてイミフ…

orz

シグナル処理をしようとしたら、やっぱインタプリタの構造体(struct ForthInterp)をグローバル変数に置くしかないのかな。 シグナルハンドラの引数はシグナルの番号だけなので、どうしても外部変数に頼らざるを得ない。できればインタプリタをいくつも実行す…

ようやく逆ポーランド計算機できた

いやForthインタプリタだけど。 とりあえず逆ポーランド計算機完成。 C++で作った時は色々すっとばしたので多分1日かかったかかからないか(よく覚えてない)だったと思う。それでもかかりすぎか...へぼい... それで、0除算した時にエラーチェックしないでおい…

Forth習得のためのインタープリタ作成状況

まだまだ継続中。もう1週間近く経ってるような... ていうかタイトル、いつの間に目的が変わってるような気がしないでもない。 <言い訳>Cでyacc/lexもBoehm GCも使わずがんばるって約束だったし、valgrindのメモリリークテスト全て通そうとすると時間くっちゃ…

Forthインタプリタ現在状況

なぜかSEGVるんだけどgdbでその箇所見ても原因が分からず・・・ やっぱりCはLLに浸かりきった脳ではきつかったのか・・・orzhttp://twitter.com/tyru/status/3580308339 追記: わかった!!1 ようするに NULL->member みたいなことしてた...うわぁしにたい…