[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 05/09 20:17 / Filesize : 49 KB / Number-of Response : 186
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 32



1 名前:処理系定義の名無しさん mailto:sage [2008/07/09(水) 11:00:48 ]
言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら宿題スレへ行ってください。
 C/C++の宿題を片付けます 110代目
 pc11.2ch.net/test/read.cgi/tech/1213796455/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 31
pc11.2ch.net/test/read.cgi/tech/1214569903/
過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

75 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:16:41 ]
>>74
ポインターはわかります?

76 名前:74 mailto:sage [2008/07/09(水) 22:21:33 ]
>>75
大まかには理解している、と思うんですが・・・。

intやcharなどの関数のメモリの先頭の場所で、
その関数を指すのと、その関数の場所を指すのは同じこと。

というくらいの理解なんですが・・・。

77 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:26:45 ]
>>76
構造体の中に自分自身と同じ構造体をさせるポインターを持たせてあって
それでつないでるのがリストです。



78 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:30:49 ]
宝箱の中に
「宝」と「次の宝箱の場所」が入ってるようなもんだ

79 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:31:44 ]
www9.plala.or.jp/sgwr-t/c/sec15-5.html
ここなんてどうかな?

80 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:44:29 ]
>>77
どう繋ぐかが分からず・・・。

>>78
その「次の宝の場所」は、どういう処理になっているのでしょうか?
その「次」が無数に増える場合、最初から指定しておくのは不可能だと思うんですが、
どうやってその「次の場所」を指定すれば良いのか分からないのです。

>>79
struct list {
        char name[20];
        struct list *next;        /* 自己参照構造体 */
};
で、構造体のポインタ *nextを作成しているのは分かるんです。
でも、それがどういう働きをして「次の構造体」に行っているのかがよく分からず……。

81 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:51:14 ]
たとえばこんな感じ

struct list {
        char name[20];
        struct list *next;        /* 自己参照構造体 */
};

