C言語なら俺に聞け( ..
[2ch|▼Menu]
49:39
08/07/09 15:37:49
>>43
ありがとうございます!
関数を作るってところが授業でもよくわかっていないのですが、どんな感じかソースを少し書いてみてくれませんか?
質問ばかりですいません。

50:デフォルトの名無しさん
08/07/09 15:40:37
宿題スレに行けよ

51:デフォルトの名無しさん
08/07/09 15:50:52
>>49
細かい部分は処理系の用意しているグラフィック機能の詳細による
たぶん実際にはC++なんだろうから、ビットマップオブジェクトクラスのメソッドを調べて使うこと

void square(BITMAP bitmap, POINT *points)
{
  bitmap->pen->color=BLACK;
  bitmap->pen->move(points[0].x, points[0].y);
  bitmap->pen->line(points[1].x, points[1].y);
  bitmap->pen->line(points[2].x, points[2].y);
  bitmap->pen->line(points[3].x, points[3].y);
  bitmap->pen->line(points[0].x, points[0].y);
}

あくまで感じ

52:デフォルトの名無しさん
08/07/09 16:02:20
引っ越したときは引越し通知くらいほしいよね

53:デフォルトの名無しさん
08/07/09 16:08:05
マルチかと思ったら別人だったようだ

54:デフォルトの名無しさん
08/07/09 16:09:20
< 39 >
========================================
引っ越しました!
近くにお越しの際は、是非お立ち寄り下さい
========================================
C/C++の宿題を片付けます 112代目
スレリンク(tech板:260番)


55:デフォルトの名無しさん
08/07/09 16:10:40
本とかによく出てるプログラムをそのまま打ち込んでうまくコンパイルしてくれるコンパイラって無いの?

56:デフォルトの名無しさん
08/07/09 16:11:46
それができりゃあプログラマの仕事がなくなるな

57:デフォルトの名無しさん
08/07/09 16:19:51
換字式暗号について聞きたいんですが、c言語で[a,b,c]を[g,C,f]に変換するようなプログラムってどう作ればいいですか?
ちなみに文字列に規則性はないです。

58:デフォルトの名無しさん
08/07/09 16:19:52
それはタイパーの仕事じゃ?
コンパイルできないといっているコードはコード片だったりしないのかな

59:デフォルトの名無しさん
08/07/09 16:20:52
微妙に違う内容でマルチすんなw

60:デフォルトの名無しさん
08/07/09 16:21:36
>>57
rand関数で適当にASCIIコードを進める

61:デフォルトの名無しさん
08/07/09 16:24:29
>>55
本と同じ環境、同じコンパイラーならそのまま動く。
しかし、半年や1年で、OSもコンパイラーも仕様さえも変わってしまう時が有る。
一つの変化は数年だが、環境は多くのソフトで成り立つので。どれかがすぐに変わるのはザラ。

62:デフォルトの名無しさん
08/07/09 16:27:25
qあwせdrftgyふじこ

63:デフォルトの名無しさん
08/07/09 16:34:29
標準関数かAPIに文字列の置き換え関数ってないの?
自分で作ったけどいまいち信用できない(速度的に)

64:デフォルトの名無しさん
08/07/09 16:36:52
>>63
cならそれこそマクロで皮だけ作ったら?

#define hogehoge(A,B,C,D) { API_hoge(A,B,C,D) };

65:デフォルトの名無しさん
08/07/09 16:37:41
あーーーーーーすまんぼけてましたorz

文字列置き換えって言われてもどう置き換えるの?

66:デフォルトの名無しさん
08/07/09 16:42:28
文字列の配列データーを作って、適当に文字列入れて、
文字のコードで配列を引く、これが単純。

67:デフォルトの名無しさん
08/07/09 16:59:29
>>57
char *stra = "abcdefghijklmeo.....";
char *strb = "gCfEjBm.....";
で文字が一致したところで置き換える


68:デフォルトの名無しさん
08/07/09 17:48:01
>>67
strb[data - 'a']
の何が不満なの?

69:デフォルトの名無しさん
08/07/09 17:58:07
>>65 こんな感じなんだけど非効率かどうか自分にはわからない
//szSrcの中からszKeyを探してszRepで置き換える
//置き換えた数を返す
int strrpl(char *szSrc, char *szKey, char *szRep) {
int nRepTime = 0;

size_t nSrcSize = strlen(szSrc);
size_t nKeySize = strlen(szKey);
size_t nRepSize = strlen(szRep);

char *szCpySrc = new char[nSrcSize + 1];
strcpy(szCpySrc, szSrc);
*szSrc = 0;

char *cp = szCpySrc;
char *_cp = szCpySrc;

while (cp = strstr(cp, szKey)) {
*cp = 0;
strcat(szSrc, _cp);
strcat(szSrc, szRep);
cp += nKeySize;
_cp = cp;

nRepTime++;
}

strcat(szSrc, _cp);
delete [] szCpySrc;

return nRepTime;
}

70:デフォルトの名無しさん
08/07/09 18:34:03
>>68
文字コードが順番じゃなくても使える
ASCII限定でも問題ないんだろうけど

71:デフォルトの名無しさん
08/07/09 18:38:43
EBCDIC でやったときは"ABCDE・・・だったなー

72:sage
08/07/09 21:06:35
学校の課題でC言語が出てしまったのですが、さっぱり分かりません…
あつかましいかもしれないですが、どなたか教えてください…

@「キーボードから10個の数値を入力して、10個の数値の最大値と最小値を表示するコードを
記述せよ」

A「キーボードから数値を入力し、その数が素数か否かを判断するコードを記述せよ」

よろしくお願いします。


73:デフォルトの名無しさん
08/07/09 21:07:57
ごめんなさい、1を見てませんでした。宿題スレに行ってきます。

74:デフォルトの名無しさん
08/07/09 22:15:00
リスト構造がよく分かりません。
構造体は理解できるのですが、なぜそれが繋がっていくのか(繋げれるのか)がどうにも・・・。

抽象的な質問ですみませんが、どなたかお願いします。
例となるようなソースなどもあると助かります。

75:デフォルトの名無しさん
08/07/09 22:16:41
>>74
ポインターはわかります?

76:74
08/07/09 22:21:33
>>75
大まかには理解している、と思うんですが・・・。

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

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

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



78:デフォルトの名無しさん
08/07/09 22:30:49
宝箱の中に
「宝」と「次の宝箱の場所」が入ってるようなもんだ

79:デフォルトの名無しさん
08/07/09 22:31:44
URLリンク(www9.plala.or.jp)
ここなんてどうかな?

80:デフォルトの名無しさん
08/07/09 22:44:29
>>77
どう繋ぐかが分からず・・・。

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

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

81:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/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:デフォルトの名無しさん
08/07/09 23:11:21
>>84
です。

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

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

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


86:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 23:29:30
初心者です。

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

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

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

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

88:74
08/07/09 23:44:41
>>86
むむむ、分からないorz

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

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

90:デフォルトの名無しさん
08/07/09 23:47:28
listptr->name

とか

listptr->name[0]

とか

91:74
08/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:デフォルトの名無しさん
08/07/10 00:01:24
>>91
領域をオーバーしないように十分な注意を払える環境であればそれでも。

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

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

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

96:74
08/07/10 00:18:47
了解です。
構造体あたりから復習してみます。
ありがとうございました!

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

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

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

98:デフォルトの名無しさん
08/07/10 00:41:06
>>97
メモリ効率 or 時間効率?


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

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

101:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/10 00:54:32
これでメモリ効率持ち出す奴ってどんなアルゴリズム考えたの?


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

104:デフォルトの名無しさん
08/07/10 01:46:44
あげんなカス

105:デフォルトの名無しさん
08/07/10 01:51:45
あがっちゃうんだよ

106:デフォルトの名無しさん
08/07/10 05:54:59
最近のexe compなに使ってる?

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

108:デフォルトの名無しさん
08/07/10 10:47:45
vc++でいいんじゃないの?

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

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

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

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


111:デフォルトの名無しさん
08/07/10 13:31:27
せっかくだから俺はこのWindowsSDKを使うぜ!

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

5380日前に更新/49 KB
担当:undef