Cの最近のブログ記事

unixなosをbootさせたりすると-(ハイフン)がその場でクルクル回転したり,パッケージとかインストールするとプログレスバーが(====>みたいなヤツ)その場でにょきにょき伸びたりする.

あれってどうやるんだろう?って昔から思っていた.
なんか専用のgnu臭漂うライブラリーでも使うのかなぁと思っていたのだが,もっともっと簡単にできることを今日やっと知った.

(参考元:工学ナビ - C/C++ テクニック集)
キャリッジリターン(CR)を使えばイイだけなのだ.

Cだとwindowsのメモ帳でも改行されるように時々使う\rのみを使う.

#include <stdio.h>
 
int main(void) {
  while(1){
    printf(" -\r");
    usleep(100000);
    fflush(stdout);
    printf(" \\\r");
    usleep(100000);
    fflush(stdout);
    printf(" |\r");
    usleep(100000);
    fflush(stdout);
    printf(" /\r");
    usleep(100000);
    fflush(stdout);
  }
}

#gcc -o anime anime.c
#./anime
  -
するとそこには元気にくるくる回るハイフンの姿が!

#それだけです.本当にありがとうございました.

Javaのような考え方でテキトーにコーディングしてたらハマった...。
debugでコンパイルしたら動くのに、releaseだと何故かサーバと通信できない...。
構成をグリグリいじってみたら今度はdebugでも動かなくなり、頭の中が混乱した。
落ち着いてトレースしてみると、サーバに送るメッセージが送る段階でメチャクチャに壊れていた。

ちなみにサーバへ送信するメッセージを生成する部分は関数に分けている。
正直、テキトーに作った関数を載せるのが恥ずかしいが、やっぱり載せちゃう。

//サーバに送る登録メッセージを作成する。
char* make_regist_req(int island_server_port, int island_reply_port, int performance){
	char buf[128];
	sprintf_s(buf, sizeof(buf), "island_registration:%d,%d,%d\n", island_server_port, island_reply_port, performance);
	return buf;
}

研究用だしmallocじゃなく配列宣言でイイヤもう。とめんどくさがったのがまずかった。
改めて上のコードを見ると

kimoigirls_c.gif

な、感じなのだが、混乱してる最中は

  ( _, ,_)  < make_regist_req()の呼び出し元でbufが参照されてるじゃねぇかよぉぉー!
_(__つ/ ̄ ̄ ̄/_
  \/    ./

とマジで思ってた。どう考えてもヒープ脳でした。


今までの経験から考えてdebugで動いてreleaseで動かない場合はメモリー関連のエラーが多いねぇ。まぁ、debugの方も運良く動いてるだけの話なんだけれども。こーゆう煩わしさがないJavaはやっぱ楽だなぁとか思ってみたり。

#もうBoehm GC使っちゃいますか。

さっきからCいじったり、Perlいじったりしてて疲れたので休憩がてらに更新。とりあえず今日プログラミングしてて色々分かったことをメモ代わりに載せていく。


#開発環境編
-subversionであり得ないコミットをしてしまったとき(dir丸ごと削除とか)
Subversion メモ 以前のリビジョンに戻す (svn cat / svn merge)より

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U  integer.c
$ svn commit -m "Undoing change committed in r303."

margeってこーゆう使い方も出来るのか。めもめも。

Tracと連携しているSubversionのリビジョンを戻す方法っていうのもあったけどリンク先でも指摘されているようにdbがぶっ壊れてるとか非常時でない限り多分marge使った方が安全。

#VC編
セキュリティ関係の警告(古い関数使ってんな関係)がいい加減煩わしく感じるようになったので_s系の関数で置き換えることにした。マニュアルをテキトーに見てた自分が悪いのだが、見事にこけた。調べてみたらすぐ見つかった

結局なんやねん! sscanf_sについてより


ただ,単純に"_s"を付ければいいわけではなく,キャラクタ等バッファサイズが不定のものは,受け付けるサイズを明示的に指定しないと強制終了してしまう.

%sフォーマットを指定したヤツは直後にサイズも教えてあげなきゃダメなのねぇ~。まぁ、脆弱性を克服してる関数だから当たり前と言っちゃ当たり前だが、呼び出し先がイチイチ指定してしなきゃいけないのがなんとも...Cの悲しい性かな。

それにしても指定しないと強制終了とか、ひどすぎる。実はsscanの前後に手を加えたマクロを置いておいたのでそっちが原因かと勘違いしてたorz


#Perl編
このクックブックが最高。色々なtipsが日本語で読める。「Data::Dumperを使って、DBIx::Classをデバッグする」とか「find_or_create が見付けたのか、列を作ったのかを知りたい?」とかタメになる情報が一杯。

DBIx::Classに大夫慣れてきた感じだけどこのO/R Mapper良すぎ。研究目的で現状10数テーブルを操作するアプリを作っているけど未だにSQLを一回も書かかずにここまできてます。

#おまけ

これはfuckと言われてもしょうがない。


すごい組み合わせ。ただ今超ヘビーローテーション中。

最近はCでプログラミングすることが多い。
といっても自分の場合、Cを勉強→すかさずJavaに移動してしまったので
関数ポインタとか高等なテクニックになるとよくワカラン事が多い。

タイトルにもあるように関数ポインタを返す関数の宣言ではまった。

結局

typedef double (*function_p)(double);

function_p get_func(void){

  (略)return hogehoge_function;

}

とやって解決。typedefせずに強引に一行でやろうとしてはまってしまったのだが、結局解決策は分からず。気になるところだが、typedefした方が見やすいので、あえて解決することもないだろうと放置。

とりあえず枠組み出来たし~と余裕こいてたら、組込先のプログラムがbug持ちで本当にありがとうございましたな状態だったので結局大学を出たのが9時過ぎ。さっさとSubversionサーバ立てないとダメだなぁ。結局今回のbugも以前自分が既に修正してた部分だったしなぁ。また同じ修正を行うハメになるとは...。


---
M研の方からスパゲティゆでタッパーをタダで貰っちゃいました。
これからはスパゲティ食いまくる予定!

このアーカイブについて

このページには、過去に書かれたブログ記事のうちCカテゴリに属しているものが含まれています。

次のカテゴリはJavaです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

OpenID対応しています OpenIDについて
Powered by Movable Type 4.261