【初心者歓迎】C/C++室 Ver.46【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001ぬ ◆NUNUK382Dk
2007/12/27(木) 20:32:47ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.45【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1197090562/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/12/27(木) 20:36:19乙
0003デフォルトの名無しさん
2007/12/27(木) 20:37:35半角スペース、タブ文字は2chでは使えません。
全角スペースを使ってもいいですが、 と入力すると半角スペースとして表示されます。
全角スペースではそのままコピペして使うことができないので、
ここにソースを貼るときはできる限りエディタでタブ文字等を に置換しましょう。
0004デフォルトの名無しさん
2007/12/27(木) 20:45:180005デフォルトの名無しさん
2007/12/27(木) 20:48:16本当
0006デフォルトの名無しさん
2007/12/27(木) 20:52:14& nbsp;って文字まで半角スペースに変換しやがる
何この無駄な機能w ふざけんなww
0007デフォルトの名無しさん
2007/12/27(木) 20:53:43ハイ機能だな
0008デフォルトの名無しさん
2007/12/28(金) 01:23:020009デフォルトの名無しさん
2007/12/28(金) 02:18:520010デフォルトの名無しさん
2007/12/28(金) 03:48:460011デフォルトの名無しさん
2007/12/28(金) 07:48:440012デフォルトの名無しさん
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 スキップ ==========
というメッセージが出てしまいました。
これらはどのように対処すればいいのでしょうか。
0013デフォルトの名無しさん
2007/12/28(金) 15:18:46Cとしてコンパイルをしないといけないのかと思い
extern "C" {
を加えてみたのですがやっぱりかわりませんでした。
0014デフォルトの名無しさん
2007/12/28(金) 15:23:320015デフォルトの名無しさん
2007/12/28(金) 18:27:168面で穴に落とす係りの奴が出てきて一発殴ると終わるよね。
レバーを入れるのと同時にパンチを連打すると当たりやすいんで
やたら忙しくココココココンってレバーをやりながらボタン連打してた。
ジャブが二発入ったらストレート、あとはその繰り返しで
適当に上下に振って動かしながらやれば何とかなるよね。
0016デフォルトの名無しさん
2007/12/28(金) 18:27:470017デフォルトの名無しさん
2007/12/28(金) 20:03:19おっしゃるとおりでした。
2日間もバカみたく考えてましたw
無事解決しました。
ありがとうございました!
0018デフォルトの名無しさん
2007/12/29(土) 13:39:40ファイルの何バイト目から読み込むというのはできるっぽいんですが、
ファイルのX行目から読み込みたい場合、
getlineをX回実行という方法で行うんでしょうか?
0019デフォルトの名無しさん
2007/12/29(土) 13:43:19それで不都合がなければそれでいいんじゃね?
0020デフォルトの名無しさん
2007/12/29(土) 13:43:24ランダムで何行目って読む場合は各行の場所を保存しておくと便利
0021デフォルトの名無しさん
2007/12/29(土) 14:05:53別に不都合はないんですが、直接飛べる方法があるなら
そっちの方が早いかなと思いまして
ありがとうございました
0022デフォルトの名無しさん
2007/12/29(土) 14:35:59struct 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[];
......
にすればすぐ読み出せるぞ。
0023デフォルトの名無しさん
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);
}
何か良い方法はないでしょうか?
0024デフォルトの名無しさん
2007/12/29(土) 15:55:03そうでもなければおとなしく std::list 使っとけ。
0025デフォルトの名無しさん
2007/12/29(土) 16:02:12すいません。
c++では無いんです。
ああ、そうか!
ちょっと良い案思い浮かんだんで、試してきます。
0026デフォルトの名無しさん
2007/12/29(土) 16:12:360027デフォルトの名無しさん
2007/12/29(土) 16:13:35まあ、exit(0); じゃなくて return 0; でいいと思うが。
どっちも同じと言えば同じだが。
0028デフォルトの名無しさん
2007/12/29(土) 16:57:16if ( n == false) {
// nが偽だったら実行
exit(-1);
}
の内側が実行されてしまいます。
どうすれば治りますか?
0029デフォルトの名無しさん
2007/12/29(土) 17:01:420030デフォルトの名無しさん
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;
0031デフォルトの名無しさん
2007/12/29(土) 17:12:11ListNode *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);
0032デフォルトの名無しさん
2007/12/29(土) 17:13:30確かに、>>29 は正しいが、C,C++ではよくあること。
その if より前に n に false が代入された。
あるいは、その処理系では、false が、 2007 とされている。
あるいは、どこかその処理より前で、
#undef false
#define false 2007
を書かれている。
0033デフォルトの名無しさん
2007/12/29(土) 17:19:09もし n が真偽を表現しているのであれば。
003425
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;
にしたら動きました。
感動!
0035デフォルトの名無しさん
2007/12/29(土) 17:35:010036デフォルトの名無しさん
2007/12/29(土) 17:44:55void test(void){
puts("test");
}
void hoge(int x){
if(x==0)return test();//←ここ
else puts("hoge");
}
int main(){
hoge(0);
return 0;
}
以上のコードがbccで通る(警告は出る)んですが、
これって規格上問題ないんですか?
0037デフォルトの名無しさん
2007/12/29(土) 17:47:450038デフォルトの名無しさん
2007/12/29(土) 17:51:25return 文は引数を取ってはならない。
0039デフォルトの名無しさん
2007/12/29(土) 17:52:43つーかこの仕様だとreturn要らないような気がするのだが
0040デフォルトの名無しさん
2007/12/29(土) 17:56:42でも、規格上は問題あり。
0041デフォルトの名無しさん
2007/12/29(土) 18:31:410042デフォルトの名無しさん
2007/12/29(土) 18:40:150043デフォルトの名無しさん
2007/12/29(土) 18:58:170044デフォルトの名無しさん
2007/12/29(土) 18:59:000045デフォルトの名無しさん
2007/12/29(土) 20:46:11C++でコンパイルすれば問題ない
0046デフォルトの名無しさん
2007/12/29(土) 22:26:28例えば、
typedef int (CALLBACK *OPEN)(char *);
typedef int (CALLBACK *CLOSE)(int);
ここで記述されているCALLBACKというものがそうらしいのですが、
さっぱりわかりません。
0047デフォルトの名無しさん
2007/12/30(日) 00:02:04環境が何だか分からんが、そのCALLBACKは何処かで#defineされてるもので
コールバック関数とは直接的には関係ない。
0048デフォルトの名無しさん
2007/12/30(日) 00:16:49CALLBACKはWindowsなら__stdcallの別名で通常は修飾なしの関数と同じ。
コープバック関数ってのはイベント通知や内部でユーザー定義の関数呼び出す場合に関数に渡すユーザー関数のポインタ。
0049デフォルトの名無しさん
2007/12/30(日) 00:19:00CALLBACKならWindows環境だと__stdcall
実はWindowsのエントリポイントであるWinMainにつけるWINAPIも、__stdcallだったりする
__stdcallは呼ばれた側がスタックの解放をするって動作を指定する
だからコールバックできるんですね
コールバックはどっかから呼び出してもらう関数のこと
折り返し電話してもらうことをコールバックっていうよね
あれと同じで、自分から明示的に呼び出さない
自分、っていっているのは、右手が恋人のおまいじゃなくて、コールバック関数が定義された側の処理
0050デフォルトの名無しさん
2007/12/30(日) 00:26:11コールバックできるかどうかに__stdcallは関係ないよ。
0051デフォルトの名無しさん
2007/12/30(日) 00:31:57そりゃ「できるかどうか」に限定すれば関係ないけどね
005225
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 仮面ライダー)というリストが出来た。*/
005325
2007/12/30(日) 08:29:07for(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;/*文字列がかぶっていないので次のリストの文字列と比較*/
}
0054デフォルトの名無しさん
2007/12/30(日) 08:56:17データ構造の設計を0から。
005525
2007/12/30(日) 09:07:15じゃあ、何が良いんですか?
配列?
0056デフォルトの名無しさん
2007/12/30(日) 09:13:17005725
2007/12/30(日) 09:23:390058デフォルトの名無しさん
2007/12/30(日) 09:27:23リスト構造わかってるのになんでわからないのかわからない、それ自体写しか?
データ構造って指摘されてるのは"1000 ガンダム"とかいれちまってるせいじゃないの
それにしたってまあ比較は出来るけど1000と"ガンダム"でわけようぜ
というかなんでその問題が解けないか全く理解出来ない
005925
2007/12/30(日) 09:39:58引数は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の条件がどうしても書けなくて...
0060デフォルトの名無しさん
2007/12/30(日) 09:43:29つなぎかえなら図でも書いてみろ、やることは単純だ
whileの条件はわかりやすくしたきゃ末尾にnullでも明示的にいれとけ
0061デフォルトの名無しさん
2007/12/30(日) 09:44:38リストの組み替えをしたいなら、
リストの組み替え前と組み替え後の状態を紙に書いて、
どう変化させればいいかを考えてみるといい。
あと、リストを実装する場合、
リストの端っこは、NULL にするより、
端っこを表すダミーのノードを作った方が実装しやすい。
006225
2007/12/30(日) 09:50:28もちょっと努力してきます。
0063デフォルトの名無しさん
2007/12/30(日) 10:09:210064デフォルトの名無しさん
2007/12/30(日) 10:27:58その必要がない限りリスト構造を使う意味はないと思うが。
0065デフォルトの名無しさん
2007/12/30(日) 10:31:22違う。
ダミーのノードは全ての有効なノードとは異なるノード。
有効なノードが0個の時でも存在してないといけないわけで。
006625
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);
0067デフォルトの名無しさん
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の形式とかはなんとか理解は出来たので、読み込み方がわかれば多分大丈夫だと思います。
ファイル全体を一気に読み込むのは流石に調べて分かったんですが、場所指定しての読み込みがどうしても分からなかったので
質問させていただきました。どうかよろしくお願いします。
0068デフォルトの名無しさん
2007/12/30(日) 16:31:11あとx86系CPUならエンディアン変換はしなくていい。
0069デフォルトの名無しさん
2007/12/30(日) 16:32:01任意の位置からの読み込みは、C++のstream類ならseekg、
CのFILE*ならfseekといった具合に、位置を指定する方法があるのでそれを使う。
007067
2007/12/30(日) 16:42:45あと、ファイルをシークするということは、一度ファイル全体を読み込み、
そこからシークしてデータを取り出すということですよね?
waveファイルって1つが結構大きいので、既に再生用にwaveをメモリに読み込んでいることもあり、
データをチャンネルごとに分けて読み込むうえに更に読み込み用にファイルを読み込むとなると
あとで全体のデータは破棄するにしても結構メモリ食うな〜と思うのですが、
やはりそうしないと読み込むのは無理ですかね?
0071デフォルトの名無しさん
2007/12/30(日) 16:45:14}while(this == NULL);
これでいいのか?
strcmpの後のifだけど、これはたぶん、>65氏の言う「ダミーノード」の方法で消すことが可能。
「次」がある限り、「次の次」は、(ダミーかもしれないが)必ず存在する。
「次」がダミーなら、strcmpのifが真になることはないはず。
ところで、この書き方だったら比較は必ず次の要素と行われてるから、
ウルトラマンウルトラマン仮面ライダーだったらいいけど、
ウルトラマン仮面ライダーウルトラマンだったときに後ろのウルトラマンが
消えてくれない気がするんだけど、なんでこんなアルゴリズムにしようと思ったの?
普通に書いたら
・まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
・次に、上の操作で出来たリストの二番目と、それ以降すべての要素と比較、かぶってたら以下略
・それをリストの最後から二番目まで繰り返す
にならない?
それともよく知らないけど>66の方が効率いいの?
あと、よけいなお節介だけど、変数名にthisとかnewとか使う癖があるなら、直した方が良い。
0072デフォルトの名無しさん
2007/12/30(日) 16:53:21シークはこれから読み書きする位置を指定する行為。
この段階ではまだ読み込みは行っていないぞ。
007367
2007/12/30(日) 17:00:59そうなんですか! よく調べもせずに申し訳ありませんでした。
折角のC++なので? seekgを使ってみたいと思います。
お答えして頂いてどうもありがとうございました!
0074デフォルトの名無しさん
2007/12/30(日) 17:13:14>if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/
> this->next = NULL;
>else
> this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
>free(this->next); /*(2000 ガンダム)を消す*/
何をfreeしているか考えよ
007525
2007/12/30(日) 17:23:42すいません。
有り難うございます。
ちょっと色気出してみようと思って、練習もかねてList使ってみたのが間違いだったのか?
今までList自体触った事無いから、難しい。
まぁ、趣味でプログラムやっているから気長にやります。
free(this->next); /*(2000 ガンダム)を消す*/
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
が正しいですね。
0076デフォルトの名無しさん
2007/12/30(日) 17:25:26MS-DOSでディレクトリの移動をやってたんですが、
cd \での移動と、(指定されたパスが見つかりませんと出る)
dir \での移動が出来ません(ファイルが見つかりませんと出る)
まさか入門書の本編にすら行かないうちに詰まるとは思いませんでした。
どなたか助けてください…。
、
0077デフォルトの名無しさん
2007/12/30(日) 17:28:14dirは移動するコマンドじゃない。
0078デフォルトの名無しさん
2007/12/30(日) 17:29:54>this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
freeした物のnextわ参照してどうする
tmp = this->next;
this->next = tmp->next;
free(tmp);
0080デフォルトの名無しさん
2007/12/30(日) 17:49:32help コマンド名
008125
2007/12/30(日) 18:19:59>まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
うう、駄目だ書けない。
配列だったら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し続けるのか書けない....*/
0082デフォルトの名無しさん
2007/12/30(日) 18:31:41ListNode 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){
……
}
}
}
これでだめ?
0083デフォルトの名無しさん
2007/12/30(日) 18:39:41リストに追加する段階で重複チェックすればいいじゃん
わざわざリスト全部作ってから除去しなくても。
0084デフォルトの名無しさん
2007/12/30(日) 18:52:00id integer not null,
name varchar(16) not null unique,
primary key (id)
);
insert into list (id, name) values (2000, "ガンダム");
008525
2007/12/30(日) 19:37:40とても良いと思います。自分は思いつきませんでした。
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;の使い方が分からないです。
もう駄目かもしれません。
なんか正直、何をやってもプログラムを書ける気がしなくなってきました....
こういう絶望感に包まれた場合、どうすればまたプログラムを書けるようになれますかね?
0086デフォルトの名無しさん
2007/12/30(日) 19:38:23Basicに乗り換える
0087デフォルトの名無しさん
2007/12/30(日) 19:39:40コンピュータから離れても良いかもしれない。
0088デフォルトの名無しさん
2007/12/30(日) 19:40:32だから、リスト構造はあんたには早過ぎると言ってるでしょう。
0089デフォルトの名無しさん
2007/12/30(日) 19:49:45>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
だね。
0090デフォルトの名無しさん
2007/12/30(日) 21:19:470091デフォルトの名無しさん
2007/12/31(月) 00:28:51何か本でも読んだ方がいいんじゃね。
0092デフォルトの名無しさん
2007/12/31(月) 03:02:300093デフォルトの名無しさん
2007/12/31(月) 03:04:40まずなにがしたいのかを書かないとエスパーしか答えられないぞ
ゲームを作りたいならDirectXとか
0094デフォルトの名無しさん
2007/12/31(月) 03:05:290095デフォルトの名無しさん
2007/12/31(月) 03:10:510096デフォルトの名無しさん
2007/12/31(月) 03:29:10どうかけばよいのか分かりません。どうかお教えください。
0097デフォルトの名無しさん
2007/12/31(月) 03:33:530098デフォルトの名無しさん
2007/12/31(月) 03:34:09自分はこんなものを書いてしまったのですが、コンパイルが通りません。
template<class T>
void show(T& v)
{
T::iterator p;
for (p = v.begin(); p != v.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
0099デフォルトの名無しさん
2007/12/31(月) 03:49:14DirectXとかでなく
C++で同人ゲームとかを改造して暇つぶししたいんですけど。
誰かマジレスお願いします。
0100デフォルトの名無しさん
2007/12/31(月) 03:52:32こんな時間にありがとうございます!
それは書けたのですが、もうちょっと一般的な書き方があればな、、と思って。
void show(deque<char>& x)
{
for (deque<char>::iterator p = x.begin(); p != x.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
こんなのよりも、dequeも<char>も勝手に入力から判断してくれる書き方はないですか?
0101デフォルトの名無しさん
2007/12/31(月) 03:58:53今程度の知識で暇つぶしできるほどの改造は無理だ。
どのゲームなのか?そのゲームがC++で書かれているのかすらわからないじゃないか。
っつうかマルチでしょ?
宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。
0102デフォルトの名無しさん
2007/12/31(月) 03:59:33typename T::iteratorじゃない?
ってかエラーが出たらエラーメッセージを張るべし。
0103デフォルトの名無しさん
2007/12/31(月) 04:10:07ありがとうございます。
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
0104デフォルトの名無しさん
2007/12/31(月) 04:16:18あと、細かいことだけどこういう処理なら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;
}
0105デフォルトの名無しさん
2007/12/31(月) 04:26:50解決です。
すいません、あと1つだけ。
constつけた方がいい理由は、show()関数が表示するだけで
内部要素を変更しないことをハッキリ示すためですか?
0106デフォルトの名無しさん
2007/12/31(月) 04:36:05ですがどのようにすればいいでしょうか?
getlineで一行つづ読み込んで"<a href="http:"を探せばいいかな。と思ってたんですが
メモ帳でスレのhtmlファイル開いてみるとURLの途中で改行があったんで悩んでます
0107デフォルトの名無しさん
2007/12/31(月) 04:37:380108デフォルトの名無しさん
2007/12/31(月) 05:52:340109デフォルトの名無しさん
2007/12/31(月) 08:21:41const参照でコンテナを受け取った関数から使えなくなってもいいならつけなくていいよ。
0110デフォルトの名無しさん
2007/12/31(月) 09:06:53Type operator ++(int)とありますが、
クラスTypeで宣言した演算対象が、float型とかの場合でも
仮引数は(int)なのでしょうか?
(float)にはならないでしょうか?
どの解説本みても(int)で、詳しい説明がなくてよくわかりません。
0111デフォルトの名無しさん
2007/12/31(月) 09:13:20オーバーロードしたいならもちろんfloat型を引数に。
0112デフォルトの名無しさん
2007/12/31(月) 09:20:360113デフォルトの名無しさん
2007/12/31(月) 10:18:500114デフォルトの名無しさん
2007/12/31(月) 11:01:19それは前置
011525
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;
}
}
}
頑張ってよかった!
感動した!
いい気持ちで正月を迎えられます。
0116デフォルトの名無しさん
2007/12/31(月) 11:25:110117デフォルトの名無しさん
2007/12/31(月) 15:45:29そのデータのレングスが先頭2バイトにある識別子で判断できる場合って
・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする
というのが一般的なのでしょうか?
recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?
要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。
0118デフォルトの名無しさん
2007/12/31(月) 15:54:11こっちのがいいと思う
ネットワークプログラミング相談室 Port20
http://pc11.2ch.net/test/read.cgi/tech/1186418855/
0119デフォルトの名無しさん
2007/12/31(月) 15:58:50サンクスです。逝って来ます。
0120デフォルトの名無しさん
2007/12/31(月) 16:49:41FILE 構造体へのポインタしか受け取ってくれない関数に,
この文字列があたかもファイルに入っているかのように
思わせて処理させることはできないものでしょうか?
C++ ならいつも std::string と std::istringstream で
ストリームとして抽象的に処理しているのですが,
どうしても C のライブラリを使う必要があって,
勝手が違って悩んでいます.
0121120
2007/12/31(月) 16:57:40使いたいライブラリのソースが手に入って,
手を突っ込んでいいとのことなので素直にそうします.
いやぁ,ストリームなんて変な演算子オーバーロードで
やだなぁ,とか思っていたのにいつの間にかストリーム
べったりの人間になってました.慣れって怖い.
0122デフォルトの名無しさん
2007/12/31(月) 17:04:49テンポラリファイル作るとか?
ファイルマッピング使って、バッファーの不一致が起きないようにファイルをクローズしてフラッシュするまでタイミングを取るとか?
0123デフォルトの名無しさん
2007/12/31(月) 17:22:09ランタイムエラーが出てしまいました。
(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;
となっています。
こういうときは何を疑えばいいのでしょうか?
よろしくお願いします。
0124デフォルトの名無しさん
2007/12/31(月) 17:25:530125123
2007/12/31(月) 17:51:13最後の多重継承にvirtualをつけてませんでした(汗
けどどういう条件でvirtualをつけるべきなのかよくわからない・・・
ともあれありがとうございました。
0126デフォルトの名無しさん
2007/12/31(月) 18:28:520127デフォルトの名無しさん
2007/12/31(月) 18:52:38俺も、多重継承やテンプレートを使いまくって複雑怪奇なオブジェクトを作っていた頃がありました。しかし、だんだんとこんな複雑な構造は不要だって解ってくるんだな。
C++をはじめて誰もが一度は通る道かな。
0128デフォルトの名無しさん
2007/12/31(月) 19:47:15もうちょっと具体的に書くと、
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
0129デフォルトの名無しさん
2007/12/31(月) 19:54:40生きろ
0130デフォルトの名無しさん
2007/12/31(月) 20:40:17どの辺がランダムなのか教えてくれ。
0131デフォルトの名無しさん
2007/12/31(月) 20:44:54エスパーするとDraw_XとDraw_Yを直接数字に置き換えるとか
0132デフォルトの名無しさん
2007/12/31(月) 20:46:00#define Draw_Y (rand()/600)
0133デフォルトの名無しさん
2007/12/31(月) 22:41:31仮引数はどうあっても int 。
0134デフォルトの名無しさん
2008/01/01(火) 21:05:24初心者向けで分かりやすい本があったら 教えて下さい。
Cはある程度は把握してます
何かお勧めの本はありますかね?
0135デフォルトの名無しさん
2008/01/01(火) 21:18:23ロベールでいいんじゃね。
0136デフォルトの名無しさん
2008/01/01(火) 21:55:510137デフォルトの名無しさん
2008/01/01(火) 23:08:21とかって 分かりやすいんですかね?
0138デフォルトの名無しさん
2008/01/01(火) 23:10:37基礎過ぎて C と被る所が多過ぎる。
0139デフォルトの名無しさん
2008/01/01(火) 23:13:44CとC++はかなり違う言語だから、なめてかからないほうがいいよ。
STLやらBoostやら、C++は変態すぎる。
0140デフォルトの名無しさん
2008/01/01(火) 23:16:00いい本を選べよ。
0141デフォルトの名無しさん
2008/01/01(火) 23:40:20やっぱりそれぞれ違いますよね?
ロベールかぁ..
本屋でいろいろ立ち読みしてみて 読みやすい本を選ぶのがいいんですかね?
0142デフォルトの名無しさん
2008/01/01(火) 23:45:23C++がCより使いやすい要素はあるんですかね。
0143デフォルトの名無しさん
2008/01/01(火) 23:48:51初心者に勉強させるって意味なら混乱する要素満載でとても使いやすいとは思えないけど
0144デフォルトの名無しさん
2008/01/01(火) 23:54:42クラス。
iostreamなんかは窓から投げ捨てていい。
0145デフォルトの名無しさん
2008/01/01(火) 23:58:010146デフォルトの名無しさん
2008/01/02(水) 00:00:19C++は使いやすいというよりも、強力な言語だと思う。強力であるが故に使いこなすのが難しい面が多々ある。
例えば文字列クラスを作ると、最初から言語仕様に組み込まれていたかのように文字列を扱えるなんて、強力というか自由度高すぎ。
0147デフォルトの名無しさん
2008/01/02(水) 00:05:47MPLとかも簡単と思う?
0148デフォルトの名無しさん
2008/01/02(水) 00:07:560149デフォルトの名無しさん
2008/01/02(水) 00:19:190150デフォルトの名無しさん
2008/01/02(水) 00:24:450151デフォルトの名無しさん
2008/01/02(水) 00:25:30使わんし。
0152デフォルトの名無しさん
2008/01/02(水) 01:15:12C++で成功したから、最近の言語で実装されるようになったんだろ。
0153デフォルトの名無しさん
2008/01/02(水) 01:30:020154デフォルトの名無しさん
2008/01/02(水) 03:30:17MPLを使わないのにC++に慣れてるとか大きく出たね
それでC++が簡単と言うのは違うんじゃないかい?
あんたにとっては簡単かもしれんけど、一般論ではないわな
0155デフォルトの名無しさん
2008/01/02(水) 03:38:48何私は最先端ですみたいになってんの?
あんなもんライブラリでも作る必要がなければ使わない。
使えない。可読性が低くなる。
0156デフォルトの名無しさん
2008/01/02(水) 03:50:28MPLより"やばい"type_traitsがtr1に入ってるぞ
可読性が低い==俺は勉強してないので読めない
0157デフォルトの名無しさん
2008/01/02(水) 04:03:210158デフォルトの名無しさん
2008/01/02(水) 09:45:530159デフォルトの名無しさん
2008/01/02(水) 11:51:00このプログラムが先日まで実行できたのですが、
probably corrupted stack
segmentation fault
と出て実行不可になりました。こちらの環境が原因でしょうか?
0160デフォルトの名無しさん
2008/01/02(水) 12:19:230161デフォルトの名無しさん
2008/01/02(水) 12:54:26type_traitsのどこがやばいの?traitsの考え方は難しくないし
コンパイル時の型の判定は便利だからboost使っている。
今でもiterator_traitsやchar_traitsはある。
>可読性が低い==俺は勉強してないので読めない
就職したら正論が通用しない場合があることがわかるよ。
0162デフォルトの名無しさん
2008/01/02(水) 12:54:58とりあえず、 ,とか?とか使うのやめて読みやすく書き直して味噌
0163デフォルトの名無しさん
2008/01/02(水) 12:57:50負数または INT_MAX を超える値を入力してない?
0164159
2008/01/02(水) 13:05:170165デフォルトの名無しさん
2008/01/02(水) 13:05:56宿題丸投げした挙句デバッグも人任せ?お前の肩の上についている物体は飾りか
0166デフォルトの名無しさん
2008/01/02(水) 13:22:34なんでそんなムキになるん?
0167デフォルトの名無しさん
2008/01/02(水) 13:23:46こんなんみりゃ誰だってうざくなるわ
0168デフォルトの名無しさん
2008/01/02(水) 13:24:12肩の上って…
首を傾げてるってことかあぁぁ!!!!!!111
0169デフォルトの名無しさん
2008/01/02(水) 13:24:510170デフォルトの名無しさん
2008/01/02(水) 13:24:520171165
2008/01/02(水) 13:29:09今度から気をつけるよ。
0172デフォルトの名無しさん
2008/01/02(水) 13:31:29宿題スレと質問スレの住人、絶対かぶってるよな
0173デフォルトの名無しさん
2008/01/02(水) 13:45:120174デフォルトの名無しさん
2008/01/02(水) 14:26:460175デフォルトの名無しさん
2008/01/02(水) 14:36:160176デフォルトの名無しさん
2008/01/02(水) 14:38:05http://ja.wikipedia.org/wiki/Strcat
0177デフォルトの名無しさん
2008/01/02(水) 14:41:47そもそも検索したかどうか知らないけど
0178デフォルトの名無しさん
2008/01/02(水) 14:45:36と思った。
0179デフォルトの名無しさん
2008/01/02(水) 17:07:02strcpyとかならまだしも、catは連結なんだから初期化前提
0180デフォルトの名無しさん
2008/01/02(水) 17:10:55また別の問題だけど
0181デフォルトの名無しさん
2008/01/02(水) 20:10:170182デフォルトの名無しさん
2008/01/02(水) 20:12:220183デフォルトの名無しさん
2008/01/02(水) 20:50:400184デフォルトの名無しさん
2008/01/02(水) 20:51:460185デフォルトの名無しさん
2008/01/02(水) 21:45:240186デフォルトの名無しさん
2008/01/02(水) 21:53:09lambdaとか。
0187デフォルトの名無しさん
2008/01/02(水) 21:57:510188デフォルトの名無しさん
2008/01/02(水) 21:59:410189デフォルトの名無しさん
2008/01/02(水) 22:35:49にしてる。中身は天才達が作ってるだろうから。
for_eachでのlambdaは秀逸だと思う。bindも
凄く使いやすい。
0190デフォルトの名無しさん
2008/01/02(水) 23:06:230191デフォルトの名無しさん
2008/01/03(木) 02:28:18using 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 ...
というように、バイナリが変わってしまっていました。何がいけないのでしょうか??
0192デフォルトの名無しさん
2008/01/03(木) 02:33:16でおk
0193デフォルトの名無しさん
2008/01/03(木) 02:45:32static const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, };
fout.write( data, sizeof(data) );
0194デフォルトの名無しさん
2008/01/03(木) 02:58:56UTF−16ベースにしないと
プログラマーから嫌われそうだ
0195デフォルトの名無しさん
2008/01/03(木) 03:18:40>>193
なるほど。こうすればよかったんですね。ありがとうございますm(_ _)m
・・なんか、いきなりあれですが。
今まで他の質問サイトでよく質問してたんですが、ここの方が返信早いし、
しかもここの人たちはポイントもらうためとかではなく無償で教えてくれるんですよね。。
なんかしんみり嬉しくなりました。また行き詰ったらご教授願いたいのでよろしくお願いしますm(_ _)m
0196デフォルトの名無しさん
2008/01/03(木) 07:12:590197デフォルトの名無しさん
2008/01/03(木) 14:59:39なんで、staticなんですか?
0198デフォルトの名無しさん
2008/01/03(木) 15:04:30よそから使う必要がなければ、見えなくするためじゃないか。
0199デフォルトの名無しさん
2008/01/03(木) 15:09:46定数にするためじゃない?
0200デフォルトの名無しさん
2008/01/03(木) 15:16:31いえ、なんてーか、グローバル変数でstaticなら、それも理解できるんですが……
これ、関数内の話ですよね?
>>199
それって、constじゃないんですか?
0201デフォルトの名無しさん
2008/01/03(木) 15:35:24constだけだと関数内では「書き換え不能」って意味だけじゃないかな?
staticがついて定数になったと思うけど。
組み込みなんかだと値をROMに収めるためにはstatic constを指定してやらないと駄目だったような・・・
C++が使える組み込みなんて少ないかもしれないけど
0202デフォルトの名無しさん
2008/01/03(木) 15:36:40確保した領域に値をコピーする手間が省けるのでメモリと処理時間の節約になるっぽい
スコープが関数内に限られた外部変数って考えるといいっしょ
でもmain関数内の変数ってコンパイラにもよると思うけど実質staticじゃなかったっけ?
0203デフォルトの名無しさん
2008/01/03(木) 16:07:50int main()
{
ofstream fout("mydata.mid", ios::binary);
const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, };
fout.write( data, sizeof(data) );
fout.close();
otherFunction();
return 0;
}
みたいな形で書いたとしたら、当然、otherFunctionから、dataにアクセスすることは出来なくなるわけですから、外部から使う必要云々の話ってのは成立しませんよね。
なので、>>201さんの言う事(前半)が理由なら、staticはいらないのではないでしょうか?
>>201(後半)と>>202の理由については初めて知りました。
よろしければ、参考文献などを教えていただけないでしょうか?
お願いいたします。
0204デフォルトの名無しさん
2008/01/03(木) 16:23:42書き換え不能の「変数」と「定数」の違いがある気がすると思って書いたんだけど。
そこまで詳しくないから間違ってるかも。
Googleで「c++ const 定数」あたりでぐぐれば?
0205193
2008/01/03(木) 16:27:08>>201と>>202(最後の1行はよく知らないが)の言うとおりだよ。
非static 非const →書き換え可能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。
非static const →書き換え不能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。(処理系により異なるかも?)
static 非const→書き換え可能な静的領域に配置。プログラム開始時に一度だけ、ROMから静的領域へのコピーが発生する。
static const →書き換え不能でROMに配置。コピーは発生しない。
0206デフォルトの名無しさん
2008/01/03(木) 16:27:11staticが外部からアクセスできないんは文法上の話
メモリ上に変数の領域が確保されてるんやからアドレス渡せばアクセスできるんよ
0207デフォルトの名無しさん
2008/01/03(木) 16:40:08なるほど……色々と教えてくださってありがとうございます。
どうも、組み込み系の話が必要になってきそうですね。
そこら辺の文献でも読んでみます。ありがとうございました。
0208デフォルトの名無しさん
2008/01/03(木) 16:56:44ホントためになる話が多いよな。各人の知識経験に感嘆するぜ。
0209デフォルトの名無しさん
2008/01/03(木) 17:24:02次に難し目の問題集を買って、それをクリアーしたらC++に移ろうと思います。
しかし、本を読んで理解して・・・の繰り返しでモチベーションが萎えて来ました。
僕は独学でパズル感覚でプログラミングの勉強をしているので
CあるいはC++を使ったら何が出来るのかということが、ちょっと想像がつきません。
そこで
■ この言語で何(どういうモノ)が作れて、
現実にはどういう場で役に立っているのかというのを教えていただきたいと思います。
よろしくお願いします。
0210デフォルトの名無しさん
2008/01/03(木) 17:35:47とりあえず「こんなソフト欲しい」って思ったら自作してみるといいお
0211デフォルトの名無しさん
2008/01/03(木) 17:37:29何ができるのかというと、何でもできるということになる。
目標がC/C++の勉強だけだと気力も萎えるだろう。そういう時は、何でも良いからアプリを作るのが一番。
0212デフォルトの名無しさん
2008/01/03(木) 17:41:50http://www.sophia-it.com/content/%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0
ここに書かれているような意味でですか?
汎用性高いとのことですが家電製品とかのシステムもC/C++で書かれていたりするんですか?
0213デフォルトの名無しさん
2008/01/03(木) 17:43:39実用的なプログラミング言語だと、言語によってできることできないことにはほとんど差がない。
どちらかというと環境の差だったり環境が用意されているかの違いの方が大きい。
なので、コンピュータ上でできることはほぼ何でもできる、と言ってよい。
でも、これだとあまりうれしくない返答だよな。
どれだけ低レベルな処理が可能かというのについては多少差があるけど、C / C++ はその方面では強い。
具体的には、オペレーティングシステム(Windows とかね)や、組み込み系(電子機器の制御、マイコン等)の
プログラミングに使われたりもする。
逆に言うと C / C++ そのままだと基礎的すぎて、ライブラリとか使わないと凝ったこと、派手なことはさせにくかったりする。
ということで、提案としては、
・OpenGL, DirectX とか使って、ゲームとか 3D CG 系で遊んでみる。
・(英語があまり苦にならなければ) http://online-judge.uva.es/problemset/ で問題を解いてみる。
(ACM国際大学対抗プログラミングコンテストの問題集でオンラインで判定もしてくれる)
あたりかなぁ。あるいは宿題スレの回答者になってみてもいいかもしれないよ?
0214デフォルトの名無しさん
2008/01/03(木) 17:44:18本を読んで理解することは非常に重要だが、実際に組んで動かしてみるのはもっと重要。
理解を深める意味でも、モチベーションの意味でもな。
あと、言語だけでなく、データ構造とアルゴリズムの勉強は欠かさないように。
パズル感覚なら楽しめるはず。実践の題材を見つけることもできると思う。
題材はGUIアプリで見た目にこだわるより、
CUIでいいから、内部動作にこだわると良い。
0215デフォルトの名無しさん
2008/01/03(木) 17:47:48C++が使える環境ではC++で書きたいな。(あくまで希望)
0216デフォルトの名無しさん
2008/01/03(木) 17:48:10何か目的があって言語を覚えたんじゃないのか
0217デフォルトの名無しさん
2008/01/03(木) 17:48:140218デフォルトの名無しさん
2008/01/03(木) 18:29:23いれる処理は以下でよいですか?
なんか、strtok()を使うやり方があるとか、','を'\0'に置換したらいいとか言われましたが、
よく分からなかったので、以下のように書いてみました。
vector<string> vec;
vector< vector<string> > vec2;
ifstream ifs("ファイル名文字列");
string line;
while (ifs >> line) {
int s1 = 0;
int s2 = 0;
while (s2 < line.size()) {
s1 = s2;
while (line[s2] != ',' && s2 < line.size()) s2++;
vec.push_back( line.substr(s1, s2 - s1) );
s2++;
}
vec2.push_back(v);
vec.clear();
}
0219デフォルトの名無しさん
2008/01/03(木) 18:45:48>>211
ありがとうございます。
アプリを作る方向で考えてみます!
>>213
ありがとうございます。
英語は、雰囲気でわかりますw
実践的な問題を解いてみるのは、楽しいと思います。
頑張ります。
>>214
ありがとうございます。
データ構造やアルゴリズムは、読んでて楽しいのでどんどん勉強したいと思います!
>>216
いや、暇つぶしです。
今、フリーター〜無職なんで、何かやってるアピールを親にしないと・・・
哲学とか、医療問題とか、どうでもいいものをいろいろ勉強してました。
昔、ウェブサイト作ってFLASHのACTION SCRIPTやJAVA SCRIPTとかをいじるのが好きだったんで
全く違うけどパソコン関連ってことでCをやってみたら楽しかった・・・って感じです。
0220デフォルトの名無しさん
2008/01/03(木) 18:47:01何やらヒゲのおじさんが微笑んでますが
参考になりそうなサイトですね。読んでみます。
ありがとうございます。
0221デフォルトの名無しさん
2008/01/03(木) 20:03:21当方、すでに出来上がっているプログラムに追加・改変して別のプログラムを作るという授業を受けている学生です。
VisualStudio2005、C++で開発しています。
ちなみに、授業を受けている割にはC++についての知識は皆無です。
今作っているのはノベルゲームのような物です。
文章を表示して、キーを入力すると次の文章を出力する、という動作を行いたいのですが、キーの入力を受け取ると、文章が一気に進んでしまいます。
これを防止する為にキーが入力されても一定時間無視するという処理を行いたいのです。
そこで皆様にお聞きしたいのですが、キーの入力(OnKeyDownで取得)を一定時間(例えば10ミリ秒)無視するためにはどのようにプログラミングすれば良いのでしょうか?
わかりにくいかと思いますが、どうかよろしくお願いします。
0222デフォルトの名無しさん
2008/01/03(木) 20:15:46フラグ立てればいい
0223デフォルトの名無しさん
2008/01/03(木) 20:16:25{
キー入力;
}
0224デフォルトの名無しさん
2008/01/03(木) 20:17:330225デフォルトの名無しさん
2008/01/03(木) 20:19:320226デフォルトの名無しさん
2008/01/03(木) 20:21:020227デフォルトの名無しさん
2008/01/03(木) 20:38:21類似オブジェクトの共通特性を抽出してクラスにすればいい
0228デフォルトの名無しさん
2008/01/03(木) 20:43:50>222も参考に、その方向考えてみたらどうかな。
0229デフォルトの名無しさん
2008/01/03(木) 20:51:25ここに誰もつっこまないのは何故だ・・・
教えようがないじゃん
論述形式の宿題とか?
0230デフォルトの名無しさん
2008/01/03(木) 20:54:33そういうもんじゃない?
情報学科卒の生徒にHelloWorldから、とまでは言わなくても、
それに類する所から始めないといけない現実。
0231デフォルトの名無しさん
2008/01/03(木) 21:57:16なんかよくわからんけどソースうpしてくれなきゃわからん
0232デフォルトの名無しさん
2008/01/03(木) 21:59:30C言語について調べる気がしないんですが。
誰かレスお願いします。
0233デフォルトの名無しさん
2008/01/03(木) 22:01:06お前はなんについて質問したんだよw
0234デフォルトの名無しさん
2008/01/03(木) 22:04:470235デフォルトの名無しさん
2008/01/03(木) 22:12:54何かを限られた時間で作るときの目標として
ゲームにこだわる必要はないんですかね。
0236デフォルトの名無しさん
2008/01/03(木) 22:19:07どこから「ゲーム」が出てきたんだ?
エスパーで答えれば
好きにしろ、人に聞くな、目標を立てるところからが勉強だ。
0237デフォルトの名無しさん
2008/01/03(木) 22:20:240238デフォルトの名無しさん
2008/01/03(木) 22:22:570239デフォルトの名無しさん
2008/01/03(木) 23:21:54>家電製品とかのシステムもC/C++で書かれていたりするんですか?
Cがほとんどだと思う。
ある程度メモリとCPUパワーに余裕があれば、C++も選択肢になるだろうな。
0240デフォルトの名無しさん
2008/01/03(木) 23:36:440241デフォルトの名無しさん
2008/01/03(木) 23:56:36Cがほとんどじゃまいか?
0242デフォルトの名無しさん
2008/01/04(金) 00:02:540243デフォルトの名無しさん
2008/01/04(金) 00:09:06コストなんてどちらにせよコード次第。
0244デフォルトの名無しさん
2008/01/04(金) 00:28:37でもnewを使わなかったし、ベターCって使い方だったけど・・・
0245デフォルトの名無しさん
2008/01/04(金) 00:31:150246デフォルトの名無しさん
2008/01/04(金) 00:33:44newは例外投げるし。
0247デフォルトの名無しさん
2008/01/04(金) 00:34:118bitは流石に見なくなったが。(やってるところもあるだろうが。)
C++でやるかどうかは、コストよりも政治的な要素が強い希ガス。
MDAツールが使える、といった明確なメリットがなければ、
Cで押し切られそうだな。
0248212
2008/01/04(金) 00:43:39ハードウェア言語?とかいうのを使っているのだと思ってました。
ありがとうございますm(_ _)m
0249デフォルトの名無しさん
2008/01/04(金) 00:52:48メモリが少ないのでヒープが小さくなる。その結果newに失敗する可能性があるとか
リアルタイムが要求される場合に遅いとか?
0250デフォルトの名無しさん
2008/01/04(金) 00:59:08普通のnew/deleteは、空き領域の断片化によってメモリ不足に陥る可能性がある。
例外はコンパイルオプションいじらないと普通は投げないんじゃないかな。
代替策として、静的確保した領域にplacement newしたり、
断片化しないように制限を付けたメモリ管理を取り入れたりと、工夫してる。
0251デフォルトの名無しさん
2008/01/04(金) 01:06:50IOから自分で実装するような組み込みならまず使わないと思うよ。
環境によっちゃRAMやスタックの使用量を監視しながらデバッグすることだってあるし。
0252デフォルトの名無しさん
2008/01/04(金) 02:10:510253デフォルトの名無しさん
2008/01/04(金) 02:31:05組込みのソフトが何で開発されたか、なんて普通表に出てこないから。
詳しくは言えないが、おまいらの目に触れるところで
C++(全部ではないが)使って作られたもの知ってるよ。
0254デフォルトの名無しさん
2008/01/04(金) 05:42:170255デフォルトの名無しさん
2008/01/04(金) 10:49:14http://pc11.2ch.net/test/read.cgi/tech/1190261457/
からの誘導で来ました。
===========
仕様:
1. UNIXのcronみたいに特定の時間になるとある処理を実行させる
2. そのプログラム自体はdaemonとしてずっと走り続けている
こういうことをLinux上でやりたいんですが、
sleepかalertを使って、
希望の時間になったかを調べ続けるしかないですかね。
何か普通はこうやるよってのあります?
1分に1回温度を測定するプログラムです。
0256デフォルトの名無しさん
2008/01/04(金) 11:15:110257デフォルトの名無しさん
2008/01/04(金) 11:18:46cron使うわけにはいかないの?
どうしてもプログラム内で完結したいなら、alarm()かsetitimer()だろうね。sleep()でもできなくはないけど。
残念ながら、alert()なんてのは知らん。
0258デフォルトの名無しさん
2008/01/04(金) 11:19:15Sleepってなんですか?
0259デフォルトの名無しさん
2008/01/04(金) 11:35:19レスありがとうございます。
やっぱりそうなりますか。
alertじゃなくてalarmでした。
0260デフォルトの名無しさん
2008/01/04(金) 12:11:270261デフォルトの名無しさん
2008/01/04(金) 12:19:000262デフォルトの名無しさん
2008/01/04(金) 13:27:420263デフォルトの名無しさん
2008/01/04(金) 14:51:41引っ越す前から見てるんだけど
時間の分解能を定義してないのはなぜよ?
sleep とか alam でやれば当然誤差累積だし…
精度とか確度とかって数学の時間に習わなかったか?
0264デフォルトの名無しさん
2008/01/04(金) 15:09:030265デフォルトの名無しさん
2008/01/04(金) 15:19:32些末な問題だから。
0266255
2008/01/04(金) 17:22:32引っ越し前からの長期に渡る応援ありがとうございます!
精度は1秒あればOKです。
sleepにせよ、alarmにせよ、
仕掛ける前にtime_tを取ってきて、
それから逆算してやろうかなと思っててわざわざ書きませんでした。
数学は得意です。
自分で微分を発明しました(`・ω・´)シャキーン
0267デフォルトの名無しさん
2008/01/04(金) 17:39:020268デフォルトの名無しさん
2008/01/04(金) 18:13:590269デフォルトの名無しさん
2008/01/04(金) 18:45:21どこに引っ越したんだ?
0270デフォルトの名無しさん
2008/01/04(金) 19:44:390271デフォルトの名無しさん
2008/01/05(土) 03:46:06引数にポインタをとる関数があるのだが
このポインタのアドレスを自動変数のものに書き換えるのはNG
このポインタに自動変数を代入するのはOK
でいいんだよね
0272デフォルトの名無しさん
2008/01/05(土) 03:49:55ごめん、読解できない
0273デフォルトの名無しさん
2008/01/05(土) 03:53:50a(int* p)
{
int local = 10; //適当
p = &local; //NG
*p = local; //これはどうだったっけ?
}
0274デフォルトの名無しさん
2008/01/05(土) 03:59:04//これはどうだっけ?
OKだよ。 ってか、なんでこの程度の事が分からん。
//NG
これの理由は説明できるか?
0275デフォルトの名無しさん
2008/01/05(土) 04:00:36*p = local; //これはどうだったっけ?
問題ない
pの指す領域に10の値が代入される
pがもつ10の値と、localが持つ10の値は、それぞれ別の領域に格納されている状態になる
0276デフォルトの名無しさん
2008/01/05(土) 04:01:11あれだ、auto変数は関数から脱出した瞬間ナイナイされちゃうからな
するとポインタpは意味の無いところを示してしまうのでエラーになるんだ
0277デフォルトの名無しさん
2008/01/05(土) 04:12:09説明ありがとう
今日はもう休もうorz
0278デフォルトの名無しさん
2008/01/05(土) 08:30:54例えば
文字列が入った変数 MOJI[]="aaabbbccc\0" 指定の文字列="bbb"だと
MOJI→他の変数へaaaccc\0をコピー
できれば
aaabbbccc→ポインタ使ってMOJI自身をaaaccc\0に
ってしたいんだけど、どのようにすればいい?
0279デフォルトの名無しさん
2008/01/05(土) 08:35:580280デフォルトの名無しさん
2008/01/05(土) 08:57:360281デフォルトの名無しさん
2008/01/05(土) 09:04:56{
if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return;
char const * p = strstr(a, b);
if (p == NULL) return;
char tmp[strlen(a) + 1];
sprintf(tmp, "%.*s%s", p - a, a, p + strlen(b));
strcpy(a, tmp);
}
char MOJI[] = "aaabbbccc";
char * b = "bbb";
func(MOJI, b);
但し、"aaabbbccc\0"はナンセンスなんで"aaabbbccc"に変更済み
0282デフォルトの名無しさん
2008/01/05(土) 09:06:01馬鹿がいる。
>char tmp[strlen(a) + 1];
c99使いがいる。
# つーか、一時領域要らないだろw
0283281
2008/01/05(土) 09:10:17確かに一時領域要らなかった。
>>278
ってことで、訂正。これでc89でも大丈夫。
void func(char * a, char const * b)
{
if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return;
char const * p = strstr(a, b);
if (p == NULL) return;
strcpy(p, p + strlen(b));
}
0284デフォルトの名無しさん
2008/01/05(土) 09:13:58いや、未だc89じゃ通らないし。つーか、char const * pじゃなくてchar * pだろよ。
0285デフォルトの名無しさん
2008/01/05(土) 09:28:25strcpyでコピー範囲が重なってるから動作が未定義になるぞ。
0286デフォルトの名無しさん
2008/01/05(土) 09:35:26さらに言えば指定文字列を取り除いた後に前後の文字列がくっついて取り除くべき指定文字列になる可能性も。
ex. aabbcからabを取り除くとabcになって再度abが出現。
0287デフォルトの名無しさん
2008/01/05(土) 10:05:44実はURLからime.nu/を消したかっただけなんでこんな感じでまとめたみた
if(NULL!=strstr(url,"ime.nu/")){
char *buf;
buf=strstr(url,"ime.nu/");
url[strlen(url)-strlen(buf)]='\0';
buf+=strlen("ime.nu/");
strcat(url,buf);
}
0288デフォルトの名無しさん
2008/01/05(土) 10:27:580289デフォルトの名無しさん
2008/01/05(土) 11:18:35ポインタpも関数から脱出した瞬間ナイナイされるので安全。
0290デフォルトの名無しさん
2008/01/05(土) 11:21:28未定義には違いないけど。
0291デフォルトの名無しさん
2008/01/05(土) 14:10:38>p = &local; //NG
これもOKだよ
よく考えろ、pもローカル変数だ
0292デフォルトの名無しさん
2008/01/05(土) 14:32:16ほう?
void TestFunc(int* p)
{
int x = 10;
p = &x;
}
int main(int argc, char* argv[])
{
int a;
TestFunc(&a);
printf("%d\n", a);
return 0;
}
0293デフォルトの名無しさん
2008/01/05(土) 14:44:20そういう話をしてるんじゃないと思うが。
0294デフォルトの名無しさん
2008/01/05(土) 14:45:200295デフォルトの名無しさん
2008/01/05(土) 14:52:06君が何を言いたいのか分からない
要するに、そのコードがどうした?
何か問題でも?
0296デフォルトの名無しさん
2008/01/05(土) 14:59:12void TestFunc(int* p)
{
int x = 10;
p = &x;
}
int main(int argc, char* argv[])
{
int a = 5;
TestFunc(&a);
printf("%d\n", a);
return 0;
}
出力結果
5
0297292
2008/01/05(土) 15:00:490298デフォルトの名無しさん
2008/01/05(土) 15:10:580299デフォルトの名無しさん
2008/01/05(土) 15:14:170300デフォルトの名無しさん
2008/01/05(土) 15:15:17int* f()
{
int a = 10;
return &a; // NG
}
特に構造体とか大きいものを返したいときに、
コストを避けようとしてやってしまう人もいるかも。
素直に値で返すか、引数に格納先のポインタを貰うべし。
0301デフォルトの名無しさん
2008/01/05(土) 15:21:000302デフォルトの名無しさん
2008/01/05(土) 15:24:48動的確保するならauto_ptrですな。
std::auto_ptr<int> f()
{
return std::auto_ptr<int>( new int(10) );
}
0303デフォルトの名無しさん
2008/01/05(土) 15:25:07ただしdelete忘れるとメモリリークが起こるから注意(´・ω・)
0304デフォルトの名無しさん
2008/01/05(土) 18:52:20二次元配列の動的確保なのですが、
TCHAR hoge[5][260];
のような時に5の部分だけ動的に確保して260の方は固定したいのですが、
TCHAR *hoge[260];
hoge = (TCHAR *)malloc(sizeof(TCHAR)*260*num);
のようにすると、"'char *'から'char *[260]'に変換することはできません"とコンパイルエラー吐きます。
TCHAR **hoge;
で最初から動的確保を2度行う方法は分かるのですが、片方を固定した場合どのようにすべきでしょうか。
0305デフォルトの名無しさん
2008/01/05(土) 18:54:060306デフォルトの名無しさん
2008/01/05(土) 18:54:470307デフォルトの名無しさん
2008/01/05(土) 18:54:58を
sizeof(hoge)
にするとどうなる?
0308デフォルトの名無しさん
2008/01/05(土) 18:55:45hoge = (TCHAR (*)[260])malloc(sizeof(*hoge)*num);
0309デフォルトの名無しさん
2008/01/05(土) 19:02:05typedef TCHAR Path[MAX_PATH];
Path *hoge;
hoge = (Path *)malloc(sizeof (Path) * num);
0310304
2008/01/05(土) 19:23:37>>307
そうすると、後者の場合は戻り値が4になりました。
何故かsizeof(TCHAR)だと1でした。何故2じゃないのだろう・・・。Unicodeじゃないからかな・・・??
>>305-306
のように間接参照演算子を括弧でくくると上手くコンパイルも通り、
for(i = 0 ; i < max ; i++) hoge[i] = "test";
と動作も確認出来ました。
>>309
のようにtypedefのやり方もググって見つけたのですが、
直接的にどうやれば通るか知りたかったもので。。 やはり、typedefの方が分かりやすいですね。
0311デフォルトの名無しさん
2008/01/05(土) 19:30:570312デフォルトの名無しさん
2008/01/05(土) 19:35:03TCHARはマクロでワイド文字(wchar_t)とマルチバイト文字(char)を切り替える
VCならプロパティからUnicode文字セットを使用するようにすればワイド文字になる
後"test";は_T("test");もしくはTEXT("test");って書くように。そうすれば切替の対象になるから。
0313デフォルトの名無しさん
2008/01/05(土) 21:29:06typedef struct { TCHAR str[260]; } Path;
Path* hoge = (Path*)malloc(sizeof(Path) * num);
煩雑かな。
0314デフォルトの名無しさん
2008/01/06(日) 00:18:19int *p[10]だとint型のポインタが10個あるポインタの配列
int a[10][10]とかの多次元配列へのポインタなら int (*p)[10]
0315デフォルトの名無しさん
2008/01/06(日) 00:55:570316デフォルトの名無しさん
2008/01/06(日) 00:56:340317デフォルトの名無しさん
2008/01/06(日) 00:59:19return 0;
}
多分これが一番分かりやすい
0318デフォルトの名無しさん
2008/01/06(日) 01:48:10printfでテキスト文を表示したいんですけど
どうすればいいんでしょうか。
0319デフォルトの名無しさん
2008/01/06(日) 01:49:48http://pc11.2ch.net/test/read.cgi/tech/1187922645/
0320デフォルトの名無しさん
2008/01/06(日) 02:15:160321デフォルトの名無しさん
2008/01/06(日) 02:28:04できれば背景が白い所に分かりやすく表示させたい。
マジレスきぼんぬ。
0322デフォルトの名無しさん
2008/01/06(日) 02:34:030323デフォルトの名無しさん
2008/01/06(日) 02:48:13#include <stdlib.h>
system( ); で、適当に
コマンドの命令だが、
color F0
とか
#define color(x) printf("\033[%dm", x + 30);
MS使用だったかも知れないが。
system("notepad.exe puni.cpp");
詳しくは調べて
0324304
2008/01/06(日) 02:57:35それを観て何となく納得出来ました。
キャストが初めて観るので、もうちょっと弄ってみます。
レスくれた皆さんありがとうございました。
0325デフォルトの名無しさん
2008/01/06(日) 05:36:09以下の(A)で生成した snow は、
(B)で問題なく解放されているのでしょうか?
void procMain()
{
Snow ***snow = NULL;
int i, j;
// 生成 ←(A)
snow = new Snow**[10];
for ( i = 0; i < 10; i++ ) {
snow[i] = new Snow*[5];
for ( j = 0; j < 5; j++ ) {
snow[i][j] = new Snow();
}
}
// 解放 ←(B)
for ( i = 0; i < 10; i++ ) {
for ( j = 0; j < 5; j++ ) {
delete snow[i][j];
}
delete snow[i];
}
delete snow;
}
下2つの delete が delete[] の様な気もしますが、
判る方がいましたらよろしくお願いします。
0326デフォルトの名無しさん
2008/01/06(日) 05:49:38ファイルに出力した後にそのファイルを開けばいい。
fp=fopen("test.txt","r");
fprintf(fp,"hoge");
fclose(fp);
system("test.txt");
0327デフォルトの名無しさん
2008/01/06(日) 06:32:15new [] 使ってるから delete [] だろうね。
こういうのはややこしくなるから、
フラットな配列にして添え字は掛け算するのがシンプルでいい。
Snow *snow = new Snow[10*5];
for (int i = 0; i < 10; i++ ) for (int j = 0; j < 5; j++ ) snow[i*5+j].xxx();
delete [] snow;
0328デフォルトの名無しさん
2008/01/06(日) 06:40:43>>318でエディションがPersonal以外ならOutputDebugString。イベントタブに出力される
0330デフォルトの名無しさん
2008/01/06(日) 11:33:30全然関係ないが、自分が一番最初に見たC++のサンプルはこれだ。
#include <iostream>
int main(int argc, char *argv) {
std::cout << "Hello World !" << std::endl;
return 0;
}
ついでに、一番最初に聞いたクラスの説明は
猫も人もみな哺乳類なのです
だ。
0331デフォルトの名無しさん
2008/01/06(日) 11:48:57mainの引数もまともに書かないとは、悪いサンプルだな。
0332デフォルトの名無しさん
2008/01/06(日) 12:42:49static char _main[] = { 0x81, 0x21, ...., 0x21 }
PDPほにゃらら専用とかかいてあった
0333デフォルトの名無しさん
2008/01/06(日) 14:01:44多くがひとつの.cppファイルにまとまってるようなコードや、グローバル変数が多いソースで、
それを元にコードを打ち始めたらひとつのファイルに何千行というコードが入り、設定情報
をグローバル変数で共有するような気持ち悪いコードになってしまいました。
Win32を用いたコードでうまくOOPの概念を取り入れて、出来るだけすっきりとしたコードを書きたいのですが、
なにかアドバイスがあればご教授願います。
0334デフォルトの名無しさん
2008/01/06(日) 14:08:520335デフォルトの名無しさん
2008/01/06(日) 14:19:46Win32API 直叩きじゃなくて、MFCや.NET Framework使ったほうが良いよ。
0336デフォルトの名無しさん
2008/01/06(日) 14:21:160337デフォルトの名無しさん
2008/01/06(日) 14:48:050338デフォルトの名無しさん
2008/01/06(日) 15:25:170339デフォルトの名無しさん
2008/01/06(日) 16:29:280340333
2008/01/06(日) 16:30:59どうやらMFCってのがうまくAPIを纏めているようなのでそれを使いたいと思います・・・
0341デフォルトの名無しさん
2008/01/06(日) 16:37:27それ欲しい。是非に
0342デフォルトの名無しさん
2008/01/06(日) 16:58:12文字列クラスには是非sprintfメソッドを
0343デフォルトの名無しさん
2008/01/06(日) 19:06:34AAA, BBB, CCCという3つのvector型があって、
それらの要素AAA[index], BBB[index], CCC[index] (indexは全て共通の整数)を一括削除したいのですが、
下記のような冗長な構文になってしまいます。
消したい対象DDD, EEE, FFFが増えていくと、プログラムが非常に長くなってしまうのですが、
イテレーターaaa, bbb, cccを極力使用せずにコンパクトに記述する方法は無いでしょうか・
vector<double>::iterator aaa; aaa = AAA.begin();
vector<int>::iterator bbb; bbb = BBB.begin();
vector<string>::iterator ccc; ccc=CCC.begin();
for(int a=0;a<index;a++) { aaa++; bbb++; ccc++; }
AAA.erase(aaa);
BBB.erase(bbb);
CCC.erase(ccc);
0344デフォルトの名無しさん
2008/01/06(日) 19:21:25いや、少なくともfor文はいらなくね?advance使えば?
というより、こういうのは思いっきりtemplateの出番だと思うんだが。
0345デフォルトの名無しさん
2008/01/06(日) 19:24:03そもそもデータ構造を
struct Hoge {
double d; int n; string s;
};
vector<Hoge> hoge;
とできないの?
ちなみにvector<>::iteratorはランダムアクセスできるので
AAA.erase(AAA.begin()+index)でOK
0346デフォルトの名無しさん
2008/01/06(日) 19:29:51>>345
ありがとうございます。
既にクラスの階層構造を何段か組んでいるので、これ以上階層化するのは避けたいと思いまして。
最後の1行の場合、indexがint型だからコンパイルエラーにならないでしょうか?
0347デフォルトの名無しさん
2008/01/06(日) 19:35:34RamdomAccessIteratorなら加算がオーバーロードされてるからおk
0348343
2008/01/06(日) 19:35:53AAA.erase(AAA.begin()+index)
0349デフォルトの名無しさん
2008/01/06(日) 19:36:13重ね重ねありがとうございますm(_ _)m
0350デフォルトの名無しさん
2008/01/06(日) 19:52:25から始まる基本関数で
何か表示する物はあるんでしょうか。
0351デフォルトの名無しさん
2008/01/06(日) 20:02:22AAA.erase( AAA.begin() + index );
BBB.erase( BBB.begin() + index );
CCC.erase( CCC.begin() + index );
でいいんじゃね?
0352デフォルトの名無しさん
2008/01/06(日) 20:04:09コンパイラの設定でブリーダーができません。
0353デフォルトの名無しさん
2008/01/06(日) 20:05:490354デフォルトの名無しさん
2008/01/06(日) 20:08:28テンプレート:クラスみたいなもん
STL:テンプレートのあつまり
みたいな認識ってまちがっていますか?
0355デフォルトの名無しさん
2008/01/06(日) 20:10:15間違ってる
0356デフォルトの名無しさん
2008/01/06(日) 20:35:34気にしなくて良いレベルなのだと思いますが
引数にaとbを取り、大きな方を返す関数テンプレートがあったとします。
この場合、大きい値を返す関数のint用のものfloat用のもの・・・・といった具合にたくさんの関数を用意するのとでは
どちらが良いのでしょうか?
ここで関数テンプレートを使うとなんというかもったいないというか処理が無駄に大きく膨らんでいる気がしてならないです
今すぐに想像はできないのですが、ここでいう大小を比べる程度のものでなく、もっと大きなものならば関数テンプレートが有効だとは思います
0357デフォルトの名無しさん
2008/01/06(日) 20:36:29つまり処理数が多いものならば関数テンプレートを利用した方が良い、などの明確だったりしないまでの決まりのようなものはあるのでしょうか?
0358デフォルトの名無しさん
2008/01/06(日) 20:38:53何で?
ぜんぜんもったいなくないと思うけど。
呼び出されてる型のものだけが具体化されるから
効率的だと思うし、実際std::maxテンプレートはあるじゃない。
0359デフォルトの名無しさん
2008/01/06(日) 20:40:57>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
これが面倒じゃないと思うならがんばれば?
0361デフォルトの名無しさん
2008/01/06(日) 21:03:260362デフォルトの名無しさん
2008/01/06(日) 21:06:46356は例えばで言ってるだけだろ
0363デフォルトの名無しさん
2008/01/06(日) 21:14:07おかしくないです。出てくるコードの大きさを見積もることは必要なことです。
0364デフォルトの名無しさん
2008/01/06(日) 21:17:24>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
保守性を考えるとこの考え方はは良くない。
バグがあったら全部直さなきゃいけないし、直し忘れが出てくる可能性がある。
ステップ数が少ない場合でも、バグが出るときは出る。
こういう場合を想定してテンプレートが出てきたわけだし。
0365デフォルトの名無しさん
2008/01/06(日) 22:00:30俺も会社でよく言われるんだわ
0366デフォルトの名無しさん
2008/01/06(日) 22:04:310367デフォルトの名無しさん
2008/01/06(日) 22:07:180368デフォルトの名無しさん
2008/01/06(日) 22:13:00組み込み環境なら結構致命的になりかねん気もするけど、それならC++にするメリット少ないし。
一般的なソフトウェアならCDやDVDに入りきらなくなったらとかじゃないのかな?
0369デフォルトの名無しさん
2008/01/06(日) 22:13:48似たような物作るわけだしな。
0370デフォルトの名無しさん
2008/01/06(日) 22:34:36昔のコンパイラは知らないけど、信じがたい。
具現化されるのは自分で呼び出してるものだけだから。
インライン化とか別の理由で大きいんでない?
それともテンプレート使わなくても、もともとバカでかく
なるプログラムかもしれん。
0371デフォルトの名無しさん
2008/01/06(日) 22:43:46大きなクラスを丸ごとテンプレートにしたんじゃないか?
0372デフォルトの名無しさん
2008/01/06(日) 22:44:170373デフォルトの名無しさん
2008/01/06(日) 23:01:42できませんでした。
どうしたもんでしょう。
0374デフォルトの名無しさん
2008/01/06(日) 23:04:360375デフォルトの名無しさん
2008/01/06(日) 23:07:35持たせたファイルポインタからファイルネームを得たいんでファイルポインタからメンバーを見てみたら
tmpfnameってのがあったけど、このtmpfnameってそのファイルの名前と考えておk?
あと、これって環境依存?
0376デフォルトの名無しさん
2008/01/06(日) 23:12:350377デフォルトの名無しさん
2008/01/06(日) 23:12:590378デフォルトの名無しさん
2008/01/06(日) 23:15:56ありがとうございました。
別の方法で管理することにします。
0379デフォルトの名無しさん
2008/01/06(日) 23:36:51main関数で用意したdouble *xを別の関数の中でmallocを使ってサイズを決めることと数値の代入を行いたいのですが上手く出来ません
どのようにすればいいでしょうか
以下は自分で作ったものの該当部分だけを抜き出し簡略化したものです
#include<stdio.h>
#include<stdlib.h>
void f(double *);
void main(void)
{
double *x;
f(x);
free(x);
}
void f(double *a)
{
a=(double *)malloc(sizeof(double)*3);
if(a==NULL){
printf("メモリ確保失敗\n");
exit(1);
}
a[1]=2.0;
}
0380デフォルトの名無しさん
2008/01/06(日) 23:40:52そのポインタを関数の中で書き換えてもmainじゃ影響されないから引数消して返り値使うとか、
ポインタのポインタを引数でとるかのどっちか。
0381デフォルトの名無しさん
2008/01/06(日) 23:41:45そりゃ、上手くいかんわ。
void f(double **);
void main(void)
{
double *x;
f(&x);
free(x);
}
void f(double **a)
{
*a=(double *)malloc(sizeof(double)*3);
if(*a==NULL){
printf("メモリ確保失敗\n");
exit(1);
}
*a[1]=2.0;
}
全く試してないけど、これでどうよ?
0382デフォルトの名無しさん
2008/01/07(月) 00:01:18俺も全く試してないけど
>*a[1]=2.0;
なんか嫌な臭いがする。
優先順位、これでよかったっけ?
0383デフォルトの名無しさん
2008/01/07(月) 00:04:54(・A・)イクナイ!!
0384デフォルトの名無しさん
2008/01/07(月) 00:07:09やりたいのは(*a)[1]か?
0385デフォルトの名無しさん
2008/01/07(月) 00:12:12どうもありがとうございます。
>>381を>>384に変更したものを使えば上手くいきました
0386デフォルトの名無しさん
2008/01/07(月) 00:38:10fscanf(fp,"%lf %lf",&m[i],&n[i]);
}
↑の状態でビルドして実行するとエラーが出る
for(i=0;i<N;i++){
fscanf(fp,"%lf %lf",&m[i],&n[i]);
printf("%f %f\n",m[i],n[i]);
}
次に↑のように書き換えてビルドして実行するとエラーが出ない
for(i=0;i<N;i++){
fscanf(fp,"%lf %lf",&m[i],&n[i]);
}
その後で↑の状態に戻してからビルドして実行すると最初と同じなのにエラーが出なくなっている
こういったことが起こるのはどのような理由でしょうか
0387デフォルトの名無しさん
2008/01/07(月) 00:45:18エラーの内容を書くとか
そういう努力をしないとエスパー以外答えられないと思うよ
0388デフォルトの名無しさん
2008/01/07(月) 01:44:26ファイル内に改行があってfscanfが2回目以降読み込みに失敗している。
0389デフォルトの名無しさん
2008/01/07(月) 03:26:270390デフォルトの名無しさん
2008/01/07(月) 05:17:35優先順位って難しいね.
みんなちゃんと覚えてるの?
0391デフォルトの名無しさん
2008/01/07(月) 06:18:31改めて、こちらで質問させて下さい。
まず、フラッシュメモリにデータを書き込みます。
そしてそのデータが書き込まれたセクタ?(アドレス?)を取得する方法ってありますでしょうか?
0392デフォルトの名無しさん
2008/01/07(月) 06:35:09少なくともCレベルじゃメモリアドレスしかわからんだろうから無理じゃね?
OSレベルの話になるね。
0393デフォルトの名無しさん
2008/01/07(月) 07:00:26そうですか…
かなり難しいようですね…
環境は、Win32(XP Pro) + VC++ なんですけど…
0394デフォルトの名無しさん
2008/01/07(月) 07:04:390395デフォルトの名無しさん
2008/01/07(月) 07:22:43http://technet.microsoft.com/en-us/sysinternals/bb897427.aspx
デフラグ用のAPIではだめかい?
0396393
2008/01/07(月) 07:56:40助言ありがとうございます。
がんばって調べてみます!
とりあえず、395さんの紹介して頂いたページを見てみたいと思います。
0397デフォルトの名無しさん
2008/01/07(月) 08:07:54自信ない使い方をするときに括弧使えばいいだけだろ。
0398デフォルトの名無しさん
2008/01/07(月) 10:10:50考えるのがめんどくさいので、常に括弧付。
可読性も向上。
0399デフォルトの名無しさん
2008/01/07(月) 13:25:53int a = (b + (c * d)) - e;とか書くの? 却って可読性が落ちる希ガス。
0400デフォルトの名無しさん
2008/01/07(月) 13:27:270401デフォルトの名無しさん
2008/01/07(月) 14:24:29煽りとしてはどうかなあ?
0402デフォルトの名無しさん
2008/01/07(月) 14:34:460403デフォルトの名無しさん
2008/01/07(月) 14:43:02だからきっと、
a = (b = (c = 0));
って書くんだよ。
0404デフォルトの名無しさん
2008/01/07(月) 14:43:30ぶっちゃけa = b + c * d - eよりはよっぽどわかりやすい
0405デフォルトの名無しさん
2008/01/07(月) 14:45:20a = b + (c * d) - e
だな。
順読み以外は括弧付ける派。
0406デフォルトの名無しさん
2008/01/07(月) 14:46:15a = c * d + b - e
0407デフォルトの名無しさん
2008/01/07(月) 15:13:450408デフォルトの名無しさん
2008/01/07(月) 15:20:45今C言語を勉強しようか考えている所なのですが
これを学ぶ事によって、ボンバーマンのようなゲームは作成可能でしょうか?
また作れると仮定しまして、C言語よりボンバーマンのようなゲームを作るのが
簡単な言語はありますでしょうか?
もしよろしければ教えてください、お願いします。
0409デフォルトの名無しさん
2008/01/07(月) 15:29:34英語を学ぶことによってマクベスを書くことは可能かどうか、
英語で書くより簡単な言語はあるかと聞くくらい、無意味だ。
こっちにでも逝け。
初心者のためのプログラミング言語ガイド Part6
http://pc11.2ch.net/test/read.cgi/tech/1193132235/
0410デフォルトの名無しさん
2008/01/07(月) 15:52:46どんな言語でも何かを作る時apiや構文等の知識は必要となり
簡単ていう概念はとっぱらったほうがいい。
どんなもんでもある程度確立した物を作るのはめんどうなもんだ。
0411デフォルトの名無しさん
2008/01/07(月) 16:06:29簡単と言う発言は軽率でした
言語にも向き不向きがあるかと思ったので、
より作りやすいと言う意味でした
それでは誘導先に行ってきますので、
こちらでの質問は取り下げさせてください
0412デフォルトの名無しさん
2008/01/07(月) 22:33:270413デフォルトの名無しさん
2008/01/07(月) 22:52:17おっさん乙
0414デフォルトの名無しさん
2008/01/08(火) 01:33:25basic_istream<>やbasic_ostream<>はbasic_streambuf<>
を利用してバッファ入出力を行ってますが、継承はして
ないですよね?basic_istream<>やbasic_ostream<>は
コンポジションとしてbasic_streambuf<>を保持してるのですか?
0415デフォルトの名無しさん
2008/01/08(火) 02:45:310416デフォルトの名無しさん
2008/01/08(火) 02:47:090417デフォルトの名無しさん
2008/01/08(火) 03:01:570418デフォルトの名無しさん
2008/01/08(火) 03:45:00「いじる」ってのをどういう意味で使ってるのかよく分からんが
JPEG<=>ビットマップの変換は古いというか普通ライブラリを使う
0419デフォルトの名無しさん
2008/01/08(火) 04:01:05{
return (0xA1 <= c && c<=0xfe)
}
0420デフォルトの名無しさん
2008/01/08(火) 05:28:11メンバ変数に配列を持つ構造体のベクタにするしかないんでしょうか
0421デフォルトの名無しさん
2008/01/08(火) 05:53:22int[10]は型じゃないっしょ?
0422デフォルトの名無しさん
2008/01/08(火) 07:23:33EUC の1バイト目はもうちょっと範囲広いし、
3バイト文字も存在する。
0423デフォルトの名無しさん
2008/01/08(火) 07:49:190424デフォルトの名無しさん
2008/01/08(火) 11:52:47int[10] は要素数 10 の int の配列型だよ。でもコピーコンストラクタや代入演算子が
使えないんで vector には入れられない。 >420 の言うような回避方法が必要。
0425デフォルトの名無しさん
2008/01/08(火) 12:50:52次の値を書き込むというのをやりたいんですが、こういったことをやる場合、
ifstreamで読み込んでいってデータを見つけたら位置を取得→
ofstreamを使って取得した位置に書き込みという風にやらないといけないのでしょうか?
0426デフォルトの名無しさん
2008/01/08(火) 12:55:28C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
データの挿入もこれに当てはまる。(ただし元の内容の後ろに追記はできる。)
ってことで新しいデータを含んだファイルの内容を全部 ofstream に突っ込むことが必要。
0427デフォルトの名無しさん
2008/01/08(火) 13:09:13std::vector<int(*)[10]>とか
0428デフォルトの名無しさん
2008/01/08(火) 13:14:32入出力を別のファイルにしておいて、入力データが「FFとい」だったら
それを出力する前に「次の値」を出力すればよろしい。
一つのファイルでそれを実現するのは、(サイズが変わるのであれば)むずかしい。
0429デフォルトの名無しさん
2008/01/08(火) 13:15:37>C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
いいえ。
0430426
2008/01/08(火) 13:23:520431デフォルトの名無しさん
2008/01/08(火) 13:31:44ありがとうございます。勉強になりました。
バイト配列にデータを全部読み込んで、配列をFFの一つ前のデータまで書き込んで→
新しい値を書き込んで→残りの配列を書き込む という方法でやりたいと思いますm(_ _)m
0432デフォルトの名無しさん
2008/01/08(火) 14:51:17istreambuf_iteratorとostreambuf_iterator使うと簡単にできそうだな。
速いし。
0433デフォルトの名無しさん
2008/01/08(火) 17:39:27プログラム内でそのドライバを作用させる方法をご教授願えないでしょうか
環境は.net 2003 c++です
0434デフォルトの名無しさん
2008/01/08(火) 18:36:440435デフォルトの名無しさん
2008/01/08(火) 20:05:46ezstreamというクラスを作って、
string line;
ezstream es;
es.setline("yes");
es.setline("no");
line = es.getline();
と書けば、line=の行でreadline風の動作(ヒストリなどカーソルキー使用可能、ctrl+aなどのemacs風キーバインドも最低限使用可能)
をするところまでは書き上がりました(tab補完はまだですが……)。上の記述では、さらに起動時点でヒストリにyesとnoが入っています。
(つまり、↑を押せばno,yesの順にコマンドラインに出てくる)
で、せっかくなので
ezstream es;
es << "yes";
es << "no";
es >> line;
と記述出来るようにしたいと思っています。
template<class E, class T = char_traits<E> >
class basic_ioestream : public basic_iostream< E, T >{
private:
hogehogehoge;
public:
string getline(void);
string setline(void);
basic_ioestream& operator>>(……
ここで詰まったのですが、どう書けば良いのでしょうか。
それとも>>のオーバーロードだけすれば済むような単純な話ではないのでしょうか?
0436デフォルトの名無しさん
2008/01/08(火) 20:23:50Boost.Iostreamsを使うのが楽。
http://www.kmonos.net/alang/boost/classes/iostreams.html
それを使いたくなければ、ググれ。
http://www.google.co.jp/search?q=iostream+%E6%8B%A1%E5%BC%B5
0437デフォルトの名無しさん
2008/01/08(火) 21:00:35コンパイルしようとするとエラーが出てしまいます。
ソース-----------------
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp;
char *line = NULL;
size_t len = 0;
while (getline(&line, &len, stdin) != -1) {
printf("%s", line);
}
if (line)
free(line);
exit(EXIT_SUCCESS);
}
----------------------
エラーメッセージ--------
Undefined symbols:
"_getline", referenced from:
_main in ccm08hLk.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
----------------------
getline関数関連のエラーなのですが、ネットを検索していると次のような記述を発見しました。
『MacのGCCはGNUのに手を入れてあるのでstdio.hにgetlineがない』
getlineを使用してコンパイルを成功させるには環境をどのようにすれば良いのでしょうか。
0438デフォルトの名無しさん
2008/01/08(火) 21:09:10勉強になるから作ってしまおう
0439437
2008/01/08(火) 21:18:41使用するソースコードは既に用意されているので、(非常に長いソースコードです)
できればソースコードをいじらないでコンパイルしたいのです。
0440デフォルトの名無しさん
2008/01/08(火) 21:25:02まずどの環境のどのコンパイラをターゲットに書かれたソースか調べる。
0441デフォルトの名無しさん
2008/01/08(火) 21:25:12別のファイルに関数を作ればいいから、ソース変更しなくてもいいよ。
0442デフォルトの名無しさん
2008/01/08(火) 21:58:11eucJP-ms
0443433
2008/01/08(火) 22:40:06VFWを使っていますので残念ながらDirectShowを使うことができません
カメラをUSBポートから引っこ抜いてから再度差し
カメラを動作させるといったことをしたいのですが…
0444デフォルトの名無しさん
2008/01/08(火) 22:50:30ソースコードにどうやって埋め込むのがスマートでしょうか??
0445デフォルトの名無しさん
2008/01/08(火) 23:25:19public:
const std::map<A, B>& GetMap() {
static Hoge singleton;
return singleton.m_map;
}
private:
Hoge() {
// ここで初期化
}
std::map<A, B> m_map;
};
こんな感じか?
0446デフォルトの名無しさん
2008/01/09(水) 00:26:45それを実行するのにはコンパイラには何か必要なんですかね。
0447デフォルトの名無しさん
2008/01/09(水) 00:40:52日本語でおkだな。
コンパイルしたいのであればC++のコンパイルが可能なものであればなんでもいい。
コンパイラに必要なものが知りたいのであれば、ソースファイルだけあればいい。
0448デフォルトの名無しさん
2008/01/09(水) 00:45:13bcc developerを使ってC言語を勉強してるんですが、
#include ""DxLib.h"
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1)return(-1);
DrawBox(0,0,120,65535,TRUE);
WaitKey();
DxLib_End();
return(0);
}
と打ち込むと
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
となります。
いろいろ調べてみた結果Windows アプリケーション→コンソールアプリケーションに
チェックを変えると、
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
となり、やはりだめです。。
もうにっちもさっちもいきません。どなたかアドバイスお願いします
0449デフォルトの名無しさん
2008/01/09(水) 00:55:34コンパイルオプション -W
0450デフォルトの名無しさん
2008/01/09(水) 00:59:49よく分からんけど先頭行に
#include<windows.h>
でいけるかも
0451デフォルトの名無しさん
2008/01/09(水) 01:57:55ソート済み const 配列の形で定義して、 lower_bound() とかする関数を
インターフェースとしてかぶせとけばいいんじゃない?
0452448
2008/01/09(水) 02:06:46説明不足ですみませんでした。
とある参考書を使っていて、「DxLib」というファイルをインクルードして
進めていくらしく、それで#include"DxLib"となっているみたいです。
>>449-450
れすありがとうございます。
#include<windows.h> としたんですが、同じエラーがでました。
コンパイルオプションってどうやっていじるんでしょうか。
BCC developerのプロジェクト設定で
●コンソールアプリケーション(-WC)
Windowsアプリケーション(-W)
というようにチェックするところがあるんですが、
このことですか?
0453デフォルトの名無しさん
2008/01/09(水) 02:12:280454448
2008/01/09(水) 02:16:38根本的に間違ってるんでしょうか
0455デフォルトの名無しさん
2008/01/09(水) 02:29:52それなんてEffective(ry
0456デフォルトの名無しさん
2008/01/09(水) 02:38:20http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5704.zip
素直に、VC++とかにしてくれれば、話は早いんだが、まぁ、ゲーム作りたいやつは応援する主義なんでね。
0457448
2008/01/09(水) 02:54:28ありがとうございます!
さっそくやってみます
0458デフォルトの名無しさん
2008/01/09(水) 03:23:36とりあえず、VC++2005ExpressEditionを進めておく
http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/
の 「Visual C++ 2005 Express Edition」 日本語版 611,540 KB 0xB3AD1A2F を選択してダウンロード、
仮想ドライブでインストール、あるいは、一度CDに焼いてから、でもよい。
Win32APIを利用するためには、PlatformSDKが必要
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
ここの、最後のほうに、「PSDK-x86.exe 1.3 MB」と (Download) がある。
似たようなのが、3つあるが、一番下の(Download)を選ぶ。ダイアログが出ると保存なりしてくれ。
ダウンロードした exe を実行して指示に従えばよい。
参考ページ : http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
0459デフォルトの名無しさん
2008/01/09(水) 03:50:340460デフォルトの名無しさん
2008/01/09(水) 03:56:032次元、3次元配列をポインタにキャストして操作したいのですが、
以下のような操作は問題ないのでしょうか?
int* hoge = (int *)new int[2][3];
例えば、上のようにcastして、1次元配列のint[5]と同じように
操作しても問題ないでしょうか?
0461デフォルトの名無しさん
2008/01/09(水) 04:04:13ちょっとずれるかもしれないが、http://plaza.rakuten.co.jp/tcross/diary/200711230000/
キャストは、一日3回までだっていったでしょう。
できるだけキャストしないですむように組みましょう。
問題ありそうな気がする。試してないので、あれだけど。
0462デフォルトの名無しさん
2008/01/09(水) 04:07:530463デフォルトの名無しさん
2008/01/09(水) 04:10:49ライブラリのことならそりゃいっぱいあるよ
0464デフォルトの名無しさん
2008/01/09(水) 04:12:35CもC++も配列はあくまでも一次元。(多次元と表現するけど。)
今の場合は、int[3]を要素として二つ持つ一次元配列だから
int (*p)[3] = new int[2][3];
だと思う。
0465デフォルトの名無しさん
2008/01/09(水) 04:12:45断言できないが、簡単に試したら、問題なかった。
でも、気持ち悪いので、出来るだけキャストはやめて欲しい。
0466460
2008/01/09(水) 04:23:49>>464
>>465
みなさんありがとうございます。
できれば変なキャストはさけたいのですが、
呼び出さなければいけないDLLのメソッドが
int * で待ってまして、どうやって2次元配列、3次元配列を渡せば
よいのか悩んでおります。
(ちなみにFortranのDLL)
いちおう上のようなやりかた
int* hoge = new int[2][3];
で渡して動作しているよう?なのですが、
なにか動きがおかしいようです・・
メモリ的にはint[5]と同じなので、問題ないのかな?
とも思うのですが・・
0467デフォルトの名無しさん
2008/01/09(水) 04:39:050468460
2008/01/09(水) 04:41:41すみません、int[6]でした。
0469460
2008/01/09(水) 04:47:58ここをみると、
int x[10][10];
int i;
int *p = (int *)x;
for( i = 0; i < 100; i++ ) {
*p++ = i;
}
printf( "x[5][5] = %d\n", x[5][5] );
とあるので、どうやら問題なさそうですね・・。
でもC++でも問題ないのか、なぞですが・・。
0470デフォルトの名無しさん
2008/01/09(水) 04:58:32int (*p)[3] = new int[2][3]; にして&p[0][0]を渡せばいいんでない?
キャストしないとコンパイルエラーだし、コンパイルを通すための無理やり
キャストは正直気持ち悪い。
0471デフォルトの名無しさん
2008/01/09(水) 05:04:30いや待てよ。上の場合だと
delete [] hoge;
が未定義動作になる可能性がなきにしもあらずな気がしないでもない。
大丈夫かもしれんが移植性と規格を考えたら、>>470のほうが安心だな。
0472460
2008/01/09(水) 05:39:13ありがとうございます。そちらの方がやさそうですね。
ためしてみます。
ちなみに3次元配列の場合は
int (*c)[2][3]= new int[5][2][3];
のような感じですよね?
0473460
2008/01/09(水) 05:39:460474デフォルトの名無しさん
2008/01/09(水) 07:42:52オフセット計算用にこんな関数でも用意して。
static int offset(int w, int x, int y) {return w * y + x;}
0475デフォルトの名無しさん
2008/01/09(水) 10:47:37そう。
>>474
そう思う。
0476デフォルトの名無しさん
2008/01/09(水) 12:37:45俺は前にbccでWinMainの引数型不一致でコンパイル通らなかったことがある
詳しいことは忘れたが第三引数がTだったような、違うかったような
0477デフォルトの名無しさん
2008/01/09(水) 14:17:31自分で作ったデータを直接zipで保存する方法分かる人いませんか?
具体的に言うと
自分で作ったデータをファイルとして出力→7-zipでファイルを指定して圧縮 はできるのですが
圧縮範囲をポインタで指定→ファイル名を指定して書庫作成 ができないのです。
0478デフォルトの名無しさん
2008/01/09(水) 14:25:20ファイルアーカイバで、ファイル以外のものをアーカイブする機能があるとも思えないが。
そもそも、なんでファイルに出力しちゃいけないの?
0479デフォルトの名無しさん
2008/01/09(水) 14:30:51数が多いので出来ればいちいちアウトプットしたくないんです。
最悪 ファイル出力→書庫作成→ファイル消去
ってしようと思ってます。
やっぱりこういったdllには基本的にないんですかね?
0480デフォルトの名無しさん
2008/01/09(水) 14:40:170481デフォルトの名無しさん
2008/01/09(水) 14:51:380482デフォルトの名無しさん
2008/01/09(水) 14:52:077-zip32.dllのAPIリストを流し読みしてみたが、メモリソース展開用の関数は無いっぽい。
出力先はメモリで受け取れるみたいだけどなw
480が言ってるようにzlibなりを使うのも手。
(その場合他のアーカイバと互換性を持たせるのは少し面倒だが)
あとは7-zip32.dllのソースをいじってメモリソース対応版を作るのも良いかも。
該当箇所を探すのが少し面倒だろうけど。
0483デフォルトの名無しさん
2008/01/09(水) 15:27:16を修正すればメモリソースに対応できると思う。
あとは自分で調べるか詳しい人に聞いてね
0484デフォルトの名無しさん
2008/01/09(水) 16:58:56極端に言えば、昔の(今もあるけど)コマンドラインインターフェースを
そのままDLLに渡して動かすために作られたようなものだから。
各DLLに共通の操作を実現させるために、基本的な処理が中心だし。
だから、その元になるものを参考にすれば、大抵はオンメモリの操作になる。
例えば、TAR32.DLLではなくてzlibを使うとかね。
全てにそういうのがあるわけじゃないだろうけど。
0485デフォルトの名無しさん
2008/01/09(水) 17:44:08ライブラリ詰め合わせとかがあると便利なんですけど
誰かマジレスお願いします。
0486デフォルトの名無しさん
2008/01/09(水) 17:44:36//配列へのポインタ−−簡単な例
#include <stdio.h>
int main(void)
{
int a[4][10]; // 配列
int i, j;
int (*p)[10]; // 配列へのポインタ
//配列へ代入
for(i=0;i<4;i++) {
for(j=0;j<10;j++) {
a[i][j]=(i+1)+(j+1)*10;
}
}
//ポインタを使って表示する
for(p=a;p<a+4;p++) {
for(i=0;i<10;i++) {
printf("%3d ",(*p)[i]);
}
printf("\n");
}
return 0;
}
0487デフォルトの名無しさん
2008/01/09(水) 17:46:51そりゃいくらでもあるぞ。目的も環境も判らんからなんとも言えんが。
0488デフォルトの名無しさん
2008/01/09(水) 17:49:23割とまじめに答えたんだがな
存在するなら
欲しい機能名 ライブラリ
で適とーにぐぐれば見つかるだろ
いろんなライブラリが片っ端から詰め合わせてあるのが欲しいとか?w
ねーよwwwww
0489デフォルトの名無しさん
2008/01/09(水) 17:49:550490デフォルトの名無しさん
2008/01/09(水) 19:09:33Windowsにバッファフラッシュされないことを期待。
0491デフォルトの名無しさん
2008/01/09(水) 19:34:13ここ2、3年新しいライブラリとかは作られていないんですかね。
携帯全盛期でほとんどプログラム終わってると困るんですけど。
キャノンの説明受けに行くのでちょとでも関係あることあればいいんですけどね。
0492デフォルトの名無しさん
2008/01/09(水) 19:44:080493デフォルトの名無しさん
2008/01/09(水) 20:17:43VBしかないんでしょうか。
0494デフォルトの名無しさん
2008/01/09(水) 20:23:37今ならjavaとかが手軽でいいんじゃないか
0495デフォルトの名無しさん
2008/01/09(水) 20:31:41getch()でキーコード受け取ったら、カーソルキーが全部224で判別できないんです。
これをどうにかして識別する方法を教えてください。
別にgetchに拘らなくてもいいですが、出来ればC/C++の標準ライブラリに入っているものだと嬉しいです
0496デフォルトの名無しさん
2008/01/09(水) 20:38:13488が否定しているのは詰め合わせのようなものの存在を否定しているだけだぞ。
0497デフォルトの名無しさん
2008/01/09(水) 21:01:59そもそも getch は標準関数じゃない
0498デフォルトの名無しさん
2008/01/09(水) 21:11:49とりあえず「ゆきいるか」でググってLunaでも使っとけばいいと思う。
0499デフォルトの名無しさん
2008/01/09(水) 21:24:35Qt でも使ってみたら。
0500デフォルトの名無しさん
2008/01/09(水) 21:26:00カーソルキーは二つのコードが送られてくる気がする
224 が制御コードで続くコードでカーソル方向が判別できるはず
0501495
2008/01/09(水) 21:31:18>>498
あんまり外部のライブラリ使いたくなかったんです。ちょっと試しにやってみようかって程度だったので。
>>500
その発想は有りませんでした。試してみたら確かに取得出来ました!
0502デフォルトの名無しさん
2008/01/09(水) 21:40:54↑のページに書いてあるコードで、一度
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
と定義してから
#define new DEBUG_CLIENTBLOCK
と定義し直す意味って何かあるのでしょうか
0503デフォルトの名無しさん
2008/01/09(水) 21:59:540504デフォルトの名無しさん
2008/01/09(水) 22:01:23・CLI+Windows.Form
・VCL
0505デフォルトの名無しさん
2008/01/09(水) 22:38:12ヘッダファイル内で new が置換されると困るだろ?
0506デフォルトの名無しさん
2008/01/09(水) 22:39:460507デフォルトの名無しさん
2008/01/09(水) 23:05:08newを使うファイルでいちいち
#define new DEBUG_CLIENTBLOCK
を定義するのがめんどくさそうですね
0508デフォルトの名無しさん
2008/01/09(水) 23:06:40最後にインクルード。
0510デフォルトの名無しさん
2008/01/09(水) 23:14:350512476
2008/01/10(木) 00:03:07つまり少なくとも>>448みたいにCがついていないのじゃ関係無かったすまん
0513448
2008/01/10(木) 00:14:320514デフォルトの名無しさん
2008/01/10(木) 00:22:38よかった。まだ見てたか。将来、今までにない斬新なゲームを作ってくれ。
こういうことは、ゲ製板 http://pc11.2ch.net/gamedev/
のほうが、いいと思う。
DXライブラリ 総合スレッド
http://pc11.2ch.net/test/read.cgi/gamedev/1197468399/
0515デフォルトの名無しさん
2008/01/10(木) 00:41:38_CLIENT_BLOCK, __FILE__, __LINE__
↑こいつらがどっかで定義されてるマクロだとするとその中身を展開するには
一回newをDEBUG_CLIENTBLOCKにしてからnew( _CLIENT_BLOCK, __FILE__, __LINE__)にしないといけないんじゃないか?
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)だと
以前に
#define _CLIENT_BLOCK 何か
ってのがあっても、一回のマクロ展開ではnew( _CLIENT_BLOCK, __FILE__, __LINE__)が出るだけで
_CLIENT_BLOCKがそのまま展開されずに残るって言う・・・
試してないけどね!!
0516デフォルトの名無しさん
2008/01/10(木) 00:44:54以下の文字列があったとします。
AB AA ABCA BA BB
この中かからABCが含まれているか検査したいのですが
どうやって実現すればいいのでしょうか
strstrだとABCAのABCに部分一致してしまうので使えないと
思うので困ってます
0517デフォルトの名無しさん
2008/01/10(木) 00:49:35ABC空白 で探せばよくね?
0518デフォルトの名無しさん
2008/01/10(木) 01:43:28WinMainは<windows.h>のさらにどっか奥でプロトタイプ宣言が為されているので、
それと合わないとそういう風にエラーになってしまう。
0519519
2008/01/10(木) 01:44:30多重定義にならず、エラーになるのはextern "C"が付いているため。
0520デフォルトの名無しさん
2008/01/10(木) 01:58:56その例だと「AB AA ABCA BA BB」のなかに「ABC」という文字列はなかったとしたいのか?
だとするならばstrcmpでよくね?
0521520
2008/01/10(木) 02:01:15char * str[] = { "AB", "AA", "ABCA", "BA", "BB" };だと思った。
セパレータが固定されてるなら>>517でよさそうだね。
ただし、後ろだけじゃなくて前後につけなきゃだめだけど。
0522デフォルトの名無しさん
2008/01/10(木) 02:04:11正規表現ライブラリを使ってみるととか
0523デフォルトの名無しさん
2008/01/10(木) 02:26:090524デフォルトの名無しさん
2008/01/10(木) 02:30:31中途半端なプログラムではなく、きっちりしたプログラムならヲタだと思われない。
また、言語知識以外にも専門的な知識が必要になるプログラムなら確実に思われないだろうな。
たとえば、半導体のキャリア輸送をシミュレートするプログラムとか。
0525デフォルトの名無しさん
2008/01/10(木) 02:38:510526デフォルトの名無しさん
2008/01/10(木) 03:09:30色々とそぎ落としてこうなったのですが、どこが間違ってるのでしょうか?
誰か助けて〜
#include <iostream>
#include <queue>
using namespace std;
class event {
int priority;
public:
event() { priority = 0; }
bool operator<(const event &a);
};
bool event::operator<(const event &a) {
return this->priority < a.priority;
}
int main() {
priority_queue<event> q;
return 0;
}
0527デフォルトの名無しさん
2008/01/10(木) 03:12:25デバッグを他人に丸投げしたいのでなければ、エラーメッセージくらい張れ。
0528デフォルトの名無しさん
2008/01/10(木) 03:50:09すいません。以下です。コンパイラはlinuxのg++です。
意味があるのは最後の4行だと思うのですが、それでも意味が分からん。。。
$ g++ test.cpp
/usr/include/c++/4.2.1/bits/stl_function.h:
In member function 'bool std::less<_Tp>::operator()
(const _Tp&, const _Tp&) const [with _Tp = event]':
/usr/include/c++/4.2.1/bits/stl_heap.h:279:
instantiated from 'void std::__adjust_heap
(_RandomAccessIterator, _Distance, _Distance, _Tp, _Compare)
[with _RandomAccessIterator = __gnu_cxx::__normal_iterator
<event*, std::vector<event, std::allocator<event> > >,
_Distance = int, _Tp = event, _Compare = std::less<event>]'
/usr/include/c++/4.2.1/bits/stl_heap.h:404:
instantiated from 'void std::make_heap(_RandomAccessIterator,
_RandomAccessIterator, _Compare) [with _RandomAccessIterator
= __gnu_cxx::__normal_iterator<event*, std::vector<event,
std::allocator<event> > >, _Compare = std::less<event>]'
/usr/include/c++/4.2.1/bits/stl_queue.h:353: instantiated from
'std::priority_queue<_Tp, _Sequence, _Compare>::priority_queue
(const _Compare&, const _Sequence&) [with _Tp = event,
_Sequence = std::vector<event, std::allocator<event> >,
_Compare = std::less<event>]'
samp50.cpp:14: instantiated from here
/usr/include/c++/4.2.1/bits/stl_function.h:227:
error: passing 'const event' as 'this' argument of
'bool event::operator<(const event&)' discards qualifiers
0529デフォルトの名無しさん
2008/01/10(木) 03:59:440530デフォルトの名無しさん
2008/01/10(木) 04:01:44+ bool operator<(const event &a) const;
- bool event::operator<(const event &a) {
+ bool event::operator<(const event &a) const {
0531デフォルトの名無しさん
2008/01/10(木) 04:02:27えっ,どこですか?
priority_queue<const event>
としてみたのですがダメ。(コンパイル通らず)
0532デフォルトの名無しさん
2008/01/10(木) 04:06:19コンパイル通りました!
でも意味わかんねえス。今まで演算子のオーバーロードでそんなところに
constつけたことなかったよ。どういう意味ですか?
0533デフォルトの名無しさん
2008/01/10(木) 04:06:260534デフォルトの名無しさん
2008/01/10(木) 04:07:170535デフォルトの名無しさん
2008/01/10(木) 04:10:32だんだん自分でも怖くなってきた。もしかして自分は、すごく基本的なことを
知らないとか言ってる?
0536デフォルトの名無しさん
2008/01/10(木) 04:11:30そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
書き換えを伴わないメンバ関数は、全てconstメンバにしておくべき。
0537デフォルトの名無しさん
2008/01/10(木) 04:11:58ttp://www.google.co.jp/search?source=ig&hl=ja&rlz=&q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0+const&meta=lr%3Dlang_ja
これでも見てろ
0538デフォルトの名無しさん
2008/01/10(木) 04:12:13「演算子のオーバーロード」を「メンバ関数」に置き換えても、やっぱり同じことが言えるんだとしたら、
かなり基本的なことを学び損ねてると思う。
そうでないなら、まぁちょっとした誤解だから、すぐ知識の修正もできるだろうけど。
0539デフォルトの名無しさん
2008/01/10(木) 04:24:38あと
>そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
「constなオブジェクトからは呼び出すことができない」じゃね
0540デフォルトの名無しさん
2008/01/10(木) 04:38:54微妙・・・
0541デフォルトの名無しさん
2008/01/10(木) 04:48:34bool less(const event &a, const event &b){ return a < b; }
こんな感じなので、eventクラスのoperator<がconstメンバ関数じゃないとエラーになる
0542デフォルトの名無しさん
2008/01/10(木) 05:41:08色々こんな時間にありがとうございます。
自分の中ではとりあえず、
「priority_queue用に独自classに<(less)を定義する時は、引数と関数にconstをつける必要あり」
というルールで記憶することにしました。そして、
かなり基本的なことを学び忘れているようなので、とりあえず関連記事探して独習c++でも逝っときます。
関数にconstをつけるのは本当に知らなかった。メンバ変数にconstをつけるのは
意味なし、くらいに思っていたし。。
関数にconstつけるのは、メンバ変数を変更しない、という意味でいいんですよね?
あと、537が書いてくれたリンクはわかりやすかったんですけど、540の微妙…という
コメントは、どうしてですか?
0543Gori
2008/01/10(木) 05:46:34Microsoft Visual C++ 6.0 Standard Edition
Microsoft Visual C++ 6 Professional
Microsoft Visual C++ 6.0 Enterpris
0544つらいぜ独学
2008/01/10(木) 06:45:35#include<stdio.h>
void aaa(int test){
int i = 1;
if(test == 5)
return;
printf("あ");
test += i;
aaa(test);
printf("え");
}
int main(void){
int test = 0;
aaa(test);
return 0;
}
の結果を あああああえ になるかと思ってたんですが、
実際は あああああえええええ でした。
これは何ででしょうか?
0545デフォルトの名無しさん
2008/01/10(木) 07:05:59printf(え)を実行するじゃん。引数が5になるまで、
aaa()は5回呼ばれる。
0546デフォルトの名無しさん
2008/01/10(木) 08:23:17再帰関数の中で、再帰する前の処理をA、自分自身の呼び出しをB、再帰した後の処理をCとすると
その再帰は(ABC)になってるわけだろ。
で、ここのBをまた(ABC)に置き換えて…ってのを5回(4回か?数えるのメンドクセ。)やって
最後のときはBを消すって形で終わってるから最終的な形としては
(AAAAACCCCC)になる。
0548デフォルトの名無しさん
2008/01/10(木) 12:11:58class ABase {
public:
typedef std::vector<B> VectorB; // Bは完全型でなくてはいけない?
virtual VectorB::iterator F(const VectorB& vec)=0;
...
}
// B.h
template <...> // テンプレートクラスのため.hと.cppにわけることができない
class B {
public:
void F() {
pABase_->...; // ABaseの関数を呼び出す
...
}
private:
ABase* pABase_;
};
ABaseはBの定義が必要、BはAbaseの定義が必要という状態になってしまい、困っています。
こういった循環参照を避ける手法はないでしょうか?
0549デフォルトの名無しさん
2008/01/10(木) 12:17:13C++言語で
interface A {
virtual void MesA() = 0;
};
interface B {
virtual void MesB() = 0;
};
interface C : public A,public B {};
class D : public C {
public:
void MesA() { printf("A class\n"); }
void MesB() { printf("B class\n"); }
};
int main() {
D d;
void *p = (D *)&d;
B *bbb = (B *)p;
B->MesB();
}
こうするとAのMesAのメソッドが呼ばれてしまいます。
Cの中身は空ですが、他のメソッドが書かれています。(このサンプルでは関係ないと思うので空にしました)
変数pを一度C型にキャストしてからB型にキャストするとうまくいくのですが、
なるべく、そうはしたくないので困っています。
原因、解決策のわかる方教えてください。
環境
Visual Studio 2003 .NET
2005でも同じでした。
改行が多すぎるとエラーが出たのでみずらくてすいません。
0550デフォルトの名無しさん
2008/01/10(木) 12:47:53これでどうかなぁ
でもかなり無理矢理な感
// ABase.h
#include "B.h"
#ifndef ABase_h
#define ABase_h
class ABase {
...
};
#endif
// B.h
#ifndef B_h
#define B_h
class ABase;
template <...>
class B {
public:
void F();
private:
ABase* pABase_;
};
#include "ABase.h"
template <...>
void B<...>::F() {
pABase_->...;
};
#endif
0551デフォルトの名無しさん
2008/01/10(木) 12:54:24void*を元と異なるクラスにキャストしてるのが原因かと
>void *p = (D *)&d;
>B *bbb = (B *)p;
ここ(pはD*なのかB*なのか??)を
void *p = (B *)&d;
B *bbb = (B *)p;
とする(pはB*を保持)か、あるいは
void *p = (D *)&d;
B *bbb = (D *)p;
とする(pはD*を保持)
0553デフォルトの名無しさん
2008/01/10(木) 13:47:15こういう風にしてみるとか
// ABase.h
#include "Bdecl.h"
class ABase { ... };
// Bdecl.h
class ABase;
template <...>
class B { ... };
// Bimpl.h
template <...>
void B<...>::F() { ... };
// B.h
#include "ABase.h"
#include "Bimpl.h"
0554デフォルトの名無しさん
2008/01/10(木) 14:38:230555デフォルトの名無しさん
2008/01/10(木) 14:43:150556デフォルトの名無しさん
2008/01/10(木) 14:57:59説明不足の部分がありましたので、補足させて頂きます。
実際この処理を使う場面では
//interface AはA.hに定義
//interface BはB.hに定義
//callbackA.cpp
#include "A.h"
void callbackA(void *p) {
A *a = (A *)p;
a->MesA();
}
//callbackB.cpp
#include "B.h"
void callbackB(void *p) {
B *b = (B *)p;
b->MesB();
}
引数pにはDクラスのアドレスが入っているとします。
このように
callbackA.cpp中ではAのinterfaceのみが公開され、
callbackB.cpp中ではBのinterfaceのみが公開されるようにしたいのです。
やはり>>551さんのようにcallbackソースの中でDやCの定義を公開して
キャストするしかないのでしょうか?
説明不足で申し訳ありませんでした。
0557デフォルトの名無しさん
2008/01/10(木) 15:24:17callbackAを呼ぶときはpにはA*をvoid*にしたものを渡せばいいし
callbackBを呼ぶときはpにはB*をvoid*にしたものを渡せばいいが
どうしてもpにはD*を渡したいけどDは公開できないというのはわりと無理め
いくらか妥協するなら例えば
class Z {
virtual void dummy(){}
};
みたいなダミーを用意して
class D: public C, public Z { ... };
としてDにZを継承させ
void callbackA(Z *p) {
A *a = dynamic_cast<A *>(p);
a->MesA();
}
って方法もある
引数の型を変えたくないなら
void callbackA(void *p) {
A *a = dynamic_cast<A *>((Z*)p);
a->MesA();
}
とか
0558デフォルトの名無しさん
2008/01/10(木) 15:24:55printf("%p", i);
とかやってましたが、これをcout <<
でやるにはどうすればよいでしょうか?
0559デフォルトの名無しさん
2008/01/10(木) 15:34:09basic_ostream& operator<<(const void*)
が定義されてるから、
cout << static_cast<void*>(i);
だな。
0560デフォルトの名無しさん
2008/01/10(木) 16:04:19ありがとうス。実際は
void func(T& a)
{
cout << static_cast<void *>(&x);
...
}
としました。
0561デフォルトの名無しさん
2008/01/10(木) 16:13:280562デフォルトの名無しさん
2008/01/10(木) 16:59:17if(1<=x<=6){
でいいのでしょうか?間違ってるなら正しい方法おしえてください・・
0563デフォルトの名無しさん
2008/01/10(木) 17:02:360564デフォルトの名無しさん
2008/01/10(木) 17:35:210565デフォルトの名無しさん
2008/01/10(木) 17:48:210566デフォルトの名無しさん
2008/01/10(木) 17:53:14xが整数じゃない場合もそれでOKなんですね? ありがとうございました。
これで課題が終わりそうです。
0567562
2008/01/10(木) 17:54:270568デフォルトの名無しさん
2008/01/10(木) 17:59:25別にどっちでもいい。
0569デフォルトの名無しさん
2008/01/10(木) 18:43:51いいわけねーだろバーカチョーン
0570デフォルトの名無しさん
2008/01/10(木) 18:50:120571デフォルトの名無しさん
2008/01/10(木) 20:36:58VisualC++ win32API
で、質問なんですが
VisualStudioでプログラムを実行したらちゃんと動くのに
exeファイルをクリックして実行するとフリーズしたりするのはなぜなんでしょうか?
0572448
2008/01/10(木) 20:42:18解決しました。
コンソールアプリ→WINDOWSアプリに設定を変えるタイミングが悪かったみたいです。。
申し訳ありませんでした
あと>>456でもらったソースを貼り付ける必要がありました。
とにかく、おかげさまで先へ進めました。レスくれた人たち、まじでありがとうございます。
0573デフォルトの名無しさん
2008/01/10(木) 20:43:16お前の書いたプログラムにバグがあるからだろうと思う
0574デフォルトの名無しさん
2008/01/10(木) 22:17:05float f = 1.0f
とすると、その変数型の可能な限り、1.000....となるのでしょうか
それとも小数点第2位以下は不定となるのでしょうか
0575デフォルトの名無しさん
2008/01/10(木) 22:19:44精度の範囲で1.000...
ってちゃんとしてくれるよ1.0に関してはな!
0576デフォルトの名無しさん
2008/01/10(木) 22:22:49どういう場合に、まずいことが起こるんでしょう?
サンプルコードを見ると、1.fなどはほとんど無く1.0fという数字ばかりなのですが、
もしかして関係してるのでしょうか。
0577デフォルトの名無しさん
2008/01/10(木) 22:31:081.f と 1.0f に特に違いは無いが、
言語によっては . で終われない場合もあるので
1.0f で慣れておいた方が良さげ。
0578562
2008/01/10(木) 22:39:57出すのってこれでいいんですよね?なんかコンパイルするとエラーがでてしまうのですが・・
void aa(){
if (1 <= x && x <=6) {
printf("あああ\n");
}
else if(6 < x && x <=10){
printf("いいい\n");
}
else{
printf("ううう\n");
}
}
0579デフォルトの名無しさん
2008/01/10(木) 22:42:090580デフォルトの名無しさん
2008/01/10(木) 22:42:570581デフォルトの名無しさん
2008/01/10(木) 22:47:230582デフォルトの名無しさん
2008/01/10(木) 22:50:02> なんかコンパイルするとエラーがでてしまうのですが・・
これは「何かが起こったんですが、これは何でしょう?」って言ってるのと同じだ。
ちゃんと質問しろ。
0583デフォルトの名無しさん
2008/01/10(木) 22:50:270584デフォルトの名無しさん
2008/01/10(木) 22:51:58int x =0;とか入れればエラーは消えるが ううう しか出んプログラムになるぞ。
入力した数値や計算結果を使って出力を変えたいんじゃないのか?
0585デフォルトの名無しさん
2008/01/10(木) 22:54:53二人でやる課題で、xを定義とか入力に応じて帰るとかその辺は違う人がやるので・・
0586デフォルトの名無しさん
2008/01/10(木) 22:56:54どっちにしろ、関数aa()にxを入れなきゃ駄目だろ。
0587デフォルトの名無しさん
2008/01/10(木) 22:59:14教科書でローカル変数とかグローバル変数とか調べて見れ。
0588デフォルトの名無しさん
2008/01/10(木) 23:12:47外部のxを読み込めみたいな命令ってどうやるんでしょうか・・
0589デフォルトの名無しさん
2008/01/10(木) 23:13:45いいから教科書で勉強しなおすんだwwwwwww
引数とかグローバル変数とか分からないの?
0590デフォルトの名無しさん
2008/01/10(木) 23:16:34関数を勉強する最初の授業で習うようなことなんだから、ノートを見直して来い。
ノート取ってないなら教科書の関数のページ開いて嫁。
0591デフォルトの名無しさん
2008/01/10(木) 23:25:19外部の変数どう読み込むかって書いてないような・・
0592デフォルトの名無しさん
2008/01/10(木) 23:40:360593デフォルトの名無しさん
2008/01/10(木) 23:47:01ITMediaの記事で
ジャストのおっさんが
人に聞くのがコミュニケーション能力かつ
正しい成長方法だっていったぞボケ
0594デフォルトの名無しさん
2008/01/10(木) 23:51:30全く勉強しないで終わらせる気なのか?
0595デフォルトの名無しさん
2008/01/10(木) 23:53:23extern int x;
if (1 <= x && x <=6) {
printf("あああ\n");
}
else if(6 < x && x <=10){
printf("いいい\n");
}
else{
printf("ううう\n");
}
}
0596デフォルトの名無しさん
2008/01/10(木) 23:55:13聞いた事を元に、それなりに自分で考える時間も取らないと身に付かん。
0597デフォルトの名無しさん
2008/01/11(金) 00:11:54ご迷惑おかけしました
0598デフォルトの名無しさん
2008/01/11(金) 00:23:25OS:windowsXP
0599デフォルトの名無しさん
2008/01/11(金) 00:39:420600デフォルトの名無しさん
2008/01/11(金) 00:59:14正確な測定方法でも良いのでご教示ください
Cとなんでもよいのですが、例えばC#やVB
ある文字列の中身の特定文字列を検索する場合だとします。
AEFASDEAEASDDという文字列があった中でDEAを検索する場合
Cならばまず文字列内を一文字ずつループでDを検索し、見つかればその直後にE、その直後にAと探していき
発見することができますが、C#やVBでは文字列の検索機能(メソッド?)があります
一見ループと条件分岐とメソッドの呼び出しになるのでどうしても前者がはやいとは思えません
ですが実際は前者がはやいのでしょうか?
0601デフォルトの名無しさん
2008/01/11(金) 01:02:330602デフォルトの名無しさん
2008/01/11(金) 01:02:570603デフォルトの名無しさん
2008/01/11(金) 01:04:44何故そう思うのですか?
或いは、何故Cならば検索する関数がないと思うのですか?
0604デフォルトの名無しさん
2008/01/11(金) 01:05:05んなこたーない。
0605デフォルトの名無しさん
2008/01/11(金) 01:08:08それなら C が速いんでないかい。
0606デフォルトの名無しさん
2008/01/11(金) 01:08:13お前の頭の悪さと
醜悪な固定観念にワロタw
0607604
2008/01/11(金) 01:10:08正解は、「一概には言えない」となる。
従って、「メソッドの方が云々」なんてくだらない思い込みに対しては「んなこたーない」で充分。
0608デフォルトの名無しさん
2008/01/11(金) 01:11:290609デフォルトの名無しさん
2008/01/11(金) 01:11:39C++buridaの話なんですけど
フォトショをつなげると何かあるんでしょうか。
0610デフォルトの名無しさん
2008/01/11(金) 01:12:050611デフォルトの名無しさん
2008/01/11(金) 01:12:060612デフォルトの名無しさん
2008/01/11(金) 01:13:13あとはつまんねー長たらしい正規表現か
0613デフォルトの名無しさん
2008/01/11(金) 01:13:430614デフォルトの名無しさん
2008/01/11(金) 01:17:32エスパー求む!
0615デフォルトの名無しさん
2008/01/11(金) 01:19:390616デフォルトの名無しさん
2008/01/11(金) 02:16:32二人でやる課題なのに、各自の担当部分のインタフェース(データの受け渡し方法)を取り決めないのか?
それじゃ仮に君がC/C++の文法を理解していたとしても無理だ。
0617デフォルトの名無しさん
2008/01/11(金) 02:25:59正直な話、あんたが何を言っているか本気でわからん。
「C++burida」でググってみたらTOPに「ダイコンの豆知識」がでてきたぞ。
PhotoShopをつなげるというのも意味不明、何につなげるんだ?
そもそもPhotoShopはソフトウェアの名称で、つなげるという動詞を使うことは中々無いと思う。
>>598時点でのformに関してもあまりにも抽象的な単語で何を意味しているか不明。
順番に端折らずに、お前の聞きたいことを丁寧に書き込むんだ。
すれ違いならエロい人が誘導してくれる。
0618デフォルトの名無しさん
2008/01/11(金) 03:07:110619デフォルトの名無しさん
2008/01/11(金) 03:18:160620デフォルトの名無しさん
2008/01/11(金) 03:27:41はいはい
0621デフォルトの名無しさん
2008/01/11(金) 03:28:530622デフォルトの名無しさん
2008/01/11(金) 03:47:270623デフォルトの名無しさん
2008/01/11(金) 04:05:52C++BuilderとFormはまあ判った。
フォトショとは何なのか(Photoshopとしても何の関係があるのか)判らん。
もちろん、何を質問しているのかなど全然判らん。
0624デフォルトの名無しさん
2008/01/11(金) 08:06:56今のバージョンは知らんが
0625デフォルトの名無しさん
2008/01/11(金) 12:33:03意味がわかりません。適当なコンテナにmake_heap(begin,end)すると、
先頭に一番大きい要素がくる、それだけなんですよね?
それじゃあ、make_heap()とか、存在している意義がないような。
0626デフォルトの名無しさん
2008/01/11(金) 13:08:25「それだけ」ではないです。ヒープというデータ構造について調べてみるといいよ。
0627デフォルトの名無しさん
2008/01/11(金) 13:51:39調べてみると、
ヒープというデータ構造は、データの中から最大(最小)値を取り出すのに
いいということがわかりました。
make_heap(begin,end)
pop_heap()begin,end)
make_heap(begin,end-1)
pop_heap()begin,end-1)
make_heap(begin,end-2)
pop_heap()begin,end-2)
...
で、ヒープソート相当のことをできるんですね。
でも自分では使いそうにないなあ。
0628デフォルトの名無しさん
2008/01/11(金) 14:17:30する方法ってありますか?
0629デフォルトの名無しさん
2008/01/11(金) 14:24:57その「コンテナの入れ替え」を定義してください。
0630デフォルトの名無しさん
2008/01/11(金) 14:32:04structure_card_information card_information;
unsigned char card_idm[8];
unsigned char card_pmm[8];
card_information.card_idm = card_idm;
card_information.card_pmm = card_pmm;
//カード情報の読み込み処理
//読み込み結果の表示
print_vector("card PMm:", card_pmm, sizeof(card_pmm));
//初回起動ならIDmをfile.txtの先頭に入力する
fp = fopen("file.txt","r");
char *c;
//cの中にfpの一文字目が入る
fgets(c,1,fp);
fclose(fp);
//他のカードで端末に接触したとき接触したカードのidmを追加登録する
if(c != card_idm){
print_vector("card IDm:", card_idm, sizeof(card_idm));
//カードへの書き込み処理を行う
というプログラムを作っています。
読み込んだcard_idmというものがchar型のcと違う場合カードへの書き込み処理をする
というプログラムにしたいのですがcard_idmというものはchar型ではないのでどのように比較処理をすればいいのかわかりません。
どのように比較すればいいのでしょうか。もしよろしければ教えてください。
0631デフォルトの名無しさん
2008/01/11(金) 14:39:38hogehoge;
}
0632デフォルトの名無しさん
2008/01/11(金) 14:42:43一年諦めて、まともにCを勉強してから卒研に取り組んだら?
fgets()の使い方が阿呆すぎて話にならないんだけど。
0633デフォルトの名無しさん
2008/01/11(金) 14:55:140634デフォルトの名無しさん
2008/01/11(金) 15:15:15swapのことか?ならSTLコンテナ全て持ってる。
0635デフォルトの名無しさん
2008/01/11(金) 15:37:11コンテナの連結状態を変えたいんです
>>634
swapだと中身のコピーによる値の入れ替えになるんじゃないでしょうか?
例えばlistのコンテナが 1,2,3,4,5 と繋がってる場合に、3,4,5 を切り離して、
1と2の間に挿入し、1,4,5,6,2 という形にしたい場合に、中身の入れ替えでは
なく、コンテナの連結先のみを書き換えることで行う方法が無いかを知りたい
のですが。
0636デフォルトの名無しさん
2008/01/11(金) 15:40:091,4,5,6,2 ではなく、1,3,4,5,2
0637デフォルトの名無しさん
2008/01/11(金) 15:47:00splice
0638デフォルトの名無しさん
2008/01/11(金) 16:02:13ならspliceメンバー関数だな
0639デフォルトの名無しさん
2008/01/11(金) 16:04:20_beginthreadexでルーチンを呼び出してもメインスレッドで処理されてしまいます。
どなたかお助けくらさい。。。
0640デフォルトの名無しさん
2008/01/11(金) 16:06:250641デフォルトの名無しさん
2008/01/11(金) 16:26:11ありがとうございます。
っと思ったらちゃんと別スレッドで処理されてました。
スレッドの他殺のテストをしてたのですが、アホな事をしてました・・・orz
0642デフォルトの名無しさん
2008/01/11(金) 16:35:21あんまりやらない方が・・・
ロック握ったまま死んじゃったりとか、
ファイル開いたまま死んじゃったりとか、
メモリ確保したまま死んじゃったりとか、
相当気をつけないとろくでもないことになりがち
0643デフォルトの名無しさん
2008/01/11(金) 16:37:59ビルドはできるのに何故かデバッグが実行できません。
エラー報告ウィンドウが出てきて強制終了;
このような場合にはどういった問題が考えられますか?
0644デフォルトの名無しさん
2008/01/11(金) 16:42:35VisualStudio自体が落ちるとかそういうこと?
0645デフォルトの名無しさん
2008/01/11(金) 16:51:20「問題が発生したため終了します」という枠が出てきてエラーを報告するか否かをきいてくるんです。
報告しなくてもしても結局ゲーム自体は動きません・・・
説明下手ですいません;
0646デフォルトの名無しさん
2008/01/11(金) 16:52:210647デフォルトの名無しさん
2008/01/11(金) 17:09:35それでした!ありがとうございます
0648デフォルトの名無しさん
2008/01/11(金) 17:14:18調べ直せw
0649デフォルトの名無しさん
2008/01/11(金) 17:23:56void func(const T& x)
{
//省略
}
という関数テンプレートを以下のように呼び出した
場合、
func("Hello");
xの型が char[6]になるのですが、何故 const char*& とならない
のでしょうか? "Hello" の型は明らかにconst char*のはずですが。
0650デフォルトの名無しさん
2008/01/11(金) 17:28:13下のソースがコンパイルできないのですが失敗する理由は何でしょうか?
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
template <class T>
class isEven : public unary_function<T, bool> {
public:
result_type operator()(argument_type i) {
return (result_type) !(i % 2);
}
};
int main() {
vector<int> v;
for (int i = 0; i < 10; i++) v.push_back(i);
cout << count_if(v.begin(), v.end(), isEven<int>());
return 0;
}
エラーメッセージは以下のようになりました。
$ g++ test.cpp
test.cpp:9: error: ISO C++ forbids declaration of 'result_type' with no type
test.cpp:9: error: expected ';' before 'operator'
test.cpp:12: error: expected `;' before '}' token
(一行略)
/usr/include/c++/4.2.1/bits/stl_algo.h:457:
error: no match for call to '(isEven<int>) (int&)'
0651デフォルトの名無しさん
2008/01/11(金) 17:43:36(環境1)
$ g++ test.cpp -Wall
test.cpp:9: 警告: `isEven<T>::result_type' is implicitly a typename
test.cpp:9: 警告: implicit typename is deprecated, please see the documentation
for details
test.cpp:9: 警告: `isEven<T>::argument_type' is implicitly a typename
test.cpp:9: 警告: implicit typename is deprecated, please see the documentation
for details
test.cpp: member function 内の `typename isEven<T>::result_type
isEven<T>::operator()(isEven<T>::argument_type)':
test.cpp:10: 警告: `isEven<T>::result_type' is implicitly a typename
test.cpp:10: 警告: implicit typename is deprecated, please see the
documentation for details
$ g++ --version
g++ (GCC) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
(環境2)
$ g++ test.cpp -Wall
$ ls
a.out test.cpp
$g++ --version
2.96
となった。
0652デフォルトの名無しさん
2008/01/11(金) 17:44:27それって単にプログラムにバグがあるだけなんじゃ?
デバッグじゃなければ動くのか?
0653デフォルトの名無しさん
2008/01/11(金) 18:02:26たぶんこう
typename result_type operator()(typename argument_type i) {
return (typename result_type) !(i % 2);
}
0654デフォルトの名無しさん
2008/01/11(金) 18:09:17>An ordinary string literal has type ``array of n const char'' and static storage duration (basic.stc),
>where n is the size of the string as defined below, and is initialized with the given characters.
とあるので、"Hello"の型は明らかに const char[6] です
0655デフォルトの名無しさん
2008/01/11(金) 18:28:28public:
template <typename T>
Hoge(){
//処理
}
};
としたときに、Hogeを実体化できません。
Hoge hoge; //当然ダメ
Hoge<int> hoge; //クラステンプレートと看做されてダメ
どうすれば実体化できるのでしょうか。
そもそもこれは合法ですか?
0656デフォルトの名無しさん
2008/01/11(金) 18:29:29なるほど。そういう仕様なんですね。てっきり文字列リテラルは
const char*だと思っていました。
では、
template <typename T>
void func(T x)
{
//省略
}
という関数テンプレートを以下のように呼び出した
場合、
func("Hello");
xはconst char*になるのですが、この場合は、const char[6]
ではないのでしょうか?これは通常の関数に配列を渡したときは
配列の先頭要素へのポインタになるのと同じ理屈でしょうか?
0657デフォルトの名無しさん
2008/01/11(金) 18:41:48void func(const char x[6])
と書くのが
void func(const char *x)
と同じだから、じゃないかなぁ
0658656
2008/01/11(金) 18:47:20今のC++は配列型に変更されていて、後方互換性からchar*へ
代入できると書いてありました。テンプレートの引数演繹
の際にパラメータが参照でない場合はarrayからpointerへ
変換されるという規則があるみたいです。
func("Hello");
template <typename T>
void func(T x); //参照でないから x は const char*
template <typename T>
void func(T const& x); //参照なので x は const char[6]
0659デフォルトの名無しさん
2008/01/11(金) 18:49:45そうですね。Cでも関数へ配列を渡すときは、要素へのポインタに
なりますからね。
0660デフォルトの名無しさん
2008/01/11(金) 18:52:39http://pc11.2ch.net/test/read.cgi/tech/1200044614/
立てたから後は頼む
0661デフォルトの名無しさん
2008/01/11(金) 22:53:45()は使用しません。
http://f4.aaa.livedoor.jp/~pointc/log302.html
ここを参考に作成していたのですが、うまく()をはずすやり方がわかりません。
(1+2)+(3+4), 1+(2+3)+4をひとつとしてカウントする方法です。
何かヒントをいただけませんか?
0662デフォルトの名無しさん
2008/01/11(金) 23:08:49そういうのは、逆ポーランド記法が有名じゃないか。
http://oshiete1.goo.ne.jp/qa2581924.html
http://smdn.invisiblefulmoon.net/ikimasshoy/cpp/polish.html
0663デフォルトの名無しさん
2008/01/11(金) 23:49:07なるほど!
逆ポーランド記法をつかってがんばってみます
0664デフォルトの名無しさん
2008/01/12(土) 00:13:26プログラミングの課題が出されたのですが、さっぱりわかりません。
代わりにプログラムを作って頂けないでしょうか。お願いします。
[1] 授業単元:プログラミング�U
[2] 問題文(含コード&リンク):正整数a以上b以下のHappyNumberを求めるプログラムを作成せよ。
ただし、関数を使うこと。
HappyNumberとは、正整数nの各桁の数を2乗し、その合計を求め、
その合計の各桁の数を2乗し、またその合計を求める計算を繰り返したとき、
最終的に1となる正整数nのことをいう。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: よくわかりません。
[3.3] 言語: C++
[4] 期限: 2008年1月14日まで
[5] その他の制限: 関数を使うところまで
0665デフォルトの名無しさん
2008/01/12(土) 00:14:40教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
http://pc11.2ch.net/test/read.cgi/tech/1197132472/
0666デフォルトの名無しさん
2008/01/12(土) 00:15:360667デフォルトの名無しさん
2008/01/12(土) 00:16:470668デフォルトの名無しさん
2008/01/12(土) 00:20:19すみません、そっちにいきます。
0669デフォルトの名無しさん
2008/01/12(土) 00:25:28int& r = *p;
delete &r;
これっておk?
0670デフォルトの名無しさん
2008/01/12(土) 00:26:290671デフォルトの名無しさん
2008/01/12(土) 00:29:06文法的にはOK。動作もする。でも、嫌い。
可読性を下げる下手なコーディングはやめれ
0672デフォルトの名無しさん
2008/01/12(土) 00:31:390673699
2008/01/12(土) 00:32:45普段のコードで書こうとしているわけじゃないから大丈夫です
0674デフォルトの名無しさん
2008/01/12(土) 00:38:20>>598か?
どういう関係の話をしているんだ?PhotShopとC++Builderで結びつく内容はぱっとは浮かばん。
無理やりひねり出せばPhotoShopでいじった画像ファイルを管理するツールをC++Builderで作るとかか?
0675デフォルトの名無しさん
2008/01/12(土) 00:59:50ってどうやれば?
さっぱり
0676デフォルトの名無しさん
2008/01/12(土) 01:09:39int num[ 100 ] = { 0 };
for ( int i = 0; str[i] != '\0'; i++) {
num[ i ] = str[ i ] - '0';
}
0677デフォルトの名無しさん
2008/01/12(土) 01:14:340678デフォルトの名無しさん
2008/01/12(土) 01:17:48num[ strlen( str ) - i - 1 ] = str[ i ] - '0';
0679デフォルトの名無しさん
2008/01/12(土) 01:18:28おまえはなにをいっているんだ?
0680675
2008/01/12(土) 01:22:000681デフォルトの名無しさん
2008/01/12(土) 01:25:27char str[100] = { 0 };
int num = 1234567890
for ( int i = 0; num > 0; i++, num /= 10 ) {
str[ i ] = num % 10 + '0';
}
0682675
2008/01/12(土) 01:26:07それ2つ使って和とかって出せますかね?
0683デフォルトの名無しさん
2008/01/12(土) 01:40:36さすがにそれくらいがんばれよw
0684675
2008/01/12(土) 02:02:190685デフォルトの名無しさん
2008/01/12(土) 02:53:18逆ポーランド記法つかったらできました!
ありがとうございます!
0686デフォルトの名無しさん
2008/01/12(土) 11:39:20int a[][] = { {1,2} , {3,4} };
とすると添え字がないといわれて怒られてしまいます
1次元配列では宣言と初期化が同時であれば要素数の指定は不要だった気がするのですが
2次元以上では必要となるのが仕様なのでしょうか?
0687デフォルトの名無しさん
2008/01/12(土) 11:47:280688デフォルトの名無しさん
2008/01/12(土) 11:57:14ありがとうございます。653に言われるように修正してやってみたのですが。
コンパイルに失敗します。失敗メッセージはこうなってます。
$ g++ test.cpp
test.cpp:9: error: expected nested-name-specifier before 'result_type'
test.cpp:9: error: expected ';' before 'operator'
test.cpp:12: error: expected `;' before '}' token
test.cpp:16: instantiated from here
<一行略>
/usr/include/c++/4.2.1/bits/stl_algo.h:457: error: no match for call
to '(isEven<int>) (int&)'
自分でも色々やってみたのですが、どうもコンパイルできません。
typenameをtypedefにするとか、
unary_function<typename T, bool>にしてみるとか、
0689デフォルトの名無しさん
2008/01/12(土) 11:58:35添字なしでよい[]は一番左の1個だけだったと思う。
0690デフォルトの名無しさん
2008/01/12(土) 12:09:290691686
2008/01/12(土) 12:11:57なるほど、仕様だったんですね
0692デフォルトの名無しさん
2008/01/12(土) 12:55:28以下のようにしたらコンパイル通りました。
result_typeとargument_typeの前に以下をくっつけた。
typename unary_function<T, bool>::result_type
650にポストしたソースでもVisualC++2005だとコンパイルできるような
カキコをみたのですが、
ttp://www.thescripts.com/forum/thread676519.html
今自分が使ってるのはgccの4.2.1(linux)で、もしできれば
だれか試してくれたらうれしいです。
しかし他の国にも2chと同じような質問スレがあるんだなと思った。
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
template <class T>
class isEven : public unary_function<T, bool> {
public:
typename unary_function<T, bool>::result_type operator()(typename unary_function<T, bool>::argument_type i) {
return (typename unary_function<T, bool>::result_type) !(i % 2);
}
};
int main() {
vector<int> v;
for (int i = 0; i < 10; i++) v.push_back(i);
cout << count_if(v.begin(), v.end(), isEven<int>());
return 0;
}
0693デフォルトの名無しさん
2008/01/12(土) 12:57:10#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
template <class T>
class isEven : public unary_function<T, bool> {
public:
result_type operator()(argument_type i) {
return (result_type) !(i % 2);
}
};
int main() {
vector<int> v;
for (int i = 0; i < 10; i++) v.push_back(i);
cout << count_if(v.begin(), v.end(), isEven<int>());
return 0;
}
0694デフォルトの名無しさん
2008/01/12(土) 13:26:49勝手なこと言ってすいません。VisualC++2005で自分でやってみます。
0695デフォルトの名無しさん
2008/01/12(土) 14:06:000696デフォルトの名無しさん
2008/01/12(土) 15:24:40解決したので報告しておきます。
>>557
レスありがとう御座います。
>callbackAを呼ぶときはpにはA*をvoid*にしたものを渡せばいいし
>callbackBを呼ぶときはpにはB*をvoid*にしたものを渡せばいいが
「callbackはライブラリ側から呼ばれるので、引数の内容は変更できない」というのを言い忘れていました。
申し訳ありません。
>どうしてもpにはD*を渡したいけどDは公開できないというのはわりと無理め
やはり無理ですか(汗
>class Z {
>virtual void dummy(){}
>};
>みたいなダミーを用意して
なるほど。そういう手もあるんですね。
勉強になりました。ありがとうございます。
結局、AとBのメソッドを一つのインターフェイスに変更して、
多重継承でなく、単一継承にすることで解決することにしました。
丁寧な回答をして頂き、大変助かりました。
ありがとうございました。
0697デフォルトの名無しさん
2008/01/12(土) 15:36:21環境:Win XP SP2/VS2005です
ifstream クラスでファイルを一行づつ読込むには、こんな感じで良いと思うのですが
istream クラスを使って ifstreamも istringstream同じように使いたいのですが
istream クラスにはopenメッソッドがありません、ファイルを開く処理を行う場合、
どうしたら良いのでしょうか?
fname = "C:\foo.txt";
char line[256];
ifstream ifs;
memset( line, 0, MAX_PATH );
ifs.open( fname.c_str(), ios::in );
while( !ifs.getline( line, sizeof( line ) ).eof()) {
(省略:適当な入れ物に格納)
}
0698デフォルトの名無しさん
2008/01/12(土) 15:40:26freopen()のような事をしたいのか?
0699デフォルトの名無しさん
2008/01/12(土) 15:42:43istreamはダウンキャストの方向になるぞ。
0700デフォルトの名無しさん
2008/01/12(土) 15:47:41istream のレベルで open できないのは当たり前だと思うが。
0701デフォルトの名無しさん
2008/01/12(土) 15:49:12即レスサンクスです
>>698
freopenが、正確にどの様なものか分からないのですが
ようは、ファイルを開いて、一行バッファーに読みこんで、コンテナでにほうりこみたいんですが
>>699
漏れもそう思ったんだけど、More Effective C++の中途半端な実装が
殆どファイル処理に関しては、引数が istream& dataSourceってな風に書いてあるんで
気になったしだいです
0702デフォルトの名無しさん
2008/01/12(土) 15:51:55open を使うという非共通処理を実行しようとしている時点で少し変。
ただ、やむを得ない場合もあるから、そういう時はダウンキャストするしかない。
0703デフォルトの名無しさん
2008/01/12(土) 15:57:27このまんま、実装しても当然動かない訳で、こちらで、読解しながら
実装しているんですが、こんな場合、
この関数に、ファイルのオブジェクトを渡して処理する場合、具体的に
どうしたらいいのでしょうか?
void ALA::proccesAdaption( istream& dataSource )
{
while( dataSource ) {
ALA* pa = readALA( dataSource );
pa->proccesAdaption();
delete pa;
}
}
0704デフォルトの名無しさん
2008/01/12(土) 16:02:30istreamはifstreamの下位クラスだから、どこか外でopenした
ifstreamのオブジェクトをそのまま渡せばよい。
0705デフォルトの名無しさん
2008/01/12(土) 16:06:42×下位クラス
○上位クラス
だわ。
0706デフォルトの名無しさん
2008/01/12(土) 16:06:52どうもありがとう
0707デフォルトの名無しさん
2008/01/12(土) 16:49:30----------------------------
void func(int *num)
{
num[0] = 9;
}
int main(void)
{
int a[3] = {0,1,2}
func(a);
}
-----------------------------
というPGMにて、func()内で
○ num[0] = 9
× *num[0] = 9
と「*」無しで配列の値を変更できるのはなぜですか?
func()に渡しているのは配列の先頭アドレスなので
func()内で値を変更するには間接参照「*」がいると思うのですが…。
0708デフォルトの名無しさん
2008/01/12(土) 17:01:25num[0]と*numは同じ意味だから。
0709デフォルトの名無しさん
2008/01/12(土) 17:01:42*( num + 3 ) = 3とnum[ 3 ] = 3は同じことをしている。
0710デフォルトの名無しさん
2008/01/12(土) 17:01:58[ ]には*の効果がある。
a[3]は*(a+3)と書くのと同じこと
0711デフォルトの名無しさん
2008/01/12(土) 17:06:42{
int a[3] = {0,1,2}
func(a);
}
このaってのは配列の先頭アドレスで、a[i]の形で値を代入できるよな?
numも全く同じ操作をしている。
0712デフォルトの名無しさん
2008/01/12(土) 17:21:58おまえら仲良しさんだな
0713707
2008/01/12(土) 17:22:53お答えありがとうございます。
num[0]と*numの意味が同じことは理解できています。
mainのa[3]の先頭アドレスと、
funcの*numのアドレスは同一なのですね。
なのでfunc内でも、ポインタを意識せずに演算ができる、と。
理解できました。ありがとうございます。
0714デフォルトの名無しさん
2008/01/12(土) 17:51:38この場合は、 num,3とか入れると、
num[0]からnum[2]までが見れたりするぜ。
071525
2008/01/12(土) 22:40:30filename = argv[1];
if (filename[0] != '-') {
break;
}
っていうソースを見たんですが、
ファイル名が-から始まったら問題が有るのでしょうか?
0716デフォルトの名無しさん
2008/01/12(土) 22:42:480717デフォルトの名無しさん
2008/01/12(土) 23:05:190718デフォルトの名無しさん
2008/01/12(土) 23:06:490719デフォルトの名無しさん
2008/01/12(土) 23:08:090720デフォルトの名無しさん
2008/01/12(土) 23:08:35でしょ。
0721デフォルトの名無しさん
2008/01/12(土) 23:08:45実行ファイル名って言うか、実行モジュール名な。で、それが何か?
0722デフォルトの名無しさん
2008/01/12(土) 23:17:11char *filename;
filename = argv[1];
if (filename[0] != '-') {
break;
}
第一引数にファイル名を取って、そのファイルに結果を保存するって感じです。
実はかなり昔どこかで、
C言語ではファイル名に「-」を使えない
って読んだ記憶が有って、このソースを見つけてその記憶がよみがえってきたんです。
でも、そんな訳ないですよねぇ?
0723デフォルトの名無しさん
2008/01/12(土) 23:19:29んなこたーない。まぁ、>716だろ。Unix系だとそういうプログラムも多いから。
# ちなみに、./-filename とでもすれば回避可能だから余り困らない。
0724デフォルトの名無しさん
2008/01/12(土) 23:20:232つの数値(最大50桁)を文字列として入力させ一桁ずつを配列に入れる
2数の和を出す
(下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる)
これの方法誰か詳しく解説してください、、
0725デフォルトの名無しさん
2008/01/12(土) 23:26:21int num1[ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int num2[ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int sum[ 11 } = { 0 };
int temp = 0;
for( int i = 0; i < 10; i++ ) {
sum[ i ] = ( num1[ i ] + num2[ i ] + temp ) % 10;
temp = ( num1[ i ] + num2[ i ] ) / 10;
}
sum[ 11 ] = temp;
動作確認はしていない。
たぶんこんな感じで動くだろ。
0726デフォルトの名無しさん
2008/01/12(土) 23:41:09とか書くと、マクロmaxの引数が少ねーぞって言われるんだが、どうすればいいんだろう。
windef.hにマクロのmaxが書かれてるようで、これが邪魔っぽいが…
0727デフォルトの名無しさん
2008/01/12(土) 23:46:37WindowsC++プログラマの常識
#define NOMINMAX
0728デフォルトの名無しさん
2008/01/12(土) 23:48:26Unix 系だと通常コマンドオプションは "-x" とか "--string" となるので, "-"
ついた奴はファイル名ではないと判断するための処理ちゃうか?
# x は一文字オプション string は 1文字以上のオプション
# "-"とオプション文字の間に空白が入ってはいけない
ちなみに, 慣習的に "--" だけってのが "オプションの終わり" になってる
0729デフォルトの名無しさん
2008/01/13(日) 00:10:06ありがとうございます!
sum[ i ] = ( num1[ i ] + num2[ i ] + temp ) % 10;
の% 10 ってなんですか???
0730デフォルトの名無しさん
2008/01/13(日) 00:12:06ex.
10 / 3 = 3 あまり 1
10 % 3 = 1
0731デフォルトの名無しさん
2008/01/13(日) 00:53:05argv[0]に何が入ってるかは処理系依存と違ったっけ?
大体はOSが解釈した後のコマンド文字列の一節目が入ってると思うんだけど。
0732デフォルトの名無しさん
2008/01/13(日) 01:55:57プログラムを呼ぶ時に使った名前か、空文字列が入れられる、と定義されている。
0733デフォルトの名無しさん
2008/01/13(日) 02:20:460734デフォルトの名無しさん
2008/01/13(日) 02:21:13{ "( ´∀`)" };
(int *)str[48] = (int)str;
ってchar型の配列を用意して、( ´∀`)で初期化。
charの配列をintにキャストして、
その配列のアドレスを、int型のstr配列に代入しているって言う解釈で良い?
0735デフォルトの名無しさん
2008/01/13(日) 02:23:55両方名前がstrなのは意図したものなのか?
0736デフォルトの名無しさん
2008/01/13(日) 02:24:130737デフォルトの名無しさん
2008/01/13(日) 02:31:580738デフォルトの名無しさん
2008/01/13(日) 02:33:560739デフォルトの名無しさん
2008/01/13(日) 02:36:23付けてみろよ
何もなかったかのようにコンパイル通るから
0740デフォルトの名無しさん
2008/01/13(日) 02:39:27どこかで見た事あるなあこれ。
何かの本だったような
0741デフォルトの名無しさん
2008/01/13(日) 02:39:30普通に怒られて通らなかったがw
0742デフォルトの名無しさん
2008/01/13(日) 02:39:38無理だった
関数宣言じゃないの?
0743デフォルトの名無しさん
2008/01/13(日) 02:39:54JIS 見る限り
1. int main(void)
2. int main(int argc, char *argv[])
3. 1,2 と等価な方法
4. 上記以外の処理系定義
この後ろに 2 の制約が書いてあり, その中で >>732 が書いてあるが!!!
Unix のように, 処理系としては
int main(int argc, char *argv[], char *envp[])
と, 定義している場合 4 に該当するため何でもありになってしまう
たとえプログラマが main(int argc, char *argv[]) と書いて envp
を無視してもだ.
実際に Unix だと微妙に ISO 規格と異なった振る舞いを生じることも
あったりする. login shell の起動時などに…
0744デフォルトの名無しさん
2008/01/13(日) 02:40:01あぁ
0745デフォルトの名無しさん
2008/01/13(日) 02:40:17Borland C++ 5.5.1だと式の構文エラーって出たんだけど、なにか勘違いしてるんだろうか
0746デフォルトの名無しさん
2008/01/13(日) 02:41:160747デフォルトの名無しさん
2008/01/13(日) 02:44:05orz
0748デフォルトの名無しさん
2008/01/13(日) 02:46:08さぁ…
戻値持つ関数呼び出すときに「戻値を捨てる」って言うコンパイラへの
明示的な指示として導入されたのは記憶にあるが………
0749デフォルトの名無しさん
2008/01/13(日) 02:46:22Code Quality ~コードリーディングによる非機能特性の識別技法~
この本で見たかな
0750デフォルトの名無しさん
2008/01/13(日) 02:47:18lint とか。
0751デフォルトの名無しさん
2008/01/13(日) 02:49:12それは今の話と関係ないと思うけど。
今はキャストで右辺値に変換したら代入できんじゃないかという話で。
0752デフォルトの名無しさん
2008/01/13(日) 03:05:06"問題のあるポインタの変換"とか言われそうじゃね
0753デフォルトの名無しさん
2008/01/13(日) 03:07:320754デフォルトの名無しさん
2008/01/13(日) 03:13:00OS 依存なんじゃね?
0755753
2008/01/13(日) 03:13:570756デフォルトの名無しさん
2008/01/13(日) 03:20:25こんな物が標準ライブラリに有る事すら知りませんでした。
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
void f(void);
static jmp_buf env;
int main(void)
{
int val = -1;
int x; // volatile が必要
x = 3;
if((val = setjmp(env)) != 0) {
printf("val = %d (x = %d)¥n", val, x);
exit(0);
}
x = 5;
printf("val = %d (x = %d)¥n", val, x);
f();
exit(0);
}
void f(void)
{
longjmp(env, 1);
}
最初のif((val = setjmp(env)) != 0) の所のx=3のスナップショット?がenvに保存されて、
longjmp(env, 1);でvalに引数の1が代入されて、if((val = setjmp(env)) != 0)がx=3の
状態で再度呼び出される?
って理解で良いのでしょうか?
難しい...
0757デフォルトの名無しさん
2008/01/13(日) 03:22:24気にしなくていいと思う。
0758デフォルトの名無しさん
2008/01/13(日) 03:23:04コンパイラが吐いたアセンブリコードが読めればすぐに
理解できるんだけどな
longjmp()をした後はprintf...からスタートするよ
0759デフォルトの名無しさん
2008/01/13(日) 03:23:42{
ofstream fout;
fout.open("sample001.txt");
if (!fout) {
cout << "出力オープン処理が失敗しています\n";
return 1;
}
return 0;
}
こんな感じの定番なプログラムについてなのですが、
出力オープン処理が失敗する時ってどんな時ですか??
そんなことあるんでしょうか?
0760デフォルトの名無しさん
2008/01/13(日) 03:25:48FLOPPYやMDでライトプロテクト状態になってるとか
もっとも先にOSのエラーが出そうだが
0761デフォルトの名無しさん
2008/01/13(日) 03:26:210762デフォルトの名無しさん
2008/01/13(日) 03:27:32読み取り専用
同名ディレクトリ
ファイル数上限
Device error
など
0763759
2008/01/13(日) 03:34:250764デフォルトの名無しさん
2008/01/13(日) 03:41:58ちと違う。
setjmp() を呼び出す瞬間の CPU 状態が(スタックポインタ/プログラムカウンタ含めて)
env に保存される。 ただし、戻値を返すレジスタは 0 に設定されるが…
longjmp(1) をやると, env に保存されてた CPU 状態が書き戻されるが,
戻値を戻すレジスターは longjmp の引数 1 に書き換えられる
乱暴な言い方すれば, longjmp はサブルーチンコール無視した goto だ
0765デフォルトの名無しさん
2008/01/13(日) 03:45:270766デフォルトの名無しさん
2008/01/13(日) 03:47:59正直こんなの使うよりエラーコードのがマシ。
0767デフォルトの名無しさん
2008/01/13(日) 03:49:00スタックにいろいろ積んでいても全部巻き戻される。
0768デフォルトの名無しさん
2008/01/13(日) 03:50:01事実C++の例外はlongjmp()に似てるな。
でもlongjmp()を使ってもC++の例外は実装できなかったので
cfrontは中止されネイティブコンパイラになったという話。
0769756
2008/01/13(日) 03:50:46>longjmp()をした後はprintf...からスタートするよ
そうなんですか?
if((val = setjmp(env)) != 0)による条件分岐は行われないんですか?
>>764さんの
>戻値を戻すレジスターは longjmp の引数 1 に書き換えられる
とありますが、longjmpの引数を0にした場合は、
if((val = setjmp(env)) != 0)
で
x =5に飛ばないんですか?
0770デフォルトの名無しさん
2008/01/13(日) 03:53:45条件分岐は当然行われるよ。
longjmpの引数を0にしたら x = 5; に飛ぶ。
0771デフォルトの名無しさん
2008/01/13(日) 03:58:47うそこけ
longjmp() は、0 を返すことは出来ない。
もし、 longjmp() の2番目の引数が 0 として呼ばれたならば、代わりに 1 を返す。
って書いてあるぞ。
0772デフォルトの名無しさん
2008/01/13(日) 04:01:39> x =5に飛ばないんですか?
飛ぶ.
つか, 本来は大域脱出するために設計されている仕組みだから
普通やらないけどな…
よく使うのが,
簡易言語のパーサとかやってて, リカバー出来ないエラーに遭遇.
途中結果を捨ててもいいから次のファイルの処理はやりたい.
けど, まともに状態戻しながら手順を踏んでもどったら大変.
えぇい! イニシャライズから, やり直してしまえぇ!!!
てな感じの時だ.
0773デフォルトの名無しさん
2008/01/13(日) 04:02:20longjmp を呼び出す前に,setjmp を呼び出さなければなりません。setjmp を呼び出して jmpb を設定するルーチンは,longjmp が呼び出されるまでアクティブなままでなければならず,戻ることはできません。この状態以外の場合,結果は予想できません。
longjmp は,値 0 を渡すことはできません。retval に 0 を入れて渡すと,longjmp はこれを 1 に置き換えます。
うーんなるほど
0775デフォルトの名無しさん
2008/01/13(日) 09:01:45実際のプログラミングで、
cout時に
endlと\nを区別することはありますか?
0776デフォルトの名無しさん
2008/01/13(日) 10:21:22バッファをフラッシュしたいときだけendl、それ以外は常に'\n'使いますが。
# まさか、標準出力のときだけ別扱いするの?
0777デフォルトの名無しさん
2008/01/13(日) 13:50:54Cだと、
int **a = malloc(SIZE * SIZE);
a[2][1] = 10;
という風に書くのは普通だと思うのですが、
C++だと、
int **a = new int [SIZE][SIZE];
int **a = new int [SIZE * SIZE];
の両方共コンパイルエラーになってしまいます。
C++では、
int **a = new int *[SIZE];
a[0〜SIZE-1] = new int [SIZE];
みたいに書くしかないのでしょうか?
0778デフォルトの名無しさん
2008/01/13(日) 13:58:59int (*a)[SIZE]= new int[SIZE][SIZE];
普通に、
std::vector<std::vector<int>> a(SIZE, std::vector<int>(SIZE));
とかしとけ。
0779デフォルトの名無しさん
2008/01/13(日) 13:59:23int **a = malloc(SIZE * SIZE);
a[2][1] = 10;
の時点で間違ってる。
勉強やり直せ。
0780デフォルトの名無しさん
2008/01/13(日) 14:09:21>a[2][1] = 10;
>という風に書くのは普通だと思うのですが
いいえ
0781デフォルトの名無しさん
2008/01/13(日) 14:30:48int main(void)
{
int i = 0;
int **a = malloc(SIZE * sizeof(int *));
for (i = 0; i < SIZE; i++) {
a[i] = malloc(SIZE * sizeof(int));
}
a[2][1] = 10;
return 0;
}
でいいですよね?
あと、
vector< vector<int> > a(SIZE, vector<int>(SIZE));
という書き方があるとは知りませんでした。こう書けばまさに配列と
同じようにつかえますね。自分は今までvector< vector<int> > a;
と宣言しておいて、push_back()で代入してました。
(なのでちょっと不便と思ってた)
ありがとうございます。
0782デフォルトの名無しさん
2008/01/13(日) 14:38:060783デフォルトの名無しさん
2008/01/13(日) 14:40:21>でいいですよね?
いいえ。
0784デフォルトの名無しさん
2008/01/13(日) 14:41:040785デフォルトの名無しさん
2008/01/13(日) 14:46:14!!
でも2次元配列として使えてますよ、、、?
0786デフォルトの名無しさん
2008/01/13(日) 14:59:42使えるし値の出し入れをしてるだけなら問題もおきないだろうが
データの並びというか構造が
int a[2][4]; とか
int (*a)[SIZE]= new int[SIZE][SIZE];
って二次元配列宣言したときのものとは異なる
そこを混同してるっぽいから間違ってる言われてるのかと
0787デフォルトの名無しさん
2008/01/13(日) 15:00:560788デフォルトの名無しさん
2008/01/13(日) 15:03:40なるほど。
int a[2][4];は8個の連続した領域になっているのに対して、
int (*a)[4] = new int[2][4];は、4個ずつは連続しているが、
2つに別れているかもしれない、ということですよね?
0789デフォルトの名無しさん
2008/01/13(日) 15:07:340790デフォルトの名無しさん
2008/01/13(日) 15:15:590791デフォルトの名無しさん
2008/01/13(日) 15:20:270792デフォルトの名無しさん
2008/01/13(日) 15:21:300793デフォルトの名無しさん
2008/01/13(日) 15:30:53違います
int a[2][4]; も int (*a)[4] = new int[2][4]; も
8個連続しています
していないのは
>>781です
0794デフォルトの名無しさん
2008/01/13(日) 15:36:18int **b = (int **)malloc(SIZE * sizeof(int *));
for (i = 0; i < SIZE; i++) {
b[i] = (int *)malloc(SIZE * sizeof(int));
}
b[2][1] = 10;
for (i = 0; i < SIZE; i++) {
printf("%p\n", b[i]);
}
printf("%d\n", b[2][1]);
ってしたら、連続領域にあるみたいなんですが?
0795デフォルトの名無しさん
2008/01/13(日) 15:39:26複数スレッド走っていて, i == 0 と i == 1 の間に他のスレッドに
プリエンプションされて, そっちのスレッドがmalloc() かけても
連続していると言い切れるかな?
0796デフォルトの名無しさん
2008/01/13(日) 15:43:01こういうこともできるって分かってるよな?
for (i = SIZE - 1; i >= 0; i++) {
b[i] = (int *)malloc(SIZE * sizeof(int));
}
0797デフォルトの名無しさん
2008/01/13(日) 15:44:47+ for (i = SIZE - 1; i >= 0; i--) {
0798デフォルトの名無しさん
2008/01/13(日) 15:47:160799デフォルトの名無しさん
2008/01/13(日) 15:52:47連続領域にしたければmallocは1回にしなきゃ無理だ。
2次元のように扱いたいならマクロでも作れ。
#defeine ARRAY_ACCESS( arrya, x, y ) arrya[ x * SIZE + y ]
0800デフォルトの名無しさん
2008/01/13(日) 15:54:01>>796
わかってます。
ということは、788に書いたことはやっぱり正しいのですよね?
0801デフォルトの名無しさん
2008/01/13(日) 15:58:09>>793
0802デフォルトの名無しさん
2008/01/13(日) 16:00:12[]も演算子なんだ。ポインタをずらした部分にアクセスするための演算子。
ってことは何次元であろうと連続した領域じゃなくちゃ困る。
2次元以上の場合[ x ][ y ]とした場合、実際には「x * SIZE + y」ずらせばOKだけど
ここでSIZEをどこから持ってくるかが問題。
>>799のように自前で作成するかint (*a)[4]のように無理やり教えるか
0803デフォルトの名無しさん
2008/01/13(日) 16:01:23あなた達みたいな低脳に聞いたのが間違いでした。
0804デフォルトの名無しさん
2008/01/13(日) 16:03:10そこで質問なのですが、初心者ならこれがお勧めというコンパイラはありますでしょうか?
エディタはサクラを使う予定です。どうかご教授お願いします。
0805デフォルトの名無しさん
2008/01/13(日) 16:07:19gccがお勧めです。
0806デフォルトの名無しさん
2008/01/13(日) 16:07:58Windowsでいいよな。個人的にはVCだけどbcc推す人も多いかな?
0807デフォルトの名無しさん
2008/01/13(日) 16:10:270808デフォルトの名無しさん
2008/01/13(日) 16:10:38GCC(MinGW)かVC++
0809デフォルトの名無しさん
2008/01/13(日) 16:27:23そうか。。。。。
自分は、
malloc()を複数回使って (int **a;と宣言した上で)int a[9][9]を確保したとき、
a[1][2]と書くと、a[1]のポインタが指しているメモリ位置(xとする)があって、
その先頭からintの2個分あとの位置にアクセスする、という理解でした。
(つまりx[2])。
上記の理解のように動作させようとすると、(a[1])[2]としても駄目ですか?
0810デフォルトの名無しさん
2008/01/13(日) 16:28:56ちなみに803は自分のコメントではありません。
0811デフォルトの名無しさん
2008/01/13(日) 16:36:57a[1][2]が示す先は
「ポインタ配列の2番目の要素a[1]が示すアドレスを先頭とする領域」の
「3番目の要素[2]」となる。
上記解釈なら問題ない。
0812デフォルトの名無しさん
2008/01/13(日) 16:40:56int main(void)
{
int i = 0;
int **a = malloc(SIZE * sizeof(int *));
for (i = 0; i < SIZE; i++) {
a[i] = malloc(SIZE * sizeof(int));
}
(a[2])[1] = 10;
return 0;
}
なら問題はないということでいいですよね?
0813デフォルトの名無しさん
2008/01/13(日) 16:48:09バイナリは全く同じでした。やっぱり何か間違ってるのかな。
アセンブラをみればいいんだろうけど、でもなんかいやだ。。。
はあ
0814デフォルトの名無しさん
2008/01/13(日) 16:53:35>>781
>>812
二つはまったく一緒だぞw
int (*a)[SIZE] = malloc(SIZE * SIZE * sizeof(int));
と
>>781
の違いは分かるか?
0815デフォルトの名無しさん
2008/01/13(日) 16:54:15>>781もだが、ちゃんとfree()を記述しよう。
0816デフォルトの名無しさん
2008/01/13(日) 16:58:34SIZE×SIZEの領域のメモリは連続していないが、
二次元配列のように使えるという点ではOK
あと、a[2][1]=10 と書けばよい。
0817デフォルトの名無しさん
2008/01/13(日) 17:06:57バッファをフラッシュしたいときだけendl、それ以外は常に'\n'使いますが。
# まさか、標準出力のときだけ別扱いするの?
ありがとうございます。
返信が遅くなりすいません。
質問の背景は以下のとおりです。
・初心者の私の読んでいる、ある本(以後本A)では、\nを使っている
・本の著者のHPに私と同じ質問があってそこには確かに
バッファをフラッシュしたいときだけendlで十分とある
・一方、他の本やHPなどではendlが多い(考えた上でのことか?)
・本Aに戻って、文字列の解説部分に、
「同一綴りの文字リテラルがプログラム中に複数ある場合、
(記憶域上)それらを同一として扱う処理系と、
別個として扱う処理系がある。
後者の場合、"\n"がプログラム中n個あれば合計2nバイトを占有する」
と書いてある。
そこでプロのみなさんはどうしているのかな、
と思って質問させていただきました。
(つづく)
0818デフォルトの名無しさん
2008/01/13(日) 17:07:42・VC++は、同一文字リテラルをどのように扱うのでしょうか。
(記憶域上、同一か別個か)
・だいたい、endlで行うバッファフラッシュのバッファとは
なんなのでしょうか。CPU内部のCacheですか?
(「# まさか、標準出力のときだけ別扱いするの?」
というお話からして、標準出力とファイル出力で
違うのでしょうか?どういうマシン語になるかという
レベルがわかる方なら簡単な話なのかもしれませんが
私には?です。)
・同一綴りの文字リテラルを別個として扱ってしまう処理系で
かつ組み込み用途など特別に記憶領域が厳しい場合は
どうしているのでしょうか?
const char* p = "\n";
として以後これを使う、なんてことを妄想中。。。
・質問の順序がぐちゃぐちゃですが、もっと基本的に
「プログラム中の同一文字リテラル」といった場合、
その”プログラム”というのは、
main以下全体の(=リンク後の)プログラム全体なのでしょうか?
言い換えると、同一綴りの文字リテラルを同一として扱う
処理系では、複数ファイル・分割コンパイルなどしていても
それぞれに共通な文字リテラルがある場合、
リンク時?に本当にこれらの記憶領域共通化を
図ってくれるものなのでしょうか?
バッファとかプログラムという基本的な言葉が釈然としない
初心者ですが、しっかりと分かっていらっしゃる様々な分野の
プロの方にご回答をお願いしたいと思っています。
0819デフォルトの名無しさん
2008/01/13(日) 17:16:26#include <stdio.h>
#include <stdlib.h>
#define SIZE 1024
int
main(int ac, char **av, char **ep)
{
int i, **a = malloc(SIZE * sizeof (int *));
for (i = 0; i < SIZE; ++i) {
a[i] = malloc(SIZE * sizeof (int));
(void)malloc(0x1000); /* あえて不連続に */
}
printf("%p %p %#x\n",
&a[0][0], &a[1][0], (int)((char *)&a[1][0] - (char *)&a[0][0]));
return 0;
}
うちとこの結果
0x603000 0x605000 0x2000
0820デフォルトの名無しさん
2008/01/13(日) 17:16:52とりあえず
"\n" は文字"列"リテラルだ
0821デフォルトの名無しさん
2008/01/13(日) 17:19:05・VC++は、同一文字リテラルをどのように扱うのでしょうか。
(記憶域上、同一か別個か)
コンパイラオプションの文字列プールというので
どっちにでもできたと思う。
0822775_817_818
2008/01/13(日) 17:20:11ですね、すいません、訂正します。
0823デフォルトの名無しさん
2008/01/13(日) 17:23:54(1) int **a = malloc(SIZE * sizeof(int *));
と
(2) int (*a)[SIZE] = malloc(SIZE * SIZE * sizeof(int));
の違いということですよね?
(1)は、「intへのポインタへのポインタ」を宣言して、(int *)をSIZE個確保。
(2)は、「intへのポインタのSIZE個の配列」、かと思いましたが、
配列にmalloc()の出力を代入できるのもおかしいし、、、
「intのSIZE個の配列の先頭を指すポインタ」ということ?
0824デフォルトの名無しさん
2008/01/13(日) 17:24:45> ・VC++は、同一文字リテラルをどのように扱うのでしょうか。
オプションで指定できる。
バージョンや最適化レベルによっても変わるかも。
どちらにせよリテラルについては規格上不定なところも多いので、
そういうのに依存するようなコーディングはやめとけ。
> ・だいたい、endlで行うバッファフラッシュのバッファとはなんなのでしょうか。
効率化のためにOS等が入出力をある程度一括して行う。
そのときに一時的にデータを貯めておくのがバッファ。
バッファにたまってるのを強制的に書き出すのがフラッシュ。
0825デフォルトの名無しさん
2008/01/13(日) 17:33:51> ・同一綴りの文字リテラルを別個として扱ってしまう処理系で
> かつ組み込み用途など特別に記憶領域が厳しい場合は
> どうしているのでしょうか?
> const char* p = "\n";
> として以後これを使う、なんてことを妄想中。。。
使いまわす対象が"\n"であるなら、
・対象が2byteと小さいので、特に使いまわしは考えない。
・文字列の出力関数の仕様を、「最後に改行が出力される」とする。
といったところ。
使いまわし対象がもっと大きな文字列なら、
文字列個別にIDを割り当てて、IDから文字列の先頭ポインタを取得する関数を作る。
0826775_817_818
2008/01/13(日) 17:34:56>>824
ありがとうございます。
コンパイラオプションの文字列プールMSDNで見てみました。
どうやらそれらしいですね。
(2005EEでは(debugですが)”いいえ”になってました)
>>そういうのに依存するようなコーディングはやめとけ。
ということはendlを常に使えということでしょうか?
>>一時的にデータを貯めておくのがバッファ
はい、ここまでは分かるのですが、具体的に(HW上)
いったいなんなんだろう、と思ったものですから。
組み込みなどを入れると全体のシステムといっても
いろいろあると思いますし。。。
0827775_817_818
2008/01/13(日) 17:38:20ありがとうございます。
そうですね、2byteですからね。
問題にならないんだとは思ったのですが、、、
ちなみに825さんはどういった分野の方なのでしょうか。
そして結論として、通常は\nを使うよ、ということで
よろしいでしょうか?
0828776
2008/01/13(日) 17:49:38取り敢えずここまで斜め読み。
・なんで"\n"を使うの? '\n'で充分だと思うのだけど。
・ファイルへの出力は、フラッシュのタイミングを常に意識すると思うわけで、標準出力についても同様だという認識。
・ちなみに、標準出力は適宜フラッシュしないと見えないという切実な問題があるわけで。
# 標準出力については、改行するとフラッシュされる処理系もあるけどそれに依存するのは如何なものかと思うし。
・蛇足ながら、ファイルへの出力は適宜フラッシュしなくてもどうせクローズするからそのときでいいという発想もあり。
# その場合、endlは一切使わないということになるかも知れず。
0829デフォルトの名無しさん
2008/01/13(日) 17:50:38(1)
int **a = malloc(SIZE * sizeof(int *));
for (i = 0; i < SIZE; i++) {
a[i] = malloc(SIZE * sizeof(int));
}
(2)
int (*a)[SIZE] = malloc(SIZE * SIZE * sizeof(int));
問われてるのは上記(1)と(2)の違いだ。
0830825
2008/01/13(日) 17:50:51組み込み屋です。
結論というか、一般論をいうなら、
基本はシンプルに書く。制約が厳しそうなら工夫して書く。
何がシンプルで何が工夫かは状況次第、臨機応変だ。
0831デフォルトの名無しさん
2008/01/13(日) 17:51:02横槍だけど
>>>そういうのに依存するようなコーディングはやめとけ。
>ということはendlを常に使えということでしょうか?
コンパイラの最適化の仕様に頼ったコーディングのことじゃない?
>具体的に(HW上)いったいなんなんだろう
メモリ。
>2byteだから問題にならない
組込みでCGIとかやったけど、意外に問題になることもある。
CGIの時は、クライアントでのHTMLの読み易さを捨てて、\nを全部消した。
で、>>825は「使いまわさない」と言ってるだけで、
「気にせず\nを文字列リテラルで使いまくる」とは言ってない。
対策として「最後に改行が出力される」出力関数を使うと言ってる。
こうすると\nは出力関数内の1箇所にしか出てこなくなるので。
0832デフォルトの名無しさん
2008/01/13(日) 17:56:19それは出力先や目的によって異なるんじゃないかな。
例えば出力先がファイルなら、endlのみだとその度に
ディスクアクセスが発生する。
そういう負荷を緩和するためにバッファに蓄えられるわけ。
0833デフォルトの名無しさん
2008/01/13(日) 18:07:59自分の結果。
0x804c010 0x804e020 0x2010
やっぱりまずいですね。
(別スレッドとかにしなくても空撃ちでも確認できるんですね!)
あと、もう自分としては
vector< vector<int> > a = vector<SIZE, vector<int>(SIZE));
がいいかなと思っているのですが、これだと動的に確保できないですよね?
つまり以下のようなことがやりたいのですが、
class test {
public:
vector< vector<int> > a;
test(int x, int y) {
a = vector<x, vector<int>(y);
}
}
};
つまり、aがあるクラスのメンバだとすると、SIZEを動的にはできないと思うんですが、
それは正しいですか?
0834デフォルトの名無しさん
2008/01/13(日) 18:08:03ためといて後で一括して… なんてわけにはいかない。
ファイルに保存するときはファイルを閉じたときにツジツマがあってれば
だいたい困らないから、こまめにフラッシュする必要はないよね。
つまりはそういうこと。
0835デフォルトの名無しさん
2008/01/13(日) 18:08:10ファイルの場合、basic_filebuf<> オブジェクトに書き込み要求
をしますが、バッファの大きさを指定することはできますか?
あと、sputcなどのStream Bufferのメンバ関数を使えばバッファ
されずに直接ディスクに書き込むことになるんですよね?
0836デフォルトの名無しさん
2008/01/13(日) 18:09:52はStream Bufferのメンバ関数呼び出しなどを行っているのでしょうか?
詳しい人教えて。
0837775_817_818
2008/01/13(日) 18:19:48プロの方がいっぱいでなんだかうれしいです。
なるほど、と思うことばかりです。
結局は目的・用途・制約などで、
条件が厳しい場合にはしっかりと使い分ける。
そうでない場合には、見やすさなどでと
いうことですね。個人によりそうですが。
バッファ(=外部メモリでよろしいでしょうか?)に
ついて確認させてください。
endlで、バッファフラッシュとなったとき、
CPUは、メモリコントローラに対して、
その指示を出す、ということで
あっていますでしょうか。
あと、818の最後の質問にも分かるかがいたら
お答えよろしくお願いいたします。
VC++での例のオプションON時だけでも構いません。
もうひとつだけ追加でお聞きします。
職場や仕事なででの
コーディングルールの中に
この改行について
書かれていることはありますか?
プロの方にしか聞けないことだと思いますので。
ご回答よろしくお願いいたします。
(組み込み関係ではない方もお願いします。
そんなの気にしたことない!、とか)
0838デフォルトの名無しさん
2008/01/13(日) 18:22:30そういう意味では「直接」書き込むなんて相当な黒魔術が必要だよ。
少なくとも今のWindowsなんかでは難しい。
だいたい、言語の規格としての定めはそこまで踏み込んだものじゃないから、
「どうなってるか」を知りたいのなら各処理系で実験してみるしかない。
(それでも最適化とかそのときの状況で色々だったりする)
>>836
それが必要なアーキテクチャならそう実装するだろうし、
そうでないならしない。
0839デフォルトの名無しさん
2008/01/13(日) 18:26:11ファイルサイズが0のまんまなの。
0840デフォルトの名無しさん
2008/01/13(日) 18:32:36お前頭大丈夫?
括弧が左右対応してなくて気持ち悪くないの?
0841デフォルトの名無しさん
2008/01/13(日) 18:33:260842デフォルトの名無しさん
2008/01/13(日) 18:48:06初期化子でぐぐってみ
0843デフォルトの名無しさん
2008/01/13(日) 18:51:160844デフォルトの名無しさん
2008/01/13(日) 21:13:09ほぼ期待通りのことができたのですが、
CString str = "abc";
と宣言と同時に値を代入する処理がうまくいきません。
どのようなオペレータを使えばできるでしょうか。
作成したものは以下のようなものです。
class CString{
private:
std::string data;
public:
operator const char*(){
return data.c_str();
}
bool IsEmpty(){
return data.empty();
}
void operator =(const char* value){
data = value;
}
void operator +=(const char* value){
data.append(value);
}
friend CString operator +(CString value1, CString value2){
CString a;
a = value1;
a.data.append(value2);
return a;
}
〜以下略〜
}
0845デフォルトの名無しさん
2008/01/13(日) 21:15:080846デフォルトの名無しさん
2008/01/13(日) 21:29:06例えば"6 * 6 - 2"だときちんと分解されるのですが
"6 * ( 6 - 2 )"だと"("を分解して終わってしまうみたいなんですがどうしてでしょうか?
また、これをすべて分解するにはどうすればいいのでしょうか...よろしくお願いします。
0847デフォルトの名無しさん
2008/01/13(日) 21:33:53>処理系では、複数ファイル・分割コンパイルなどしていても
>それぞれに共通な文字リテラルがある場合、
>リンク時?に本当にこれらの記憶領域共通化を
>図ってくれる
されるはずだが試してない。
気になるのならある程度長い特徴的な文字列で、
実際にコンパイルしてバイナリエディタでサーチしてみてくれ。
0848デフォルトの名無しさん
2008/01/13(日) 22:08:06勉強のためならあえて指摘しようかな。
operator const char *とbool IsEmptyはconstを付けよう。
friend CString operator +の引数はconst CString &にしよう。
0849846
2008/01/13(日) 22:12:34変なとこに割り込んでしまって申し訳ないです...
0850デフォルトの名無しさん
2008/01/13(日) 22:34:24ありがとうございます。
明日に試してみます。
>>848
指摘ありがとうございます。
operator const char * の場合どこにconstをつけるべきなのでしょうか?
0851デフォルトの名無しさん
2008/01/13(日) 22:37:54const CStringに対して呼び出せるようにするってことね。
operator const char*() const
bool IsEmpty() const
0852デフォルトの名無しさん
2008/01/13(日) 22:55:49なるほど・・・
勉強になりました。ありがとうございましたm(_ _)m
0853775_817_818_837
2008/01/14(月) 00:36:02>>847
ありがとうございます。
>>838
言語仕様からしてそこは「あいまいだ」と
いうことですね。
それがわかったことはのすごい収穫です。
もともと、なんだかあいまいな表現だなあ、と
思っていたわけで、その直感は、それはそれで
合ってたわけですね。
>>847
はい、そのうちでよければ、やってみます。
共通化してくれそうな気も少ししてきました。
0854デフォルトの名無しさん
2008/01/14(月) 01:04:52>>783はどこからか連続領域とかいう条件もってきてだめっていってるんだよな?
(それか「厳密には二次元配列ではない」という意味か)
0856デフォルトの名無しさん
2008/01/14(月) 01:45:460857デフォルトの名無しさん
2008/01/14(月) 09:00:33#ifndef __GNUC__
のようなマクロが定義してあるんですが、gccでコンイルしているかコンパイル時に分かるんでしょうか?
#define hoge(r,i) ¥
({ ¥
hoge _z_; ¥
huga(_z_) = (r); ¥
meso(_z_) = (i); ¥
_z_; ¥
})
#define hoge(z) (__real__ (z))
みたいな感じで、
やたらと、__や_を使っているのですが、
これはどういう意味やメリットが有るのでしょうか?
0858デフォルトの名無しさん
2008/01/14(月) 09:09:28Yes
>やたらと、__や_を使っているのですが、
__real__ は gcc の拡張機能で、gcc の組み込み複素数型の実数部を取得するキーワード。
_ が先頭に付いている識別子や、__ を含む識別子は処理系の予約語になってるから
(本当はもうちょっと規則がややこしい)、
ユーザ側で定義してはいけないことになっている。
だから、処理系がそういう識別子を使っても、
(ユーザがちゃんとこういう命名規則を把握しさえしていれば)
ユーザ側の識別子とは被らないようになっている。
0859デフォルトの名無しさん
2008/01/14(月) 09:10:50gcc:__GNUC__が定義されてる
他:そんなの知らん
ということ。
0860デフォルトの名無しさん
2008/01/14(月) 09:40:43おお、鋭いです
>__real__ は gcc の拡張機能で、gcc の組み込み複素数型の実数部を取得するキーワード。
この辺の事を詳しく書いているサイトって無いですか?
0861デフォルトの名無しさん
2008/01/14(月) 09:44:450862デフォルトの名無しさん
2008/01/14(月) 10:12:43complex ヘッダでも嫁
0863775_817_818_837
2008/01/14(月) 11:12:42いろいろ実験中なんですが、
いまさらのちょー基本的質問をさせてください。
char str[] = "ABC";
の"ABC"の代わりに
char* ptr = "ABC";
のprtを使って(strを)
初期化するようにすることはできますか?
char str[] = ptr; も
char str[] = *ptr; も
コンパイルエラーになるので、
どうしたらよいかわかりません。
よろしくお願いします。
なお、実験の方は、なぜか、文字列プールオプションを
OFFしていても共通化されてしまっている感じです。。。
(オプション相互の関係とかよくわかっていないので、
勝手にONになっているのかもしれません)
0864デフォルトの名無しさん
2008/01/14(月) 11:14:050865デフォルトの名無しさん
2008/01/14(月) 11:20:360866775_817_818_837
2008/01/14(月) 11:41:33>>865
ありがとうございます。
そうなんですね。だめですか。
constがprt定義についていても駄目でした。
となると、ここはdefineの代わりに
const char*を使うなんていうことは
できないということでしょうか。
(一般的にdefineの代わりにconstを使う方が
C++の場合よいよ、なんていう記述がどこか(本かHP)に
あったもんですから、確認させてくださいませ。)
あと、strcpyするためには、char str[xxx] のxxxが
あらかじめ決まってないといけないですよね。
なんかもどかしい感じがしてしまうのです。
0867デフォルトの名無しさん
2008/01/14(月) 11:43:03そもそも型が違う
strはarray of char、ptrはpointer、*ptrはchar
strncpy使え
0868デフォルトの名無しさん
2008/01/14(月) 12:55:54bool operator<(const CLS& x) const {}
bool operator<(CLS& x) {}
の違いって何なんですか?
後半にconst つけるとどういう効果があるんですか
0869デフォルトの名無しさん
2008/01/14(月) 12:59:44と明示している
あとmutableというキーワードもあってだな
0870デフォルトの名無しさん
2008/01/14(月) 13:02:150871デフォルトの名無しさん
2008/01/14(月) 13:03:52後者の非constメンバー関数はconstオブジェクトからは呼び出せない。
で、何で後者の引数にはconstをつけないんだ?
0872デフォルトの名無しさん
2008/01/14(月) 17:14:1264bit環境でコンパイルしても、32bit環境でコンパイルしても、必ず32bitや64bitであることが保証されている型はありますか?
__int32などを使えば良いのでしょうか?
0873デフォルトの名無しさん
2008/01/14(月) 17:19:33int64_t/uint64_t
C99だけど大抵の環境で使えるだろう。
0874デフォルトの名無しさん
2008/01/14(月) 17:32:13INT32とか使うしかない
0875デフォルトの名無しさん
2008/01/14(月) 17:33:550876デフォルトの名無しさん
2008/01/14(月) 17:34:31俺は標準に合わせといた方が良いと思うけど。
0877デフォルトの名無しさん
2008/01/14(月) 17:39:590878872
2008/01/14(月) 18:11:46プリプロセッサで判別することにします。ありがとうございました。
>>877
C言語なのでboost使えないんです。抜き出して使おうと思います。
0879デフォルトの名無しさん
2008/01/14(月) 18:28:37ないなら環境ごとに自分で定義すれば?
0880デフォルトの名無しさん
2008/01/14(月) 18:30:070881デフォルトの名無しさん
2008/01/14(月) 20:09:29スタック領域にメモリを確保するのは遅くないのでしょうか?
0882デフォルトの名無しさん
2008/01/14(月) 20:15:160883デフォルトの名無しさん
2008/01/14(月) 20:18:06esp レジスタの値をいじるだけだし。
ヒープに確保するのはそれはそれは複雑な処理だ。
0884デフォルトの名無しさん
2008/01/14(月) 20:18:42スタック上の領域は、確保した逆順にしか解放しない方式なので、仕組みが単純。スタックポインタというCPUレジスタを操作するだけなので高速。
ヒープは任意の順序で解放できるので、少し複雑になり、遅い。
0885デフォルトの名無しさん
2008/01/14(月) 21:05:570886デフォルトの名無しさん
2008/01/14(月) 21:08:28構造体のコンストラクタ呼べば
0887デフォルトの名無しさん
2008/01/14(月) 21:08:450888デフォルトの名無しさん
2008/01/14(月) 21:12:59構造体って、APIに渡す時ぐらいか使わないなあ。
0889デフォルトの名無しさん
2008/01/14(月) 21:13:090890デフォルトの名無しさん
2008/01/14(月) 21:14:460891デフォルトの名無しさん
2008/01/14(月) 21:15:04struct tag {
int x , y ;
}
みたいな小さい構造体にコンストラクタは馬鹿らしいと思うので、
コンストラクタ本体で代入することにします。
ご返答ありがとうございました。
0892デフォルトの名無しさん
2008/01/14(月) 21:16:52個人的には初期化方法のためだけにデータ型をクラスで実装するのは反対。
データ型なんて出てこないように全体的にクラス構成を考え直すということならアリだと思う。
0893デフォルトの名無しさん
2008/01/14(月) 21:21:420894デフォルトの名無しさん
2008/01/14(月) 21:30:44Cと文法を共通化させるためとは言っても(structの元々の存在意義ってコレよね?)
せっかくclassとstructがあるんだから、オブジェクト定義とデータ定義で使い分けた方がソース見やすくならない?
まぁ標準ライブラリ自体がアレだから、あんまり意味無いのかなぁ・・・
0895デフォルトの名無しさん
2008/01/14(月) 21:45:04最近興味あるプログラムのソースがC++であることが多くなり
C++も使えなきゃ駄目だなと思っています。
Cでは1500行くらいのプログラムを書いた事が有ります。
ポインタは分かっているつもりです。
アセンブラはほとんど分かりません。ごく稀にgdbでdisassembleする程度です。
オブジェクト指向は分かっていません。構造体の強化バージョン程度の理解です。
こんな感じの自分に、オススメのC++を紹介して頂けないでしょうか。
まぁ、「プログラミング言語の本は、どんな本でも一冊しっかり読めば
基礎力は付く」ってのは無しで。
0896デフォルトの名無しさん
2008/01/14(月) 21:48:36嫌なら、ヘルパ関数作るという手もある。
tag make_point(int x, int y)
{
tag t = {x, y};
return t;
}
class hoge
{
hoge(int x, int y) : foo(make_point(x, y)) {/* ... */}
tag foo;
};
0897デフォルトの名無しさん
2008/01/14(月) 21:49:04OOPをC++でやりたいならGanf Of Fourの
「オブジェクト指向における再利用のためのデザインパターン」は買っとけ
0898デフォルトの名無しさん
2008/01/14(月) 22:04:110899デフォルトの名無しさん
2008/01/14(月) 22:05:24素人でもいい。というかこの本以外に適当なC++でOOPをやってる
本が事実上ないんだよ。
後はネットで簡単なデザパタのページを見つけてそれを参考にいくつか
プログラムを自分で書いてみれば理解できる。
0900デフォルトの名無しさん
2008/01/14(月) 22:06:30C++ の本に固執しなくてもいいんじゃないかな。
C++ に応用させればいいだけだし。
0901デフォルトの名無しさん
2008/01/14(月) 22:08:21それがそうもいかない。C++には他の言語にはあまりない
多重継承という機能がありそれを利用した独特のデザパタがあるし、
ポインタと仮想関数でOOPしなければならないという特殊事情が
ありboostの使用も視野に入れなければならなくなってくる。
他のOOP言語ではC++よりスマートにOOPを実現している。
0902デフォルトの名無しさん
2008/01/14(月) 22:16:310903デフォルトの名無しさん
2008/01/14(月) 22:32:37実際、デバッグオプションも付けないでコンパイルしたプログラムを、
デバッガも使わず、プログラムの実行中に変数の中身を書き換える事って可能なの?
0904デフォルトの名無しさん
2008/01/14(月) 22:36:14そういうツールもちゃんとある
0905デフォルトの名無しさん
2008/01/14(月) 22:44:070906デフォルトの名無しさん
2008/01/14(月) 22:44:18どうやれば実現できるんだろう?
ツール名教えて。
0907デフォルトの名無しさん
2008/01/14(月) 22:46:51すれ違いだけどうさみみハリケーンとかすぺしゃるねこまんま
名前がふざけすぎだけど中身はまとも
使い方は自分で調べろ
あとメモリエディタでぐぐるとか
0908デフォルトの名無しさん
2008/01/14(月) 22:52:20(1)あらかじめ余分にメモリ領域を確保してLM作成。
(2)決まった手順でパッチを作成
(3)パッチをあてると、その領域に新関数を書き込み&旧関数の頭にはジャンプ命令を書き込み
ってのがあった。
動いたままパッチが当てられる。
0909デフォルトの名無しさん
2008/01/14(月) 23:02:53いきなりエリックガンマを読まなくてもいいだろ。
初心者に勧めるものではないな。
オブジェクト指向のこころのほうがアプローチが分かりやすい。
サンプルはJAVAだがあの程度なら覚えるのは簡単だし、分かりやすい
必要ならC++で記述するのもよし。
0910デフォルトの名無しさん
2008/01/14(月) 23:16:12「ポインタと仮想関数」って特殊事情ではないだろ。
むしろテンプレートなんかのほうがよっぽど特殊事情だ。
0911デフォルトの名無しさん
2008/01/14(月) 23:36:100912デフォルトの名無しさん
2008/01/14(月) 23:40:31あんたが思っている以上に大きい
0913デフォルトの名無しさん
2008/01/15(火) 02:59:35ヴォラタイルであってる?
0914デフォルトの名無しさん
2008/01/15(火) 03:18:070915デフォルトの名無しさん
2008/01/15(火) 03:34:00ファルスとナルであってる?
0916デフォルトの名無しさん
2008/01/15(火) 03:36:30ナルはいいけどファルスはやばいwww
0917デフォルトの名無しさん
2008/01/15(火) 03:37:350918デフォルトの名無しさん
2008/01/15(火) 03:41:22>ナルはいいけどファルスはやばいwww
ファルスでググったら勃起て出てきたwwww
こんどこらfalseをバルスって呼ぼうぜ!
0919デフォルトの名無しさん
2008/01/15(火) 03:58:11typedef double* vector とか書かれても読む気しない。
型が増えると逆に理解に苦しむのっては少数派なのか・・・
0920デフォルトの名無しさん
2008/01/15(火) 04:02:570921デフォルトの名無しさん
2008/01/15(火) 04:49:30派手に押し進められると、さすがにね。
0922デフォルトの名無しさん
2008/01/15(火) 09:39:12それ以外だと、違うアーキテクチャへの移植を意識するときくらいか。
0923デフォルトの名無しさん
2008/01/15(火) 09:52:32C++だからstructはtypedefしない。
0924デフォルトの名無しさん
2008/01/15(火) 12:31:02basic_string<char>と毎度毎度書きたくないだろう?
0925デフォルトの名無しさん
2008/01/15(火) 12:39:30typedef int data_type;
0926デフォルトの名無しさん
2008/01/15(火) 12:52:100927デフォルトの名無しさん
2008/01/15(火) 13:07:550928デフォルトの名無しさん
2008/01/15(火) 13:27:50プロトタイプの中で一度だけ指定しておけばいい。
0929デフォルトの名無しさん
2008/01/15(火) 13:40:50ありがと
0930デフォルトの名無しさん
2008/01/15(火) 14:15:04#if defined(USE_DOUBLE)
typedef double Float;
#else
typedef float Float;
#endif
なんてことをしている。
0931デフォルトの名無しさん
2008/01/15(火) 14:23:13vector<Widget>::const_iterator
maultimap<Widget>::value_type
と毎回書きたくないな。やっぱtypedefするわ。
0932デフォルトの名無しさん
2008/01/15(火) 15:08:49(void *)p
見たいのをみかけたのですが、この (void *) は何をやっているのでしょうか?
ちなみに、 free の引数で使われていました。
0933デフォルトの名無しさん
2008/01/15(火) 15:11:12意味無いと思うけど。
0934デフォルトの名無しさん
2008/01/15(火) 15:46:37「30度刻みで、640×480の画像の中心から12本放射線状に直線を描くプログラムを作成せよ」
って課題が出たらしいんだ。
んで、二点間の直線を引くというDrawLine関数が有ったと仮定して、
#define WIDTH 640
#define HEIGHT 480
#define X_CENTER ((WIDTH)/2)
#define Y_CENTER ((HEIGHT)/2)
#define ELLIPSE_A ((WIDTH)/2)
#define ELLIPSE_B ((HEIGHT)/2)
#define PI 3.1415
void DrawRadiation()
{
double i;
int x1,x2;
for( i = 0; i<360.0; i+=30.0)
{
rad = i * 2.0 * PI / 360.0;
x1 = X_CENTER + ELLIPSE_A * cos(rad);
y1 = Y_CENTER + ELLIPSE_B * sin(rad);
DrawLine( X_CENTER, Y_CENTER, x1,x2)
}
}
ぐらいまでなら俺も思いついたんだが(この時点で宿題は完成)、
これだと画像の中心から(ELLIPSE_A * cos(rad),ELLIPSE_B * sin(rad))
までしか、線を引けないよね。
どうやれば、画像のはしいっぱいまで放射線を書く事が出来ると思う?
今までテキスト処理ばっかりしかやってなかったから、いまいち思いつかない。
0935デフォルトの名無しさん
2008/01/15(火) 15:53:45(X_CENTER, Y_CENTER)と(x1, y1)を通る直線の方程式が得られるのだから、
それと画像の端との交点を求めればいいじゃん。
# 詳細は鼬害にて割愛。
0936デフォルトの名無しさん
2008/01/15(火) 16:20:130937デフォルトの名無しさん
2008/01/15(火) 16:31:360938デフォルトの名無しさん
2008/01/15(火) 17:18:25Hoge:Func(int v){
int a = v;
}
void Hoge:Func(void){
int a = 5;
}
どっちが速いでしょうか?
0939デフォルトの名無しさん
2008/01/15(火) 17:19:43ありがとうございます。
template <class T, typename Arg, typename Res>
vector<T> line2vec(string line, char delim, unary_function<Arg,Res> func)
こんな関数を定義したのですが、どうやっても呼び出せません(泣)
string s = "1234567";
vector<int> vec = line2vec<int>(s, ' ', NULL);
とやると、
error: no matching function for call to 'line2vec(std::string&, char, NULL)'
と言われます。どこか間違ってますか?
0940デフォルトの名無しさん
2008/01/15(火) 17:22:35秒間60回程度なら気にする必要はない。
0941デフォルトの名無しさん
2008/01/15(火) 17:25:100942デフォルトの名無しさん
2008/01/15(火) 17:28:18NULLじゃなくてunary_functionを渡せよ
何がしたいんだ
0943デフォルトの名無しさん
2008/01/15(火) 17:36:46NULLをデフォルトにしといて、デフォルトかそれ以外かで処理をわけたかったんだよ。
でも色々試したけどNULLはうまくいかないので、ちゃんと関数をわたしてみる。
ありがとう。
0944デフォルトの名無しさん
2008/01/15(火) 17:53:08funcの引数は単にTとでもしたほうが最適化されやすいと思う。
0945デフォルトの名無しさん
2008/01/15(火) 20:00:37unary_function型にNULL渡せるわけがないだろ
0946デフォルトの名無しさん
2008/01/15(火) 21:32:51/*--- 単純交換ソート ---*/
void bubble(int a[], int n)
{
int i, j;
for (i = 0; i < n - 1; i++) {
for (j = 1; j <= n - i; j++)
if (a[j - 1] > a[j])
swap(&a[j - 1], &a[j]);
}
}
このアルゴリズムを利用して整数が格納された要素数5の配列を昇順にソートする際、
仮引数のnに5を渡すと内側のループでjが5になるときがあります。
それでも正常に動作するのですがこれはどういう仕組みなのでしょうか。
0947デフォルトの名無しさん
2008/01/15(火) 22:05:44たまたま運良く動いてるだけかと
与えるデータによっては正常に動かない
int a[]={2147483647, 4, 3, 2, 1};
bubble(a, 5);
とかやってみ
0948デフォルトの名無しさん
2008/01/15(火) 22:58:27>内側のループでjが5になるときがあります
forを抜けた後の値見てるんだろ
0949デフォルトの名無しさん
2008/01/15(火) 23:59:18ありがとうございました。
0950デフォルトの名無しさん
2008/01/16(水) 00:56:47cout << i << endl;
for(int i = 0; i <= 4; ++i)
cout << i << endl;
両者に表示結果の違いはありますか?
0951デフォルトの名無しさん
2008/01/16(水) 00:58:441234
0952デフォルトの名無しさん
2008/01/16(水) 01:00:19やってみれば?
0953デフォルトの名無しさん
2008/01/16(水) 01:08:220954デフォルトの名無しさん
2008/01/16(水) 01:13:000955デフォルトの名無しさん
2008/01/16(水) 01:13:32自分晒しage
0957デフォルトの名無しさん
2008/01/16(水) 01:16:320958デフォルトの名無しさん
2008/01/16(水) 01:40:05i++と、++iの違いなんて初歩中の初歩だろ。
どんな参考書でも載ってるはずだぜ。
0959デフォルトの名無しさん
2008/01/16(水) 01:42:59その場合だとない。
>>951
僕の気のせいか。
for ( ; ; 最初期化式)だから、ループの終わりにインクリメントされるはず。
つまり、
for (i = 0; i <= 4; ) {
何たらかんたら
i++; // または ++i;
} と同じ
for(int i = 0; i <= 4; )
cout << i++ << endl;
for(int i = 0; i <= 4; )
cout << ++i << endl;
この二つは、スタックの関係で違うはず。
とりあえず試せ
0960デフォルトの名無しさん
2008/01/16(水) 01:43:170961デフォルトの名無しさん
2008/01/16(水) 01:45:070962デフォルトの名無しさん
2008/01/16(水) 02:00:40言語仕様と実装を混ぜて語るなって
0963デフォルトの名無しさん
2008/01/16(水) 02:01:15これは釣り?
0964デフォルトの名無しさん
2008/01/16(水) 02:38:150965デフォルトの名無しさん
2008/01/16(水) 02:39:050966デフォルトの名無しさん
2008/01/16(水) 02:39:14>>950
のどっちの形式が好き?
0967デフォルトの名無しさん
2008/01/16(水) 02:42:240968デフォルトの名無しさん
2008/01/16(水) 02:43:510969デフォルトの名無しさん
2008/01/16(水) 02:51:130970デフォルトの名無しさん
2008/01/16(水) 02:53:300971デフォルトの名無しさん
2008/01/16(水) 02:55:260972デフォルトの名無しさん
2008/01/16(水) 05:20:310973デフォルトの名無しさん
2008/01/16(水) 07:04:06のサイトにある、complex.hを読んでいるんですが、
gccでマクロを展開してここのソースを読むと、
/* setjmp(cjmpenv)の返却値 */
#define C_DIVIDE_BY_ZERO 1 /* 0で除算しようとした */
#define C_ARG_ZERO 2 /* 0の角度を求めようとした */
略
#endif
#if __GNUC__==2
#define complex __complex__
#define Re(z) (__real__ (z))
#define Im(z) (__imag__ (z))
#else
typedef struct {
double re;
double im;
} complex;
などごっそり書いてあった部分が、
/* setjmp(cjmpenv)の返却値 */
# 24 "complex.h"
typedef struct {
double re;
double im;
} complex;
# 77 "complex.h"
/* xの実数部にsを加える */
# 89 "complex.h"
/* xの虚数部にsを加える */
と、# 24 "complex.h"や# 77 "complex.h"などに置き換えられているようです。
この#24や#77はどういう意味なのでしょうか?
0974デフォルトの名無しさん
2008/01/16(水) 07:27:29gccローカルな行番号コメントなんでしょう。よって、スレ違い。
0975デフォルトの名無しさん
2008/01/16(水) 08:38:15前者だな。
i+=1とか書く代わりと考えてるから。
0976デフォルトの名無しさん
2008/01/16(水) 08:55:300977デフォルトの名無しさん
2008/01/16(水) 09:01:310978デフォルトの名無しさん
2008/01/16(水) 09:43:11でもコンパイラに任せて使い慣れたほうでいいと思う。
0979デフォルトの名無しさん
2008/01/16(水) 09:45:03/ ―\ ┏┛
/ノ (●)\ ・
. | (●) ⌒)\
. | (__ノ ̄ |
\ /
\ _ノ
/´ `\
| |
| |
___ ━┓
/ ― \ ┏┛
/ (●) \ヽ ・
/ (⌒ (●) /
/  ̄ヽ__) /
. /´ ___/
| \
| |
0980デフォルトの名無しさん
2008/01/16(水) 10:09:31エディタ:BCC Developer
質問です。
今C++を、0からのゲームプログラミングというHPで勉強中なのですが、
スケルトンプログラムの項目で、サンプルを落として、ビルドしようとしたところ、
エラー E2209 c:\Borland\Bcc55\include\dmusicc.h 20: インクルードファイル 'dls1.h' をオープンできない
という表示がでてビルドできず、先に進めなくなってしまいました・・・。
調べてみたところ、Borland C++ Compiler 5.5には「dls1.h」が含まれてなく、
別途用意しないといけないみたいなんですが、そのファイルがどこに行っても見つかりません・・・。
(1件配布していたところがあったみたいですが、すでにデータが消えてました。archiveも×)
どなたか、この「dls1.h」の入手先が分かる方いませんでしょうか・・・?
勉強先を変えたほうがいいのかな・・・。
0981デフォルトの名無しさん
2008/01/16(水) 10:12:49DirectX SDK
0982デフォルトの名無しさん
2008/01/16(水) 10:17:03最適化はずしてアセンブラ出力して比べてみな
0983デフォルトの名無しさん
2008/01/16(水) 10:18:08http://clootie.narod.ru/cbuilder/index.html
0984デフォルトの名無しさん
2008/01/16(水) 10:51:31i+=1と++iの結果は左辺値じゃね?i++の結果は右辺値じゃね?
0985デフォルトの名無しさん
2008/01/16(水) 10:54:06i++の結果ってなんだよww
0986デフォルトの名無しさん
2008/01/16(水) 10:55:22++i の値は現在の i そのもの。
0987デフォルトの名無しさん
2008/01/16(水) 10:55:470988デフォルトの名無しさん
2008/01/16(水) 11:00:040989デフォルトの名無しさん
2008/01/16(水) 11:04:45んー・・・DirectX SDK - November 2007ですよね?
これはインストールして、インクルードパスはちゃんと設定しているのですが・・・。
フォルダの中を探してもdls1.hは無いしorz
DirectX Control Panel→DirectMusicタブの項目が灰色になってて、
設定変更できないのとか何か関係あるのだろうか・・・。
0990デフォルトの名無しさん
2008/01/16(水) 11:10:220991デフォルトの名無しさん
2008/01/16(水) 11:47:29August 2007ならあるみたいなので、そっちをダウンロード中・・・。
ありがとうございました。
0992デフォルトの名無しさん
2008/01/16(水) 13:09:52初心者歓迎だからでしょ。
0993デフォルトの名無しさん
2008/01/16(水) 14:11:51STL使いには常識だと思うが。
ttp://oshiete1.goo.ne.jp/qa1285242.html
0994デフォルトの名無しさん
2008/01/16(水) 14:20:300995デフォルトの名無しさん
2008/01/16(水) 14:34:15ここで公開されてるプログラムを使ってみようと思い
コンパイルしてみたのですが
cv109.c: In function ‘readfile’:
cv109.c:2363: error: ‘gzFile’ undeclared (first use in this function)
cv109.c:2363: error: (Each undeclared identifier is reported only once
cv109.c:2363: error: for each function it appears in.)
cv109.c:2363: error: expected ‘;’ before ‘fpz’
cv109.c:2519: error: ‘fpz’ undeclared (first use in this function)
cv109.c:2523: 警告: ポインタと整数との比較を行なっています
cv109.c: In function ‘column_check’:
cv109.c:2891: error: ‘gzFile’ undeclared (first use in this function)
cv109.c:2891: error: expected ‘;’ before ‘fpz’
cv109.c:2895: error: ‘fpz’ undeclared (first use in this function)
cv109.c: In function ‘dnum_check’:
cv109.c:2946: error: ‘gzFile’ undeclared (first use in this function)
cv109.c:2946: error: expected ‘;’ before ‘fpz’
cv109.c:2950: error: ‘fpz’ undeclared (first use in this function)
cv109.c:2960: 警告: ポインタと整数との比較を行なっています
cv109.c: In function ‘data_read’:
cv109.c:2995: error: ‘gzFile’ undeclared (first use in this function)
cv109.c:2995: error: expected ‘;’ before ‘fpz’
cv109.c:2998: error: ‘fpz’ undeclared (first use in this function)
cv109.c:3029: 警告: ポインタと整数との比較を行なっています
というエラーが出てしまいました。インクルードしなければいけないのは多分インクルードできてると思うのですが・・・
どのようにすれば解決できるのか、分かる方はぜひ教えてください。
環境はUbuntu7.10
コンパイラはgccです。
0996デフォルトの名無しさん
2008/01/16(水) 14:36:17あなたは世界を革命するしかないでしょう。
0997デフォルトの名無しさん
2008/01/16(水) 14:47:200998デフォルトの名無しさん
2008/01/16(水) 14:49:59式の結果のこと。値を返すのは単なるside effectに過ぎない。
左辺値と右辺値じゃ全然ちがくね?
i++ = 5;は無効だが、++i = 5; と (i += 1) = 5; は有効じゃね?
i++をi += 1の代わりとするのは違うんじゃね?
むしろ代わりになるのは++iじゃね?
0999デフォルトの名無しさん
2008/01/16(水) 14:56:18つzlib
1000デフォルトの名無しさん
2008/01/16(水) 15:05:5010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。