int main()
{
        list *listptr;


       listptr = (list *)malloc(sizeof(list);
       listptr->next = (list *)malloc(sizeof(list);
       listptr->next-next = NULL;

       return 0;

}


82 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:52:05 ]
一部ミス

struct list {
        char name[20];
        struct list *next;        /* 自己参照構造体 */
};

int main()
{
        list *listptr;


       listptr = (list *)malloc(sizeof(list);
       listptr->next = (list *)malloc(sizeof(list);
       listptr->next->next = NULL;

       return 0;

}

83 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:53:07 ]
あふーんorz
またまたミス。ヘッダとかは自分でいれてね。

struct list {
        char name[20];
        struct list *next;        /* 自己参照構造体 */
};

int main()
{
        list *listptr;


       listptr = (list *)malloc(sizeof(list));
       listptr->next = (list *)malloc(sizeof(list));
       listptr->next->next = NULL;

       return 0;

}



84 名前:74 mailto:sage [2008/07/09(水) 23:05:58 ]
>>83
struct list {
        char name[20];
        struct list *next;        /* 自己参照構造体 */
};

int main()
{
        list *listptr;

       listptr = (list *)malloc(sizeof(list));
    /* mallocで確保したメモリの場所をlist型のlistptrに代入 */
       listptr->next = (list *)malloc(sizeof(list));
    /* listprtの中の*nextにmallocで確保したメモリの場所を代入 */
       listptr->next->next = NULL;
    /* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/
       return 0;
}

って理解でいいんでしょうか?

85 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:11:21 ]
>>84
です。

リストを管理するポインターは例のような単純なリストでも2つは欲しいですかねえ・・・

listptrはリストをつないで置くだけのポインタ。
リストの入り口ですかね。

で、リストの最後を判別するために最後の構造体のnextにはNULLを入れます。
これはリストの決まりごとみたいな感じですね。


86 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:14:22 ]
struct list {
        char name[20];
        struct list *next;        /* 自己参照構造体 */
};

int main()
{
        list *listptr;      //管理用
        list *listwptr;    //リストをたどる用

       listptr = (list *)malloc(sizeof(list));
    /* mallocで確保したメモリの場所をlist型のlistptrに代入 */
       listptr->next = (list *)malloc(sizeof(list));
    /* listprtの中の*nextにmallocで確保したメモリの場所を代入 */
       listwptr = listptr->next;
       listwptr->next = NULL;
    /* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/
       return 0;
}

87 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:29:30 ]
初心者です。

Visual C++ 2008 Express EditionをDLし、プログラミングしてみたところ
なぜかコンパイルできません。なぜでしょう・・・?

----------------------------------------------------------
プログラム
'c:\work\sample_console1\Debug\sample_console1.exe'を開始
できません。

アクセスが拒否されました。
----------------------------------------------------------

OSはVistaで管理者権限で実行しています。

88 名前:74 mailto:sage [2008/07/09(水) 23:44:41 ]
>>86
むむむ、分からないorz

listptr = (list *)malloc(sizeof(list));
    /* mallocで確保したメモリの場所をlist型のlistptrに代入 */
でlist型の関数にメモリの場所を渡してますよね?
このとき、struct listのchar name[20];は(今は説明のため省いてある部分だと思うのですが)どういう扱いになるんでしょうか?

89 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:46:41 ]
>>88
一緒に確保されてる
構造体の定義が目次で、中身が本文で、本ごと手に入れるというか。

90 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:47:28 ]
listptr->name

とか

listptr->name[0]

とか

91 名前:74 mailto:sage [2008/07/09(水) 23:59:05 ]

int main()
{
        list *listptr;      //管理用
        list *listwptr;    //リストをたどる用

       listptr = (list *)malloc(sizeof(list));
    /* mallocで確保したメモリの場所をlist型のlistptrに代入 */

    scanf("%c",&listptr->name);

       listptr->next = (list *)malloc(sizeof(list));
    /* listprtの中の*nextにmallocで確保したメモリの場所を代入 */
       listwptr = listptr->next;
       listwptr->next = NULL;
    /* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/
       return 0;
}

のような事をすれば、入力できると考えて大丈夫でしょうか?

92 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:01:24 ]
>>91
領域をオーバーしないように十分な注意を払える環境であればそれでも。

93 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:02:31 ]
そんなことないわ。
scanf("%s",listptr->name);
だね



94 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:03:05 ]
>>91
そういう使い方をするならとりあえず入力の情報を受けるだけのでっかい器
を別に用意して文字数の確認なんかをした上でmemcpyとかで
入れてあげたほうが良いかもしれないですね。

95 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:07:39 ]
まず構造体をおさらいしてからの方がいいのかも?
入力処理に自信がもてず、構造体に自信がもてない状態でリストに進むと、
何か問題があったときにどこが問題なのかが分からなくなるかもよ

96 名前:74 mailto:sage [2008/07/10(木) 00:18:47 ]
了解です。
構造体あたりから復習してみます。
ありがとうございました!

97 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:36:23 ]
int hoge[10000];
と言う配列を以下のように操作したいのですがいまひとつ効率のよい方法が思いつきません。

1.hogeには0以上の整数がランダムで入っている
2.0は空きと考え、hogeを添字0から順に走査して1以上の数であれば添字の小さい順に詰める
(301200960890なら312968900000としたい)

出来る限り効率の良い方法はどのようになるのでしょうか?

98 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:41:06 ]
>>97
メモリ効率 or 時間効率?


99 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:41:52 ]
それはCっていうより、アルゴリズムの話だからスレ違い

100 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:44:59 ]
時間効率なんですが、すれ違いみたいなので去ります
スレ汚し失礼しました

101 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:50:57 ]
for(i=j=0; i<10000; i++) if(hoge[i]) hoge[j++] = hoge[i];
for(;j<10000; j++) hoge[j] = 0;

102 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:54:32 ]
これでメモリ効率持ち出す奴ってどんなアルゴリズム考えたの?


103 名前:デフォルトの名無しさん [2008/07/10(木) 01:25:10 ]
それはCっていうより、アルゴリズムの話だからスレ違い
warota



104 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 01:46:44 ]
あげんなカス

105 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 01:51:45 ]
あがっちゃうんだよ

106 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 05:54:59 ]
最近のexe compなに使ってる?

107 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 10:42:45 ]
XPに最適なCコンパイラをおしえて
今はbccつこうとる

108 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 10:47:45 ]
vc++でいいんじゃないの?

あれってGUI版も作れるし、コンソールのもできるでしょ?

109 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 10:48:43 ]
>>107
統合開発環境を使うと関数のマニュアルやプロトタイプが簡単に見えたり
スペルチェックや変数名の補完もできたりするメリットはある

でも、現状それで何か不都合があるの?

110 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:48:04 ]
>>107
Windows用ならやっぱり開発元の作ったVisualC++がいいだろう


111 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 13:31:27 ]
せっかくだから俺はこのWindowsSDKを使うぜ!

112 名前:デフォルトの名無しさん [2008/07/10(木) 13:49:50 ]
入力は正の整数n.
• 出力はn = a^2 となるような正の整数a が
– 存在するときは上の式をみたすa の値.
– 存在しないときは“ No ”.
このプログラムの作り方を教えてください。お願いします。

113 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 14:00:57 ]
>>112
正の整数を変数nに入力し、
nの平方根を求めて変数aに代入し、
変数aが整数ならそれを出力し、
そうでないなら"No"を出力する。
ように作ればいいとおもうよ。



114 名前:デフォルトの名無しさん [2008/07/10(木) 14:19:22 ]
>>113
ありがとうございます。
がんばってみます。

115 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:30:40 ]
OSSである、expat-2.0.1のソースコードを読んでいるのですが、どうしても分からない部分があります。
elements.c内のstatic void XMLCALL startElement(void *userData, const XML_Char *name, const XML_Char **atts);
この関数の引数XML_Char **attsのHeap領域がどこの関数で確保されているのかが分かりません。
構造体をchar **にキャストして使用している、と予想して探しているのですが、
ご存知でしたらご教授下さい。お願いします。

116 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:03:35 ]
>>115
最初のポインターを配列に置き換えて考えてみたら?

117 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:06:23 ]
自己管理がちゃんとできるならC++にたいした利点はありませんよね?

118 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:10:16 ]
そのレスの意味する所が余りに広大そうで訳が分からん

119 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:10:22 ]
>>116
レスありがとうございます。
最初のポインタを配列に置き換えて考える、というのはどういう意味でしょうか?

120 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:12:28 ]
const XML_Char *atts[]

121 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:14:02 ]
確かに自己管理ができていれば山本モナも番組降板になることもなかったわけで、
そう考えるとC++のことなんてほんとたいした問題ではない

122 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:14:09 ]
>>117
ええ!?クラスとかデフォルト引数とか死ぬほど便利なのに・・・

123 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:18:22 ]
>>120
XML_Char **attsは動的に複数個確保された構造体を指している、という事でしょうか?



124 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:21:48 ]
CとC++て結局どっちが速いの?

125 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:22:04 ]
>>123
main関数でコマンドラインに渡されたパラーメータを解析するとかやったことないの?

126 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:29:16 ]
>>125
申し訳ありません、した事無いです。

127 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:34:28 ]
>>126
ポインタへのポインタってこと何だけど、これが分からないとなると...

128 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:41:29 ]
char *へのポインタ、ですか?
main引数のパラメーターの場合は二次元配列に使っている。と覚えています。

129 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:43:46 ]
>>128
そこまで分かってるのに
試しに、コマンドラインに渡されたパラメータを表示することとかやってみたら?

130 名前:デフォルトの名無しさん [2008/07/10(木) 18:01:18 ]
自分の名前を大文字でYAMADA HANAKOのように入力し、小文字で出力せよ。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
char ch;
printf("Input > \n");
while( (ch=getchar()) != '\n' && ch != EOF ) {
ch=tolower(ch);
putchar(ch);
}
return 0;
}

でソースはわかったんですが、コンパイル後に
Input > だけ出てきて何をどうすればいいのかわかりません・・・

131 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:03:02 ]
入力してEnterだけど、人に頼るのはもうやめたほうがいい

132 名前:デフォルトの名無しさん [2008/07/10(木) 18:03:59 ]
入力してEnter押してもなぜか終了しちゃうんです。

133 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:05:02 ]
Windows環境で、さらに出来上がった実行ファイルをダブルクリックして動かしたろ?



134 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:06:08 ]
return 0;
のまえに getcher(); でもいれとけ

135 名前:デフォルトの名無しさん [2008/07/10(木) 18:06:35 ]
はい、WindowsXPで
出来上がったexeを実行して動かしました。
違ったんでしょうか?

136 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:07:12 ]
ごめん getchar

137 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:07:38 ]
>>135
コマンドプロンプト開いてから実行すればよい

138 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:08:25 ]
return 0;
でmain()から抜けるんだから、終了しない方がおかしい

139 名前:デフォルトの名無しさん [2008/07/10(木) 18:13:36 ]
>>137
コマンドプロントから実行したらできました!
ありがとうございます!

140 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:13:50 ]
>>129
すみません。レスが大分遅くなりました。
帰ってからパラメーターの解析をしようと思います。

141 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:30:24 ]
>>124
Cのがちょっとだけ速い

142 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:33:20 ]
早いか遅いかはプログラマ次第

143 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:33:34 ]
出来上がったコードによるでしょ。
同じソースからコンパイルしたらほぼ同じものができると思うが。



144 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:34:40 ]
double < long double < ?
?に相当するものってありますか?

小数点第60位までを表示したいです。

145 名前:デフォルトの名無しさん [2008/07/10(木) 18:35:18 ]
コンパイラではなく、C++の機能を使った場合だろ

146 名前:デフォルトの名無しさん [2008/07/10(木) 18:36:08 ]
多倍長ライブラリ

147 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:37:24 ]
C++コンパイラで、なるべくCのコード書いて、必要最低限のC++機能を使うのが正解

148 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:39:56 ]
有名なバベル案内
www.aoky.net/articles/steve_yegge/tour_de_babel.htm
一回は読んどいて損はない

149 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:44:22 ]
char[] 型って1バイトの配列なのに2バイト文字を扱えるのはどうして?
たとえば↓のようにやってもちゃんと文字が出力される
#include <stdio.h>
int main(){
char test[] = "いろはにほへと";
fprintf(stdout, test);
return 0;
}


150 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:46:04 ]
>>149
printf("%d\n", sizeof(test));
とやってみるといいよ

151 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:59:50 ]
>>148
おk、C++をドブ川に投げ捨ててきた

152 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:59:51 ]
>>149
SJISかな?
test[0] と test[1] の2つあわせて「い」だよ

153 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:03:35 ]
>>151
川から海へと流れ出し、蒸発し雲になり、それは雨となり、いつかあなたの家の蛇口から出てくるでしょう



154 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:07:50 ]
パラメーターの処理をしている部分がxmlwf.cにありました。
ここを解析していけばわかりますか?

155 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:09:18 ]
外人の書く文章ってなんか笑えないんだけど面白い

156 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:14:22 ]
それは翻訳のせいだ

157 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:17:20 ]
>>154
解析するなら、もっと簡単な奴にした方がいいのでは?

158 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:19:08 ]
>>157
レスありがとうございます。
例えばどのようなものがありますか?

159 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:29:24 ]
>>158
本屋にいって入門書を立ち読みするとか?

160 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:45:23 ]
>>159
elements.cを見ていて思ったのですが、
XML_ParserCreate
XML_SetUserData
XML_SetElementHandler
XML_Parse
XML_ParserFree
これらの関数はelements.c内で使われている関数ですが、
どのみちハンドラを呼び出すためには、上記五つの関数内でXML_Char **attsの部分を動的に確保する必要があると予測出来ます。
パラメーターから辿るのは今の私には無理があります。
XML_Char **attsを確保している部分の関数名を教えて頂きたいです。

161 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:49:12 ]
>>160
配列が理解できてるなら、ポインタも理解できると思うんだけど
基本に立ち返って、自力で**の動作確認できるプログラムを作る方がいいと思うけど

162 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:52:42 ]
>>161
どこでXML_Char **attsを確保する関数が呼び出されているのかが分からないのです。

163 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:55:11 ]
なんか面倒そうな話してるなあと思ってソース拾ってきたんだが
examples/elements.c の話してんの?



164 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:56:59 ]
>>162
XML_Char **attsをパラメータにしてる関数を検索すればいいのでは?
何が分からないのか俺には理解できない。

165 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:59:55 ]
>>163
そうです。
>>164
検索してもわからなかったのであなたに質問しています。
XML_Char **attsの部分を動的に確保している場所が分かりません。

166 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:00:45 ]
>>165
じゃ、俺はおりた。

167 名前:163 mailto:sage [2008/07/10(木) 20:00:49 ]
lib/xmlparse.c 2653は?

168 名前:163 mailto:sage [2008/07/10(木) 20:04:01 ]
ああ、関数名が欲しいのか。storeAtts

169 名前:163 mailto:sage [2008/07/10(木) 20:13:52 ]
まだ必要かどうかわからないが

REALLOCマクロの定義は lib/xmlparse.c 552 で
#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))

上記関数ポインタの設定はparserCreateでやってる。

170 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:22:43 ]
>>167
レスありがとうございます。
ATTRIBUTE *temp;
attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
なるほど、ATTRBUTE構造体をここで再確保しています。
parserCreate()内でも確保しているようですが、
一番気になるのは、
const char *name;
const char *vlauePtr;
const char *valueEnd;
をどこで確保しているのか、ここが分かりません。
>>168
今からstoreAtts();を見てみます。
>>169
そこは以前に見たものですが、先程再確認させて頂きました。
ありがとうございます。

171 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:44:35 ]
申し訳ありません、言い忘れました。
const char *name;
const char *vlauePtr;
const char *valueEnd;
はATTRBUTE構造体のメンバです。

172 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:48:08 ]
あれ?それも場所を教えてっていってたの?
storeAttsでその構造体を確保したんだからその後attsを使用してるとこ追ってけばすぐ見つかると思うけど。

173 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:53:08 ]
と思ったけどパラメータでもらってたりするね。
たいして見てなくて申し訳ない



174 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:05:38 ]
>>173
いえ、感謝しています。
今storeAtts()を見ています。
appAtts = (const XML_Char **)atts;これ以降で、appAttsが引数になっている関数はstoreAtts内に、
XmlGetAttributes()
getAttributeId()
storeAttributeValue()
poolStoreString()
addBinding()
上記の関数がありました。
私が気になったのは、名前からして、poolStoreString()です。
なので、/* String Pool */STRING_POOL;構造体を調べてみようと思います。

175 名前:162 mailto:sage [2008/07/10(木) 21:10:51 ]
なんか名前忘れてた。

とりあえず解析するならctagsというツールと、そのツールの出力ファイルを
活用可能なエディタを手に入れるといいと思う。
この関数の定義の場所へジャンプ、ということができるようになったりするよ。

あと、そもそも何で解析してるの?勉強?

176 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:15:37 ]
>>175
その通り、勉強です。

177 名前:162 mailto:sage [2008/07/10(木) 21:27:47 ]
>>176
なるほど。がんばってね。

178 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:39:12 ]
xmlを実際に解析させてみました。解析して分かった事は、
xmlparse.c内のpoolInit関数、poolCopyString関数、poolGrow関数、poolAppend関数、
poolStoreString関数、poolClear関数、poolDestroy関数が呼び出されていました。
ATTRBUTE構造体各メンバの動的確保はここで行われているのでは無いかと予想し、
今からここを重点的に調べていこうと思います。
皆様からの回答、本当にありがとうございます。
それでは、

