タグ

c言語に関するni66lingのブックマーク (12)

  • lda, a Latent Dirichlet Allocation package

    lda, a Latent Dirichlet Allocation package. Daichi Mochihashi NTT Communication Science Laboratories $Id: index.html,v 1.3 2004/12/04 12:47:35 daiti-m Exp $ Overview lda is a Latent Dirichlet Allocation (Blei et al., 2001) package written both in MATLAB and C (command line interface). This package provides only a standard variational Bayes estimation that was first proposed, but has a simple textu

  • printf() のバッファリングにはまる

    cles::blog 平常心是道 blogs: cles::blog NP_cles() « Cでmain()が呼ばれる直前に関数を呼ぶ :: Firefoxを更新したらFlash Playerの警告が出た » 2009/09/09 printf() のバッファリングにはまる  c 592 4へぇ 昨日に引き続き後輩がプログラムが想定通りに動かないと相談に来たので、一緒にデバッグ。 開発しているプログラムはJavaのプログラムからRuntime.exec()経由でC言語のプログラムを起動し、開いたInput / Output Streamを使って起動したプログラムと対話するというというもの。どうも対話がうまくいかなくて、途中で詰まってしまうとのこと。 双方向のパイプを使ってプログラムを操作しようとして、バッファリングのせいでデッドロックになるとか、プログラムが終了するまでログファイルになに

    printf() のバッファリングにはまる
  • Super Technique 講座~longjmpと例外

    プログラムの流れを制御する手段として、いわゆる「構造化構文(for とか if とか)」、悪名高い「goto 文」などがあるのは周知のことだが、かなり特殊なものとして、「setjmp, longjmp」による「非ローカル分岐」と呼ばれるものがある。この「非ローカル分岐」は「非ローカル」と言うだけあって、ある関数の中から、別な関数に制御を移すことができたりする。まあ、そのために乱用すべきではなく、注意して使わなくてはならないライブラリ関数なのだが、実はこれは JavaC++ で言語の上で実装されている「例外」の基礎となるものである。だから、まずこの標準ライブラリ関数「setjmp, longjmp」について解説しよう。 → Java 講座の「例外」 setjmp, longjmp とは どうやって実現してるの? setjmp/longjmp の利用例~インタプリタ 補追1:setjmp

  • C言語講座:gets( )とscanf( )の問題点の解決

    [キーボードから1行入力]←このソース→[書式付き入力と書式指定子] /* 今日は、標準ライブラリ関数gets( )の問題点と、fgets( )による問題解決の話です。 #include <stdio.h> char *gets(char *s); 使用例:gets(s); 実行結 戻り値 成功 s 失敗 NULL gets( )は、標準入力(stdin:キーボード)から1行を読み込みsにしまいます。改行コード(\n)または EOF に出会うと、s に ヌル文字(\0)を追加して戻ります。次のプログラムを検討して見て下さい。重大な問題点があります。 #include <stdio.h> void main(void); void main(void) { char name[21]; printf("お名前を入力して下さい\t"); gets(name); printf("\nあなたのお名

  • プリプロセッサ - cppreference.com

    [編集] 能力 プリプロセッサはソースファイル変換の能力を持ちます。 ソースファイルの一部を条件コンパイルする (#if, #ifdef, #ifndef, #else, #elif, #endif 指令によって制御されます)。 テキストマクロを置換すると共に識別子を連結したり引用符で囲ったりする (#define, #undef 指令および #, ## 演算子によって制御されます)。 他のファイルをインクルードする (#include 指令によって制御され、 __has_include によってチェック (C++17以上)されます)。 エラーを発生させます (#error 指令によって制御されます)。 プリプロセッサの以下の面は制御することができます。 処理系定義の動作 (#pragma 指令および _Pragma 演算子 (C++11以上)によって制御されます)。 プリプロセッサに利用

  • C 言語 マクロ講座 # ## 編: uyota 匠の一手

    # と ## はマクロ関数で使う。 # と ## 共に古くからマクロで実装されている。ところが、これを知らない人達がとても多い。 十年、二十年と C 言語を使ってきたという人でも知らないと言う人が結構いる。これを知らないから、余計なコードを書き、バグを増やし続けるのである。 高級言語と呼ばれる言語の中でも、単純な部類に入る C 言語。その C 言語よりも単純なマクロ言語の構文を把握していないのである。マクロ自体では、できることもたかが知れている。マクロでできるのは、ごく限られた置換や条件分岐処理程度のみだ。C 言語の構文だけでは、それこそ複数のファイルにコードを分けて書くこともできない。 ライブラリを作るのなどは、それこそ不可能だ。 しかし、C 言語はその欠点をマクロ言語を使い前処理することにより、強力な力を得た。C 言語以降もいくつもの高級言語が生まれてきたが、前処理を組み込んである言語

  • 「末尾再帰」の勝ち組的学び方 - ウィリアムのいたずらの、まちあるき、たべあるき

    ウィリアムのいたずらが、街歩き、べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も) 末尾再帰ってあるじゃないですか・・・ って、書いて、??といわれると、先に話が進まないので、説明しちゃうと、 自分を呼び出す再帰プログラムの場合、 int a(x) { if ( x == 1 ) { return 1; } return x + a(x-1); } とかやってしまうと、a(x-1)の再帰をやった後で、xと掛ける作業が必要ななので、このxの領域を保存しておかなきゃいけない、ってことは、再帰を行うたびに、メモリ領域ががんがん増えていくので、よくないなどと、C言語では、言われてたわけです。 でもね、もし、再帰のあとに、なーんにも命令がなかったら、つまり、 int a_oya(x) { int hikisu; hikisu = 0; a(&hikisu,x); retu

    「末尾再帰」の勝ち組的学び方 - ウィリアムのいたずらの、まちあるき、たべあるき
  • C言語で文字列を簡単にかつ少し高速に操作する - ほんまの走り書き技術メモ

    C言語では文字列を連結していくと、メモリの再確保とかしなくてはならないのでとても面倒です。 さらに、strcatを利用すると、 以下のように文字列連結をした場合。 strcat(str1, str2); char *strcat(char *s1, const char *s2) { int len = strlen(s1); strcpy(s1 + len, s2); return s1; } となっている(はず)ため、連結を行う度に線形探索による文字数カウントが行われる。よって、連結を行う操作が多いと処理速度が大幅に低下する。特にオーダーがO(n)になるため、s1の文字数が多くなるとパフォーマンスは最悪だ。 そこで、常に文字数を保持しておくことでstrlenを省くことができ、連結のコストを抑えることができるのだ。 ソース MyString.h #ifndef __MY_STRING_H

    C言語で文字列を簡単にかつ少し高速に操作する - ほんまの走り書き技術メモ
  • ビキビキ…たった1行のC言語だけで鳴らされる異常に格好良い電子ノイズの数々 : matsu & take

    ブブブブブブビビビビビビ…。 まったくC言語のプログラムに関する知識のない自分でも、このノイズの格好良さとシンプルな数式のマジックには意味がわからないままに驚愕します。たった1行程度のC言語プログラムで生成された低bitなデジタルノイズミュージックの数々がプログラムのコードとセットでYouTubeに公開されています(via: motherboard.tv)。 上のようなたった数十文字の単純な記号と数字を書きこむだけで当にこんなノイズが出せるものなんでしょうか。一文字一文字の意味の詳しい説明を聞いても全く頭の中にとどまりそうにありませんが、作者のブログに説明が書かれています(→Link) 動画の作者はviznutというフィンランド人。小サイズのCGアートを製作するデモシーン(Demoscene →Wikipedia)で活動している人物だそうです。 作者がこの動画を作るきっかけになったという

  • “本物のマクロ”でCのコード行数を半分に! - @IT

    2009/09/07 毎年夏に開催される軽量プログラミング言語(LL:Lightweight Language)をテーマにした「LLイベント」。第7回目となる「LLTV」が、2009年8月29日に東京・中野で開催された。この記事ではプログラムの一部、「大改善!!劇的ビフォーアフター」をレポートする。前編では、Rubyによるfortuneコマンドの“増築”と、Firefox拡張によるslコマンドの実装というネタ系発表をレポートした。中編となる記事では、C言語にLisp風のマクロを取り入れ、lsコマンドのソースコードを約半分に“修繕”する匠の技をレポートする。後編では、売り場業務が滞りがちだった販売管理システムをbashコマンドで“建て直した”という劇的ビフォーアフターの発表をレポートする。 Cで書かれたlsのソースコードの問題点 「Real/Macro Metaprogramming On

  • C言語の数学関数 - [物理のかぎしっぽ]

    著者:崎間 C,C++言語には以下の数学関数が用意されていますが,これらを使うには #include <math.h> として math.h というヘッダをインクルードする必要があります.コンパイル時には $ gcc foo.c -lm というふうに -lm オプションを付ける必要がある場合があります. 数学関数(要 math.h) † 一つまたは二つの引数を与え,それぞれの関数に対応した計算値を返すものです. ↑

  • argv[0]は何をさしているか? | messier42の日記 | スラド

    C言語のmain関数の引数main(int argc, char argv*[])はプログラムを実行した時の コマンドライン引数であることは賢明な/.の読者ならご存じだろう。 さて、daemonのプログラムを読んだ・書いた読者ならご存じかと思うがこのargvなので あるが、上書きする事が出来る。例えばこんなふうにだ。 --- #include <unistd.h> #include <string.h> int main(int argc, char *argv[]) { strcpy(argv[0], "./b.out"); sleep(180); } --- このプログラムになんの意味があるのだろうか? 引数を上書きする事になんの意味が? 実はあるのだ。「ps x」等で表示されるコマンド名が書きかわる! % gcc tmp.c % ./a.out & % ps x (補足 CentOS

  • 1