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

2 名前:処理系定義の名無しさん mailto:sage [2008/07/09(水) 11:01:36 ]
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/


3 名前:処理系定義の名無しさん mailto:sage [2008/07/09(水) 11:02:07 ]
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/
Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/
Part 27 ttp://pc11.2ch.net/test/read.cgi/tech/1209429897/
Part 28 ttp://pc11.2ch.net/test/read.cgi/tech/1211198816/
Part 29 ttp://pc11.2ch.net/test/read.cgi/tech/1212329099/
Part 30 ttp://pc11.2ch.net/test/read.cgi/tech/1213367888/
Part 31 ttp://pc11.2ch.net/test/read.cgi/tech/1214569903/

4 名前:全スレ 924 mailto:sage [2008/07/09(水) 13:27:58 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7308.c

ソースをアップしました。

5 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:28:53 ]
thread_new=otu>>1;

6 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:34:09 ]
typedef struct
{
unsigned short HOGE_COUNT;
char Reserve[14];
char data[2];
} HOGE_HED;

HOGE_HED* fpHOGE;
HOGEHOGE* fpHOGEDATA;

fpHOGEDATA = (HOGEHOGE *)fpHOGE->data;

ざけんな

7 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:35:58 ]
ワロタ

8 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:37:33 ]
アハハハハハ …ハァ

9 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:39:45 ]
長さが決まってない構造体を扱う場合はこうするとネットで見たのでそれをまねしたんですけど・・・

10 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:41:47 ]
>9
たぶん、それは可変長の文字列を扱うための、
あまり行儀がよくないがよく使われている方法だろう
まあここだけじゃなさそうだから少し待て



11 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:43:02 ]
void HogeFree(HOGEHOGE* wfp)
{
free(wfp);
return;
}
これはねーよ・・・

12 名前:924 mailto:sage [2008/07/09(水) 13:47:13 ]
>>11
機能を分割してて、他から呼ばれる予定で作ったのでまだ未使用
ですしフェールセーフもいれてません。


13 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:47:33 ]
流し読みした感じ
一応手前の確保は sizeof(HOGEHOGE) * ret 増加分は見込んでるのか
しかし -2 ってマジックワードは何よ?

あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ?
そこらへんの落とし穴は大丈夫なのか?

14 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:49:42 ]
>>4
wfp = fpEntTy[i];
case -2 :
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy[i];
}
free(wfp);
wfp = wfp2;
if ( wfp != NULL ) wfp = (HOGEHOGE *)wfp->nextdata;

この流れがあやしい
wfpとwfp2は同じもの(fpEntTy[i])を指してるよな?
wfpはfreeしてしまったんだから、同じ場所を指してるwfp2も触ってはだめなんじゃないか?

15 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:49:50 ]
>あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ?
>そこらへんの落とし穴は大丈夫なのか?
今それが一番くさいです。
なのでリストから切り離したあとfreeする部分をコメントにしたらフリーズしませんので


16 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:50:03 ]
-2はヘッダのchar[2] 分でしょ。

17 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:54:26 ]
LineCount()とChkIndexの仕様は

18 名前:デフォルトの名無しさん [2008/07/09(水) 13:59:14 ]
if ((fp = fopen(fname, "r")) == NULL) {
printf("%s が見つかりません\n",fname);
}

読み込むファイル名の入力処理なんですが、VSだと古い形式と警告されます。
より安全にするにはどう書いたらいいんですか?

19 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:00:03 ]
LineCount() は リストに登録する対象となるデータの数字を返すだけです。

ChkIndex() はリストの元となるデータnコのうち現在どこまで処理したかを返すだけです。
呼ばれると数字を返したあと内部で持ってるカウンターをインクリメントします。

20 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:02:29 ]
あっちこっちに不要なキャストがあるな
んでとりあえず

if (wfp->prevdata == NULL) {
 wfp2 = fpEntTy[i];
} else {
 wfp2 = wfp->prevdata;
}
HogeDel(i,wfp);
wfp = wfp2;
break;

