C言語なら俺に聞け(入門篇) Part 32at TECH
C言語なら俺に聞け(入門篇) Part 32 - 暇つぶし2ch112:デフォルトの名無しさん
08/07/10 13:49:50
入力は正の整数n.
• 出力はn = a^2 となるような正の整数a が
– 存在するときは上の式をみたすa の値.
– 存在しないときは“ No ”.
このプログラムの作り方を教えてください。お願いします。

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

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

115:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/10 17:03:35
>>115
最初のポインターを配列に置き換えて考えてみたら?

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

118:デフォルトの名無しさん
08/07/10 17:10:16
そのレスの意味する所が余りに広大そうで訳が分からん

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

120:デフォルトの名無しさん
08/07/10 17:12:28
const XML_Char *atts[]

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

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

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

124:デフォルトの名無しさん
08/07/10 17:21:48
CとC++て結局どっちが速いの?

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

126:デフォルトの名無しさん
08/07/10 17:29:16
>>125
申し訳ありません、した事無いです。

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

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

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

130:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/10 18:03:02
入力してEnterだけど、人に頼るのはもうやめたほうがいい

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

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

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

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

136:デフォルトの名無しさん
08/07/10 18:07:12
ごめん getchar

137:デフォルトの名無しさん
08/07/10 18:07:38
>>135
コマンドプロンプト開いてから実行すればよい

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

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

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

141:デフォルトの名無しさん
08/07/10 18:30:24
>>124
Cのがちょっとだけ速い

142:デフォルトの名無しさん
08/07/10 18:33:20
早いか遅いかはプログラマ次第

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

144:デフォルトの名無しさん
08/07/10 18:34:40
double < long double < ?
?に相当するものってありますか?

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

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

146:デフォルトの名無しさん
08/07/10 18:36:08
多倍長ライブラリ

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

148:デフォルトの名無しさん
08/07/10 18:39:56
有名なバベル案内
URLリンク(www.aoky.net)
一回は読んどいて損はない

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


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

151:デフォルトの名無しさん
08/07/10 18:59:50
>>148
おk、C++をドブ川に投げ捨ててきた

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

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

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

155:デフォルトの名無しさん
08/07/10 19:09:18
外人の書く文章ってなんか笑えないんだけど面白い

156:デフォルトの名無しさん
08/07/10 19:14:22
それは翻訳のせいだ

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

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

159:デフォルトの名無しさん
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