[表示 : 全て 最新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

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