1 名前:ぬ ◆NUNUK382Dk mailto:sage [2007/12/27(木) 20:32:47 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.45【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1197090562/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
29 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:01:42 ] 直るも何も、int と bool を比較している時点で何かおかしい。
30 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:11:26 ] できたー! んですが、どこかで失敗しているらしく、終了しません。 1000 ガンダムみたいに、数字と文字のペアを管理するリストを作って、 引数に./a.out 1000 ガンダム 2000 ウルトラマン 3000 仮面ライダー を取るとして、引数が ./a.out 1000 ガンダム なら動くんですが、 ./a.out 1000 ガンダム 2000 ウルトラマン になると、処理が戻ってこなくなります。 うまく2個目のリストが出来ていないみたいなんですが、どこが間違っているでしょうか? typedef struct tagListNode{ struct tagListNode *prev; struct tagListNode *next; char *data; char *argv; }ListNode;
31 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:12:11 ] int i; ListNode *first, *last, *new; first = last = NULL; do{ i = 1; new = (ListNode*)malloc(sizeof(ListNode)); new->data = argv[i]; new->argv = argv[i+1]; new->next = NULL; i = i+2; if(NULL != last){ last->next = new; new->prev = last; last = new; } else{ first = last = new; new->prev = NULL; } }while (i < argc);
32 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:13:30 ] >>28 確かに、>>29 は正しいが、C,C++ではよくあること。 その if より前に n に false が代入された。 あるいは、その処理系では、false が、 2007 とされている。 あるいは、どこかその処理より前で、 #undef false #define false 2007 を書かれている。
33 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:19:09 ] C/C++ でも if(!n) とすればいい話だな。 もし n が真偽を表現しているのであれば。
34 名前:25 mailto:sage [2007/12/29(土) 17:31:15 ] すいません。 解決しました。 do{ i = 1; new = (ListNode*)malloc(sizeof(ListNode)); new->data = argv[i]; new->argv = argv[i+1]; new->next = NULL; i = i+2; を i=1; do{ new = (ListNode*)malloc(sizeof(ListNode)); new->data = argv[i]; new->argv = argv[i+1]; new->next = NULL; にしたら動きました。 感動!
35 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:35:01 ] new->argv じゃなくて new->prev じゃないの?
36 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:44:55 ] #include <stdio.h> void test(void){ puts("test"); } void hoge(int x){ if(x==0)return test();//←ここ else puts("hoge"); } int main(){ hoge(0); return 0; } 以上のコードがbccで通る(警告は出る)んですが、 これって規格上問題ないんですか?
37 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:47:45 ] 2行に分ければいいじゃん
38 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:51:25 ] 規格上は戻り値の型が void の場合は return 文は引数を取ってはならない。
39 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:52:43 ] hoge()がvoidなのにreturnして怒られない? つーかこの仕様だとreturn要らないような気がするのだが
40 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:56:42 ] test の型も void だから通すコンパイラもありはする。 でも、規格上は問題あり。
41 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:31:41 ] まあ、おとなしく { } つけろってこった。
42 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:40:15 ] 戻り値型voidの関数でvoidをreturnするのは合法だと思ったが
43 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:58:17 ] 普通は合法なら警告はでない。
44 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:59:00 ] んなこたーない。
45 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 20:46:11 ] >>40 C++でコンパイルすれば問題ない
46 名前:デフォルトの名無しさん [2007/12/29(土) 22:26:28 ] すいません、コールバック関数って何ですか? 例えば、 typedef int (CALLBACK *OPEN)(char *); typedef int (CALLBACK *CLOSE)(int); ここで記述されているCALLBACKというものがそうらしいのですが、 さっぱりわかりません。
47 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:02:04 ] >>46 環境が何だか分からんが、そのCALLBACKは何処かで#defineされてるもので コールバック関数とは直接的には関係ない。
48 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:16:49 ] >>46 CALLBACKはWindowsなら__stdcallの別名で通常は修飾なしの関数と同じ。 コープバック関数ってのはイベント通知や内部でユーザー定義の関数呼び出す場合に関数に渡すユーザー関数のポインタ。
49 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:19:00 ] どうみてもコールバック用の関数ポインタ CALLBACKならWindows環境だと__stdcall 実はWindowsのエントリポイントであるWinMainにつけるWINAPIも、__stdcallだったりする __stdcallは呼ばれた側がスタックの解放をするって動作を指定する だからコールバックできるんですね コールバックはどっかから呼び出してもらう関数のこと 折り返し電話してもらうことをコールバックっていうよね あれと同じで、自分から明示的に呼び出さない 自分、っていっているのは、右手が恋人のおまいじゃなくて、コールバック関数が定義された側の処理
50 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:26:11 ] >>49 コールバックできるかどうかに__stdcallは関係ないよ。
51 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:31:57 ] >>50 そりゃ「できるかどうか」に限定すれば関係ないけどね
52 名前:25 mailto:sage [2007/12/30(日) 08:28:19 ] すいません。 どうしても解けない問題なので、お教えください。 1000 ガンダム 2000 ウルトラマン 3000 ウルトラマン 4000 仮面ライダー のような数字と文字列をメンバに持つ構造体で、 もし、文字列が同じだった場合、リストを繋ぎ変えてこの場合 1000 ガンダム 3000 ウルトラマン 4000 仮面ライダー と言う風にしたいんです。 どこを直せば良いでしょうか? typedef struct tagListNode{ struct tagListNode *prev; struct tagListNode *next; char *data; char *argv; }ListNode; ListNode *first, *last, *point; /*first(1000 ガンダム)->(2000 ウルトラマン)-> (3000 ウルトラマン)-> last(4000 仮面ライダー)というリストが出来た。*/
53 名前:25 mailto:sage [2007/12/30(日) 08:29:07 ] point = first->next; for(this = first;this != NULL;){ if(NULL == first->next) break; if(NULL == point->next) break; if(0 == strcmp(this->argv,point->argv)){ if(NULL != point->prev) point->prev->next = point->next; else first = point->next; if(NULL != point->next) point->next->prev = point->prev; free(point); continue;/*文字列がかぶっているリストが除外されたので(1000 ガンダム)から調べ直し*/ }else point = point->next;/*文字列がかぶっていないので次のリストの文字列と比較*/ }
54 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:56:17 ] >どこを直せば良いでしょうか? データ構造の設計を0から。
55 名前:25 mailto:sage [2007/12/30(日) 09:07:15 ] え、リストじゃ駄目ってことですか? じゃあ、何が良いんですか? 配列?
56 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 09:13:17 ] 学校の課題とかならともかくリスト構造使う意味がわからない
57 名前:25 mailto:sage [2007/12/30(日) 09:23:39 ] えっと、引数の個数がいくつ有るか分からないからです。
58 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 09:27:23 ] 引数・・・まあいいか リスト構造わかってるのになんでわからないのかわからない、それ自体写しか? データ構造って指摘されてるのは"1000 ガンダム"とかいれちまってるせいじゃないの それにしたってまあ比較は出来るけど1000と"ガンダム"でわけようぜ というかなんでその問題が解けないか全く理解出来ない
59 名前:25 mailto:sage [2007/12/30(日) 09:39:58 ] 1000 とガンダムは分ける事は出来ないんです。 引数は1000 ガンダム 2000 ウルトラマンと分かれているんですが、 プログラムの中ではペアで管理しないとまずいんです。 リニアサーチを参考にしたんですが、どうしても、 リストの繋ぎ替えがうまく行かないんです。 malloc: *** Deallocation of a pointer not malloced: 0x300260; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug ってエラーが出るんです。 do{}while{}を使おうとしてたんですが、whileの条件がどうしても書けなくて...
60 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 09:43:29 ] ペア管理って、だから構造体にいれんじゃないの つなぎかえなら図でも書いてみろ、やることは単純だ whileの条件はわかりやすくしたきゃ末尾にnullでも明示的にいれとけ
61 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 09:44:38 ] 要素の除外を効率的に行うには確かにリストは最適ではあるわな。 リストの組み替えをしたいなら、 リストの組み替え前と組み替え後の状態を紙に書いて、 どう変化させればいいかを考えてみるといい。 あと、リストを実装する場合、 リストの端っこは、NULL にするより、 端っこを表すダミーのノードを作った方が実装しやすい。
62 名前:25 mailto:sage [2007/12/30(日) 09:50:28 ] わかりました。 もちょっと努力してきます。
63 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 10:09:21 ] ていうか、そのためのlastなんじゃないの?>61
64 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 10:27:58 ] コマンドラインからだろうとファイルからだろうと、通常事前に件数は把握できるだろうから その必要がない限りリスト構造を使う意味はないと思うが。
65 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 10:31:22 ] >>63 違う。 ダミーのノードは全ての有効なノードとは異なるノード。 有効なノードが0個の時でも存在してないといけないわけで。
66 名前:25 mailto:sage [2007/12/30(日) 16:14:57 ] うぇぇん。やればやるほど分け分かんなくなってきた。 まず、今のやり方で進んでいった場合、 1000 ガンダム 2000 ガンダム3000 ウルトラマンのように、 しょっぱなに消したい文字列がある場合はともかく、 1000 ガンダム 2000 仮面ライダー 3000 仮面ライダー のような場合、非常に大変なんじゃないかという気がしてきた。 typedef struct tagListNode{ struct tagListNode *next; char *data; char *argv; }ListNode; /*first(1000 ガンダム)->(2000 ガンダム)-> (3000 ウルトラマン)-> last(4000 仮面ライダー)というリストが出来た。*/ /*同じ文字を持つペアを(2000 ガンダム)を消したい*/ this = first;/*最初から調べる*/ do{ if(0 == strcmp(this->argv,this->next->argv)){/*今のノードと次のノードの文字列を比較*/ if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/ this->next = NULL; else this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/ free(this->next); /*(2000 ガンダム)を消す*/ this = first;/*(1000 ガンダム)と(3000 ウルトラマン)比較から始める*/ continue; } else this = this->next; /*文字列のかぶりは無かったので次と比較*/ }while(this == NULL);
67 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 16:21:52 ] はじめまして。 現在ステレオのwaveファイルの波形データを左右のチャンネル別々に配列に保存したいと思っているのですが、 C++どころかプログラミング自体今まであまり触れてこなかったので、ファイルの読み込み方が全く分かりません。 waveファイルのフォーマットは16bitでStereoなので、ファイルは「aa aa bb bb cc cc dd dd」のように表現されています。 まずは左のチャンネルのデータから記述が始まって、左右左右…の順にデータが格納されてます。 上の例だとaa aaが最初の左の音データ、bb bbが最初の右のデータでcc ccが2番目の左、dd ddが2番目の右です。 しかもリトルエンディアン? とかいう形式らしく、10進で10000という数字の場合なら16進で2710と表現してくれればいいのに 10 27という風に上位と下位が入れ替わって記述されているんです。 だからそれもC++で数値として扱えるように上位下位を入れ替えながら読み込む必要があります。 しかもwaveファイルの波形データを読み込もうと思った場合、ヘッダの事もあるので 純粋に波形データだけ欲しい場合ヘッダはすっ飛ばして読みこまなきゃいけないんです。 要はバイナリファイルをデータのアドレス指定をして自分の好きな場所から好きな場所まで読み込む操作をしたいのですが…。 ヘッダのバイト数とかwaveの形式とかはなんとか理解は出来たので、読み込み方がわかれば多分大丈夫だと思います。 ファイル全体を一気に読み込むのは流石に調べて分かったんですが、場所指定しての読み込みがどうしても分からなかったので 質問させていただきました。どうかよろしくお願いします。
68 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 16:31:11 ] fseekで読みたい場所にシークするだけじゃん。 あとx86系CPUならエンディアン変換はしなくていい。
69 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 16:32:01 ] CPUもリトルエンディアンなら、単純に2バイトずつ読めばいい。 任意の位置からの読み込みは、C++のstream類ならseekg、 CのFILE*ならfseekといった具合に、位置を指定する方法があるのでそれを使う。
70 名前:67 mailto:sage [2007/12/30(日) 16:42:45 ] ありがとうございます。エンディアンは気にしなくて良いのですね。 あと、ファイルをシークするということは、一度ファイル全体を読み込み、 そこからシークしてデータを取り出すということですよね? waveファイルって1つが結構大きいので、既に再生用にwaveをメモリに読み込んでいることもあり、 データをチャンネルごとに分けて読み込むうえに更に読み込み用にファイルを読み込むとなると あとで全体のデータは破棄するにしても結構メモリ食うな〜と思うのですが、 やはりそうしないと読み込むのは無理ですかね?
71 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 16:45:14 ] >66 }while(this == NULL); これでいいのか? strcmpの後のifだけど、これはたぶん、>65氏の言う「ダミーノード」の方法で消すことが可能。 「次」がある限り、「次の次」は、(ダミーかもしれないが)必ず存在する。 「次」がダミーなら、strcmpのifが真になることはないはず。 ところで、この書き方だったら比較は必ず次の要素と行われてるから、 ウルトラマンウルトラマン仮面ライダーだったらいいけど、 ウルトラマン仮面ライダーウルトラマンだったときに後ろのウルトラマンが 消えてくれない気がするんだけど、なんでこんなアルゴリズムにしようと思ったの? 普通に書いたら ・まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。 ・次に、上の操作で出来たリストの二番目と、それ以降すべての要素と比較、かぶってたら以下略 ・それをリストの最後から二番目まで繰り返す にならない? それともよく知らないけど>66の方が効率いいの? あと、よけいなお節介だけど、変数名にthisとかnewとか使う癖があるなら、直した方が良い。
72 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 16:53:21 ] >>70 シークはこれから読み書きする位置を指定する行為。 この段階ではまだ読み込みは行っていないぞ。
73 名前:67 mailto:sage [2007/12/30(日) 17:00:59 ] >>72 そうなんですか! よく調べもせずに申し訳ありませんでした。 折角のC++なので? seekgを使ってみたいと思います。 お答えして頂いてどうもありがとうございました!
74 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:13:14 ] >>66 >if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/ > this->next = NULL; >else > this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/ >free(this->next); /*(2000 ガンダム)を消す*/ 何をfreeしているか考えよ
75 名前:25 mailto:sage [2007/12/30(日) 17:23:42 ] >>71 ,74 すいません。 有り難うございます。 ちょっと色気出してみようと思って、練習もかねてList使ってみたのが間違いだったのか? 今までList自体触った事無いから、難しい。 まぁ、趣味でプログラムやっているから気長にやります。 free(this->next); /*(2000 ガンダム)を消す*/ this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/ が正しいですね。
76 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:25:26 ] 今日からC言語の勉強を始めた超初心者なんですが、質問させてください。 MS-DOSでディレクトリの移動をやってたんですが、 cd \での移動と、(指定されたパスが見つかりませんと出る) dir \での移動が出来ません(ファイルが見つかりませんと出る) まさか入門書の本編にすら行かないうちに詰まるとは思いませんでした。 どなたか助けてください…。 、
77 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:28:14 ] それC言語関係ない。 dirは移動するコマンドじゃない。
78 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:29:54 ] >free(this->next); /*(2000 ガンダム)を消す*/ >this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/ freeした物のnextわ参照してどうする tmp = this->next; this->next = tmp->next; free(tmp);
79 名前:25 mailto:sage [2007/12/30(日) 17:36:45 ] >>78 そーですね。 なんか皆さんがアドバイスしてくれるから、 みwなwぎwっwてwきwたwww なんかいい感じになってきたかも!
80 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:49:32 ] >>76 help コマンド名
81 名前:25 mailto:sage [2007/12/30(日) 18:19:59 ] >>71 >まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。 うう、駄目だ書けない。 配列だったらforで簡単に比較できるけど、 listだと最初と次とのノードと比較は簡単にできるけれど、最初と次の次や最初の次の次の次の比較が全然思いつかない。 do{ this = first; /*最初のノード*/ if(0 == strcmp(this->argv,this->next->argv)){/*最初と次のargvの比較*/ if(NULL != this->next->next){/*次の次がNULLで無かったら*/ tmp = this->next; this->next = tmp->next;/*次の次のノードと繋ぐ*/ free(tmp); }else{ free(this->next);/*次の次のが無かったら今比較しているノードをfree*/ } continue;/*最初に戻る*/ } }while(/*何が真の間whileし続けるのか書けない....*/
82 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 18:31:41 ] >81 ListNode cmp,search; for(cmp = first;cmp != dummy;cmp = cmp->next){ for(search = first->next;search->next != dummy;search = search->next){ if(strcmp(cmp->argv,search->argv) == 0){ …… } } } これでだめ?
83 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 18:39:41 ] ていうか、さ リストに追加する段階で重複チェックすればいいじゃん わざわざリスト全部作ってから除去しなくても。
84 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 18:52:00 ] create table list ( id integer not null, name varchar(16) not null unique, primary key (id) ); insert into list (id, name) values (2000, "ガンダム");
85 名前:25 mailto:sage [2007/12/30(日) 19:37:40 ] >>82 とても良いと思います。自分は思いつきませんでした。 ListNode *cmp, *search; for(cmp = first;cmp != NULL;cmp = cmp->next){ for(search = first->next;search->next != NULL;search = search->next){ if(strcmp(cmp->argv,search->argv) == 0){ tmp = search; search->next = tmp->next->next; free(tmp); }else{ free(search); } continue; } } } どうしても分からないのは リストの繋ぎ替えをしたとき、 search->next = tmp->next->next; for(略;略;search = search->next){ の処理がかぶってしまうってことです。 正直continue;の使い方が分からないです。 もう駄目かもしれません。 なんか正直、何をやってもプログラムを書ける気がしなくなってきました.... こういう絶望感に包まれた場合、どうすればまたプログラムを書けるようになれますかね?
86 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 19:38:23 ] >>85 Basicに乗り換える
87 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 19:39:40 ] 気分転換にプログラミング以外の事をする。 コンピュータから離れても良いかもしれない。
88 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 19:40:32 ] >>85 だから、リスト構造はあんたには早過ぎると言ってるでしょう。
89 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 19:49:45 ] >}else{ >free(search); >} >continue; どうしてそうなるんだw なぜにsearchをfreeしてしまう。 if(strcmp()!=0)なら、何もしなくていいんだよ。 あとcontinueいらない。そのcontinue何の意味もない。 continueは、ループの括弧内の、「それ以降」をすっ飛ばす意味。 括弧その次で終わってるから、全く意味がない。 >search->next = tmp->next->next; >for(略;略;search = search->next){ >の処理がかぶってしまうってことです。 処理がかぶるならどっちか消せばいいじゃない。 それと、>82で間違えたけど、二つ目のforの初期条件は search = cmp->next だね。
90 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:19:47 ] 次の次とか処理順で頭悩ませるぐらいなら再帰にしたらどう?
91 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 00:28:51 ] リストを試行錯誤で実現するにはまだ早いという感じだなあ。 何か本でも読んだ方がいいんじゃね。
92 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:02:30 ] C++でグラフィックをいじるにはどうすればいいんでしょうか。
93 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:04:40 ] 唐突過ぎるとマルチうぜーとか書かれるぞ まずなにがしたいのかを書かないとエスパーしか答えられないぞ ゲームを作りたいならDirectXとか
94 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:05:29 ] 一人で作るレベルならC++よりCがいいと思うな、ゲームなら
95 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:10:51 ] ここであえてJavaAppletを勧めてみる!
96 名前:デフォルトの名無しさん [2007/12/31(月) 03:29:10 ] STDのlistやvectorの全要素を表示させる関数を書きたいのですが、 どうかけばよいのか分かりません。どうかお教えください。
97 名前:デフォルトの名無しさん [2007/12/31(月) 03:33:53 ] size()までループさせてひとつひとつ出力
98 名前:デフォルトの名無しさん [2007/12/31(月) 03:34:09 ] 96です。 自分はこんなものを書いてしまったのですが、コンパイルが通りません。 template<class T> void show(T& v) { T::iterator p; for (p = v.begin(); p != v.end(); p++) { cout << *p << " "; } cout << endl; }
99 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:49:14 ] >>93 DirectXとかでなく C++で同人ゲームとかを改造して暇つぶししたいんですけど。 誰かマジレスお願いします。
100 名前:デフォルトの名無しさん [2007/12/31(月) 03:52:32 ] >>97 こんな時間にありがとうございます! それは書けたのですが、もうちょっと一般的な書き方があればな、、と思って。 void show(deque<char>& x) { for (deque<char>::iterator p = x.begin(); p != x.end(); p++) { cout << *p << " "; } cout << endl; } こんなのよりも、dequeも<char>も勝手に入力から判断してくれる書き方はないですか?
101 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:58:53 ] >>99 今程度の知識で暇つぶしできるほどの改造は無理だ。 どのゲームなのか?そのゲームがC++で書かれているのかすらわからないじゃないか。 っつうかマルチでしょ? 宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。
102 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 03:59:33 ] >>98 typename T::iteratorじゃない? ってかエラーが出たらエラーメッセージを張るべし。
103 名前:デフォルトの名無しさん [2007/12/31(月) 04:10:07 ] >>102 ありがとうございます。 typenameをつけたら希望どおりの動作になりましたが、その後、 エラーメッセージを張ったら、実はそこに書いてありました。 $ g++ samp20.cpp samp20.cpp: In function 'void show(T&)': samp20.cpp:9: error: expected `;' before 'p' samp20.cpp:10: error: 'p' was not declared in this scope samp20.cpp: In function 'void show(T&) [with T = std::list<int, std::allocator<int> >]': samp20.cpp:23: instantiated from here samp20.cpp:9: error: dependent-name 'T::iterator' is parsed as a non-type, but instantiation yields a type samp20.cpp:9: note: say 'typename T::iterator' if a type is meant
104 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 04:16:18 ] 日本語が変だぞwとりあえず解決でOK? あと、細かいことだけどこういう処理ならconstつけといた方がいい。 template<class T> void show(const T& v) { for (typename T::const_iterator p p = v.begin(); p != v.end(); p++) { cout << *p << " "; } cout << endl; }
105 名前:デフォルトの名無しさん [2007/12/31(月) 04:26:50 ] >>104 解決です。 すいません、あと1つだけ。 constつけた方がいい理由は、show()関数が表示するだけで 内部要素を変更しないことをハッキリ示すためですか?
106 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 04:36:05 ] htmlファイルからリンクのURLだけを抜き出してその文字列を変数に入れたいん ですがどのようにすればいいでしょうか? getlineで一行つづ読み込んで"<a href="http:"を探せばいいかな。と思ってたんですが メモ帳でスレのhtmlファイル開いてみるとURLの途中で改行があったんで悩んでます
107 名前:デフォルトの名無しさん [2007/12/31(月) 04:37:38 ] いちどによみこんで整形する 改行や空白をなくす
108 名前:デフォルトの名無しさん [2007/12/31(月) 05:52:34 ] gccで変数名を表示できる拡張機能ってどう書くんだっけ?
109 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 08:21:41 ] >>105 const参照でコンテナを受け取った関数から使えなくなってもいいならつけなくていいよ。
110 名前:デフォルトの名無しさん [2007/12/31(月) 09:06:53 ] 後置演算子++のオーバーロードについて質問です。 Type operator ++(int)とありますが、 クラスTypeで宣言した演算対象が、float型とかの場合でも 仮引数は(int)なのでしょうか? (float)にはならないでしょうか? どの解説本みても(int)で、詳しい説明がなくてよくわかりません。
111 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:13:20 ] まあfloatをインクリメントって普通しないからね。 オーバーロードしたいならもちろんfloat型を引数に。
112 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:20:36 ] わざわざそんなんせず1足してやる方が無難な気がするけどねぇ
113 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:18:50 ] T& operator++(void)じゃなくて?
114 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:01:19 ] >>113 それは前置
115 名前:25 mailto:sage [2007/12/31(月) 11:07:00 ] (;つД`); うわーん ふて寝して、それでも気になって、紙にリスト書きながら、いろいろやってたら、 うまく行ったポイ! 変なのところが有ったら指摘してください。 それとdummyリストは便利! ListNode *cmp, *search, *tmp; for(cmp = first;dummy != cmp ;cmp = cmp->next){ for(search = cmp->next;dummy != search ;search = search->next){ if(dummy == search) break; if(0 == strcmp(cmp->argv,search->argv)){ tmp = search; tmp->next->prev = tmp->prev; tmp->prev->next = search->next; } } } 頑張ってよかった! 感動した! いい気持ちで正月を迎えられます。
116 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:25:11 ] それにしても混同しそうになる
117 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 15:45:29 ] サーバソケットでTCPの10〜100バイトの可変長データを受信する際、 そのデータのレングスが先頭2バイトにある識別子で判断できる場合って ・まず先頭2バイトをrecvする。 ・識別子を判断して残りのバイト数をrecvする というのが一般的なのでしょうか? recvの第3引数に1500バイトくらいの十分余裕な値を指定すると 勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか? 要は連続してデータが飛んでくる場合に 1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが 知りたいです。
118 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 15:54:11 ] >>117 こっちのがいいと思う ネットワークプログラミング相談室 Port20 pc11.2ch.net/test/read.cgi/tech/1186418855/
119 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 15:58:50 ] >>118 サンクスです。逝って来ます。
120 名前:デフォルトの名無しさん [2007/12/31(月) 16:49:41 ] char bun[] ="すごく長い文章が入っている"; FILE 構造体へのポインタしか受け取ってくれない関数に, この文字列があたかもファイルに入っているかのように 思わせて処理させることはできないものでしょうか? C++ ならいつも std::string と std::istringstream で ストリームとして抽象的に処理しているのですが, どうしても C のライブラリを使う必要があって, 勝手が違って悩んでいます.
121 名前:120 [2007/12/31(月) 16:57:40 ] 標準的な方法ではできないようですね. 使いたいライブラリのソースが手に入って, 手を突っ込んでいいとのことなので素直にそうします. いやぁ,ストリームなんて変な演算子オーバーロードで やだなぁ,とか思っていたのにいつの間にかストリーム べったりの人間になってました.慣れって怖い.
122 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:04:49 ] >>120 テンポラリファイル作るとか? ファイルマッピング使って、バッファーの不一致が起きないようにファイルをクローズしてフラッシュするまでタイミングを取るとか?
123 名前:デフォルトの名無しさん [2007/12/31(月) 17:22:09 ] 質問です、VC2005で、多重継承のクラスを作ってるのですが ランタイムエラーが出てしまいました。 (0xC0000005: 場所0x00000010を読み込み中にアクセス違反が発生しました) デバッガの自動変数の欄にはthisポインタのみ載っていて(値は0とかではなく、 ちゃんとしたアドレスっぽい)、thisポインタの「+」をクリックして展開すると 「CXX0030: エラーです: 式を評価できません」 となっています。 hoge0---hoge1---hoge2---hoge3---hoge4 ---hoge5 ---hoge6---hoge7 ---hoge8 ↑のような感じで継承して(全てvirtualをつけて継承してます)、 最後に2,4,5,7,8を多重継承してhogerableクラスを定義して、 そのインスタンスを生成して使っています。 2や4578で実装されている仮想関数(f())をhogerableクラスでも実装し、 そのときの条件によって return hoge5::f(); とかやろうとしたのですが、 hoge5::()f に飛んだときは正常に動くものが、hoge7::f() に飛ぶとランタイムエラーが 起こりました。 hoge7::f()の中は if (!hoge2::f()) return false; if (!p) // ここでエラー。pはhoge3にあるメンバ return false; となっています。 こういうときは何を疑えばいいのでしょうか? よろしくお願いします。
124 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:25:53 ] hoge3のインスタンスがたくさんできてる予感
125 名前:123 mailto:sage [2007/12/31(月) 17:51:13 ] すみません、言われてから一番下のクラスを見直したら速攻で解決しました、 最後の多重継承にvirtualをつけてませんでした(汗 けどどういう条件でvirtualをつけるべきなのかよくわからない・・・ ともあれありがとうございました。
126 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:28:52 ] そもそもそこまでの多重継承になるなら設計がおかしいのでは。
127 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:52:38 ] >>126 そだね。多重継承も使いすぎると良くないね。 俺も、多重継承やテンプレートを使いまくって複雑怪奇なオブジェクトを作っていた頃がありました。しかし、だんだんとこんな複雑な構造は不要だって解ってくるんだな。 C++をはじめて誰もが一度は通る道かな。
128 名前:デフォルトの名無しさん [2007/12/31(月) 19:47:15 ] >>101 もうちょっと具体的に書くと、 if(Char_Trans[0]!=0){ SetDrawBlendMode( DX_BLENDMODE_ALPHA , Char_Trans[0] ) ; if(LoadCharName_BC[0]!='\x00'){DrawGraph(Draw_X+160,Draw_Y,CHAR_BC_Handle,TRUE);}//キャラを立たせる。奥中央 } このランダム部分を変える方法はありますかね? 年末に何やってるんだ俺はorz
129 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:54:40 ] >>128 生きろ