これは

HogeDel(i,wfp);
wfp = fpEntTy[i];
break;

の間違いじゃないのか?
その下も同様に

HogeDel(i,wfp);
//free(wfp);
wfp = fpEntTy[i];
break;




21 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:04:52 ]
実は、を連発するあたりでだいぶなえてしもうた
有志ガンガレ

22 名前:924 mailto:sage [2008/07/09(水) 14:05:09 ]
>>20
やってることはリストをたどりながら処理をし(ChkSwitch)不要になった
ら戻り値によって途中で削除ということなので

wfpがリストの中ほどなのかリストの一番先頭なのか
を判断してます。

23 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:05:37 ]
>>19
int index = ChkIndex();    -(1)
if (index < fpHOGE->HOGE_COUNT) {
...
wfp = (HOGEHOGE *)(fpHOGEDATA + ChkIndex()); -(2)

(1) の戻りが HOGE_COUNT-1 の場合
fpHOGEDATA は 0〜HOGE_COUNT-1 の HOGE_COUNT個確保しているにもかかわらず

(2) で HOGE_COUNT を返すことになり 確保外のアドレスを指示することになっている

24 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:08:34 ]
>>18
if(fopen_s(&fp, fname, "r")){
printf("%s が見つかりません\n",fname);
}

25 名前:デフォルトの名無しさん [2008/07/09(水) 14:09:52 ]
>>24
どうも!
この辺の解説サイトありますか?

26 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:12:03 ]
>>25
msdn.microsoft.com/ja-jp/library/z5hh6ee9

27 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:12:14 ]
>>22
じゃあこうだろう

wfp2 = wfp->nextdata;
HogeDel(i,wfp);
if(ChkSwitch[wfp->Hoge06](i,wfp) == -2) {
 free(wfp);
 break;
}
wfp = wfp2;

28 名前:27 mailto:sage [2008/07/09(水) 14:15:38 ]
あ、break消し忘れた

まあとにかく、元のソースだとwfp2に入れてる値がおかしい
wfp2 = fpEntTy[i]; としても、その後HogeDel()で fpEntTy[i] が変化してもwfp2は変わんないだろ

29 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:17:07 ]
>>27
それだと常に削除の対象です・・・

ChkSwitchの戻り値が-1と-2は削除それ以外の場合、リストはそのままなんです。

30 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:18:28 ]
つーか、下手に技巧かまして初期に配列確保して動かないコード書くぐらいなら
単品 malloc() を n回呼び出し+途中の追加も単品 malloc() のほうがマシじゃね?



31 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:21:29 ]
>>29

switch(ChkSwitch[wfp->Hoge06](i,wfp)) {
 case -1:
  wfp2 = wfp->nextdata;
  HogeDel(i,wfp);
  wfp = wfp2;
  break;
 case -2:
  wfp2 = wfp->nextdata;
  HogeDel(i,wfp);
  free(wfp);
  wfp = wfp2;
  break;
 default:
  break;
}


32 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:23:59 ]
宿題スレだな

33 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:25:34 ]
ついでにこっちも直しとく

//
// 領域確保部分抜粋
//
int size = sizeof(HOGE_HED) + sizeof(HOGEHOGE) * ret;
fpHOGE = malloc(size);
if (fpHOGE == NULL ) return -18;
memset(fpHOGE,0x00,size);

fpHOGE->HOGE_COUNT = ret;

fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1);


34 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:29:23 ]
>>33
>fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1);
あーなるほど。こうすればいいんですね。
これでchar data[2];が不要になりますね。

35 名前:924 mailto:sage [2008/07/09(水) 14:35:13 ]
>>30
まー近い挙動のものにシューティングゲームなんかがありますけど
ゲームを構成する素材(背景や敵本体)は固定になりますが、自機や敵が吐き出す弾
は事前に・・というわけにはいきませんよね?
それでこういった2種類の領域の確保の仕方になってます。

>>31
ありがとうございます。
これでうまくいきました。

最近大改造してようやく今のスタイルにこぎつけたので混乱してました。


36 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:53:37 ]
>>35
は? 全て固定にしろと言っているのではなく、
全て動的にしといて たまたま固定分は先にやっちゃったね って構造のことを指しているのだが?

全て敵が吐き出す弾扱い。 背景や敵本体は初期化の時に1個1個追加してくだけじゃん

37 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:00:19 ]
まーいいじゃないですか

あの変なポインタ操作みてるとヘッダ+データになったバイナリファイルをまとめて
読み込んだりしてるんでしょ?

>>31で動いたってことは領域の確保の問題じゃなく単にリスト操作の間違いだったんだし。

38 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:04:54 ]
>>37
リストをバイナリファイル保存するのは… テラオソロシス
ちゃんと繋ぎ替え作業しないといけないしね。
そこだけ違うコード書くってことは、そこで間違う可能性もあるわけだし…

>>31 の修正で動く
>>31 のせずに、構造体のメンバ入れ替えで挙動変化する
のは、どういう副作用かなぁ free後次の alloc する何か次第なんだろうけど…

39 名前:デフォルトの名無しさん [2008/07/09(水) 15:21:54 ]
学校の課題なんですが、どうやればいいかいまいちわかりません。
なので、全体の流れだけでもいいので教えてくれませんか?

以下、課題の内容です。

200x200ピクセルの画像の中に三角形、四角形、円、楕
円を用いて絵を作成しよう。その際、関数を用いて作成し
ましょう。
􀂄 図形の作成、移動、回転などには関数を用いること。
􀂄 効率よく関数を使って、絵を作成しましょう。
􀂄 main関数は画像配列の確保と関数の呼び出しで作成する。
􀂄 出力ファイル名(art.bmp)


40 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:23:17 ]
要するにfreeした後の領域を使おうとしてたわけで、
おそらくアロケート情報が入っていた領域先頭付近のメモリの書き換えが発生したんだろう
だからポインタを先頭に置いてたらおかしくなった
後ろに配置してたときはたまたま情報が壊れずに残ってたと



41 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:26:40 ]
>>38
別人28号、余談だが俺いま、双方向ツリーデータのべた書き保存してるよ。
元々はテキストで保存読込みしていたが、あまりにも遅いので、いろいろ考えた据え
メモリーイメージべた書きにした。もちろんアドレス変換つきで。
数十Mぐらいのデータ読込みに分かかってたのが一瞬で読み込めるようになった。
いや〜あまりの速さに、TPOを考慮しないプログラムもいいなと思った。(チラシの裏

42 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:29:42 ]
そういうことやね

43 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:30:30 ]
>39
1)各画像をビットマップ描画する関数を作る。
  このとき、関数の引数で図形の基準座標や大きさ、角度などを指定できるようにする。
  指定の方法はいろいろあるが、かなり引数が多くなることもある。
  その場合には必要な変数を構造体に詰めこんでそのポインタを渡すと楽。
  対象のビットマップは、引数で渡してもいいし、どうせ1個しか書かないなら、
  グローバル変数で確保してもいいだろう。

2)mainで、1)で作った関数に適当に数値を与えて呼び出し、ビットマップに描画する。

3)作ったビットマップをファイルに書き出す(何かメソッドがあるはず)。



44 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:30:53 ]
>>40

45 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:31:00 ]
>>40
なるほど。
ある意味先頭に持ってきたためにバグが発覚してよかったのかもなw

>>41
まあリストを保存するっていったって、保存ルールさえ決めちゃえば
問題ないしな。


46 名前:デフォルトの名無しさん [2008/07/09(水) 15:32:28 ]
char func(char *hoge){

char hoge2[256];

 処理


return *hoge2;
}
とする関数を定義しました。
main関数で
char test[256];

*test= func("文字列");
って書いたんですが、testにゴミしか入りません・・・
正しいやり方を教えてください


47 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:36:00 ]
char *func(char *test, char *hoge){

char hoge2[256];

 処理

return strcpy(test, hoge2);
}


main()
{
char test[256];

func(test, "文字列");

48 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:37:28 ]
int func(const char *hoge1,char *hoge2){




}

char test[256];

func("文字列",test);

でfuncの中でtestに書き込みできるよ

49 名前:39 mailto:sage [2008/07/09(水) 15:37:49 ]
>>43
ありがとうございます!
関数を作るってところが授業でもよくわかっていないのですが、どんな感じかソースを少し書いてみてくれませんか?
質問ばかりですいません。

50 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:40:37 ]
宿題スレに行けよ



51 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:02:20 ]
引っ越したときは引越し通知くらいほしいよね

53 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:08:05 ]
マルチかと思ったら別人だったようだ

54 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:09:20 ]
< 39 >
========================================
引っ越しました!
近くにお越しの際は、是非お立ち寄り下さい
========================================
C/C++の宿題を片付けます 112代目
pc11.2ch.net/test/read.cgi/tech/1215439445/260


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

56 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:11:46 ]
それができりゃあプログラマの仕事がなくなるな

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

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

59 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:20:52 ]
微妙に違う内容でマルチすんなw

60 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:21:36 ]
>>57
rand関数で適当にASCIIコードを進める



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

62 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:27:25 ]
qあwせdrftgyふじこ

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

64 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:36:52 ]
>>63
cならそれこそマクロで皮だけ作ったら?

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

65 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:37:41 ]
あーーーーーーすまんぼけてましたorz

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

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

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


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

69 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:34:03 ]
>>68
文字コードが順番じゃなくても使える
ASCII限定でも問題ないんだろうけど



71 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:38:43 ]
EBCDIC でやったときは"ABCDE・・・だったなー

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

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

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

よろしくお願いします。


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

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

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

75 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:16:41 ]
>>74
ポインターはわかります?

76 名前:74 mailto:sage [2008/07/09(水) 22:21:33 ]
>>75
大まかには理解している、と思うんですが・・・。

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

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

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



78 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:30:49 ]
宝箱の中に
「宝」と「次の宝箱の場所」が入ってるようなもんだ

79 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:31:44 ]
www9.plala.or.jp/sgwr-t/c/sec15-5.html
ここなんてどうかな?

80 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:44:29 ]
>>77
どう繋ぐかが分からず・・・。

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

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



81 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:11:21 ]
>>84
です。

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

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

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


86 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:29:30 ]
初心者です。

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

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

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

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

88 名前:74 mailto:sage [2008/07/09(水) 23:44:41 ]
>>86
むむむ、分からないorz

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

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

90 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:47:28 ]
listptr->name

とか

listptr->name[0]

とか



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

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

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

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

96 名前:74 mailto:sage [2008/07/10(木) 00:18:47 ]
了解です。
構造体あたりから復習してみます。
ありがとうございました!

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

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

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

98 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:41:06 ]
>>97
メモリ効率 or 時間効率?


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

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



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


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

104 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 01:46:44 ]
あげんなカス

105 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 01:51:45 ]
あがっちゃうんだよ

106 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 05:54:59 ]
最近のexe compなに使ってる?

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

108 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 10:47:45 ]
vc++でいいんじゃないの?

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

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

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

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




111 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 13:31:27 ]
せっかくだから俺はこのWindowsSDKを使うぜ!

112 名前:デフォルトの名無しさん [2008/07/10(木) 13:49:50 ]
入力は正の整数n.
• 出力はn = a^2 となるような正の整数a が
– 存在するときは上の式をみたすa の値.
– 存在しないときは“ No ”.
このプログラムの作り方を教えてください。お願いします。

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

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

115 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん 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