179 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 09:42:38 ]
ctagsのほかに、cscopeもあるでよ。
最近どこかで読んだけど、silentbobとかいうのもなかなかいいそうな。
まぁ、grepでしこしこ調べるのも、まぁアリといえばアリな気がするけど。


180 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 16:25:52 ]
cで例外処理書くときはgoto文で書いたほうがいいですか?

181 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 16:37:09 ]
私は、例外処理でもgotoは使わない。

182 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 16:44:44 ]
setjmp, longjmp のペア?

183 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 17:01:50 ]
gotoやjmp系は総て無視していたので、調べてみた。

準拠
setjmp() は C89, C99, POSIX.1-2001 で規定されている。 sigsetjmp() は
POSIX.1-2001 で規定されている。
注意
POSIX は、 setjmp() がシグナルコンテキスト (signal context) を保存すべきかどうか
を規定していない (System V では保存しない; 4.3BSD では保存する; 4.3BSD には
シグナルコンテキストを保存しない関数 _setjmp もある)。シグナルマスクを保存したい
のなら、 sigsetjmp() を使うこと。 setjmp() や sigsetjmp() を使うと、プログラムは理解
しづらく、保守しにくいものになる。別の方法が可能なら、それを使うべきである。

とあるね、やっぱり私は使わないか。C++の例外は使ってる。



184 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 17:33:55 ]
>>180
いいとか悪いとかいうことはない
gotoの利点と欠点をよく考えた上で
必要かどうかを自分で判断すること

185 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 17:44:28 ]
>>184
最初は使わないようにして、後々使うパターンを覚えたほうが有益だと思うがいかが?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<49KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef