C言語なら俺に聞け(入門篇) Part 32at TECH
C言語なら俺に聞け(入門篇) Part 32 - 暇つぶし2ch159:デフォルトの名無しさん
08/07/10 19:29:24
>>158
本屋にいって入門書を立ち読みするとか?

160:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/10 19:49:12
>>160
配列が理解できてるなら、ポインタも理解できると思うんだけど
基本に立ち返って、自力で**の動作確認できるプログラムを作る方がいいと思うけど

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

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

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

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

166:デフォルトの名無しさん
08/07/10 20:00:45
>>165
じゃ、俺はおりた。

167:163
08/07/10 20:00:49
lib/xmlparse.c 2653は?

168:163
08/07/10 20:04:01
ああ、関数名が欲しいのか。storeAtts

169:163
08/07/10 20:13:52
まだ必要かどうかわからないが

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

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

170:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/10 20:44:35
申し訳ありません、言い忘れました。
const char *name;
const char *vlauePtr;
const char *valueEnd;
はATTRBUTE構造体のメンバです。

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

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

174:デフォルトの名無しさん
08/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
08/07/10 21:10:51
なんか名前忘れてた。

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

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

176:デフォルトの名無しさん
08/07/10 21:15:37
>>175
その通り、勉強です。

177:162
08/07/10 21:27:47
>>176
なるほど。がんばってね。

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

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


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

181:デフォルトの名無しさん
08/07/11 16:37:09
私は、例外処理でもgotoは使わない。

182:デフォルトの名無しさん
08/07/11 16:44:44
setjmp, longjmp のペア?

183:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/11 17:33:55
>>180
いいとか悪いとかいうことはない
gotoの利点と欠点をよく考えた上で
必要かどうかを自分で判断すること

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch