ginga_canvas
ログインはこちらから
ID (ユーザ名)
PW (パスワード)

C
1   a-fukuda   2006-06-23 11:57:03
C, Pro-C, C++等々は、こちらまで♪
29   isbn   2006-07-04 10:43:37
関数ポインタ配列カッコい〜い。
私のTill-C言語でも、DBアクセスは関数ポインタを追加して
アドインする形にしています。

※Till-C Htmlライクな動的Webページ作成言語
1998 (C) GingaSoftware Inc.
30   isbn   2006-07-18 10:18:07
私がよく使うテクニックに、社内で「オフセット」と呼ばれているものがあります。こんな感じですが、ご存知の方いらっしゃいますか?
例えば、typedef struct DENBUN が定義されていて、
そのメンバに順繰りにアクセスする場合、

struct _offset {
  int ofs;
  int size;
} inf[] = { /* DENBUN構造体オフセット情報 */
  { ((DENBUN *)0)->head, sizeof(((DENBUN *)0)->head) },
  { ((DENBUN *)0)->type, sizeof(((DENBUN *)0)->type) },
  { ((DENBUN *)0)->data, sizeof(((DENBUN *)0)->data) },
  ...
  { -1, 0 }
};

やたらカッコ()が多くて恐縮ですが、このinfを使うと、
多くの文字列メンバが並ぶ構造体のデータ移送や構造体変換に
威力を発揮することがあります。

31   r-ogushi   2006-10-17 23:14:20
Till-C言語って初めて聞いたんですけど、普通のC言語と何処が違うんですか?
32   saruhaed   2006-10-17 23:19:15
ACSI-Cとは、別物?
33   isbn   2006-10-20 09:42:25
>31,32
「Till-C」は、29※で書いた通り、C言語とは全く関係がなく、
私が国立○○○館プロジェクトで開発した、
Copyright銀河の全く新しい(もう古い?)言語です。
JSPやstrutsを相当先取りした、ちょっとした優れものと自負しています。
コンパイラと言語命名は、ゼロエックス(旧クラスタソフトウェア)の
小野寺専務です。
詳しく知りたい方は私までメッセージを!
今はPW言語に賭けていますが、Till-Cもいつか日の目を見たいものです。
34   r-ogushi   2006-10-20 13:14:06
なるほど・・・
ちょっとソースを見てみたいですね!
35   pootaroxgs   2007-06-21 17:08:54
質問があります。
「割り込みやスレッドで共有する変数はvolatileにするべき」
らしいのですが、意味がわかりません。
どなたかご教授願えますでしょうか?
36   isbn   2007-06-21 18:01:30
>35
ある変数が初期化以外に変更がない場合、
その変数をwhile(条件)にすると、永久ループか空抜けどちらかですね。
要するに1回だけ判断すりゃいいので、優れた(大抵の)コンパイラは、
そのように効率最適化したコードを生成します。

これがマルチとなると、自分の知らない所でいつの間にか
その変数の値が変更されるかも知れません。
そこだけ見ると馬鹿馬鹿しいが、それでも毎回律儀にチェックしろ
というのがvolatile修飾子です。
これをしないと、
「あれっ、このタイミングで別スレッドが値を変えているのに、
 ループ脱出しない!なぜだ?」
のような現象が発生する可能性があります。

マルチスレッドは、この他getenv()使用禁止(マルチ用が別にある)など、
想定外の事態が結構あります。
37   r-ogushi   2007-06-21 23:20:09
>36
それは知らなかった。

ここ半年Cをさわっていません。
Cにこだわっているわけじゃないけど、忘れないようにしなしと・・・
38   pootaroxgs   2007-06-22 09:59:00
>36
ありがとうございます。
要するに・・・。
スレッドで動作する中で使われるグローバルな変数なんかはvolatileで宣言するということですかね?
変数変更時にロックとかで排他にしてるっぽいのですが、あんまり関係ないでしょうか?
(うーよくわからん・・・・。volatileは「ボラタイル」?そもそもソースが難しすぎるんです!)
39   isbn   2007-06-26 09:32:02
>38
その通りだと思います。
volatileは、registerとペアで語られることがあるのでしょうか。
ともに、邪魔にはなりませんので、
複数スレッドで使用する変数にはつけておいて間違いないと思います。
40   pootaroxgs   2007-08-17 17:10:28
基本的な質問。
Cでの文字列のおはなし。
自動変数の場合、関数を抜けたときにその領域は保証されなくなりますが、リテラル文字列の場合はなくなることはないんですかね?
引数 char **errm に
*errm = "malloc error.";
とかした場合なんですが。
41   isbn   2007-08-20 22:43:42
>40
リテラル実装の詳細は、さすがにコンパイラ作成者にでも
聞かないとわかりませんが、
基本的にはstaticなものですので、成立します。
同一のリテラルが2ヶ所以上で使われていると、共用されるようです。
お試しください。
42   pootaroxgs   2007-08-21 12:22:47
ありがとうございます。
さすがの明快な回答で助かります。
43   pootaroxgs   2007-08-27 14:58:09
お疲れ様です。
質問です。
#define XXX
とかなっている状態でコンパイルし、ライブラリを作成するのですが、この作成されたライブラリをみて、XXX がdefineされているかどうか、ということを確認する術はあるのでしょうか?

#ifdef XXX
となっているところを通るかどうかの試験で、defineされているかどうかをエビデンスに残すにはどうしたもんか、ということなんですが。
44   isbn   2007-08-28 21:24:02
>43
これは聞いたことがありません...
ライブラリ(.aとします)に関しては、
ar -tでオブジェクトを見る以外のことがあるのかどうか?
提案になりますが、システム全体の共通課題となっているのでしたら、
ライブラリ各ソースファイルに
#ifdef XXX
void XXX_ファイル名(void){}
#endif
を必ず入れる規約とすれば、ar -tの結果をエビデンスに
できるとは思います。
45   pootaroxgs   2007-09-07 14:41:39
お疲れ様です。
「ar -tでオブジェクトを見る」
すらよくわからないのですが、結局のところ、コンパイルに使用したヘッダファイルのdefineしている部分を表示してごまかしておきました。
時間がなさすぎて「なんでもいいからやりとげる」のが第一目標らしいので。。。
オブジェクトを見る、については今度詳しく教えてください。
46   isbn   2007-09-07 19:51:48
システム標準関数ライブラリの内容を表示させた結果です。
[root@/usr/lib/ $] ar -t libc.a | head
init-first.o
libc-start.o
sysdep.o
version.o
check_fds.o
libc-tls.o
elf-init.o
dso_handle.o
errno.o
errno-loc.o

実際やってみてわかったのですが、これでは
#define有無のエビデンスにはなり得ないですね。
大変失礼しました。代わりに、

[root@/usr/lib/ $] nm -s libc.a (ものすごい出力、実行はしないで)

ならば、各オブジェクトファイル内の
関数(あるいは大域変数も)オブジェクト名の
一覧が得られるようです。

次の機会に、直接話をしましょう。
47   gon10   2008-11-14 10:14:22
>30
大変興味深いです。
仕事で活かしたと考えておりますが、DENBUN構造体は
どのような定義なのでしょうか?
恐れ入りますが簡単でいいのでサンプルソースが
見てみたいです。

Copyright 2010 Planet Co.,Ltd.. All rights reserved. No reproduction or republication without written permission.