08/07/09 11:01:36
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)
3:処理系定義の名無しさん
08/07/09 11:02:07
Part 16 スレリンク(tech板)
Part 17 スレリンク(tech板)
Part 18 スレリンク(tech板)
Part 19 スレリンク(tech板)
Part 20 スレリンク(tech板)
Part 21 スレリンク(tech板)
Part 22 スレリンク(tech板)
Part 23 スレリンク(tech板)
Part 24 スレリンク(tech板)
Part 25 スレリンク(tech板)
Part 26 スレリンク(tech板)
Part 27 スレリンク(tech板)
Part 28 スレリンク(tech板)
Part 29 スレリンク(tech板)
Part 30 スレリンク(tech板)
Part 31 スレリンク(tech板)
4:全スレ 924
08/07/09 13:27:58
URLリンク(kansai2channeler.hp.infoseek.co.jp)
ソースをアップしました。
5:デフォルトの名無しさん
08/07/09 13:28:53
thread_new=otu>>1;
6:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 13:35:58
ワロタ
8:デフォルトの名無しさん
08/07/09 13:37:33
アハハハハハ …ハァ
9:デフォルトの名無しさん
08/07/09 13:39:45
長さが決まってない構造体を扱う場合はこうするとネットで見たのでそれをまねしたんですけど・・・
10:デフォルトの名無しさん
08/07/09 13:41:47
>9
たぶん、それは可変長の文字列を扱うための、
あまり行儀がよくないがよく使われている方法だろう
まあここだけじゃなさそうだから少し待て
11:デフォルトの名無しさん
08/07/09 13:43:02
void HogeFree(HOGEHOGE* wfp)
{
free(wfp);
return;
}
これはねーよ・・・
12:924
08/07/09 13:47:13
>>11
機能を分割してて、他から呼ばれる予定で作ったのでまだ未使用
ですしフェールセーフもいれてません。
13:デフォルトの名無しさん
08/07/09 13:47:33
流し読みした感じ
一応手前の確保は sizeof(HOGEHOGE) * ret 増加分は見込んでるのか
しかし -2 ってマジックワードは何よ?
あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ?
そこらへんの落とし穴は大丈夫なのか?
14:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 13:49:50
>あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ?
>そこらへんの落とし穴は大丈夫なのか?
今それが一番くさいです。
なのでリストから切り離したあとfreeする部分をコメントにしたらフリーズしませんので
16:デフォルトの名無しさん
08/07/09 13:50:03
-2はヘッダのchar[2] 分でしょ。
17:デフォルトの名無しさん
08/07/09 13:54:26
LineCount()とChkIndexの仕様は
18:デフォルトの名無しさん
08/07/09 13:59:14
if ((fp = fopen(fname, "r")) == NULL) {
printf("%s が見つかりません\n",fname);
}
読み込むファイル名の入力処理なんですが、VSだと古い形式と警告されます。
より安全にするにはどう書いたらいいんですか?
19:デフォルトの名無しさん
08/07/09 14:00:03
LineCount() は リストに登録する対象となるデータの数字を返すだけです。
ChkIndex() はリストの元となるデータnコのうち現在どこまで処理したかを返すだけです。
呼ばれると数字を返したあと内部で持ってるカウンターをインクリメントします。
20:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 14:04:52
実は、を連発するあたりでだいぶなえてしもうた
有志ガンガレ
22:924
08/07/09 14:05:09
>>20
やってることはリストをたどりながら処理をし(ChkSwitch)不要になった
ら戻り値によって途中で削除ということなので
wfpがリストの中ほどなのかリストの一番先頭なのか
を判断してます。
23:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 14:08:34
>>18
if(fopen_s(&fp, fname, "r")){
printf("%s が見つかりません\n",fname);
}
25:デフォルトの名無しさん
08/07/09 14:09:52
>>24
どうも!
この辺の解説サイトありますか?
26:デフォルトの名無しさん
08/07/09 14:12:03
>>25
URLリンク(msdn.microsoft.com)
27:デフォルトの名無しさん
08/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
08/07/09 14:15:38
あ、break消し忘れた
まあとにかく、元のソースだとwfp2に入れてる値がおかしい
wfp2 = fpEntTy[i]; としても、その後HogeDel()で fpEntTy[i] が変化してもwfp2は変わんないだろ
29:デフォルトの名無しさん
08/07/09 14:17:07
>>27
それだと常に削除の対象です・・・
ChkSwitchの戻り値が-1と-2は削除それ以外の場合、リストはそのままなんです。
30:デフォルトの名無しさん
08/07/09 14:18:28
つーか、下手に技巧かまして初期に配列確保して動かないコード書くぐらいなら
単品 malloc() を n回呼び出し+途中の追加も単品 malloc() のほうがマシじゃね?
31:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 14:23:59
宿題スレだな
33:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 14:29:23
>>33
>fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1);
あーなるほど。こうすればいいんですね。
これでchar data[2];が不要になりますね。
35:924
08/07/09 14:35:13
>>30
まー近い挙動のものにシューティングゲームなんかがありますけど
ゲームを構成する素材(背景や敵本体)は固定になりますが、自機や敵が吐き出す弾
は事前に・・というわけにはいきませんよね?
それでこういった2種類の領域の確保の仕方になってます。
>>31
ありがとうございます。
これでうまくいきました。
最近大改造してようやく今のスタイルにこぎつけたので混乱してました。
36:デフォルトの名無しさん
08/07/09 14:53:37
>>35
は? 全て固定にしろと言っているのではなく、
全て動的にしといて たまたま固定分は先にやっちゃったね って構造のことを指しているのだが?
全て敵が吐き出す弾扱い。 背景や敵本体は初期化の時に1個1個追加してくだけじゃん
37:デフォルトの名無しさん
08/07/09 15:00:19
まーいいじゃないですか
あの変なポインタ操作みてるとヘッダ+データになったバイナリファイルをまとめて
読み込んだりしてるんでしょ?
>>31で動いたってことは領域の確保の問題じゃなく単にリスト操作の間違いだったんだし。
38:デフォルトの名無しさん
08/07/09 15:04:54
>>37
リストをバイナリファイル保存するのは… テラオソロシス
ちゃんと繋ぎ替え作業しないといけないしね。
そこだけ違うコード書くってことは、そこで間違う可能性もあるわけだし…
>>31 の修正で動く
>>31 のせずに、構造体のメンバ入れ替えで挙動変化する
のは、どういう副作用かなぁ free後次の alloc する何か次第なんだろうけど…
39:デフォルトの名無しさん
08/07/09 15:21:54
学校の課題なんですが、どうやればいいかいまいちわかりません。
なので、全体の流れだけでもいいので教えてくれませんか?
以下、課題の内容です。
200x200ピクセルの画像の中に三角形、四角形、円、楕
円を用いて絵を作成しよう。その際、関数を用いて作成し
ましょう。
図形の作成、移動、回転などには関数を用いること。
効率よく関数を使って、絵を作成しましょう。
main関数は画像配列の確保と関数の呼び出しで作成する。
出力ファイル名(art.bmp)
40:デフォルトの名無しさん
08/07/09 15:23:17
要するにfreeした後の領域を使おうとしてたわけで、
おそらくアロケート情報が入っていた領域先頭付近のメモリの書き換えが発生したんだろう
だからポインタを先頭に置いてたらおかしくなった
後ろに配置してたときはたまたま情報が壊れずに残ってたと
41:デフォルトの名無しさん
08/07/09 15:26:40
>>38
別人28号、余談だが俺いま、双方向ツリーデータのべた書き保存してるよ。
元々はテキストで保存読込みしていたが、あまりにも遅いので、いろいろ考えた据え
メモリーイメージべた書きにした。もちろんアドレス変換つきで。
数十Mぐらいのデータ読込みに分かかってたのが一瞬で読み込めるようになった。
いや~あまりの速さに、TPOを考慮しないプログラムもいいなと思った。(チラシの裏
42:デフォルトの名無しさん
08/07/09 15:29:42
そういうことやね
43:デフォルトの名無しさん
08/07/09 15:30:30
>39
1)各画像をビットマップ描画する関数を作る。
このとき、関数の引数で図形の基準座標や大きさ、角度などを指定できるようにする。
指定の方法はいろいろあるが、かなり引数が多くなることもある。
その場合には必要な変数を構造体に詰めこんでそのポインタを渡すと楽。
対象のビットマップは、引数で渡してもいいし、どうせ1個しか書かないなら、
グローバル変数で確保してもいいだろう。
2)mainで、1)で作った関数に適当に数値を与えて呼び出し、ビットマップに描画する。
3)作ったビットマップをファイルに書き出す(何かメソッドがあるはず)。
44:デフォルトの名無しさん
08/07/09 15:30:53
>>40ね
45:デフォルトの名無しさん
08/07/09 15:31:00
>>40
なるほど。
ある意味先頭に持ってきたためにバグが発覚してよかったのかもなw
>>41
まあリストを保存するっていったって、保存ルールさえ決めちゃえば
問題ないしな。
46:デフォルトの名無しさん
08/07/09 15:32:28
char func(char *hoge){
char hoge2[256];
処理
return *hoge2;
}
とする関数を定義しました。
main関数で
char test[256];
*test= func("文字列");
って書いたんですが、testにゴミしか入りません・・・
正しいやり方を教えてください
47:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 15:37:28
int func(const char *hoge1,char *hoge2){
}
char test[256];
func("文字列",test);
でfuncの中でtestに書き込みできるよ
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個の数値の最大値と最小値を表示するコードを
記述せよ」
②「キーボードから数値を入力し、その数が素数か否かを判断するコードを記述せよ」
よろしくお願いします。
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
最初は使わないようにして、後々使うパターンを覚えたほうが有益だと思うがいかが?