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
2 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:36:19 ] >>1 乙
3 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:37:35 ] ソースコードを載せる人はちゃんとインデントをつけましょう。 半角スペース、タブ文字は2chでは使えません。 全角スペースを使ってもいいですが、 と入力すると半角スペースとして表示されます。 全角スペースではそのままコピペして使うことができないので、 ここにソースを貼るときはできる限りエディタでタブ文字等を に置換しましょう。
4 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:45:18 ] 本当か?
5 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:48:16 ] うん 本当
6 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:52:14 ] やべえ、うちの2chブラウザだと、 & nbsp;って文字まで半角スペースに変換しやがる 何この無駄な機能w ふざけんなww
7 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:53:43 ] >>3 の が見えないってことか? ハイ機能だな
8 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 01:23:02 ] ポップうpで見れば問題解決なのだが
9 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:18:52 ] /**/
10 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:48:46 ] test
11 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 07:48:44 ]
12 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 15:00:45 ] 失礼します。 当方VC++2005ExpressEditionを使用しています。 作成したプログラムをビルドをしたら 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__dispose_library が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__close_reader_writer が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__read_block_without_encryption が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__write_block_without_encryption が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__polling_and_get_card_information が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__open_reader_writer_auto が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__initialize_library が関数 _main で参照されました。 1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__get_last_error_types が関数 "void __cdecl error_routine(void)" (?error_routine@@YAXXZ) で参照されました。 1>C:\Documents and Settings\mouna\My Documents\Visual Studio 2005\Projects\testtest\Debug\testtest.exe : fatal error LNK1120: 外部参照 8 が未解決です。 1>ビルドログは "file://c:\Documents and Settings\mouna\My Documents\Visual Studio 2005\Projects\testtest\testtest\Debug\BuildLog.htm" に保存されました。 1>testtest - エラー 9、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== というメッセージが出てしまいました。 これらはどのように対処すればいいのでしょうか。
13 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 15:18:46 ] >>12 です。 Cとしてコンパイルをしないといけないのかと思い extern "C" { を加えてみたのですがやっぱりかわりませんでした。
14 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 15:23:32 ] 必要なライブラリをリンクしてないからでしょ
15 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 18:27:16 ] アーケードのをクリアしたなあ。 8面で穴に落とす係りの奴が出てきて一発殴ると終わるよね。 レバーを入れるのと同時にパンチを連打すると当たりやすいんで やたら忙しくココココココンってレバーをやりながらボタン連打してた。 ジャブが二発入ったらストレート、あとはその繰り返しで 適当に上下に振って動かしながらやれば何とかなるよね。
16 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 18:27:47 ] 誤爆
17 名前:デフォルトの名無しさん [2007/12/28(金) 20:03:19 ] >>14 おっしゃるとおりでした。 2日間もバカみたく考えてましたw 無事解決しました。 ありがとうございました!
18 名前:デフォルトの名無しさん [2007/12/29(土) 13:39:40 ] ファイル読み込みについて質問です、 ファイルの何バイト目から読み込むというのはできるっぽいんですが、 ファイルのX行目から読み込みたい場合、 getlineをX回実行という方法で行うんでしょうか?
19 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:43:19 ] >>18 それで不都合がなければそれでいいんじゃね?
20 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:43:24 ] Yes ランダムで何行目って読む場合は各行の場所を保存しておくと便利
21 名前:デフォルトの名無しさん [2007/12/29(土) 14:05:53 ] >>19-20 別に不都合はないんですが、直接飛べる方法があるなら そっちの方が早いかなと思いまして ありがとうございました
22 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 14:35:59 ] 専用フォーマットにしていいんなら struct file_header { unsigned int line_number; }; struct line_header { unsigned int offset_address; }; file_header header; line_header lines[header.line_number]; char line0[]; char line1[]; ...... にすればすぐ読み出せるぞ。
23 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 15:51:17 ] 質問です。 引数をリストにしたいのですが、 リストを作るところで、困っています。 int main(int argc, char *argv[]){ typedef struct tagListNode{ struct tagListNode *prev; struct tagListNode *next; char *argv; }Listnode; Listnode list[argc-1]; for(i=0;i<argc;i++){ <--ココ list[i].argv = argv[i+1]; list[i].prev = NULL; list[i].next = &list[i+1]; exit(0); } 何か良い方法はないでしょうか?
24 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 15:55:03 ] リストのことをちゃんと書いた本でも読め。 そうでもなければおとなしく std::list 使っとけ。
25 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:02:12 ] >>24 すいません。 c++では無いんです。 ああ、そうか! ちょっと良い案思い浮かんだんで、試してきます。
26 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:12:36 ] とりあえず、双方向リストはリングリストにすると実装しやすいよ。
27 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:13:35 ] 良く見たら確かに C99 だな。 まあ、exit(0); じゃなくて return 0; でいいと思うが。 どっちも同じと言えば同じだが。
28 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:57:16 ] int n = 2007; if ( n == false) { // nが偽だったら実行 exit(-1); } の内側が実行されてしまいます。 どうすれば治りますか?
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++で書かれているのかすらわからないじゃないか。 っつうかマルチでしょ? 宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。