- 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
- 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
最初は使わないようにして、後々使うパターンを覚えたほうが有益だと思うがいかが?
|

|