【初心者歓迎】C/C++室 Ver.46【環境依存OK】
at TECH
1:ぬ ◆NUNUK382Dk
07/12/27 20:32:47
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.45【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
2:デフォルトの名無しさん
07/12/27 20:36:19
>>1
乙
3:デフォルトの名無しさん
07/12/27 20:37:35
ソースコードを載せる人はちゃんとインデントをつけましょう。
半角スペース、タブ文字は2chでは使えません。
全角スペースを使ってもいいですが、 と入力すると半角スペースとして表示されます。
全角スペースではそのままコピペして使うことができないので、
ここにソースを貼るときはできる限りエディタでタブ文字等を に置換しましょう。
4:デフォルトの名無しさん
07/12/27 20:45:18
本当か?
5:デフォルトの名無しさん
07/12/27 20:48:16
うん
本当
6:デフォルトの名無しさん
07/12/27 20:52:14
やべえ、うちの2chブラウザだと、
& nbsp;って文字まで半角スペースに変換しやがる
何この無駄な機能w ふざけんなww
7:デフォルトの名無しさん
07/12/27 20:53:43
>>3の が見えないってことか?
ハイ機能だな
8:デフォルトの名無しさん
07/12/28 01:23:02
ポップうpで見れば問題解決なのだが
9:デフォルトの名無しさん
07/12/28 02:18:52
/**/
10:デフォルトの名無しさん
07/12/28 03:48:46
test
11:デフォルトの名無しさん
07/12/28 07:48:44
12:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/28 15:18:46
>>12です。
Cとしてコンパイルをしないといけないのかと思い
extern "C" {
を加えてみたのですがやっぱりかわりませんでした。
14:デフォルトの名無しさん
07/12/28 15:23:32
必要なライブラリをリンクしてないからでしょ
15:デフォルトの名無しさん
07/12/28 18:27:16
アーケードのをクリアしたなあ。
8面で穴に落とす係りの奴が出てきて一発殴ると終わるよね。
レバーを入れるのと同時にパンチを連打すると当たりやすいんで
やたら忙しくココココココンってレバーをやりながらボタン連打してた。
ジャブが二発入ったらストレート、あとはその繰り返しで
適当に上下に振って動かしながらやれば何とかなるよね。
16:デフォルトの名無しさん
07/12/28 18:27:47
誤爆
17:デフォルトの名無しさん
07/12/28 20:03:19
>>14
おっしゃるとおりでした。
2日間もバカみたく考えてましたw
無事解決しました。
ありがとうございました!
18:デフォルトの名無しさん
07/12/29 13:39:40
ファイル読み込みについて質問です、
ファイルの何バイト目から読み込むというのはできるっぽいんですが、
ファイルのX行目から読み込みたい場合、
getlineをX回実行という方法で行うんでしょうか?
19:デフォルトの名無しさん
07/12/29 13:43:19
>>18
それで不都合がなければそれでいいんじゃね?
20:デフォルトの名無しさん
07/12/29 13:43:24
Yes
ランダムで何行目って読む場合は各行の場所を保存しておくと便利
21:デフォルトの名無しさん
07/12/29 14:05:53
>>19-20
別に不都合はないんですが、直接飛べる方法があるなら
そっちの方が早いかなと思いまして
ありがとうございました
22:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/29 15:55:03
リストのことをちゃんと書いた本でも読め。
そうでもなければおとなしく std::list 使っとけ。
25:デフォルトの名無しさん
07/12/29 16:02:12
>>24
すいません。
c++では無いんです。
ああ、そうか!
ちょっと良い案思い浮かんだんで、試してきます。
26:デフォルトの名無しさん
07/12/29 16:12:36
とりあえず、双方向リストはリングリストにすると実装しやすいよ。
27:デフォルトの名無しさん
07/12/29 16:13:35
良く見たら確かに C99 だな。
まあ、exit(0); じゃなくて return 0; でいいと思うが。
どっちも同じと言えば同じだが。
28:デフォルトの名無しさん
07/12/29 16:57:16
int n = 2007;
if ( n == false) {
// nが偽だったら実行
exit(-1);
}
の内側が実行されてしまいます。
どうすれば治りますか?
29:デフォルトの名無しさん
07/12/29 17:01:42
直るも何も、int と bool を比較している時点で何かおかしい。
30:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/29 17:13:30
>>28
確かに、>>29 は正しいが、C,C++ではよくあること。
その if より前に n に false が代入された。
あるいは、その処理系では、false が、 2007 とされている。
あるいは、どこかその処理より前で、
#undef false
#define false 2007
を書かれている。
33:デフォルトの名無しさん
07/12/29 17:19:09
C/C++ でも if(!n) とすればいい話だな。
もし n が真偽を表現しているのであれば。
34:25
07/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:デフォルトの名無しさん
07/12/29 17:35:01
new->argv じゃなくて new->prev じゃないの?
36:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/29 17:47:45
2行に分ければいいじゃん
38:デフォルトの名無しさん
07/12/29 17:51:25
規格上は戻り値の型が void の場合は
return 文は引数を取ってはならない。
39:デフォルトの名無しさん
07/12/29 17:52:43
hoge()がvoidなのにreturnして怒られない?
つーかこの仕様だとreturn要らないような気がするのだが
40:デフォルトの名無しさん
07/12/29 17:56:42
test の型も void だから通すコンパイラもありはする。
でも、規格上は問題あり。
41:デフォルトの名無しさん
07/12/29 18:31:41
まあ、おとなしく { } つけろってこった。
42:デフォルトの名無しさん
07/12/29 18:40:15
戻り値型voidの関数でvoidをreturnするのは合法だと思ったが
43:デフォルトの名無しさん
07/12/29 18:58:17
普通は合法なら警告はでない。
44:デフォルトの名無しさん
07/12/29 18:59:00
んなこたーない。
45:デフォルトの名無しさん
07/12/29 20:46:11
>>40
C++でコンパイルすれば問題ない
46:デフォルトの名無しさん
07/12/29 22:26:28
すいません、コールバック関数って何ですか?
例えば、
typedef int (CALLBACK *OPEN)(char *);
typedef int (CALLBACK *CLOSE)(int);
ここで記述されているCALLBACKというものがそうらしいのですが、
さっぱりわかりません。
47:デフォルトの名無しさん
07/12/30 00:02:04
>>46
環境が何だか分からんが、そのCALLBACKは何処かで#defineされてるもので
コールバック関数とは直接的には関係ない。
48:デフォルトの名無しさん
07/12/30 00:16:49
>>46
CALLBACKはWindowsなら__stdcallの別名で通常は修飾なしの関数と同じ。
コープバック関数ってのはイベント通知や内部でユーザー定義の関数呼び出す場合に関数に渡すユーザー関数のポインタ。
49:デフォルトの名無しさん
07/12/30 00:19:00
どうみてもコールバック用の関数ポインタ
CALLBACKならWindows環境だと__stdcall
実はWindowsのエントリポイントであるWinMainにつけるWINAPIも、__stdcallだったりする
__stdcallは呼ばれた側がスタックの解放をするって動作を指定する
だからコールバックできるんですね
コールバックはどっかから呼び出してもらう関数のこと
折り返し電話してもらうことをコールバックっていうよね
あれと同じで、自分から明示的に呼び出さない
自分、っていっているのは、右手が恋人のおまいじゃなくて、コールバック関数が定義された側の処理
50:デフォルトの名無しさん
07/12/30 00:26:11
>>49
コールバックできるかどうかに__stdcallは関係ないよ。
51:デフォルトの名無しさん
07/12/30 00:31:57
>>50
そりゃ「できるかどうか」に限定すれば関係ないけどね
52:25
07/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
07/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:デフォルトの名無しさん
07/12/30 08:56:17
>どこを直せば良いでしょうか?
データ構造の設計を0から。
55:25
07/12/30 09:07:15
え、リストじゃ駄目ってことですか?
じゃあ、何が良いんですか?
配列?
56:デフォルトの名無しさん
07/12/30 09:13:17
学校の課題とかならともかくリスト構造使う意味がわからない
57:25
07/12/30 09:23:39
えっと、引数の個数がいくつ有るか分からないからです。
58:デフォルトの名無しさん
07/12/30 09:27:23
引数・・・まあいいか
リスト構造わかってるのになんでわからないのかわからない、それ自体写しか?
データ構造って指摘されてるのは"1000 ガンダム"とかいれちまってるせいじゃないの
それにしたってまあ比較は出来るけど1000と"ガンダム"でわけようぜ
というかなんでその問題が解けないか全く理解出来ない
59:25
07/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:デフォルトの名無しさん
07/12/30 09:43:29
ペア管理って、だから構造体にいれんじゃないの
つなぎかえなら図でも書いてみろ、やることは単純だ
whileの条件はわかりやすくしたきゃ末尾にnullでも明示的にいれとけ
61:デフォルトの名無しさん
07/12/30 09:44:38
要素の除外を効率的に行うには確かにリストは最適ではあるわな。
リストの組み替えをしたいなら、
リストの組み替え前と組み替え後の状態を紙に書いて、
どう変化させればいいかを考えてみるといい。
あと、リストを実装する場合、
リストの端っこは、NULL にするより、
端っこを表すダミーのノードを作った方が実装しやすい。
62:25
07/12/30 09:50:28
わかりました。
もちょっと努力してきます。
63:デフォルトの名無しさん
07/12/30 10:09:21
ていうか、そのためのlastなんじゃないの?>61
64:デフォルトの名無しさん
07/12/30 10:27:58
コマンドラインからだろうとファイルからだろうと、通常事前に件数は把握できるだろうから
その必要がない限りリスト構造を使う意味はないと思うが。
65:デフォルトの名無しさん
07/12/30 10:31:22
>>63
違う。
ダミーのノードは全ての有効なノードとは異なるノード。
有効なノードが0個の時でも存在してないといけないわけで。
66:25
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/30 16:31:11
fseekで読みたい場所にシークするだけじゃん。
あとx86系CPUならエンディアン変換はしなくていい。
69:デフォルトの名無しさん
07/12/30 16:32:01
CPUもリトルエンディアンなら、単純に2バイトずつ読めばいい。
任意の位置からの読み込みは、C++のstream類ならseekg、
CのFILE*ならfseekといった具合に、位置を指定する方法があるのでそれを使う。
70:67
07/12/30 16:42:45
ありがとうございます。エンディアンは気にしなくて良いのですね。
あと、ファイルをシークするということは、一度ファイル全体を読み込み、
そこからシークしてデータを取り出すということですよね?
waveファイルって1つが結構大きいので、既に再生用にwaveをメモリに読み込んでいることもあり、
データをチャンネルごとに分けて読み込むうえに更に読み込み用にファイルを読み込むとなると
あとで全体のデータは破棄するにしても結構メモリ食うな〜と思うのですが、
やはりそうしないと読み込むのは無理ですかね?
71:デフォルトの名無しさん
07/12/30 16:45:14
>66
}while(this == NULL);
これでいいのか?
strcmpの後のifだけど、これはたぶん、>65氏の言う「ダミーノード」の方法で消すことが可能。
「次」がある限り、「次の次」は、(ダミーかもしれないが)必ず存在する。
「次」がダミーなら、strcmpのifが真になることはないはず。
ところで、この書き方だったら比較は必ず次の要素と行われてるから、
ウルトラマンウルトラマン仮面ライダーだったらいいけど、
ウルトラマン仮面ライダーウルトラマンだったときに後ろのウルトラマンが
消えてくれない気がするんだけど、なんでこんなアルゴリズムにしようと思ったの?
普通に書いたら
・まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
・次に、上の操作で出来たリストの二番目と、それ以降すべての要素と比較、かぶってたら以下略
・それをリストの最後から二番目まで繰り返す
にならない?
それともよく知らないけど>66の方が効率いいの?
あと、よけいなお節介だけど、変数名にthisとかnewとか使う癖があるなら、直した方が良い。
72:デフォルトの名無しさん
07/12/30 16:53:21
>>70
シークはこれから読み書きする位置を指定する行為。
この段階ではまだ読み込みは行っていないぞ。
73:67
07/12/30 17:00:59
>>72
そうなんですか! よく調べもせずに申し訳ありませんでした。
折角のC++なので? seekgを使ってみたいと思います。
お答えして頂いてどうもありがとうございました!
74:デフォルトの名無しさん
07/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
07/12/30 17:23:42
>>71,74
すいません。
有り難うございます。
ちょっと色気出してみようと思って、練習もかねてList使ってみたのが間違いだったのか?
今までList自体触った事無いから、難しい。
まぁ、趣味でプログラムやっているから気長にやります。
free(this->next); /*(2000 ガンダム)を消す*/
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
が正しいですね。
76:デフォルトの名無しさん
07/12/30 17:25:26
今日からC言語の勉強を始めた超初心者なんですが、質問させてください。
MS-DOSでディレクトリの移動をやってたんですが、
cd \での移動と、(指定されたパスが見つかりませんと出る)
dir \での移動が出来ません(ファイルが見つかりませんと出る)
まさか入門書の本編にすら行かないうちに詰まるとは思いませんでした。
どなたか助けてください…。
、
77:デフォルトの名無しさん
07/12/30 17:28:14
それC言語関係ない。
dirは移動するコマンドじゃない。
78:デフォルトの名無しさん
07/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
07/12/30 17:36:45
>>78
そーですね。
なんか皆さんがアドバイスしてくれるから、
みwなwぎwっwてwきwたwww
なんかいい感じになってきたかも!
80:デフォルトの名無しさん
07/12/30 17:49:32
>>76
help コマンド名
81:25
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/30 18:39:41
ていうか、さ
リストに追加する段階で重複チェックすればいいじゃん
わざわざリスト全部作ってから除去しなくても。
84:デフォルトの名無しさん
07/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
07/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:デフォルトの名無しさん
07/12/30 19:38:23
>>85
Basicに乗り換える
87:デフォルトの名無しさん
07/12/30 19:39:40
気分転換にプログラミング以外の事をする。
コンピュータから離れても良いかもしれない。
88:デフォルトの名無しさん
07/12/30 19:40:32
>>85
だから、リスト構造はあんたには早過ぎると言ってるでしょう。
89:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/30 21:19:47
次の次とか処理順で頭悩ませるぐらいなら再帰にしたらどう?
91:デフォルトの名無しさん
07/12/31 00:28:51
リストを試行錯誤で実現するにはまだ早いという感じだなあ。
何か本でも読んだ方がいいんじゃね。
92:デフォルトの名無しさん
07/12/31 03:02:30
C++でグラフィックをいじるにはどうすればいいんでしょうか。
93:デフォルトの名無しさん
07/12/31 03:04:40
唐突過ぎるとマルチうぜーとか書かれるぞ
まずなにがしたいのかを書かないとエスパーしか答えられないぞ
ゲームを作りたいならDirectXとか
94:デフォルトの名無しさん
07/12/31 03:05:29
一人で作るレベルならC++よりCがいいと思うな、ゲームなら
95:デフォルトの名無しさん
07/12/31 03:10:51
ここであえてJavaAppletを勧めてみる!
96:デフォルトの名無しさん
07/12/31 03:29:10
STDのlistやvectorの全要素を表示させる関数を書きたいのですが、
どうかけばよいのか分かりません。どうかお教えください。
97:デフォルトの名無しさん
07/12/31 03:33:53
size()までループさせてひとつひとつ出力
98:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/31 03:49:14
>>93
DirectXとかでなく
C++で同人ゲームとかを改造して暇つぶししたいんですけど。
誰かマジレスお願いします。
100:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/31 03:58:53
>>99
今程度の知識で暇つぶしできるほどの改造は無理だ。
どのゲームなのか?そのゲームがC++で書かれているのかすらわからないじゃないか。
っつうかマルチでしょ?
宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。
102:デフォルトの名無しさん
07/12/31 03:59:33
>>98
typename T::iteratorじゃない?
ってかエラーが出たらエラーメッセージを張るべし。
103:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/31 04:26:50
>>104
解決です。
すいません、あと1つだけ。
constつけた方がいい理由は、show()関数が表示するだけで
内部要素を変更しないことをハッキリ示すためですか?
106:デフォルトの名無しさん
07/12/31 04:36:05
htmlファイルからリンクのURLだけを抜き出してその文字列を変数に入れたいん
ですがどのようにすればいいでしょうか?
getlineで一行つづ読み込んで"<a href="http:"を探せばいいかな。と思ってたんですが
メモ帳でスレのhtmlファイル開いてみるとURLの途中で改行があったんで悩んでます
107:デフォルトの名無しさん
07/12/31 04:37:38
いちどによみこんで整形する 改行や空白をなくす
108:デフォルトの名無しさん
07/12/31 05:52:34
gccで変数名を表示できる拡張機能ってどう書くんだっけ?
109:デフォルトの名無しさん
07/12/31 08:21:41
>>105
const参照でコンテナを受け取った関数から使えなくなってもいいならつけなくていいよ。
110:デフォルトの名無しさん
07/12/31 09:06:53
後置演算子++のオーバーロードについて質問です。
Type operator ++(int)とありますが、
クラスTypeで宣言した演算対象が、float型とかの場合でも
仮引数は(int)なのでしょうか?
(float)にはならないでしょうか?
どの解説本みても(int)で、詳しい説明がなくてよくわかりません。
111:デフォルトの名無しさん
07/12/31 09:13:20
まあfloatをインクリメントって普通しないからね。
オーバーロードしたいならもちろんfloat型を引数に。
112:デフォルトの名無しさん
07/12/31 09:20:36
わざわざそんなんせず1足してやる方が無難な気がするけどねぇ
113:デフォルトの名無しさん
07/12/31 10:18:50
T& operator++(void)じゃなくて?
114:デフォルトの名無しさん
07/12/31 11:01:19
>>113
それは前置
115:25
07/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:デフォルトの名無しさん
07/12/31 11:25:11
それにしても混同しそうになる
117:デフォルトの名無しさん
07/12/31 15:45:29
サーバソケットでTCPの10〜100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って
・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする
というのが一般的なのでしょうか?
recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?
要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。
118:デフォルトの名無しさん
07/12/31 15:54:11
>>117
こっちのがいいと思う
ネットワークプログラミング相談室 Port20
スレリンク(tech板)
119:デフォルトの名無しさん
07/12/31 15:58:50
>>118
サンクスです。逝って来ます。
120:デフォルトの名無しさん
07/12/31 16:49:41
char bun[] ="すごく長い文章が入っている";
FILE 構造体へのポインタしか受け取ってくれない関数に,
この文字列があたかもファイルに入っているかのように
思わせて処理させることはできないものでしょうか?
C++ ならいつも std::string と std::istringstream で
ストリームとして抽象的に処理しているのですが,
どうしても C のライブラリを使う必要があって,
勝手が違って悩んでいます.
121:120
07/12/31 16:57:40
標準的な方法ではできないようですね.
使いたいライブラリのソースが手に入って,
手を突っ込んでいいとのことなので素直にそうします.
いやぁ,ストリームなんて変な演算子オーバーロードで
やだなぁ,とか思っていたのにいつの間にかストリーム
べったりの人間になってました.慣れって怖い.
122:デフォルトの名無しさん
07/12/31 17:04:49
>>120
テンポラリファイル作るとか?
ファイルマッピング使って、バッファーの不一致が起きないようにファイルをクローズしてフラッシュするまでタイミングを取るとか?
123:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/31 17:25:53
hoge3のインスタンスがたくさんできてる予感
125:123
07/12/31 17:51:13
すみません、言われてから一番下のクラスを見直したら速攻で解決しました、
最後の多重継承にvirtualをつけてませんでした(汗
けどどういう条件でvirtualをつけるべきなのかよくわからない・・・
ともあれありがとうございました。
126:デフォルトの名無しさん
07/12/31 18:28:52
そもそもそこまでの多重継承になるなら設計がおかしいのでは。
127:デフォルトの名無しさん
07/12/31 18:52:38
>>126そだね。多重継承も使いすぎると良くないね。
俺も、多重継承やテンプレートを使いまくって複雑怪奇なオブジェクトを作っていた頃がありました。しかし、だんだんとこんな複雑な構造は不要だって解ってくるんだな。
C++をはじめて誰もが一度は通る道かな。
128:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/31 19:54:40
>>128
生きろ
130:デフォルトの名無しさん
07/12/31 20:40:17
>>128
どの辺がランダムなのか教えてくれ。
131:デフォルトの名無しさん
07/12/31 20:44:54
>>128
エスパーするとDraw_XとDraw_Yを直接数字に置き換えるとか
132:デフォルトの名無しさん
07/12/31 20:46:00
#define Draw_X (rand()/800)
#define Draw_Y (rand()/600)
133:デフォルトの名無しさん
07/12/31 22:41:31
>>110
仮引数はどうあっても int 。
134:デフォルトの名無しさん
08/01/01 21:05:24
C++を勉強したいのですが
初心者向けで分かりやすい本があったら 教えて下さい。
Cはある程度は把握してます
何かお勧めの本はありますかね?
135:デフォルトの名無しさん
08/01/01 21:18:23
>>134
ロベールでいいんじゃね。
136:デフォルトの名無しさん
08/01/01 21:55:51
Accelerated C++とか。
137:デフォルトの名無しさん
08/01/01 23:08:21
やさしいC++
とかって 分かりやすいんですかね?
138:デフォルトの名無しさん
08/01/01 23:10:37
>>137
基礎過ぎて C と被る所が多過ぎる。
139:デフォルトの名無しさん
08/01/01 23:13:44
>>134
CとC++はかなり違う言語だから、なめてかからないほうがいいよ。
STLやらBoostやら、C++は変態すぎる。
140:デフォルトの名無しさん
08/01/01 23:16:00
かなり違う言語だけど、慣れれば簡単なもんだ。
いい本を選べよ。
141:デフォルトの名無しさん
08/01/01 23:40:20
分かりやすい本とかお勧めの本は
やっぱりそれぞれ違いますよね?
ロベールかぁ..
本屋でいろいろ立ち読みしてみて 読みやすい本を選ぶのがいいんですかね?
142:デフォルトの名無しさん
08/01/01 23:45:23
>>139
C++がCより使いやすい要素はあるんですかね。
143:デフォルトの名無しさん
08/01/01 23:48:51
「使いやすい」の定義によるんじゃない?
初心者に勉強させるって意味なら混乱する要素満載でとても使いやすいとは思えないけど
144:デフォルトの名無しさん
08/01/01 23:54:42
>>142
クラス。
iostreamなんかは窓から投げ捨てていい。
145:デフォルトの名無しさん
08/01/01 23:58:01
STL
146:デフォルトの名無しさん
08/01/02 00:00:19
>>142
C++は使いやすいというよりも、強力な言語だと思う。強力であるが故に使いこなすのが難しい面が多々ある。
例えば文字列クラスを作ると、最初から言語仕様に組み込まれていたかのように文字列を扱えるなんて、強力というか自由度高すぎ。
147:デフォルトの名無しさん
08/01/02 00:05:47
>>140
MPLとかも簡単と思う?
148:デフォルトの名無しさん
08/01/02 00:07:56
例外処理も地味に便利だよなあ
149:デフォルトの名無しさん
08/01/02 00:19:19
演算子オーバーロードとか例外とか最近の言語なら珍しくないって。
150:デフォルトの名無しさん
08/01/02 00:24:45
STL と参照があるだけで C より随分楽になるわ。
151:デフォルトの名無しさん
08/01/02 00:25:30
>>147
使わんし。
152:デフォルトの名無しさん
08/01/02 01:15:12
>>149
C++で成功したから、最近の言語で実装されるようになったんだろ。
153:デフォルトの名無しさん
08/01/02 01:30:02
例外はJavaが早くね?他にもあるかもしれんが・・・
154:デフォルトの名無しさん
08/01/02 03:30:17
>>151
MPLを使わないのにC++に慣れてるとか大きく出たね
それでC++が簡単と言うのは違うんじゃないかい?
あんたにとっては簡単かもしれんけど、一般論ではないわな
155:デフォルトの名無しさん
08/01/02 03:38:48
>>151
何私は最先端ですみたいになってんの?
あんなもんライブラリでも作る必要がなければ使わない。
使えない。可読性が低くなる。
156:デフォルトの名無しさん
08/01/02 03:50:28
ライブラリ作らないでプログラムしてるのはすごいな
MPLより"やばい"type_traitsがtr1に入ってるぞ
可読性が低い==俺は勉強してないので読めない
157:デフォルトの名無しさん
08/01/02 04:03:21
mplってboost?
158:デフォルトの名無しさん
08/01/02 09:45:53
水掛け論したいなら他でやれ。
159:デフォルトの名無しさん
08/01/02 11:51:00
スレリンク(tech板:659番)
このプログラムが先日まで実行できたのですが、
probably corrupted stack
segmentation fault
と出て実行不可になりました。こちらの環境が原因でしょうか?
160:デフォルトの名無しさん
08/01/02 12:19:23
プログラムがおかしい。
161:デフォルトの名無しさん
08/01/02 12:54:26
>>156
type_traitsのどこがやばいの?traitsの考え方は難しくないし
コンパイル時の型の判定は便利だからboost使っている。
今でもiterator_traitsやchar_traitsはある。
>可読性が低い==俺は勉強してないので読めない
就職したら正論が通用しない場合があることがわかるよ。
162:デフォルトの名無しさん
08/01/02 12:54:58
>>159
とりあえず、 ,とか?とか使うのやめて読みやすく書き直して味噌
163:デフォルトの名無しさん
08/01/02 12:57:50
>>159
負数または INT_MAX を超える値を入力してない?
164:159
08/01/02 13:05:17
実行時のコマンドが誤ってました。お騒がせしてサーセン
165:デフォルトの名無しさん
08/01/02 13:05:56
>>159
宿題丸投げした挙句デバッグも人任せ?お前の肩の上についている物体は飾りか
166:デフォルトの名無しさん
08/01/02 13:22:34
>>165
なんでそんなムキになるん?
167:デフォルトの名無しさん
08/01/02 13:23:46
ムキっていうかうざくなるのは当然
こんなんみりゃ誰だってうざくなるわ
168:デフォルトの名無しさん
08/01/02 13:24:12
>>165
肩の上って…
首を傾げてるってことかあぁぁ!!!!!!111
169:デフォルトの名無しさん
08/01/02 13:24:51
こういうのは真性だからねぇ、わざわざ言わずにスルーだな
170:デフォルトの名無しさん
08/01/02 13:24:52
まあ根っこからこういう奴っているんだよな、治らないよ、小さい時の教育の問題だろう
171:165
08/01/02 13:29:09
ゴメン言い過ぎた。
今度から気をつけるよ。
172:デフォルトの名無しさん
08/01/02 13:31:29
こういうのを見て毎回思うことは、
宿題スレと質問スレの住人、絶対かぶってるよな
173:デフォルトの名無しさん
08/01/02 13:45:12
うん
174:デフォルトの名無しさん
08/01/02 14:26:46
誰も>>159のプログラムが間違ってることは指摘してやらないんだなw
175:デフォルトの名無しさん
08/01/02 14:36:16
strcatのcatって何の略ですか?
176:デフォルトの名無しさん
08/01/02 14:38:05
>>175
Wikipedia項目リンク
177:デフォルトの名無しさん
08/01/02 14:41:47
GoogleでもYahooでもどこでもいいから、検索して最初の10ページくらいは見て欲しいな
そもそも検索したかどうか知らないけど
178:デフォルトの名無しさん
08/01/02 14:45:36
どうでもいいが、>>176のバッファオーバーラン対策コードはsを初期化しているかが曖昧だから不完全だ。strlen(s)がsizeof(s)を超える場合がある。
と思った。
179:デフォルトの名無しさん
08/01/02 17:07:02
初期化されてなかったら、それはバッファオーバーランとは別問題だろ
strcpyとかならまだしも、catは連結なんだから初期化前提
180:デフォルトの名無しさん
08/01/02 17:10:55
中途半端に"〜.ex"とかになった場合に誤動作しそうで怖いな
また別の問題だけど
181:デフォルトの名無しさん
08/01/02 20:10:17
C++でなにか簡単に動くプログラムはないだろうか。
182:デフォルトの名無しさん
08/01/02 20:12:22
はろーわーるど
183:デフォルトの名無しさん
08/01/02 20:50:40
マージャン、囲碁、将棋、チェス、好きなのを選べ。
184:デフォルトの名無しさん
08/01/02 20:51:46
はっきり言ってboostより分かりやすいC++はないんだろうか。
185:デフォルトの名無しさん
08/01/02 21:45:24
boost分からなければ無理に使うことは無い
186:デフォルトの名無しさん
08/01/02 21:53:09
boostってそんなにわかり易かったかな?
lambdaとか。
187:デフォルトの名無しさん
08/01/02 21:57:51
lambda はともかく、半分以上は分かりやすいと思うが。
188:デフォルトの名無しさん
08/01/02 21:59:41
boost::spiritは必見
189:デフォルトの名無しさん
08/01/02 22:35:49
とりあえず使い方を覚えて便利さを享受すること
にしてる。中身は天才達が作ってるだろうから。
for_eachでのlambdaは秀逸だと思う。bindも
凄く使いやすい。
190:デフォルトの名無しさん
08/01/02 23:06:23
便利だけど特別分かりやすいとは思わなかったな
191:デフォルトの名無しさん
08/01/03 02:28:18
#include <fstream>
using namespace std;
int main()
{
ofstream fout("mydata.mid", ios::binary);
fout.write("4D 54 68 64 00 00 00 06 00 01 00 01 00 60 4D 54 72 6B 00 00 00 1C 00 90 3C 64 4B 80 3C 64 15 90 3E 64 4B 80 3E 64 15 90 40 64 4B 80 40 64 15 FF 2F 00", 74);
fout.close();
return 0;
}
fout.write の引数のバイナリ(SMF)をそのままファイルに出力したいのですが、
出力されたsample.midを再生しようとすると「プレーヤーがそのファイルの種類をサポートしていないか、そのファイルの圧縮に使用したコーデックをサポートしていない可能性があります。」
というエラーが出てしまいます。そのファイルをバイナリエディタで見てみると、34 44 20 ...
というように、バイナリが変わってしまっていました。何がいけないのでしょうか??
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4134日前に更新/166 KB
担当:undef