【初心者歓迎】C/C++室 Ver.46【環境依存OK】

このエントリーをはてなブックマークに追加
1ぬ ◆NUNUK382Dk
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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
2デフォルトの名無しさん:2007/12/27(木) 20:36:19
>>1
3デフォルトの名無しさん:2007/12/27(木) 20:37:35
ソースコードを載せる人はちゃんとインデントをつけましょう。
半角スペース、タブ文字は2chでは使えません。
全角スペースを使ってもいいですが、 と入力すると半角スペースとして表示されます。
全角スペースではそのままコピペして使うことができないので、
ここにソースを貼るときはできる限りエディタでタブ文字等を に置換しましょう。
4デフォルトの名無しさん:2007/12/27(木) 20:45:18
 本当か?
5デフォルトの名無しさん:2007/12/27(木) 20:48:16
 うん
本当
6デフォルトの名無しさん:2007/12/27(木) 20:52:14
やべえ、うちの2chブラウザだと、
& nbsp;って文字まで半角スペースに変換しやがる
何この無駄な機能w ふざけんなww
7デフォルトの名無しさん:2007/12/27(木) 20:53:43
>>3の が見えないってことか?
ハイ機能だな
8デフォルトの名無しさん:2007/12/28(金) 01:23:02
ポップうpで見れば問題解決なのだが
9デフォルトの名無しさん:2007/12/28(金) 02:18:52
/**/
10デフォルトの名無しさん:2007/12/28(金) 03:48:46
 test
11デフォルトの名無しさん:2007/12/28(金) 07:48:44
 
 
12デフォルトの名無しさん:2007/12/28(金) 15:00:45
失礼します。
当方VC++2005ExpressEditionを使用しています。
作成したプログラムをビルドをしたら
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__dispose_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__close_reader_writer が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__read_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__write_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__polling_and_get_card_information が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__open_reader_writer_auto が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__initialize_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__get_last_error_types が関数 "void __cdecl error_routine(void)" (?error_routine@@YAXXZ) で参照されました。
1>C:\Documents and Settings\mouna\My Documents\Visual Studio 2005\Projects\testtest\Debug\testtest.exe : fatal error LNK1120: 外部参照 8 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\mouna\My Documents\Visual Studio 2005\Projects\testtest\testtest\Debug\BuildLog.htm" に保存されました。
1>testtest - エラー 9、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

というメッセージが出てしまいました。
これらはどのように対処すればいいのでしょうか。
13デフォルトの名無しさん:2007/12/28(金) 15:18:46
>>12です。
Cとしてコンパイルをしないといけないのかと思い
extern "C" {
を加えてみたのですがやっぱりかわりませんでした。
14デフォルトの名無しさん:2007/12/28(金) 15:23:32
必要なライブラリをリンクしてないからでしょ
15デフォルトの名無しさん:2007/12/28(金) 18:27:16
アーケードのをクリアしたなあ。
8面で穴に落とす係りの奴が出てきて一発殴ると終わるよね。

レバーを入れるのと同時にパンチを連打すると当たりやすいんで
やたら忙しくココココココンってレバーをやりながらボタン連打してた。
ジャブが二発入ったらストレート、あとはその繰り返しで
適当に上下に振って動かしながらやれば何とかなるよね。
16デフォルトの名無しさん:2007/12/28(金) 18:27:47
誤爆
17デフォルトの名無しさん:2007/12/28(金) 20:03:19
>>14
おっしゃるとおりでした。
2日間もバカみたく考えてましたw
無事解決しました。
ありがとうございました!
18デフォルトの名無しさん:2007/12/29(土) 13:39:40
ファイル読み込みについて質問です、
ファイルの何バイト目から読み込むというのはできるっぽいんですが、
ファイルのX行目から読み込みたい場合、
getlineをX回実行という方法で行うんでしょうか?
19デフォルトの名無しさん:2007/12/29(土) 13:43:19
>>18
それで不都合がなければそれでいいんじゃね?
20デフォルトの名無しさん:2007/12/29(土) 13:43:24
Yes
ランダムで何行目って読む場合は各行の場所を保存しておくと便利
21デフォルトの名無しさん:2007/12/29(土) 14:05:53
>>19-20
別に不都合はないんですが、直接飛べる方法があるなら
そっちの方が早いかなと思いまして

ありがとうございました
22デフォルトの名無しさん:2007/12/29(土) 14:35:59
専用フォーマットにしていいんなら
struct file_header {
unsigned int line_number;
};

struct line_header {
unsigned int offset_address;
};

file_header header;
line_header lines[header.line_number];
char line0[];
char line1[];
......

にすればすぐ読み出せるぞ。
23デフォルトの名無しさん:2007/12/29(土) 15:51:17
質問です。
引数をリストにしたいのですが、
リストを作るところで、困っています。

int main(int argc, char *argv[]){

typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
char *argv;
}Listnode;

Listnode list[argc-1];

for(i=0;i<argc;i++){ <--ココ
list[i].argv = argv[i+1];
list[i].prev = NULL;
list[i].next = &list[i+1];

exit(0);
}

何か良い方法はないでしょうか?
24デフォルトの名無しさん:2007/12/29(土) 15:55:03
リストのことをちゃんと書いた本でも読め。
そうでもなければおとなしく std::list 使っとけ。
25デフォルトの名無しさん:2007/12/29(土) 16:02:12
>>24
すいません。
c++では無いんです。
ああ、そうか!
ちょっと良い案思い浮かんだんで、試してきます。
26デフォルトの名無しさん:2007/12/29(土) 16:12:36
とりあえず、双方向リストはリングリストにすると実装しやすいよ。
27デフォルトの名無しさん:2007/12/29(土) 16:13:35
良く見たら確かに C99 だな。

まあ、exit(0); じゃなくて return 0; でいいと思うが。
どっちも同じと言えば同じだが。
28デフォルトの名無しさん:2007/12/29(土) 16:57:16
int n = 2007;
if ( n == false) {
  // nが偽だったら実行
  exit(-1);
}

の内側が実行されてしまいます。
どうすれば治りますか?
29デフォルトの名無しさん:2007/12/29(土) 17:01:42
直るも何も、int と bool を比較している時点で何かおかしい。
30デフォルトの名無しさん:2007/12/29(土) 17:11:26
できたー!
んですが、どこかで失敗しているらしく、終了しません。
1000 ガンダムみたいに、数字と文字のペアを管理するリストを作って、
引数に./a.out 1000 ガンダム 2000 ウルトラマン 3000 仮面ライダー
を取るとして、引数が
./a.out 1000 ガンダム なら動くんですが、
./a.out 1000 ガンダム 2000 ウルトラマン
になると、処理が戻ってこなくなります。
うまく2個目のリストが出来ていないみたいなんですが、どこが間違っているでしょうか?
typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
char *data;
char *argv;
}ListNode;
31デフォルトの名無しさん:2007/12/29(土) 17:12:11
int i;
ListNode *first, *last, *new;
first = last = NULL;

do{
i = 1;
new = (ListNode*)malloc(sizeof(ListNode));
new->data = argv[i];
new->argv = argv[i+1];
new->next = NULL;
i = i+2;

if(NULL != last){
last->next = new;
new->prev = last;
last = new;
}
else{
first = last = new;
new->prev = NULL;
}

}while (i < argc);
32デフォルトの名無しさん:2007/12/29(土) 17:13:30
 >>28
 確かに、>>29 は正しいが、C,C++ではよくあること。

 その if より前に n に false が代入された。
 あるいは、その処理系では、false が、 2007 とされている。
 あるいは、どこかその処理より前で、
#undef false
#define false 2007
を書かれている。
33デフォルトの名無しさん:2007/12/29(土) 17:19:09
C/C++ でも if(!n) とすればいい話だな。
もし n が真偽を表現しているのであれば。
3425:2007/12/29(土) 17:31:15
すいません。
解決しました。
do{
i = 1;
new = (ListNode*)malloc(sizeof(ListNode));
new->data = argv[i];
new->argv = argv[i+1];
new->next = NULL;
i = i+2;

i=1;
do{
new = (ListNode*)malloc(sizeof(ListNode));
new->data = argv[i];
new->argv = argv[i+1];
new->next = NULL;
にしたら動きました。
感動!
35デフォルトの名無しさん:2007/12/29(土) 17:35:01
new->argv じゃなくて new->prev じゃないの?
36デフォルトの名無しさん:2007/12/29(土) 17:44:55
#include <stdio.h>

void test(void){
  puts("test");
}

void hoge(int x){
  if(x==0)return test();//←ここ
  else puts("hoge");
}

int main(){
  hoge(0);
  return 0;
}

以上のコードがbccで通る(警告は出る)んですが、
これって規格上問題ないんですか?
37デフォルトの名無しさん:2007/12/29(土) 17:47:45
2行に分ければいいじゃん
38デフォルトの名無しさん:2007/12/29(土) 17:51:25
規格上は戻り値の型が void の場合は
return 文は引数を取ってはならない。
39デフォルトの名無しさん:2007/12/29(土) 17:52:43
hoge()がvoidなのにreturnして怒られない?

つーかこの仕様だとreturn要らないような気がするのだが
40デフォルトの名無しさん:2007/12/29(土) 17:56:42
test の型も void だから通すコンパイラもありはする。
でも、規格上は問題あり。
41デフォルトの名無しさん:2007/12/29(土) 18:31:41
まあ、おとなしく { } つけろってこった。
42デフォルトの名無しさん:2007/12/29(土) 18:40:15
戻り値型voidの関数でvoidをreturnするのは合法だと思ったが
43デフォルトの名無しさん:2007/12/29(土) 18:58:17
普通は合法なら警告はでない。
44デフォルトの名無しさん:2007/12/29(土) 18:59:00
んなこたーない。
45デフォルトの名無しさん:2007/12/29(土) 20:46:11
>>40
C++でコンパイルすれば問題ない
46デフォルトの名無しさん:2007/12/29(土) 22:26:28
すいません、コールバック関数って何ですか?
例えば、
typedef int (CALLBACK *OPEN)(char *);
typedef int (CALLBACK *CLOSE)(int);
ここで記述されているCALLBACKというものがそうらしいのですが、
さっぱりわかりません。


47デフォルトの名無しさん:2007/12/30(日) 00:02:04
>>46
環境が何だか分からんが、そのCALLBACKは何処かで#defineされてるもので
コールバック関数とは直接的には関係ない。
48デフォルトの名無しさん:2007/12/30(日) 00:16:49
>>46
CALLBACKはWindowsなら__stdcallの別名で通常は修飾なしの関数と同じ。
コープバック関数ってのはイベント通知や内部でユーザー定義の関数呼び出す場合に関数に渡すユーザー関数のポインタ。
49デフォルトの名無しさん:2007/12/30(日) 00:19:00
どうみてもコールバック用の関数ポインタ
CALLBACKならWindows環境だと__stdcall
実はWindowsのエントリポイントであるWinMainにつけるWINAPIも、__stdcallだったりする
__stdcallは呼ばれた側がスタックの解放をするって動作を指定する
だからコールバックできるんですね

コールバックはどっかから呼び出してもらう関数のこと
折り返し電話してもらうことをコールバックっていうよね
あれと同じで、自分から明示的に呼び出さない
自分、っていっているのは、右手が恋人のおまいじゃなくて、コールバック関数が定義された側の処理
50デフォルトの名無しさん:2007/12/30(日) 00:26:11
>>49
コールバックできるかどうかに__stdcallは関係ないよ。
51デフォルトの名無しさん:2007/12/30(日) 00:31:57
>>50
そりゃ「できるかどうか」に限定すれば関係ないけどね
5225: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 仮面ライダー)というリストが出来た。*/

5325:2007/12/30(日) 08:29:07
point = first->next;
for(this = first;this != NULL;){
if(NULL == first->next)
break;
if(NULL == point->next)
break;

if(0 == strcmp(this->argv,point->argv)){
if(NULL != point->prev)
point->prev->next = point->next;

else
first = point->next;

if(NULL != point->next)
point->next->prev = point->prev;

free(point);
continue;/*文字列がかぶっているリストが除外されたので(1000 ガンダム)から調べ直し*/
}else point = point->next;/*文字列がかぶっていないので次のリストの文字列と比較*/
}
54デフォルトの名無しさん:2007/12/30(日) 08:56:17
>どこを直せば良いでしょうか?
データ構造の設計を0から。
5525:2007/12/30(日) 09:07:15
え、リストじゃ駄目ってことですか?
じゃあ、何が良いんですか?
配列?
56デフォルトの名無しさん:2007/12/30(日) 09:13:17
学校の課題とかならともかくリスト構造使う意味がわからない
5725:2007/12/30(日) 09:23:39
えっと、引数の個数がいくつ有るか分からないからです。
58デフォルトの名無しさん:2007/12/30(日) 09:27:23
引数・・・まあいいか

リスト構造わかってるのになんでわからないのかわからない、それ自体写しか?
データ構造って指摘されてるのは"1000 ガンダム"とかいれちまってるせいじゃないの
それにしたってまあ比較は出来るけど1000と"ガンダム"でわけようぜ

というかなんでその問題が解けないか全く理解出来ない
5925:2007/12/30(日) 09:39:58
1000 とガンダムは分ける事は出来ないんです。
引数は1000 ガンダム 2000 ウルトラマンと分かれているんですが、
プログラムの中ではペアで管理しないとまずいんです。
リニアサーチを参考にしたんですが、どうしても、
リストの繋ぎ替えがうまく行かないんです。
malloc: *** Deallocation of a pointer not malloced: 0x300260;
This could be a double free(), or free() called with the middle of an allocated block;
Try setting environment variable MallocHelp to see tools to help debug
ってエラーが出るんです。
do{}while{}を使おうとしてたんですが、whileの条件がどうしても書けなくて...
60デフォルトの名無しさん:2007/12/30(日) 09:43:29
ペア管理って、だから構造体にいれんじゃないの

つなぎかえなら図でも書いてみろ、やることは単純だ
whileの条件はわかりやすくしたきゃ末尾にnullでも明示的にいれとけ
61デフォルトの名無しさん:2007/12/30(日) 09:44:38
要素の除外を効率的に行うには確かにリストは最適ではあるわな。
リストの組み替えをしたいなら、
リストの組み替え前と組み替え後の状態を紙に書いて、
どう変化させればいいかを考えてみるといい。

あと、リストを実装する場合、
リストの端っこは、NULL にするより、
端っこを表すダミーのノードを作った方が実装しやすい。
6225:2007/12/30(日) 09:50:28
わかりました。
もちょっと努力してきます。
63デフォルトの名無しさん:2007/12/30(日) 10:09:21
ていうか、そのためのlastなんじゃないの?>61
64デフォルトの名無しさん:2007/12/30(日) 10:27:58
コマンドラインからだろうとファイルからだろうと、通常事前に件数は把握できるだろうから
その必要がない限りリスト構造を使う意味はないと思うが。
65デフォルトの名無しさん:2007/12/30(日) 10:31:22
>>63
違う。
ダミーのノードは全ての有効なノードとは異なるノード。
有効なノードが0個の時でも存在してないといけないわけで。
6625:2007/12/30(日) 16:14:57
うぇぇん。やればやるほど分け分かんなくなってきた。
まず、今のやり方で進んでいった場合、
1000 ガンダム 2000 ガンダム3000 ウルトラマンのように、 
しょっぱなに消したい文字列がある場合はともかく、
1000 ガンダム 2000 仮面ライダー 3000 仮面ライダー
のような場合、非常に大変なんじゃないかという気がしてきた。
typedef struct tagListNode{
struct tagListNode *next;
char *data;
char *argv;
}ListNode;

/*first(1000 ガンダム)->(2000 ガンダム)-> (3000 ウルトラマン)-> last(4000 仮面ライダー)というリストが出来た。*/ 
/*同じ文字を持つペアを(2000 ガンダム)を消したい*/
this = first;/*最初から調べる*/
do{
if(0 == strcmp(this->argv,this->next->argv)){/*今のノードと次のノードの文字列を比較*/
if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/
this->next = NULL;
else
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
free(this->next); /*(2000 ガンダム)を消す*/
this = first;/*(1000 ガンダム)と(3000 ウルトラマン)比較から始める*/
continue;
}
else
this = this->next; /*文字列のかぶりは無かったので次と比較*/
}while(this == NULL);
67デフォルトの名無しさん:2007/12/30(日) 16:21:52
はじめまして。
現在ステレオのwaveファイルの波形データを左右のチャンネル別々に配列に保存したいと思っているのですが、
C++どころかプログラミング自体今まであまり触れてこなかったので、ファイルの読み込み方が全く分かりません。
waveファイルのフォーマットは16bitでStereoなので、ファイルは「aa aa bb bb cc cc dd dd」のように表現されています。
まずは左のチャンネルのデータから記述が始まって、左右左右…の順にデータが格納されてます。
上の例だとaa aaが最初の左の音データ、bb bbが最初の右のデータでcc ccが2番目の左、dd ddが2番目の右です。
しかもリトルエンディアン? とかいう形式らしく、10進で10000という数字の場合なら16進で2710と表現してくれればいいのに
10 27という風に上位と下位が入れ替わって記述されているんです。
だからそれもC++で数値として扱えるように上位下位を入れ替えながら読み込む必要があります。
しかもwaveファイルの波形データを読み込もうと思った場合、ヘッダの事もあるので
純粋に波形データだけ欲しい場合ヘッダはすっ飛ばして読みこまなきゃいけないんです。

要はバイナリファイルをデータのアドレス指定をして自分の好きな場所から好きな場所まで読み込む操作をしたいのですが…。
ヘッダのバイト数とかwaveの形式とかはなんとか理解は出来たので、読み込み方がわかれば多分大丈夫だと思います。
ファイル全体を一気に読み込むのは流石に調べて分かったんですが、場所指定しての読み込みがどうしても分からなかったので
質問させていただきました。どうかよろしくお願いします。
68デフォルトの名無しさん:2007/12/30(日) 16:31:11
fseekで読みたい場所にシークするだけじゃん。
あとx86系CPUならエンディアン変換はしなくていい。
69デフォルトの名無しさん:2007/12/30(日) 16:32:01
CPUもリトルエンディアンなら、単純に2バイトずつ読めばいい。

任意の位置からの読み込みは、C++のstream類ならseekg、
CのFILE*ならfseekといった具合に、位置を指定する方法があるのでそれを使う。
7067:2007/12/30(日) 16:42:45
ありがとうございます。エンディアンは気にしなくて良いのですね。
あと、ファイルをシークするということは、一度ファイル全体を読み込み、
そこからシークしてデータを取り出すということですよね?
waveファイルって1つが結構大きいので、既に再生用にwaveをメモリに読み込んでいることもあり、
データをチャンネルごとに分けて読み込むうえに更に読み込み用にファイルを読み込むとなると
あとで全体のデータは破棄するにしても結構メモリ食うな〜と思うのですが、
やはりそうしないと読み込むのは無理ですかね?
71デフォルトの名無しさん:2007/12/30(日) 16:45:14
>66
}while(this == NULL);
これでいいのか?
strcmpの後のifだけど、これはたぶん、>65氏の言う「ダミーノード」の方法で消すことが可能。
「次」がある限り、「次の次」は、(ダミーかもしれないが)必ず存在する。
「次」がダミーなら、strcmpのifが真になることはないはず。

ところで、この書き方だったら比較は必ず次の要素と行われてるから、
ウルトラマンウルトラマン仮面ライダーだったらいいけど、
ウルトラマン仮面ライダーウルトラマンだったときに後ろのウルトラマンが
消えてくれない気がするんだけど、なんでこんなアルゴリズムにしようと思ったの?
普通に書いたら
・まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
・次に、上の操作で出来たリストの二番目と、それ以降すべての要素と比較、かぶってたら以下略
・それをリストの最後から二番目まで繰り返す
にならない?
それともよく知らないけど>66の方が効率いいの?

あと、よけいなお節介だけど、変数名にthisとかnewとか使う癖があるなら、直した方が良い。
72デフォルトの名無しさん:2007/12/30(日) 16:53:21
>>70
シークはこれから読み書きする位置を指定する行為。
この段階ではまだ読み込みは行っていないぞ。
7367:2007/12/30(日) 17:00:59
>>72
そうなんですか! よく調べもせずに申し訳ありませんでした。
折角のC++なので? seekgを使ってみたいと思います。
お答えして頂いてどうもありがとうございました!
74デフォルトの名無しさん:2007/12/30(日) 17:13:14
>>66
>if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/
> this->next = NULL;
>else
> this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
>free(this->next); /*(2000 ガンダム)を消す*/

何をfreeしているか考えよ
7525:2007/12/30(日) 17:23:42
>>71,74
すいません。
有り難うございます。
ちょっと色気出してみようと思って、練習もかねてList使ってみたのが間違いだったのか?
今までList自体触った事無いから、難しい。
まぁ、趣味でプログラムやっているから気長にやります。
free(this->next); /*(2000 ガンダム)を消す*/
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
が正しいですね。
76デフォルトの名無しさん:2007/12/30(日) 17:25:26
今日からC言語の勉強を始めた超初心者なんですが、質問させてください。

MS-DOSでディレクトリの移動をやってたんですが、
cd \での移動と、(指定されたパスが見つかりませんと出る)
dir \での移動が出来ません(ファイルが見つかりませんと出る)

まさか入門書の本編にすら行かないうちに詰まるとは思いませんでした。
どなたか助けてください…。

77デフォルトの名無しさん:2007/12/30(日) 17:28:14
それC言語関係ない。
dirは移動するコマンドじゃない。
78デフォルトの名無しさん:2007/12/30(日) 17:29:54
>free(this->next); /*(2000 ガンダム)を消す*/
>this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
freeした物のnextわ参照してどうする

tmp = this->next;
this->next = tmp->next;
free(tmp);
7925:2007/12/30(日) 17:36:45
>>78
そーですね。
なんか皆さんがアドバイスしてくれるから、
みwなwぎwっwてwきwたwww
なんかいい感じになってきたかも!
80デフォルトの名無しさん:2007/12/30(日) 17:49:32
>>76
help コマンド名
8125:2007/12/30(日) 18:19:59
>>71
>まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
うう、駄目だ書けない。
配列だったらforで簡単に比較できるけど、
listだと最初と次とのノードと比較は簡単にできるけれど、最初と次の次や最初の次の次の次の比較が全然思いつかない。
do{
this = first; /*最初のノード*/
if(0 == strcmp(this->argv,this->next->argv)){/*最初と次のargvの比較*/
if(NULL != this->next->next){/*次の次がNULLで無かったら*/
tmp = this->next;
this->next = tmp->next;/*次の次のノードと繋ぐ*/
free(tmp);
}else{
free(this->next);/*次の次のが無かったら今比較しているノードをfree*/
}
continue;/*最初に戻る*/
}
}while(/*何が真の間whileし続けるのか書けない....*/
82デフォルトの名無しさん:2007/12/30(日) 18:31:41
>81

ListNode cmp,search;

for(cmp = first;cmp != dummy;cmp = cmp->next){
 for(search = first->next;search->next != dummy;search = search->next){
  if(strcmp(cmp->argv,search->argv) == 0){
  ……
  }
 }
}

これでだめ?
83デフォルトの名無しさん:2007/12/30(日) 18:39:41
ていうか、さ
リストに追加する段階で重複チェックすればいいじゃん
わざわざリスト全部作ってから除去しなくても。
84デフォルトの名無しさん:2007/12/30(日) 18:52:00
create table list (
id integer not null,
name varchar(16) not null unique,
primary key (id)
);

insert into list (id, name) values (2000, "ガンダム");
8525:2007/12/30(日) 19:37:40
>>82
とても良いと思います。自分は思いつきませんでした。
ListNode *cmp, *search;

for(cmp = first;cmp != NULL;cmp = cmp->next){
for(search = first->next;search->next != NULL;search = search->next){
if(strcmp(cmp->argv,search->argv) == 0){
tmp = search;
search->next = tmp->next->next;
free(tmp);
}else{
free(search);
}
continue;
}
    }
  }
どうしても分からないのは
リストの繋ぎ替えをしたとき、
search->next = tmp->next->next;
for(略;略;search = search->next){
の処理がかぶってしまうってことです。
正直continue;の使い方が分からないです。
もう駄目かもしれません。
なんか正直、何をやってもプログラムを書ける気がしなくなってきました....
こういう絶望感に包まれた場合、どうすればまたプログラムを書けるようになれますかね?

86デフォルトの名無しさん:2007/12/30(日) 19:38:23
>>85
Basicに乗り換える
87デフォルトの名無しさん:2007/12/30(日) 19:39:40
気分転換にプログラミング以外の事をする。
コンピュータから離れても良いかもしれない。
88デフォルトの名無しさん:2007/12/30(日) 19:40:32
>>85
だから、リスト構造はあんたには早過ぎると言ってるでしょう。
89デフォルトの名無しさん:2007/12/30(日) 19:49:45
>}else{
>free(search);
>}
>continue;
どうしてそうなるんだw
なぜにsearchをfreeしてしまう。
if(strcmp()!=0)なら、何もしなくていいんだよ。
あとcontinueいらない。そのcontinue何の意味もない。
continueは、ループの括弧内の、「それ以降」をすっ飛ばす意味。
括弧その次で終わってるから、全く意味がない。

>search->next = tmp->next->next;
>for(略;略;search = search->next){
>の処理がかぶってしまうってことです。
処理がかぶるならどっちか消せばいいじゃない。
それと、>82で間違えたけど、二つ目のforの初期条件は
search = cmp->next
だね。
90デフォルトの名無しさん:2007/12/30(日) 21:19:47
次の次とか処理順で頭悩ませるぐらいなら再帰にしたらどう?
91デフォルトの名無しさん:2007/12/31(月) 00:28:51
リストを試行錯誤で実現するにはまだ早いという感じだなあ。
何か本でも読んだ方がいいんじゃね。
92デフォルトの名無しさん:2007/12/31(月) 03:02:30
C++でグラフィックをいじるにはどうすればいいんでしょうか。
93デフォルトの名無しさん:2007/12/31(月) 03:04:40
唐突過ぎるとマルチうぜーとか書かれるぞ
まずなにがしたいのかを書かないとエスパーしか答えられないぞ

ゲームを作りたいならDirectXとか
94デフォルトの名無しさん:2007/12/31(月) 03:05:29
一人で作るレベルならC++よりCがいいと思うな、ゲームなら
95デフォルトの名無しさん:2007/12/31(月) 03:10:51
ここであえてJavaAppletを勧めてみる!
96デフォルトの名無しさん:2007/12/31(月) 03:29:10
STDのlistやvectorの全要素を表示させる関数を書きたいのですが、
どうかけばよいのか分かりません。どうかお教えください。
97デフォルトの名無しさん:2007/12/31(月) 03:33:53
size()までループさせてひとつひとつ出力
98デフォルトの名無しさん:2007/12/31(月) 03:34:09
96です。
自分はこんなものを書いてしまったのですが、コンパイルが通りません。

template<class T>
void show(T& v)
{
T::iterator p;
for (p = v.begin(); p != v.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
99デフォルトの名無しさん:2007/12/31(月) 03:49:14
>>93
DirectXとかでなく
C++で同人ゲームとかを改造して暇つぶししたいんですけど。
誰かマジレスお願いします。
100デフォルトの名無しさん:2007/12/31(月) 03:52:32
>>97
こんな時間にありがとうございます!
それは書けたのですが、もうちょっと一般的な書き方があればな、、と思って。

void show(deque<char>& x)
{
for (deque<char>::iterator p = x.begin(); p != x.end(); p++) {
cout << *p << " ";
}
cout << endl;
}

こんなのよりも、dequeも<char>も勝手に入力から判断してくれる書き方はないですか?

101デフォルトの名無しさん:2007/12/31(月) 03:58:53
>>99
今程度の知識で暇つぶしできるほどの改造は無理だ。
どのゲームなのか?そのゲームがC++で書かれているのかすらわからないじゃないか。
っつうかマルチでしょ?
宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。
102デフォルトの名無しさん:2007/12/31(月) 03:59:33
>>98
typename T::iteratorじゃない?
ってかエラーが出たらエラーメッセージを張るべし。
103デフォルトの名無しさん:2007/12/31(月) 04:10:07
>>102
ありがとうございます。
typenameをつけたら希望どおりの動作になりましたが、その後、
エラーメッセージを張ったら、実はそこに書いてありました。

$ g++ samp20.cpp
samp20.cpp: In function 'void show(T&)':
samp20.cpp:9: error: expected `;' before 'p'
samp20.cpp:10: error: 'p' was not declared in this scope
samp20.cpp: In function 'void show(T&) [with T = std::list<int, std::allocator<int> >]':
samp20.cpp:23: instantiated from here
samp20.cpp:9: error: dependent-name 'T::iterator' is parsed as a non-type, but instantiation yields a type
samp20.cpp:9: note: say 'typename T::iterator' if a type is meant

104デフォルトの名無しさん:2007/12/31(月) 04:16:18
日本語が変だぞwとりあえず解決でOK?
あと、細かいことだけどこういう処理ならconstつけといた方がいい。
template<class T>
void show(const T& v)
{
for (typename T::const_iterator p p = v.begin(); p != v.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
105デフォルトの名無しさん:2007/12/31(月) 04:26:50
>>104
解決です。
すいません、あと1つだけ。
constつけた方がいい理由は、show()関数が表示するだけで
内部要素を変更しないことをハッキリ示すためですか?
106デフォルトの名無しさん:2007/12/31(月) 04:36:05
htmlファイルからリンクのURLだけを抜き出してその文字列を変数に入れたいん
ですがどのようにすればいいでしょうか?
getlineで一行つづ読み込んで"<a href="http:"を探せばいいかな。と思ってたんですが
メモ帳でスレのhtmlファイル開いてみるとURLの途中で改行があったんで悩んでます
107デフォルトの名無しさん:2007/12/31(月) 04:37:38
いちどによみこんで整形する 改行や空白をなくす
108デフォルトの名無しさん:2007/12/31(月) 05:52:34
gccで変数名を表示できる拡張機能ってどう書くんだっけ?
109デフォルトの名無しさん:2007/12/31(月) 08:21:41
>>105
const参照でコンテナを受け取った関数から使えなくなってもいいならつけなくていいよ。
110デフォルトの名無しさん:2007/12/31(月) 09:06:53
後置演算子++のオーバーロードについて質問です。
Type operator ++(int)とありますが、
クラスTypeで宣言した演算対象が、float型とかの場合でも
仮引数は(int)なのでしょうか?
(float)にはならないでしょうか?
どの解説本みても(int)で、詳しい説明がなくてよくわかりません。
111デフォルトの名無しさん:2007/12/31(月) 09:13:20
まあfloatをインクリメントって普通しないからね。
オーバーロードしたいならもちろんfloat型を引数に。
112デフォルトの名無しさん:2007/12/31(月) 09:20:36
わざわざそんなんせず1足してやる方が無難な気がするけどねぇ
113デフォルトの名無しさん:2007/12/31(月) 10:18:50
T& operator++(void)じゃなくて?
114デフォルトの名無しさん:2007/12/31(月) 11:01:19
>>113
それは前置
11525:2007/12/31(月) 11:07:00
(;つД`); うわーん
ふて寝して、それでも気になって、紙にリスト書きながら、いろいろやってたら、
うまく行ったポイ!
変なのところが有ったら指摘してください。
それとdummyリストは便利!
ListNode *cmp, *search, *tmp;
for(cmp = first;dummy != cmp ;cmp = cmp->next){
for(search = cmp->next;dummy != search ;search = search->next){
if(dummy == search)
break;
if(0 == strcmp(cmp->argv,search->argv)){
tmp = search;
tmp->next->prev = tmp->prev;
tmp->prev->next = search->next;
    }
  }
}
頑張ってよかった!
感動した!
いい気持ちで正月を迎えられます。

116デフォルトの名無しさん:2007/12/31(月) 11:25:11
それにしても混同しそうになる
117デフォルトの名無しさん:2007/12/31(月) 15:45:29
サーバソケットでTCPの10〜100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って

・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする

というのが一般的なのでしょうか?

recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?

要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。

118デフォルトの名無しさん:2007/12/31(月) 15:54:11
>>117
こっちのがいいと思う
ネットワークプログラミング相談室 Port20
http://pc11.2ch.net/test/read.cgi/tech/1186418855/
119デフォルトの名無しさん:2007/12/31(月) 15:58:50
>>118
サンクスです。逝って来ます。
120デフォルトの名無しさん:2007/12/31(月) 16:49:41
char bun[] ="すごく長い文章が入っている";

FILE 構造体へのポインタしか受け取ってくれない関数に,
この文字列があたかもファイルに入っているかのように
思わせて処理させることはできないものでしょうか?

C++ ならいつも std::string と std::istringstream で
ストリームとして抽象的に処理しているのですが,
どうしても C のライブラリを使う必要があって,
勝手が違って悩んでいます.
121120:2007/12/31(月) 16:57:40
標準的な方法ではできないようですね.
使いたいライブラリのソースが手に入って,
手を突っ込んでいいとのことなので素直にそうします.

いやぁ,ストリームなんて変な演算子オーバーロードで
やだなぁ,とか思っていたのにいつの間にかストリーム
べったりの人間になってました.慣れって怖い.
122デフォルトの名無しさん:2007/12/31(月) 17:04:49
>>120
テンポラリファイル作るとか?
ファイルマッピング使って、バッファーの不一致が起きないようにファイルをクローズしてフラッシュするまでタイミングを取るとか?
123デフォルトの名無しさん:2007/12/31(月) 17:22:09
質問です、VC2005で、多重継承のクラスを作ってるのですが
ランタイムエラーが出てしまいました。
(0xC0000005: 場所0x00000010を読み込み中にアクセス違反が発生しました)

デバッガの自動変数の欄にはthisポインタのみ載っていて(値は0とかではなく、
ちゃんとしたアドレスっぽい)、thisポインタの「+」をクリックして展開すると
「CXX0030: エラーです: 式を評価できません」
となっています。

hoge0---hoge1---hoge2---hoge3---hoge4
                     ---hoge5
                     ---hoge6---hoge7
                           ---hoge8
↑のような感じで継承して(全てvirtualをつけて継承してます)、
最後に2,4,5,7,8を多重継承してhogerableクラスを定義して、
そのインスタンスを生成して使っています。
2や4578で実装されている仮想関数(f())をhogerableクラスでも実装し、
そのときの条件によって
return hoge5::f();
とかやろうとしたのですが、
hoge5::()f に飛んだときは正常に動くものが、hoge7::f() に飛ぶとランタイムエラーが
起こりました。
hoge7::f()の中は
if (!hoge2::f())
  return false;
if (!p)         // ここでエラー。pはhoge3にあるメンバ
  return false;
となっています。
こういうときは何を疑えばいいのでしょうか?
よろしくお願いします。
124デフォルトの名無しさん:2007/12/31(月) 17:25:53
hoge3のインスタンスがたくさんできてる予感
125123:2007/12/31(月) 17:51:13
すみません、言われてから一番下のクラスを見直したら速攻で解決しました、
最後の多重継承にvirtualをつけてませんでした(汗
けどどういう条件でvirtualをつけるべきなのかよくわからない・・・
ともあれありがとうございました。
126デフォルトの名無しさん:2007/12/31(月) 18:28:52
そもそもそこまでの多重継承になるなら設計がおかしいのでは。
127デフォルトの名無しさん:2007/12/31(月) 18:52:38
>>126そだね。多重継承も使いすぎると良くないね。
俺も、多重継承やテンプレートを使いまくって複雑怪奇なオブジェクトを作っていた頃がありました。しかし、だんだんとこんな複雑な構造は不要だって解ってくるんだな。
C++をはじめて誰もが一度は通る道かな。
128デフォルトの名無しさん:2007/12/31(月) 19:47:15
>>101
もうちょっと具体的に書くと、
if(Char_Trans[0]!=0){
SetDrawBlendMode( DX_BLENDMODE_ALPHA , Char_Trans[0] ) ;
if(LoadCharName_BC[0]!='\x00'){DrawGraph(Draw_X+160,Draw_Y,CHAR_BC_Handle,TRUE);}//キャラを立たせる。奥中央
}
このランダム部分を変える方法はありますかね?

年末に何やってるんだ俺はorz
129デフォルトの名無しさん:2007/12/31(月) 19:54:40
>>128
生きろ
130デフォルトの名無しさん:2007/12/31(月) 20:40:17
>>128
どの辺がランダムなのか教えてくれ。
131デフォルトの名無しさん:2007/12/31(月) 20:44:54
>>128
エスパーするとDraw_XとDraw_Yを直接数字に置き換えるとか
132デフォルトの名無しさん:2007/12/31(月) 20:46:00
#define Draw_X (rand()/800)
#define Draw_Y (rand()/600)
133デフォルトの名無しさん:2007/12/31(月) 22:41:31
>>110
仮引数はどうあっても int 。
134デフォルトの名無しさん:2008/01/01(火) 21:05:24
C++を勉強したいのですが
初心者向けで分かりやすい本があったら 教えて下さい。

Cはある程度は把握してます

何かお勧めの本はありますかね?
135デフォルトの名無しさん:2008/01/01(火) 21:18:23
>>134
ロベールでいいんじゃね。
136デフォルトの名無しさん:2008/01/01(火) 21:55:51
Accelerated C++とか。
137デフォルトの名無しさん:2008/01/01(火) 23:08:21
やさしいC++
とかって 分かりやすいんですかね?
138デフォルトの名無しさん:2008/01/01(火) 23:10:37
>>137
基礎過ぎて C と被る所が多過ぎる。
139デフォルトの名無しさん:2008/01/01(火) 23:13:44
>>134
CとC++はかなり違う言語だから、なめてかからないほうがいいよ。
STLやらBoostやら、C++は変態すぎる。
140デフォルトの名無しさん:2008/01/01(火) 23:16:00
かなり違う言語だけど、慣れれば簡単なもんだ。
いい本を選べよ。
141デフォルトの名無しさん:2008/01/01(火) 23:40:20
分かりやすい本とかお勧めの本は
やっぱりそれぞれ違いますよね?

ロベールかぁ..

本屋でいろいろ立ち読みしてみて 読みやすい本を選ぶのがいいんですかね?
142デフォルトの名無しさん:2008/01/01(火) 23:45:23
>>139
C++がCより使いやすい要素はあるんですかね。
143デフォルトの名無しさん:2008/01/01(火) 23:48:51
「使いやすい」の定義によるんじゃない?
初心者に勉強させるって意味なら混乱する要素満載でとても使いやすいとは思えないけど
144デフォルトの名無しさん:2008/01/01(火) 23:54:42
>>142
クラス。
iostreamなんかは窓から投げ捨てていい。
145デフォルトの名無しさん:2008/01/01(火) 23:58:01
STL
146デフォルトの名無しさん:2008/01/02(水) 00:00:19
>>142
C++は使いやすいというよりも、強力な言語だと思う。強力であるが故に使いこなすのが難しい面が多々ある。
例えば文字列クラスを作ると、最初から言語仕様に組み込まれていたかのように文字列を扱えるなんて、強力というか自由度高すぎ。
147デフォルトの名無しさん:2008/01/02(水) 00:05:47
>>140
MPLとかも簡単と思う?
148デフォルトの名無しさん:2008/01/02(水) 00:07:56
例外処理も地味に便利だよなあ
149デフォルトの名無しさん:2008/01/02(水) 00:19:19
演算子オーバーロードとか例外とか最近の言語なら珍しくないって。
150デフォルトの名無しさん:2008/01/02(水) 00:24:45
STL と参照があるだけで C より随分楽になるわ。
151デフォルトの名無しさん:2008/01/02(水) 00:25:30
>>147
使わんし。
152デフォルトの名無しさん:2008/01/02(水) 01:15:12
>>149

C++で成功したから、最近の言語で実装されるようになったんだろ。
153デフォルトの名無しさん:2008/01/02(水) 01:30:02
例外はJavaが早くね?他にもあるかもしれんが・・・
154デフォルトの名無しさん:2008/01/02(水) 03:30:17
>>151
MPLを使わないのにC++に慣れてるとか大きく出たね
それでC++が簡単と言うのは違うんじゃないかい?
あんたにとっては簡単かもしれんけど、一般論ではないわな
155デフォルトの名無しさん:2008/01/02(水) 03:38:48
>>151
何私は最先端ですみたいになってんの?
あんなもんライブラリでも作る必要がなければ使わない。
使えない。可読性が低くなる。
156デフォルトの名無しさん:2008/01/02(水) 03:50:28
ライブラリ作らないでプログラムしてるのはすごいな
MPLより"やばい"type_traitsがtr1に入ってるぞ

可読性が低い==俺は勉強してないので読めない
157デフォルトの名無しさん:2008/01/02(水) 04:03:21
mplってboost?
158デフォルトの名無しさん:2008/01/02(水) 09:45:53
水掛け論したいなら他でやれ。
159デフォルトの名無しさん:2008/01/02(水) 11:51:00
http://pc11.2ch.net/test/read.cgi/tech/1197132472/659

このプログラムが先日まで実行できたのですが、
probably corrupted stack
segmentation fault

と出て実行不可になりました。こちらの環境が原因でしょうか?
160デフォルトの名無しさん:2008/01/02(水) 12:19:23
プログラムがおかしい。
161デフォルトの名無しさん:2008/01/02(水) 12:54:26
>>156
type_traitsのどこがやばいの?traitsの考え方は難しくないし
コンパイル時の型の判定は便利だからboost使っている。
今でもiterator_traitsやchar_traitsはある。

>可読性が低い==俺は勉強してないので読めない
就職したら正論が通用しない場合があることがわかるよ。
162デフォルトの名無しさん:2008/01/02(水) 12:54:58
>>159
とりあえず、 ,とか?とか使うのやめて読みやすく書き直して味噌
163デフォルトの名無しさん:2008/01/02(水) 12:57:50
>>159
負数または INT_MAX を超える値を入力してない?
164159:2008/01/02(水) 13:05:17
実行時のコマンドが誤ってました。お騒がせしてサーセン
165デフォルトの名無しさん:2008/01/02(水) 13:05:56
>>159
宿題丸投げした挙句デバッグも人任せ?お前の肩の上についている物体は飾りか
166デフォルトの名無しさん:2008/01/02(水) 13:22:34
>>165
なんでそんなムキになるん?
167デフォルトの名無しさん:2008/01/02(水) 13:23:46
ムキっていうかうざくなるのは当然

こんなんみりゃ誰だってうざくなるわ
168デフォルトの名無しさん:2008/01/02(水) 13:24:12
>>165
肩の上って…
首を傾げてるってことかあぁぁ!!!!!!111
169デフォルトの名無しさん:2008/01/02(水) 13:24:51
こういうのは真性だからねぇ、わざわざ言わずにスルーだな
170デフォルトの名無しさん:2008/01/02(水) 13:24:52
まあ根っこからこういう奴っているんだよな、治らないよ、小さい時の教育の問題だろう
171165:2008/01/02(水) 13:29:09
ゴメン言い過ぎた。
今度から気をつけるよ。
172デフォルトの名無しさん:2008/01/02(水) 13:31:29
こういうのを見て毎回思うことは、
宿題スレと質問スレの住人、絶対かぶってるよな
173デフォルトの名無しさん:2008/01/02(水) 13:45:12
うん
174デフォルトの名無しさん:2008/01/02(水) 14:26:46
誰も>>159のプログラムが間違ってることは指摘してやらないんだなw
175デフォルトの名無しさん:2008/01/02(水) 14:36:16
strcatのcatって何の略ですか?
176デフォルトの名無しさん:2008/01/02(水) 14:38:05
177デフォルトの名無しさん:2008/01/02(水) 14:41:47
GoogleでもYahooでもどこでもいいから、検索して最初の10ページくらいは見て欲しいな
そもそも検索したかどうか知らないけど
178デフォルトの名無しさん:2008/01/02(水) 14:45:36
どうでもいいが、>>176のバッファオーバーラン対策コードはsを初期化しているかが曖昧だから不完全だ。strlen(s)がsizeof(s)を超える場合がある。


と思った。
179デフォルトの名無しさん:2008/01/02(水) 17:07:02
初期化されてなかったら、それはバッファオーバーランとは別問題だろ
strcpyとかならまだしも、catは連結なんだから初期化前提
180デフォルトの名無しさん:2008/01/02(水) 17:10:55
中途半端に"〜.ex"とかになった場合に誤動作しそうで怖いな
また別の問題だけど
181デフォルトの名無しさん:2008/01/02(水) 20:10:17
C++でなにか簡単に動くプログラムはないだろうか。
182デフォルトの名無しさん:2008/01/02(水) 20:12:22
はろーわーるど
183デフォルトの名無しさん:2008/01/02(水) 20:50:40
マージャン、囲碁、将棋、チェス、好きなのを選べ。
184デフォルトの名無しさん:2008/01/02(水) 20:51:46
はっきり言ってboostより分かりやすいC++はないんだろうか。
185デフォルトの名無しさん:2008/01/02(水) 21:45:24
boost分からなければ無理に使うことは無い
186デフォルトの名無しさん:2008/01/02(水) 21:53:09
boostってそんなにわかり易かったかな?
lambdaとか。
187デフォルトの名無しさん:2008/01/02(水) 21:57:51
lambda はともかく、半分以上は分かりやすいと思うが。
188デフォルトの名無しさん:2008/01/02(水) 21:59:41
boost::spiritは必見
189デフォルトの名無しさん:2008/01/02(水) 22:35:49
とりあえず使い方を覚えて便利さを享受すること
にしてる。中身は天才達が作ってるだろうから。
for_eachでのlambdaは秀逸だと思う。bindも
凄く使いやすい。
190デフォルトの名無しさん:2008/01/02(水) 23:06:23
便利だけど特別分かりやすいとは思わなかったな
191デフォルトの名無しさん:2008/01/03(木) 02:28:18
#include <fstream>
using namespace std;

int main()
{
ofstream fout("mydata.mid", ios::binary);

fout.write("4D 54 68 64 00 00 00 06 00 01 00 01 00 60 4D 54 72 6B 00 00 00 1C 00 90 3C 64 4B 80 3C 64 15 90 3E 64 4B 80 3E 64 15 90 40 64 4B 80 40 64 15 FF 2F 00", 74);

fout.close();

return 0;

}



fout.write の引数のバイナリ(SMF)をそのままファイルに出力したいのですが、
出力されたsample.midを再生しようとすると「プレーヤーがそのファイルの種類をサポートしていないか、そのファイルの圧縮に使用したコーデックをサポートしていない可能性があります。」
というエラーが出てしまいます。そのファイルをバイナリエディタで見てみると、34 44 20 ...
というように、バイナリが変わってしまっていました。何がいけないのでしょうか??
192デフォルトの名無しさん:2008/01/03(木) 02:33:16
16進の文字列から数値に変換→書き込み
でおk
193デフォルトの名無しさん:2008/01/03(木) 02:45:32
>>191
static const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, };
fout.write( data, sizeof(data) );
194デフォルトの名無しさん:2008/01/03(木) 02:58:56
これからは開発文字コード体系を
UTF−16ベースにしないと
プログラマーから嫌われそうだ
195デフォルトの名無しさん:2008/01/03(木) 03:18:40
>>192
>>193

なるほど。こうすればよかったんですね。ありがとうございますm(_ _)m

・・なんか、いきなりあれですが。
今まで他の質問サイトでよく質問してたんですが、ここの方が返信早いし、
しかもここの人たちはポイントもらうためとかではなく無償で教えてくれるんですよね。。
なんかしんみり嬉しくなりました。また行き詰ったらご教授願いたいのでよろしくお願いしますm(_ _)m
196デフォルトの名無しさん:2008/01/03(木) 07:12:59
197デフォルトの名無しさん:2008/01/03(木) 14:59:39
>>193
なんで、staticなんですか?
198デフォルトの名無しさん:2008/01/03(木) 15:04:30
>>197
よそから使う必要がなければ、見えなくするためじゃないか。
199デフォルトの名無しさん:2008/01/03(木) 15:09:46
>>197
定数にするためじゃない?
200デフォルトの名無しさん:2008/01/03(木) 15:16:31
>>198
いえ、なんてーか、グローバル変数でstaticなら、それも理解できるんですが……
これ、関数内の話ですよね?

>>199
それって、constじゃないんですか?
201デフォルトの名無しさん:2008/01/03(木) 15:35:24
>>200
constだけだと関数内では「書き換え不能」って意味だけじゃないかな?
staticがついて定数になったと思うけど。



組み込みなんかだと値をROMに収めるためにはstatic constを指定してやらないと駄目だったような・・・
C++が使える組み込みなんて少ないかもしれないけど
202デフォルトの名無しさん:2008/01/03(木) 15:36:40
んーとねstaticはスタック上に領域確保するのを防ぐ狙いがあったよーな
確保した領域に値をコピーする手間が省けるのでメモリと処理時間の節約になるっぽい
スコープが関数内に限られた外部変数って考えるといいっしょ
でもmain関数内の変数ってコンパイラにもよると思うけど実質staticじゃなかったっけ?
203デフォルトの名無しさん:2008/01/03(木) 16:07:50
私の理解が間違っているかもしれませんが……一応確認

int 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の理由については初めて知りました。
よろしければ、参考文献などを教えていただけないでしょうか?
お願いいたします。
204デフォルトの名無しさん:2008/01/03(木) 16:23:42
>>203
書き換え不能の「変数」と「定数」の違いがある気がすると思って書いたんだけど。
そこまで詳しくないから間違ってるかも。

Googleで「c++ const 定数」あたりでぐぐれば?
205193:2008/01/03(木) 16:27:08
組み込み屋なので、こういう場合static const にしちゃうんだよな。
>>201>>202(最後の1行はよく知らないが)の言うとおりだよ。

非static 非const →書き換え可能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。
非static const →書き換え不能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。(処理系により異なるかも?)
static 非const→書き換え可能な静的領域に配置。プログラム開始時に一度だけ、ROMから静的領域へのコピーが発生する。
static const →書き換え不能でROMに配置。コピーは発生しない。
206デフォルトの名無しさん:2008/01/03(木) 16:27:11
>>203
staticが外部からアクセスできないんは文法上の話
メモリ上に変数の領域が確保されてるんやからアドレス渡せばアクセスできるんよ
207デフォルトの名無しさん:2008/01/03(木) 16:40:08
>>204-206
なるほど……色々と教えてくださってありがとうございます。
どうも、組み込み系の話が必要になってきそうですね。
そこら辺の文献でも読んでみます。ありがとうございました。
208デフォルトの名無しさん:2008/01/03(木) 16:56:44
このスレには滅多に書き込まないけど、ずっと読んでる。
ホントためになる話が多いよな。各人の知識経験に感嘆するぜ。
209デフォルトの名無しさん:2008/01/03(木) 17:24:02
初心者向けのCの本を一冊読み終わり、問題もだいたい解けるようになりました。
次に難し目の問題集を買って、それをクリアーしたらC++に移ろうと思います。

しかし、本を読んで理解して・・・の繰り返しでモチベーションが萎えて来ました。

僕は独学でパズル感覚でプログラミングの勉強をしているので
CあるいはC++を使ったら何が出来るのかということが、ちょっと想像がつきません。

そこで

■ この言語で何(どういうモノ)が作れて、
  現実にはどういう場で役に立っているのかというのを教えていただきたいと思います。

よろしくお願いします。
210デフォルトの名無しさん:2008/01/03(木) 17:35:47
C/C++は汎用性高すぎて組み込みからサーバ、GUIアプリケーションまで色々としか‥‥

とりあえず「こんなソフト欲しい」って思ったら自作してみるといいお
211デフォルトの名無しさん:2008/01/03(木) 17:37:29
>>209
何ができるのかというと、何でもできるということになる。
目標がC/C++の勉強だけだと気力も萎えるだろう。そういう時は、何でも良いからアプリを作るのが一番。
212デフォルトの名無しさん:2008/01/03(木) 17:41:50
ここで言ってる組み込みって
http://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++で書かれていたりするんですか?
213デフォルトの名無しさん:2008/01/03(木) 17:43:39
釣りな感じもするけどまぁいいか。

実用的なプログラミング言語だと、言語によってできることできないことにはほとんど差がない。
どちらかというと環境の差だったり環境が用意されているかの違いの方が大きい。
なので、コンピュータ上でできることはほぼ何でもできる、と言ってよい。
でも、これだとあまりうれしくない返答だよな。

どれだけ低レベルな処理が可能かというのについては多少差があるけど、C / C++ はその方面では強い。
具体的には、オペレーティングシステム(Windows とかね)や、組み込み系(電子機器の制御、マイコン等)の
プログラミングに使われたりもする。
逆に言うと C / C++ そのままだと基礎的すぎて、ライブラリとか使わないと凝ったこと、派手なことはさせにくかったりする。

ということで、提案としては、
・OpenGL, DirectX とか使って、ゲームとか 3D CG 系で遊んでみる。
・(英語があまり苦にならなければ) http://online-judge.uva.es/problemset/ で問題を解いてみる。
(ACM国際大学対抗プログラミングコンテストの問題集でオンラインで判定もしてくれる)
あたりかなぁ。あるいは宿題スレの回答者になってみてもいいかもしれないよ?
214デフォルトの名無しさん:2008/01/03(木) 17:44:18
>>209
本を読んで理解することは非常に重要だが、実際に組んで動かしてみるのはもっと重要。
理解を深める意味でも、モチベーションの意味でもな。

あと、言語だけでなく、データ構造とアルゴリズムの勉強は欠かさないように。
パズル感覚なら楽しめるはず。実践の題材を見つけることもできると思う。
題材はGUIアプリで見た目にこだわるより、
CUIでいいから、内部動作にこだわると良い。
215デフォルトの名無しさん:2008/01/03(木) 17:47:48
>>212
C++が使える環境ではC++で書きたいな。(あくまで希望)
216デフォルトの名無しさん:2008/01/03(木) 17:48:10
言語を覚えたからどうこうというのがそもそもおかしい
何か目的があって言語を覚えたんじゃないのか
217デフォルトの名無しさん:2008/01/03(木) 17:48:14
Gotwを見るとか
218デフォルトの名無しさん:2008/01/03(木) 18:29:23
CSVファイルから各行を読み込んでベクターに入れ、それをさらに大きなベクターに
いれる処理は以下でよいですか?
なんか、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();
}
219デフォルトの名無しさん:2008/01/03(木) 18:45:48
>>210
>>211
ありがとうございます。

アプリを作る方向で考えてみます!

>>213
ありがとうございます。
英語は、雰囲気でわかりますw
実践的な問題を解いてみるのは、楽しいと思います。
頑張ります。

>>214
ありがとうございます。
データ構造やアルゴリズムは、読んでて楽しいのでどんどん勉強したいと思います!

>>216
いや、暇つぶしです。
今、フリーター〜無職なんで、何かやってるアピールを親にしないと・・・
哲学とか、医療問題とか、どうでもいいものをいろいろ勉強してました。
昔、ウェブサイト作ってFLASHのACTION SCRIPTやJAVA SCRIPTとかをいじるのが好きだったんで
全く違うけどパソコン関連ってことでCをやってみたら楽しかった・・・って感じです。




220デフォルトの名無しさん:2008/01/03(木) 18:47:01
>>217
何やらヒゲのおじさんが微笑んでますが
参考になりそうなサイトですね。読んでみます。
ありがとうございます。
221デフォルトの名無しさん:2008/01/03(木) 20:03:21
質問させてください。
当方、すでに出来上がっているプログラムに追加・改変して別のプログラムを作るという授業を受けている学生です。
VisualStudio2005、C++で開発しています。
ちなみに、授業を受けている割にはC++についての知識は皆無です。

今作っているのはノベルゲームのような物です。
文章を表示して、キーを入力すると次の文章を出力する、という動作を行いたいのですが、キーの入力を受け取ると、文章が一気に進んでしまいます。
これを防止する為にキーが入力されても一定時間無視するという処理を行いたいのです。

そこで皆様にお聞きしたいのですが、キーの入力(OnKeyDownで取得)を一定時間(例えば10ミリ秒)無視するためにはどのようにプログラミングすれば良いのでしょうか?

わかりにくいかと思いますが、どうかよろしくお願いします。
222デフォルトの名無しさん:2008/01/03(木) 20:15:46
>>221
フラグ立てればいい
223デフォルトの名無しさん:2008/01/03(木) 20:16:25
if( 一定時間 != true )
{
キー入力;
}
224デフォルトの名無しさん:2008/01/03(木) 20:17:33
そもそも一気に進んでしまうのがおかしいのでは
225デフォルトの名無しさん:2008/01/03(木) 20:19:32
何をクラスにしたらいいのかの指針をください
226デフォルトの名無しさん:2008/01/03(木) 20:21:02
何をしたいのか書かないとエスパーじゃなきゃ無理w
227デフォルトの名無しさん:2008/01/03(木) 20:38:21
>>225
類似オブジェクトの共通特性を抽出してクラスにすればいい
228デフォルトの名無しさん:2008/01/03(木) 20:43:50
「押されているかどうか」ではなく、「押された瞬間」を検知すれば、そういうことは無くなる。
>222も参考に、その方向考えてみたらどうかな。



229デフォルトの名無しさん:2008/01/03(木) 20:51:25
>ちなみに、授業を受けている割にはC++についての知識は皆無です。

ここに誰もつっこまないのは何故だ・・・
教えようがないじゃん

論述形式の宿題とか?
230デフォルトの名無しさん:2008/01/03(木) 20:54:33
>>229
そういうもんじゃない?
情報学科卒の生徒にHelloWorldから、とまでは言わなくても、
それに類する所から始めないといけない現実。
231デフォルトの名無しさん:2008/01/03(木) 21:57:16
すでに出来上がっているプログラムって吉里吉里みたいな仕様になっているのか?
なんかよくわからんけどソースうpしてくれなきゃわからん
232デフォルトの名無しさん:2008/01/03(木) 21:59:30
今日はものすごく調子が悪くてとても
C言語について調べる気がしないんですが。
誰かレスお願いします。
233デフォルトの名無しさん:2008/01/03(木) 22:01:06
>>232
お前はなんについて質問したんだよw
234デフォルトの名無しさん:2008/01/03(木) 22:04:47
235デフォルトの名無しさん:2008/01/03(木) 22:12:54
>>233
何かを限られた時間で作るときの目標として
ゲームにこだわる必要はないんですかね。
236デフォルトの名無しさん:2008/01/03(木) 22:19:07
>>235
どこから「ゲーム」が出てきたんだ?
エスパーで答えれば
好きにしろ、人に聞くな、目標を立てるところからが勉強だ。
237デフォルトの名無しさん:2008/01/03(木) 22:20:24
人生相談スレではありません。
238デフォルトの名無しさん:2008/01/03(木) 22:22:57
ゲームといえば、ライフゲームとスタートレックかな。
239デフォルトの名無しさん:2008/01/03(木) 23:21:54
>>212

>家電製品とかのシステムもC/C++で書かれていたりするんですか?

Cがほとんどだと思う。
ある程度メモリとCPUパワーに余裕があれば、C++も選択肢になるだろうな。
240デフォルトの名無しさん:2008/01/03(木) 23:36:44
組み込みはC++が多い
241デフォルトの名無しさん:2008/01/03(木) 23:56:36
組み込みC++ってそんな贅沢させてくれるのか?

Cがほとんどじゃまいか?
242デフォルトの名無しさん:2008/01/04(金) 00:02:54
今は組み込みも(全体的に)だいぶ性能上がってるんじゃないか
243デフォルトの名無しさん:2008/01/04(金) 00:09:06
コンパイラさえ対応していれば使うよ。
コストなんてどちらにせよコード次第。
244デフォルトの名無しさん:2008/01/04(金) 00:28:37
組み込みは一回しか経験したことないけど、一応C++だったな
でもnewを使わなかったし、ベターCって使い方だったけど・・・
245デフォルトの名無しさん:2008/01/04(金) 00:31:15
組み込み全く知らんのだけど、newを使わない事による組み込み的なメリットって何かあるのかね?
246デフォルトの名無しさん:2008/01/04(金) 00:33:44
例外処理省いてバイナリをコンパクトに出来るとかそのあたりかね
newは例外投げるし。
247デフォルトの名無しさん:2008/01/04(金) 00:34:11
性能は大分上がってるけど、16bit環境も珍しくないからな。
8bitは流石に見なくなったが。(やってるところもあるだろうが。)

C++でやるかどうかは、コストよりも政治的な要素が強い希ガス。
MDAツールが使える、といった明確なメリットがなければ、
Cで押し切られそうだな。

248212:2008/01/04(金) 00:43:39
むーそうだったのですか。
ハードウェア言語?とかいうのを使っているのだと思ってました。
ありがとうございますm(_ _)m
249デフォルトの名無しさん:2008/01/04(金) 00:52:48
>>245
メモリが少ないのでヒープが小さくなる。その結果newに失敗する可能性があるとか
リアルタイムが要求される場合に遅いとか?
250デフォルトの名無しさん:2008/01/04(金) 00:59:08
>>245
普通のnew/deleteは、空き領域の断片化によってメモリ不足に陥る可能性がある。
例外はコンパイルオプションいじらないと普通は投げないんじゃないかな。

代替策として、静的確保した領域にplacement newしたり、
断片化しないように制限を付けたメモリ管理を取り入れたりと、工夫してる。
251デフォルトの名無しさん:2008/01/04(金) 01:06:50
携帯電話みたいにOSが入ってる環境ならnew(mallocも)とか使うだろうけど
IOから自分で実装するような組み込みならまず使わないと思うよ。
環境によっちゃRAMやスタックの使用量を監視しながらデバッグすることだってあるし。
252デフォルトの名無しさん:2008/01/04(金) 02:10:51
C++で組み込みっつったらBREWとかしか思いうかばんなぁ
253デフォルトの名無しさん:2008/01/04(金) 02:31:05
>>252

組込みのソフトが何で開発されたか、なんて普通表に出てこないから。
詳しくは言えないが、おまいらの目に触れるところで
C++(全部ではないが)使って作られたもの知ってるよ。
254デフォルトの名無しさん:2008/01/04(金) 05:42:17
日立(ルネサス)のはC++コンパイラだったな
255デフォルトの名無しさん:2008/01/04(金) 10:49:14
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
http://pc11.2ch.net/test/read.cgi/tech/1190261457/
からの誘導で来ました。

===========

仕様:
1. UNIXのcronみたいに特定の時間になるとある処理を実行させる
2. そのプログラム自体はdaemonとしてずっと走り続けている

こういうことをLinux上でやりたいんですが、
sleepかalertを使って、
希望の時間になったかを調べ続けるしかないですかね。
何か普通はこうやるよってのあります?

1分に1回温度を測定するプログラムです。
256デフォルトの名無しさん:2008/01/04(金) 11:15:11
現在の時刻を取ってきて、Sleepで寝かせる時間を計算すれば良いんじゃないかな。
257デフォルトの名無しさん:2008/01/04(金) 11:18:46
>>255
cron使うわけにはいかないの?
どうしてもプログラム内で完結したいなら、alarm()かsetitimer()だろうね。sleep()でもできなくはないけど。
残念ながら、alert()なんてのは知らん。
258デフォルトの名無しさん:2008/01/04(金) 11:19:15
>>256
Sleepってなんですか?
259デフォルトの名無しさん:2008/01/04(金) 11:35:19
>>256-257
レスありがとうございます。
やっぱりそうなりますか。
alertじゃなくてalarmでした。
260デフォルトの名無しさん:2008/01/04(金) 12:11:27
そもそもcronのソース読めばいいじゃないか
261デフォルトの名無しさん:2008/01/04(金) 12:19:00
それはめんどくせえじゃん
262デフォルトの名無しさん:2008/01/04(金) 13:27:42
そもそもcron使えばいいじゃないか。
263デフォルトの名無しさん:2008/01/04(金) 14:51:41
>>255
引っ越す前から見てるんだけど
時間の分解能を定義してないのはなぜよ?

sleep とか alam でやれば当然誤差累積だし…

精度とか確度とかって数学の時間に習わなかったか?
264デフォルトの名無しさん:2008/01/04(金) 15:09:03
何で偉そうなの?
265デフォルトの名無しさん:2008/01/04(金) 15:19:32
>>263
些末な問題だから。
266255:2008/01/04(金) 17:22:32
>>263
引っ越し前からの長期に渡る応援ありがとうございます!

精度は1秒あればOKです。
sleepにせよ、alarmにせよ、
仕掛ける前にtime_tを取ってきて、
それから逆算してやろうかなと思っててわざわざ書きませんでした。

数学は得意です。
自分で微分を発明しました(`・ω・´)シャキーン
267デフォルトの名無しさん:2008/01/04(金) 17:39:02
ライプニッツもしくはニュートン乙
268デフォルトの名無しさん:2008/01/04(金) 18:13:59
凄い奴が書き込んでたんだな。しかも前スレから。
269デフォルトの名無しさん:2008/01/04(金) 18:45:21
>>263
どこに引っ越したんだ?
270デフォルトの名無しさん:2008/01/04(金) 19:44:39
いや、>255が他のスレから移動してきただけのことだろ。
271デフォルトの名無しさん:2008/01/05(土) 03:46:06
度忘れしてしまったので助けて

引数にポインタをとる関数があるのだが
このポインタのアドレスを自動変数のものに書き換えるのはNG
このポインタに自動変数を代入するのはOK
でいいんだよね
272デフォルトの名無しさん:2008/01/05(土) 03:49:55
>>271
ごめん、読解できない
273デフォルトの名無しさん:2008/01/05(土) 03:53:50
寝ぼけてるから日本語でokになってしまったorz

a(int* p)
{
int local = 10; //適当

p = &local; //NG
*p = local; //これはどうだったっけ?
}


274デフォルトの名無しさん:2008/01/05(土) 03:59:04
>>273
//これはどうだっけ?
OKだよ。    ってか、なんでこの程度の事が分からん。

//NG
これの理由は説明できるか?
275デフォルトの名無しさん:2008/01/05(土) 04:00:36
>>273
*p = local; //これはどうだったっけ?

問題ない
pの指す領域に10の値が代入される


pがもつ10の値と、localが持つ10の値は、それぞれ別の領域に格納されている状態になる
276デフォルトの名無しさん:2008/01/05(土) 04:01:11
よくわからんが混乱してしまった、最近疲れてる予感orz


あれだ、auto変数は関数から脱出した瞬間ナイナイされちゃうからな
するとポインタpは意味の無いところを示してしまうのでエラーになるんだ
277デフォルトの名無しさん:2008/01/05(土) 04:12:09
>>274-275
説明ありがとう
今日はもう休もうorz
278デフォルトの名無しさん:2008/01/05(土) 08:30:54
文字列から指定の文字列を省いて他の変数へコピー
例えば
文字列が入った変数 MOJI[]="aaabbbccc\0" 指定の文字列="bbb"だと
MOJI→他の変数へaaaccc\0をコピー
できれば
aaabbbccc→ポインタ使ってMOJI自身をaaaccc\0に
ってしたいんだけど、どのようにすればいい?
279デフォルトの名無しさん:2008/01/05(土) 08:35:58
ドゥアブルポイントゥアァァァァ
280デフォルトの名無しさん:2008/01/05(土) 08:57:36
strstrでbbb探してbbbのに続くバイトをヌル文字まで一文字ずつ前にコピー
281デフォルトの名無しさん:2008/01/05(土) 09:04:56
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;
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"に変更済み
282デフォルトの名無しさん:2008/01/05(土) 09:06:01
>一文字ずつ前にコピー
馬鹿がいる。
>char tmp[strlen(a) + 1];
c99使いがいる。
# つーか、一時領域要らないだろw
283281:2008/01/05(土) 09:10:17
>>282
確かに一時領域要らなかった。

>>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));
}
284デフォルトの名無しさん:2008/01/05(土) 09:13:58
>>283
いや、未だc89じゃ通らないし。つーか、char const * pじゃなくてchar * pだろよ。
285デフォルトの名無しさん:2008/01/05(土) 09:28:25
>>283
strcpyでコピー範囲が重なってるから動作が未定義になるぞ。
286デフォルトの名無しさん:2008/01/05(土) 09:35:26
さらに指定の文字列は複数回出現する可能性も有るから・・・
さらに言えば指定文字列を取り除いた後に前後の文字列がくっついて取り除くべき指定文字列になる可能性も。
ex. aabbcからabを取り除くとabcになって再度abが出現。
287デフォルトの名無しさん:2008/01/05(土) 10:05:44
ありがとうstrlen使う発想がなかったから助かりました
実は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);
}
288デフォルトの名無しさん:2008/01/05(土) 10:27:58
strcatも未定義動作になるから止めれ。
289デフォルトの名無しさん:2008/01/05(土) 11:18:35
>>276
ポインタpも関数から脱出した瞬間ナイナイされるので安全。
290デフォルトの名無しさん:2008/01/05(土) 11:21:28
strcpy()で、前方への移動ができない実装ってあるんかいな。
未定義には違いないけど。
291デフォルトの名無しさん:2008/01/05(土) 14:10:38
>>273
>p = &local; //NG
これもOKだよ
よく考えろ、pもローカル変数だ
292デフォルトの名無しさん:2008/01/05(土) 14:32:16
>>291
ほう?
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;
}
293デフォルトの名無しさん:2008/01/05(土) 14:44:20
>>292
そういう話をしてるんじゃないと思うが。
294デフォルトの名無しさん:2008/01/05(土) 14:45:20
何が「ほう?」なんだか。
295デフォルトの名無しさん:2008/01/05(土) 14:52:06
>>292
君が何を言いたいのか分からない
要するに、そのコードがどうした?
何か問題でも?
296デフォルトの名無しさん:2008/01/05(土) 14:59:12
>>292
void 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
297292:2008/01/05(土) 15:00:49
ごめん、俺が悪かった。物凄く勘違いしてたらしい。いじめないでくれ。
298デフォルトの名無しさん:2008/01/05(土) 15:10:58
ローカル変数のポインタをリターンするときに注意が必要なんだっけ?
299デフォルトの名無しさん:2008/01/05(土) 15:14:17
あれ?戻った先で使おうと思っても残ってる保証がないんぢゃ? > 298
300デフォルトの名無しさん:2008/01/05(土) 15:15:17
そうだね。
int* f()
{
int a = 10;
return &a; // NG
}

特に構造体とか大きいものを返したいときに、
コストを避けようとしてやってしまう人もいるかも。
素直に値で返すか、引数に格納先のポインタを貰うべし。
301デフォルトの名無しさん:2008/01/05(土) 15:21:00
そんな時のための動的確保ですよ > 300
302デフォルトの名無しさん:2008/01/05(土) 15:24:48
>>300
動的確保するならauto_ptrですな。
std::auto_ptr<int> f()
{
return std::auto_ptr<int>( new int(10) );
}
303デフォルトの名無しさん:2008/01/05(土) 15:25:07
ヒープ領域に確保されるからdeleteで明示的に削除しない限り開放されないってやつか

ただしdelete忘れるとメモリリークが起こるから注意(´・ω・)
304デフォルトの名無しさん: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度行う方法は分かるのですが、片方を固定した場合どのようにすべきでしょうか。
305デフォルトの名無しさん:2008/01/05(土) 18:54:06
TCHAR (*hoge)[260];
306デフォルトの名無しさん:2008/01/05(土) 18:54:47
hoge = (TCHAR (*)[260])malloc(sizeof(TCHAR)*260*num);
307デフォルトの名無しさん:2008/01/05(土) 18:54:58
sizeof(TCHAR)*260

sizeof(hoge)
にするとどうなる?
308デフォルトの名無しさん:2008/01/05(土) 18:55:45
あるいは

hoge = (TCHAR (*)[260])malloc(sizeof(*hoge)*num);
309デフォルトの名無しさん:2008/01/05(土) 19:02:05
typedef すると分かりやすいよ。


typedef TCHAR Path[MAX_PATH];

Path *hoge;
hoge = (Path *)malloc(sizeof (Path) * num);
310304: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の方が分かりやすいですね。
311デフォルトの名無しさん:2008/01/05(土) 19:30:57
型宣言の * は間接参照演算子とは別物。
312デフォルトの名無しさん:2008/01/05(土) 19:35:03
>>310
TCHARはマクロでワイド文字(wchar_t)とマルチバイト文字(char)を切り替える
VCならプロパティからUnicode文字セットを使用するようにすればワイド文字になる
後"test";は_T("test");もしくはTEXT("test");って書くように。そうすれば切替の対象になるから。
313デフォルトの名無しさん:2008/01/05(土) 21:29:06
構造体にすると見慣れた形になる。
typedef struct { TCHAR str[260]; } Path;
Path* hoge = (Path*)malloc(sizeof(Path) * num);
煩雑かな。
314デフォルトの名無しさん:2008/01/06(日) 00:18:19
なんて言うかポインタの配列と多次元配列へのポインタを勘違いしている様な希ガス
int *p[10]だとint型のポインタが10個あるポインタの配列
int a[10][10]とかの多次元配列へのポインタなら int (*p)[10]
315デフォルトの名無しさん:2008/01/06(日) 00:55:57
C言語で何か分かりやすいプログラムはないでしょうか。
316デフォルトの名無しさん:2008/01/06(日) 00:56:34
helloworld
317デフォルトの名無しさん:2008/01/06(日) 00:59:19
int main(){
return 0;
}

多分これが一番分かりやすい
318デフォルトの名無しさん:2008/01/06(日) 01:48:10
C++Builder 6でコンパイルした後
printfでテキスト文を表示したいんですけど
どうすればいいんでしょうか。
319デフォルトの名無しさん:2008/01/06(日) 01:49:48
エスパーが質問に答えるスレ
http://pc11.2ch.net/test/read.cgi/tech/1187922645/
320デフォルトの名無しさん:2008/01/06(日) 02:15:16
実行すれば良いんじゃない。
321デフォルトの名無しさん:2008/01/06(日) 02:28:04
日本語をコマンドプロンプトや「メモ帳」で表示させたいです。
できれば背景が白い所に分かりやすく表示させたい。
マジレスきぼんぬ。
322デフォルトの名無しさん:2008/01/06(日) 02:34:03
コマンドプロンプトの配色を「白地に黒文字」に設定
323デフォルトの名無しさん: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");
詳しくは調べて
324304:2008/01/06(日) 02:57:35
>>314
それを観て何となく納得出来ました。
キャストが初めて観るので、もうちょっと弄ってみます。
レスくれた皆さんありがとうございました。
325デフォルトの名無しさん: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[] の様な気もしますが、
判る方がいましたらよろしくお願いします。
326デフォルトの名無しさん:2008/01/06(日) 05:49:38
>>321
ファイルに出力した後にそのファイルを開けばいい。
fp=fopen("test.txt","r");
fprintf(fp,"hoge");
fclose(fp);
system("test.txt");
327デフォルトの名無しさん:2008/01/06(日) 06:32:15
>>325
new [] 使ってるから 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;
328デフォルトの名無しさん:2008/01/06(日) 06:40:43
>>321
>>318でエディションがPersonal以外ならOutputDebugString。イベントタブに出力される
329325:2008/01/06(日) 08:55:02
>>327
レスありがとうございます。問題が解決しそうです。

どちらの delete でもコンパイルが通っちゃうから自信が持てない・・・
330デフォルトの名無しさん:2008/01/06(日) 11:33:30
>>315
全然関係ないが、自分が一番最初に見たC++のサンプルはこれだ。

#include <iostream>
int main(int argc, char *argv) {
 std::cout << "Hello World !" << std::endl;
 return 0;
}

ついでに、一番最初に聞いたクラスの説明は
 猫も人もみな哺乳類なのです
だ。
331デフォルトの名無しさん:2008/01/06(日) 11:48:57
>>330
mainの引数もまともに書かないとは、悪いサンプルだな。
332デフォルトの名無しさん:2008/01/06(日) 12:42:49
俺はこれだった・・・

static char _main[] = { 0x81, 0x21, ...., 0x21 }

PDPほにゃらら専用とかかいてあった
333デフォルトの名無しさん:2008/01/06(日) 14:01:44
最近Win32APIを使ったソフトを作り始め、色々とサンプルを見て回ってるのですが
多くがひとつの.cppファイルにまとまってるようなコードや、グローバル変数が多いソースで、
それを元にコードを打ち始めたらひとつのファイルに何千行というコードが入り、設定情報
をグローバル変数で共有するような気持ち悪いコードになってしまいました。

Win32を用いたコードでうまくOOPの概念を取り入れて、出来るだけすっきりとしたコードを書きたいのですが、
なにかアドバイスがあればご教授願います。
334デフォルトの名無しさん:2008/01/06(日) 14:08:52
APIを直接呼ぶんじゃなくて、APIを包み込むクラスかしてから使う。たとえばファイル関係のクラスを作って外からAPIを見えなくする。
335デフォルトの名無しさん:2008/01/06(日) 14:19:46
>>333

Win32API 直叩きじゃなくて、MFCや.NET Framework使ったほうが良いよ。
336デフォルトの名無しさん:2008/01/06(日) 14:21:16
MFCや.NET Frameworkみたいなのを作りたいんだろ。
337デフォルトの名無しさん:2008/01/06(日) 14:48:05
SDLとかwx使おう是
338デフォルトの名無しさん:2008/01/06(日) 15:25:17
VCLも愛して
339デフォルトの名無しさん:2008/01/06(日) 16:29:28
暇だしVCLをC++に移植するか
340333:2008/01/06(日) 16:30:59
皆さん ご回答ありがとうございます。
どうやらMFCってのがうまくAPIを纏めているようなのでそれを使いたいと思います・・・
341デフォルトの名無しさん:2008/01/06(日) 16:37:27
>>339
それ欲しい。是非に
342デフォルトの名無しさん:2008/01/06(日) 16:58:12
>>339
文字列クラスには是非sprintfメソッドを
343デフォルトの名無しさん:2008/01/06(日) 19:06:34
C++のSTLであるvector型に関する質問です。
AAA, 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);
344デフォルトの名無しさん:2008/01/06(日) 19:21:25
>>343
いや、少なくともfor文はいらなくね?advance使えば?
というより、こういうのは思いっきりtemplateの出番だと思うんだが。
345デフォルトの名無しさん:2008/01/06(日) 19:24:03
>>343
そもそもデータ構造を
struct Hoge {
double d; int n; string s;
};
vector<Hoge> hoge;
とできないの?

ちなみにvector<>::iteratorはランダムアクセスできるので
AAA.erase(AAA.begin()+index)でOK
346デフォルトの名無しさん:2008/01/06(日) 19:29:51
>>344
>>345
ありがとうございます。

既にクラスの階層構造を何段か組んでいるので、これ以上階層化するのは避けたいと思いまして。
最後の1行の場合、indexがint型だからコンパイルエラーにならないでしょうか?
347デフォルトの名無しさん:2008/01/06(日) 19:35:34
>>346
RamdomAccessIteratorなら加算がオーバーロードされてるからおk
348343:2008/01/06(日) 19:35:53
まずはこの方法でためしてみます。
AAA.erase(AAA.begin()+index)
349デフォルトの名無しさん:2008/01/06(日) 19:36:13
>>347
重ね重ねありがとうございますm(_ _)m
350デフォルトの名無しさん:2008/01/06(日) 19:52:25
#include <stdio.h>
から始まる基本関数で
何か表示する物はあるんでしょうか。
351デフォルトの名無しさん:2008/01/06(日) 20:02:22
Random Access Iteratorだから

AAA.erase( AAA.begin() + index );
BBB.erase( BBB.begin() + index );
CCC.erase( CCC.begin() + index );

でいいんじゃね?
352デフォルトの名無しさん:2008/01/06(日) 20:04:09
printfとか簡単な関数でもいいんですが。
コンパイラの設定でブリーダーができません。
353デフォルトの名無しさん:2008/01/06(日) 20:05:49
質問はコミュニケーション言語日本でお願いします。
354デフォルトの名無しさん:2008/01/06(日) 20:08:28
これからテンプレートの勉強を始めようと思っているんですが

テンプレート:クラスみたいなもん
STL:テンプレートのあつまり

みたいな認識ってまちがっていますか?
355デフォルトの名無しさん:2008/01/06(日) 20:10:15
>>354
間違ってる
356デフォルトの名無しさん:2008/01/06(日) 20:35:34
関数テンプレートの使いどころというか選択についてです
気にしなくて良いレベルなのだと思いますが
引数にaとbを取り、大きな方を返す関数テンプレートがあったとします。
この場合、大きい値を返す関数のint用のものfloat用のもの・・・・といった具合にたくさんの関数を用意するのとでは
どちらが良いのでしょうか?
ここで関数テンプレートを使うとなんというかもったいないというか処理が無駄に大きく膨らんでいる気がしてならないです

今すぐに想像はできないのですが、ここでいう大小を比べる程度のものでなく、もっと大きなものならば関数テンプレートが有効だとは思います
357デフォルトの名無しさん:2008/01/06(日) 20:36:29
大事なところがorz

つまり処理数が多いものならば関数テンプレートを利用した方が良い、などの明確だったりしないまでの決まりのようなものはあるのでしょうか?
358デフォルトの名無しさん:2008/01/06(日) 20:38:53
>>356
何で?
ぜんぜんもったいなくないと思うけど。
呼び出されてる型のものだけが具体化されるから
効率的だと思うし、実際std::maxテンプレートはあるじゃない。
359デフォルトの名無しさん:2008/01/06(日) 20:40:57
>>356
>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
これが面倒じゃないと思うならがんばれば?
360356:2008/01/06(日) 20:41:07
>>358
ありがとうございます
そうですよねorzもったいないと感じている自分がおかしくてならないです
積極的に使っていこうとおもいます
361デフォルトの名無しさん:2008/01/06(日) 21:03:26
だから、std::max()を使えってば。
362デフォルトの名無しさん:2008/01/06(日) 21:06:46
>>361
356は例えばで言ってるだけだろ
363デフォルトの名無しさん:2008/01/06(日) 21:14:07
>>360
おかしくないです。出てくるコードの大きさを見積もることは必要なことです。
364デフォルトの名無しさん:2008/01/06(日) 21:17:24
>>356

>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する

保守性を考えるとこの考え方はは良くない。
バグがあったら全部直さなきゃいけないし、直し忘れが出てくる可能性がある。
ステップ数が少ない場合でも、バグが出るときは出る。
こういう場合を想定してテンプレートが出てきたわけだし。
365デフォルトの名無しさん:2008/01/06(日) 22:00:30
templateを使うとexeがバカでかくなるって言うアホがいるんだよな
俺も会社でよく言われるんだわ
366デフォルトの名無しさん:2008/01/06(日) 22:04:31
そういやテンプレートを使う機会が無い
367デフォルトの名無しさん:2008/01/06(日) 22:07:18
仮にばかでかくなったとして、どのぐらいのサイズなら問題だと感じるんだろう……
368デフォルトの名無しさん:2008/01/06(日) 22:13:00
環境によってさまざまだろうね。
組み込み環境なら結構致命的になりかねん気もするけど、それならC++にするメリット少ないし。
一般的なソフトウェアならCDやDVDに入りきらなくなったらとかじゃないのかな?
369デフォルトの名無しさん:2008/01/06(日) 22:13:48
仮にテンプレート使わなかったとしても、
似たような物作るわけだしな。
370デフォルトの名無しさん:2008/01/06(日) 22:34:36
>>365
昔のコンパイラは知らないけど、信じがたい。
具現化されるのは自分で呼び出してるものだけだから。
インライン化とか別の理由で大きいんでない?
それともテンプレート使わなくても、もともとバカでかく
なるプログラムかもしれん。
371デフォルトの名無しさん:2008/01/06(日) 22:43:46
>>370
大きなクラスを丸ごとテンプレートにしたんじゃないか?
372デフォルトの名無しさん:2008/01/06(日) 22:44:17
オブジェクトファイルのサイズだけ比較すればずっと増えるんじゃね?計ったことないけど
373デフォルトの名無しさん:2008/01/06(日) 23:01:42
VC++2008express editionでコンソールアプリケーションを作れるか実験してみた結果
できませんでした。
どうしたもんでしょう。
374デフォルトの名無しさん:2008/01/06(日) 23:04:36
それだけじゃ、何が起こったのかサッパリ
375デフォルトの名無しさん:2008/01/06(日) 23:07:35
C言語の質問なんだが。
持たせたファイルポインタからファイルネームを得たいんでファイルポインタからメンバーを見てみたら
tmpfnameってのがあったけど、このtmpfnameってそのファイルの名前と考えておk?
あと、これって環境依存?
376デフォルトの名無しさん:2008/01/06(日) 23:12:35
環境依存
377デフォルトの名無しさん:2008/01/06(日) 23:12:59
FILE構造体の中身は処理系依存
378デフォルトの名無しさん:2008/01/06(日) 23:15:56
>>376-377
ありがとうございました。
別の方法で管理することにします。
379デフォルトの名無しさん:2008/01/06(日) 23:36:51
C言語の質問です
main関数で用意した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;
}
380デフォルトの名無しさん:2008/01/06(日) 23:40:52
ポインタを関数に渡しているといってもポインタという値を渡してるだけ。
そのポインタを関数の中で書き換えてもmainじゃ影響されないから引数消して返り値使うとか、
ポインタのポインタを引数でとるかのどっちか。
381デフォルトの名無しさん:2008/01/06(日) 23:41:45
>>379
そりゃ、上手くいかんわ。

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;
}


全く試してないけど、これでどうよ?
382デフォルトの名無しさん:2008/01/07(月) 00:01:18
>>381
俺も全く試してないけど

>*a[1]=2.0;
なんか嫌な臭いがする。
優先順位、これでよかったっけ?
383デフォルトの名無しさん:2008/01/07(月) 00:04:54
>>382
(・A・)イクナイ!!
384デフォルトの名無しさん:2008/01/07(月) 00:07:09
*a[1]は*(a[1])だったはずだな。
やりたいのは(*a)[1]か?
385デフォルトの名無しさん:2008/01/07(月) 00:12:12
>>378-384
どうもありがとうございます。
>>381>>384に変更したものを使えば上手くいきました
386デフォルトの名無しさん:2008/01/07(月) 00:38:10
for(i=0;i<N;i++){
  fscanf(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]);
}

その後で↑の状態に戻してからビルドして実行すると最初と同じなのにエラーが出なくなっている



こういったことが起こるのはどのような理由でしょうか


387デフォルトの名無しさん:2008/01/07(月) 00:45:18
すべてのソースを貼り付けるとか
エラーの内容を書くとか
そういう努力をしないとエスパー以外答えられないと思うよ
388デフォルトの名無しさん:2008/01/07(月) 01:44:26
エスパーしてみる。
ファイル内に改行があってfscanfが2回目以降読み込みに失敗している。
389デフォルトの名無しさん:2008/01/07(月) 03:26:27
多分初期化忘れ。エラーが出ない方はたまたま
390デフォルトの名無しさん:2008/01/07(月) 05:17:35
>384
優先順位って難しいね.
みんなちゃんと覚えてるの?
391デフォルトの名無しさん:2008/01/07(月) 06:18:31
別スレから誘導されて来ました。
改めて、こちらで質問させて下さい。

まず、フラッシュメモリにデータを書き込みます。
そしてそのデータが書き込まれたセクタ?(アドレス?)を取得する方法ってありますでしょうか?
392デフォルトの名無しさん:2008/01/07(月) 06:35:09
誰だよ、誘導したのwここでもスレ違いだろw
少なくともCレベルじゃメモリアドレスしかわからんだろうから無理じゃね?
OSレベルの話になるね。
393デフォルトの名無しさん:2008/01/07(月) 07:00:26
>>392
そうですか…
かなり難しいようですね…

環境は、Win32(XP Pro) + VC++ なんですけど…
394デフォルトの名無しさん:2008/01/07(月) 07:04:39
DOS 時代なら INT 25H(アブソリュートディスクリード)使えば何とかなると思うけど・・・。
395デフォルトの名無しさん:2008/01/07(月) 07:22:43
Inside Windows NT Disk Defragmenting
http://technet.microsoft.com/en-us/sysinternals/bb897427.aspx
デフラグ用のAPIではだめかい?
396393:2008/01/07(月) 07:56:40
>>394-395
助言ありがとうございます。
がんばって調べてみます!

とりあえず、395さんの紹介して頂いたページを見てみたいと思います。
397デフォルトの名無しさん:2008/01/07(月) 08:07:54
>>390
自信ない使い方をするときに括弧使えばいいだけだろ。
398デフォルトの名無しさん:2008/01/07(月) 10:10:50
>>390

考えるのがめんどくさいので、常に括弧付。
可読性も向上。
399デフォルトの名無しさん:2008/01/07(月) 13:25:53
>>398
int a = (b + (c * d)) - e;とか書くの? 却って可読性が落ちる希ガス。
400デフォルトの名無しさん:2008/01/07(月) 13:27:27
lispに慣れてればどうということはない
401デフォルトの名無しさん:2008/01/07(月) 14:24:29
>399
煽りとしてはどうかなあ?
402デフォルトの名無しさん:2008/01/07(月) 14:34:46
素朴な疑問だろ?
403デフォルトの名無しさん:2008/01/07(月) 14:43:02
左結合か右結合か、考えるの面倒だよね。
だからきっと、
a = (b = (c = 0));
って書くんだよ。
404デフォルトの名無しさん:2008/01/07(月) 14:43:30
>>399
ぶっちゃけa = b + c * d - eよりはよっぽどわかりやすい
405デフォルトの名無しさん:2008/01/07(月) 14:45:20
俺は
a = b + (c * d) - e
だな。
順読み以外は括弧付ける派。
406デフォルトの名無しさん:2008/01/07(月) 14:46:15

a = c * d + b - e
407デフォルトの名無しさん:2008/01/07(月) 15:13:45
b,c,d,eの順序に意味がある場合の話だろうjk
408デフォルトの名無しさん:2008/01/07(月) 15:20:45
質問があります。
今C言語を勉強しようか考えている所なのですが
これを学ぶ事によって、ボンバーマンのようなゲームは作成可能でしょうか?
また作れると仮定しまして、C言語よりボンバーマンのようなゲームを作るのが
簡単な言語はありますでしょうか?

もしよろしければ教えてください、お願いします。
409デフォルトの名無しさん:2008/01/07(月) 15:29:34
>>408
英語を学ぶことによってマクベスを書くことは可能かどうか、
英語で書くより簡単な言語はあるかと聞くくらい、無意味だ。
こっちにでも逝け。

初心者のためのプログラミング言語ガイド Part6
http://pc11.2ch.net/test/read.cgi/tech/1193132235/
410デフォルトの名無しさん:2008/01/07(月) 15:52:46
>>408
どんな言語でも何かを作る時apiや構文等の知識は必要となり
簡単ていう概念はとっぱらったほうがいい。
どんなもんでもある程度確立した物を作るのはめんどうなもんだ。
411デフォルトの名無しさん:2008/01/07(月) 16:06:29
誘導ありがとうございます。

簡単と言う発言は軽率でした
言語にも向き不向きがあるかと思ったので、
より作りやすいと言う意味でした

それでは誘導先に行ってきますので、
こちらでの質問は取り下げさせてください
412デフォルトの名無しさん:2008/01/07(月) 22:33:27
藤原紀香相手に中だしSEXするよりは簡単だろう
413デフォルトの名無しさん:2008/01/07(月) 22:52:17
>>412
おっさん乙
414デフォルトの名無しさん:2008/01/08(火) 01:33:25
C++の標準I/Oライブラリについてですが、
basic_istream<>やbasic_ostream<>はbasic_streambuf<>
を利用してバッファ入出力を行ってますが、継承はして
ないですよね?basic_istream<>やbasic_ostream<>は
コンポジションとしてbasic_streambuf<>を保持してるのですか?
415デフォルトの名無しさん:2008/01/08(火) 02:45:31
.jpgとかをいじるのは古いプログラムなんですかね。
416デフォルトの名無しさん:2008/01/08(火) 02:47:09
>>414 そうともいう。
417デフォルトの名無しさん:2008/01/08(火) 03:01:57
入力がEUCで漢字コードを検索したい場合、どうやればいいんでしょうか?コンパイラはシフトジスが基本みたいです
418デフォルトの名無しさん:2008/01/08(火) 03:45:00
>>415
「いじる」ってのをどういう意味で使ってるのかよく分からんが
JPEG<=>ビットマップの変換は古いというか普通ライブラリを使う
419デフォルトの名無しさん:2008/01/08(火) 04:01:05
int iskanji(int c)
{
return (0xA1 <= c && c<=0xfe)
}
420デフォルトの名無しさん:2008/01/08(火) 05:28:11
std::vector<int[10]>みたいなことをやりたいのですが、ベクタのベクタにするか、
メンバ変数に配列を持つ構造体のベクタにするしかないんでしょうか
421デフォルトの名無しさん:2008/01/08(火) 05:53:22
>>420
int[10]は型じゃないっしょ?
422デフォルトの名無しさん:2008/01/08(火) 07:23:33
>>419
EUC の1バイト目はもうちょっと範囲広いし、
3バイト文字も存在する。
423デフォルトの名無しさん:2008/01/08(火) 07:49:19
どこのEUCだか。
424デフォルトの名無しさん:2008/01/08(火) 11:52:47
>>420-421
int[10] は要素数 10 の int の配列型だよ。でもコピーコンストラクタや代入演算子が
使えないんで vector には入れられない。 >420 の言うような回避方法が必要。
425デフォルトの名無しさん:2008/01/08(火) 12:50:52
バイナリのデータを1バイトづつ読み込んでいって、FFといデータの前に
次の値を書き込むというのをやりたいんですが、こういったことをやる場合、
ifstreamで読み込んでいってデータを見つけたら位置を取得→
ofstreamを使って取得した位置に書き込みという風にやらないといけないのでしょうか?
426デフォルトの名無しさん:2008/01/08(火) 12:55:28
>>425
C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
データの挿入もこれに当てはまる。(ただし元の内容の後ろに追記はできる。)

ってことで新しいデータを含んだファイルの内容を全部 ofstream に突っ込むことが必要。
427デフォルトの名無しさん:2008/01/08(火) 13:09:13
>>420
std::vector<int(*)[10]>とか
428デフォルトの名無しさん:2008/01/08(火) 13:14:32
>>425
入出力を別のファイルにしておいて、入力データが「FFとい」だったら
それを出力する前に「次の値」を出力すればよろしい。
一つのファイルでそれを実現するのは、(サイズが変わるのであれば)むずかしい。
429デフォルトの名無しさん:2008/01/08(火) 13:15:37
>>426
>C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
いいえ。
430426:2008/01/08(火) 13:23:52
ごめんよ。サイズの変わらない書き換え(上書き)はできるね。データの挿入ができないんだ。
431デフォルトの名無しさん:2008/01/08(火) 13:31:44
>>426-430
ありがとうございます。勉強になりました。
バイト配列にデータを全部読み込んで、配列をFFの一つ前のデータまで書き込んで→
新しい値を書き込んで→残りの配列を書き込む という方法でやりたいと思いますm(_ _)m
432デフォルトの名無しさん:2008/01/08(火) 14:51:17
>>431
istreambuf_iteratorとostreambuf_iterator使うと簡単にできそうだな。
速いし。
433デフォルトの名無しさん:2008/01/08(火) 17:39:27
webカメラ(usb接続)のドライバの取得方法と、
プログラム内でそのドライバを作用させる方法をご教授願えないでしょうか
環境は.net 2003 c++です
434デフォルトの名無しさん:2008/01/08(火) 18:36:44
ドライバ直じゃなくて普通はDirectShow経由じゃね?
435デフォルトの名無しさん:2008/01/08(火) 20:05:46
readlineがGPLだったので、自前で書くついでにc++に移植しちゃおうと思いました。
ezstreamというクラスを作って、

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>>(……

ここで詰まったのですが、どう書けば良いのでしょうか。
それとも>>のオーバーロードだけすれば済むような単純な話ではないのでしょうか?
436デフォルトの名無しさん:2008/01/08(火) 20:23:50
むしろoperator >>を定義すればよいという話ではないよ。

Boost.Iostreamsを使うのが楽。
http://www.kmonos.net/alang/boost/classes/iostreams.html

それを使いたくなければ、ググれ。
http://www.google.co.jp/search?q=iostream+%E6%8B%A1%E5%BC%B5
437デフォルトの名無しさん:2008/01/08(火) 21:00:35
mac ox10.5を使ってるのですが、次のソースコードをgccで
コンパイルしようとするとエラーが出てしまいます。
ソース-----------------
#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を使用してコンパイルを成功させるには環境をどのようにすれば良いのでしょうか。
438デフォルトの名無しさん:2008/01/08(火) 21:09:10
無い関数は作る!

勉強になるから作ってしまおう
439437:2008/01/08(火) 21:18:41
すみません。目的としては他の人が作ったソースをコンパイルすることなのです。
使用するソースコードは既に用意されているので、(非常に長いソースコードです)
できればソースコードをいじらないでコンパイルしたいのです。
440デフォルトの名無しさん:2008/01/08(火) 21:25:02
>>439
まずどの環境のどのコンパイラをターゲットに書かれたソースか調べる。
441デフォルトの名無しさん:2008/01/08(火) 21:25:12
>>439
別のファイルに関数を作ればいいから、ソース変更しなくてもいいよ。
442デフォルトの名無しさん:2008/01/08(火) 21:58:11
>>423
eucJP-ms
443433:2008/01/08(火) 22:40:06
>>434
VFWを使っていますので残念ながらDirectShowを使うことができません
カメラをUSBポートから引っこ抜いてから再度差し
カメラを動作させるといったことをしたいのですが…
444デフォルトの名無しさん:2008/01/08(火) 22:50:30
C++で、比較的大きくてかつ静的な連想配列を宣言したいんだけど、
ソースコードにどうやって埋め込むのがスマートでしょうか??
445デフォルトの名無しさん:2008/01/08(火) 23:25:19
class Hoge {
public:
 const std::map<A, B>& GetMap() {
  static Hoge singleton;
  return singleton.m_map;
 }

private:
 Hoge() {
  // ここで初期化
 }
 std::map<A, B> m_map;
};

こんな感じか?
446デフォルトの名無しさん:2008/01/09(水) 00:26:45
>>330
それを実行するのにはコンパイラには何か必要なんですかね。
447デフォルトの名無しさん:2008/01/09(水) 00:40:52
>>446
日本語でおkだな。
コンパイルしたいのであればC++のコンパイルが可能なものであればなんでもいい。
コンパイラに必要なものが知りたいのであれば、ソースファイルだけあればいい。
448デフォルトの名無しさん:2008/01/09(水) 00:45:13
質問です。
bcc 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 が参照)
となり、やはりだめです。。
もうにっちもさっちもいきません。どなたかアドバイスお願いします
449デフォルトの名無しさん:2008/01/09(水) 00:55:34
 #include <windows.h>

コンパイルオプション -W
450デフォルトの名無しさん:2008/01/09(水) 00:59:49
>>448
よく分からんけど先頭行に
#include<windows.h>
でいけるかも
451デフォルトの名無しさん:2008/01/09(水) 01:57:55
>>444
ソート済み const 配列の形で定義して、 lower_bound() とかする関数を
インターフェースとしてかぶせとけばいいんじゃない?
452448:2008/01/09(水) 02:06:46

説明不足ですみませんでした。
とある参考書を使っていて、「DxLib」というファイルをインクルードして
進めていくらしく、それで#include"DxLib"となっているみたいです。
>>449-450
れすありがとうございます。
#include<windows.h> としたんですが、同じエラーがでました。
コンパイルオプションってどうやっていじるんでしょうか。
BCC developerのプロジェクト設定で
●コンソールアプリケーション(-WC)
Windowsアプリケーション(-W)
というようにチェックするところがあるんですが、
このことですか?
453デフォルトの名無しさん:2008/01/09(水) 02:12:28
あたりが付いてるならとりあえずやってみてから質問してはどうか
454448:2008/01/09(水) 02:16:38
やってみたんですが、だめでした。
根本的に間違ってるんでしょうか
455デフォルトの名無しさん:2008/01/09(水) 02:29:52
>>451
それなんてEffective(ry
456デフォルトの名無しさん:2008/01/09(水) 02:38:20
 >>448
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5704.zip

素直に、VC++とかにしてくれれば、話は早いんだが、まぁ、ゲーム作りたいやつは応援する主義なんでね。
457448:2008/01/09(水) 02:54:28
>>456
ありがとうございます!
さっそくやってみます
458デフォルトの名無しさん:2008/01/09(水) 03:23:36
>>448
 とりあえず、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/
459デフォルトの名無しさん:2008/01/09(水) 03:50:34
2008じゃだめなん?psdkも一緒にインスコできるぜ
460デフォルトの名無しさん:2008/01/09(水) 03:56:03
ポインタの基本的なことなのかもしれませんが、良く分からず悩んでおります。

2次元、3次元配列をポインタにキャストして操作したいのですが、
以下のような操作は問題ないのでしょうか?

int* hoge = (int *)new int[2][3];

例えば、上のようにcastして、1次元配列のint[5]と同じように
操作しても問題ないでしょうか?

461デフォルトの名無しさん:2008/01/09(水) 04:04:13
>>461
ちょっとずれるかもしれないが、http://plaza.rakuten.co.jp/tcross/diary/200711230000/

 キャストは、一日3回までだっていったでしょう。
できるだけキャストしないですむように組みましょう。
 問題ありそうな気がする。試してないので、あれだけど。
462デフォルトの名無しさん:2008/01/09(水) 04:07:53
C++のブースト以外のプログラムってないでしょうか。
463デフォルトの名無しさん:2008/01/09(水) 04:10:49
意味が分からないぞw
ライブラリのことならそりゃいっぱいあるよ
464デフォルトの名無しさん:2008/01/09(水) 04:12:35
>>460
CもC++も配列はあくまでも一次元。(多次元と表現するけど。)
今の場合は、int[3]を要素として二つ持つ一次元配列だから
int (*p)[3] = new int[2][3];
だと思う。
465デフォルトの名無しさん:2008/01/09(水) 04:12:45
>>461
断言できないが、簡単に試したら、問題なかった。
でも、気持ち悪いので、出来るだけキャストはやめて欲しい。
466460:2008/01/09(水) 04:23:49
>>461
>>464
>>465

みなさんありがとうございます。
できれば変なキャストはさけたいのですが、
呼び出さなければいけないDLLのメソッドが
int * で待ってまして、どうやって2次元配列、3次元配列を渡せば
よいのか悩んでおります。
(ちなみにFortranのDLL)

いちおう上のようなやりかた
int* hoge = new int[2][3];
で渡して動作しているよう?なのですが、

なにか動きがおかしいようです・・

メモリ的にはint[5]と同じなので、問題ないのかな?
とも思うのですが・・
467デフォルトの名無しさん:2008/01/09(水) 04:39:05
2 * 3 = ?
468460:2008/01/09(水) 04:41:41
>>467
すみません、int[6]でした。
469460:2008/01/09(水) 04:47:58
http://www.nurs.or.jp/~sug/soft/tora/tora10.htm
ここをみると、

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++でも問題ないのか、なぞですが・・。
470デフォルトの名無しさん:2008/01/09(水) 04:58:32
>>466
int (*p)[3] = new int[2][3]; にして&p[0][0]を渡せばいいんでない?
キャストしないとコンパイルエラーだし、コンパイルを通すための無理やり
キャストは正直気持ち悪い。
471デフォルトの名無しさん:2008/01/09(水) 05:04:30
int* hoge = (int *)new int[2][3];

いや待てよ。上の場合だと

delete [] hoge;

が未定義動作になる可能性がなきにしもあらずな気がしないでもない。
大丈夫かもしれんが移植性と規格を考えたら、>>470のほうが安心だな。
472460:2008/01/09(水) 05:39:13
>>470-471
ありがとうございます。そちらの方がやさそうですね。
ためしてみます。
ちなみに3次元配列の場合は

int (*c)[2][3]= new int[5][2][3];

のような感じですよね?
473460:2008/01/09(水) 05:39:46
「よさそうです」の間違いでした。
474デフォルトの名無しさん:2008/01/09(水) 07:42:52
最初から1次元配列で確保しておいて、オフセットを調整した方がいい希ガス。
オフセット計算用にこんな関数でも用意して。
static int offset(int w, int x, int y) {return w * y + x;}
475デフォルトの名無しさん:2008/01/09(水) 10:47:37
>>472
そう。

>>474
そう思う。
476デフォルトの名無しさん:2008/01/09(水) 12:37:45
>>448
俺は前にbccでWinMainの引数型不一致でコンパイル通らなかったことがある
詳しいことは忘れたが第三引数がTだったような、違うかったような
477デフォルトの名無しさん:2008/01/09(水) 14:17:31
スレ違いかもしれませんが7-zip32.dllで
自分で作ったデータを直接zipで保存する方法分かる人いませんか?
具体的に言うと
自分で作ったデータをファイルとして出力→7-zipでファイルを指定して圧縮 はできるのですが
圧縮範囲をポインタで指定→ファイル名を指定して書庫作成 ができないのです。
478デフォルトの名無しさん:2008/01/09(水) 14:25:20
>>477
ファイルアーカイバで、ファイル以外のものをアーカイブする機能があるとも思えないが。
そもそも、なんでファイルに出力しちゃいけないの?
479デフォルトの名無しさん:2008/01/09(水) 14:30:51
>>478
数が多いので出来ればいちいちアウトプットしたくないんです。
最悪 ファイル出力→書庫作成→ファイル消去
ってしようと思ってます。
やっぱりこういったdllには基本的にないんですかね?
480デフォルトの名無しさん:2008/01/09(水) 14:40:17
圧縮したいだけならアーカイバのDLLを使わないで圧縮ライブラリ使ったら?
481デフォルトの名無しさん:2008/01/09(水) 14:51:38
そのとおり
482デフォルトの名無しさん:2008/01/09(水) 14:52:07
>>479
7-zip32.dllのAPIリストを流し読みしてみたが、メモリソース展開用の関数は無いっぽい。
出力先はメモリで受け取れるみたいだけどなw
480が言ってるようにzlibなりを使うのも手。
(その場合他のアーカイバと互換性を持たせるのは少し面倒だが)
あとは7-zip32.dllのソースをいじってメモリソース対応版を作るのも良いかも。
該当箇所を探すのが少し面倒だろうけど。
483デフォルトの名無しさん:2008/01/09(水) 15:27:16
軽く調べたら7zip(7-zip32.dllではなく、本家のほう)のcommon/StdInStream.h .cpp
を修正すればメモリソースに対応できると思う。
あとは自分で調べるか詳しい人に聞いてね
484デフォルトの名無しさん:2008/01/09(水) 16:58:56
統合アーカイバDLLってのは、基本的はファイル経由ばかりかと。

極端に言えば、昔の(今もあるけど)コマンドラインインターフェースを
そのままDLLに渡して動かすために作られたようなものだから。
各DLLに共通の操作を実現させるために、基本的な処理が中心だし。

だから、その元になるものを参考にすれば、大抵はオンメモリの操作になる。
例えば、TAR32.DLLではなくてzlibを使うとかね。
全てにそういうのがあるわけじゃないだろうけど。
485デフォルトの名無しさん:2008/01/09(水) 17:44:08
>>463
ライブラリ詰め合わせとかがあると便利なんですけど
誰かマジレスお願いします。
486デフォルトの名無しさん:2008/01/09(水) 17:44:36
>>466

//配列へのポインタ−−簡単な例

#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;
}
487デフォルトの名無しさん:2008/01/09(水) 17:46:51
>ライブラリ詰め合わせ
そりゃいくらでもあるぞ。目的も環境も判らんからなんとも言えんが。
488デフォルトの名無しさん:2008/01/09(水) 17:49:23
>>485
割とまじめに答えたんだがな
存在するなら
欲しい機能名 ライブラリ
で適とーにぐぐれば見つかるだろ

いろんなライブラリが片っ端から詰め合わせてあるのが欲しいとか?w
ねーよwwwww
489デフォルトの名無しさん:2008/01/09(水) 17:49:55
アーカイバの展開なら00AM型Susieプラグインがメモリストリームからの展開サポートしてるのにね。
490デフォルトの名無しさん:2008/01/09(水) 19:09:33
FILE_ATTRIBUTE_TEMPORARYを付けてCreateFileして、
Windowsにバッファフラッシュされないことを期待。
491デフォルトの名無しさん:2008/01/09(水) 19:34:13
>>488
ここ2、3年新しいライブラリとかは作られていないんですかね。
携帯全盛期でほとんどプログラム終わってると困るんですけど。

キャノンの説明受けに行くのでちょとでも関係あることあればいいんですけどね。
492デフォルトの名無しさん:2008/01/09(水) 19:44:08
「キャノン」って書いてる時点で
493デフォルトの名無しさん:2008/01/09(水) 20:17:43
ぶっちけた話C++でformに写るようにするには
VBしかないんでしょうか。
494デフォルトの名無しさん:2008/01/09(水) 20:23:37
画像表示さえできればボンバーマンくらいはすぐできるだろう
今ならjavaとかが手軽でいいんじゃないか
495デフォルトの名無しさん:2008/01/09(水) 20:31:41
VC2005で簡単にゲーム作ってみようと思ったんですが、
getch()でキーコード受け取ったら、カーソルキーが全部224で判別できないんです。

これをどうにかして識別する方法を教えてください。
別にgetchに拘らなくてもいいですが、出来ればC/C++の標準ライブラリに入っているものだと嬉しいです
496デフォルトの名無しさん:2008/01/09(水) 20:38:13
>>491
488が否定しているのは詰め合わせのようなものの存在を否定しているだけだぞ。
497デフォルトの名無しさん:2008/01/09(水) 21:01:59
>>495
そもそも getch は標準関数じゃない
498デフォルトの名無しさん:2008/01/09(水) 21:11:49
>>495
とりあえず「ゆきいるか」でググってLunaでも使っとけばいいと思う。
499デフォルトの名無しさん:2008/01/09(水) 21:24:35
>>491
Qt でも使ってみたら。
500デフォルトの名無しさん:2008/01/09(水) 21:26:00
>>495
カーソルキーは二つのコードが送られてくる気がする
224 が制御コードで続くコードでカーソル方向が判別できるはず
501495:2008/01/09(水) 21:31:18
回答ありがとうございます。getchって標準ライブラリじゃなかったんですか、初めて知りました…
>>498
あんまり外部のライブラリ使いたくなかったんです。ちょっと試しにやってみようかって程度だったので。

>>500
その発想は有りませんでした。試してみたら確かに取得出来ました!
502デフォルトの名無しさん:2008/01/09(水) 21:40:54
ttp://msdn2.microsoft.com/ja-jp/library/19f56tw3.aspx
↑のページに書いてあるコードで、一度

#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)

と定義してから

#define new DEBUG_CLIENTBLOCK

と定義し直す意味って何かあるのでしょうか
503デフォルトの名無しさん:2008/01/09(水) 21:59:54
new( _CLIENT_BLOCK, __FILE__, __LINE__)っていう文字列にトラウマがあって使いたくないんじゃね
504デフォルトの名無しさん:2008/01/09(水) 22:01:23
>>493
・CLI+Windows.Form
・VCL
505デフォルトの名無しさん:2008/01/09(水) 22:38:12
>>502
ヘッダファイル内で new が置換されると困るだろ?
506デフォルトの名無しさん:2008/01/09(水) 22:39:46
困るってのは、具体的に言えば operator new あたりが一番困る。
507デフォルトの名無しさん:2008/01/09(水) 23:05:08
レスありがとうございます。おおよその目的がわかりました。
newを使うファイルでいちいち
#define new DEBUG_CLIENTBLOCK
を定義するのがめんどくさそうですね
508デフォルトの名無しさん:2008/01/09(水) 23:06:40
それ専用のヘッダファイルを用意するとか。
最後にインクルード。
509448:2008/01/09(水) 23:13:00
>>458
なにからなにまでありがとうございます。。いじくってみます。
>>476
そのへん調べてみます
510デフォルトの名無しさん:2008/01/09(水) 23:14:35
STLにたどりつかねぇ、焦っちゃダメだ・・基礎がおろそかになる
511476:2008/01/09(水) 23:54:28
>>509
すまん、今試したらTは何の関係も無かったw
何でエラー出てたんだっけな……
512476:2008/01/10(木) 00:03:07
連投すまん、うちのエラーはLPCSTRでC++としてコンパイルした時だった(LPSTRならコンパイル通る)
つまり少なくとも>>448みたいにCがついていないのじゃ関係無かったすまん
513448:2008/01/10(木) 00:14:32
わかりました。わざわざ教えてくれてすいません
514デフォルトの名無しさん:2008/01/10(木) 00:22:38
 >>448
 よかった。まだ見てたか。将来、今までにない斬新なゲームを作ってくれ。

こういうことは、ゲ製板 http://pc11.2ch.net/gamedev/
のほうが、いいと思う。

DXライブラリ 総合スレッド
http://pc11.2ch.net/test/read.cgi/gamedev/1197468399/
515デフォルトの名無しさん:2008/01/10(木) 00:41:38
>>502見当違いかもだけど
_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がそのまま展開されずに残るって言う・・・

試してないけどね!!
516デフォルトの名無しさん:2008/01/10(木) 00:44:54


以下の文字列があったとします。
AB AA ABCA BA BB

この中かからABCが含まれているか検査したいのですが
どうやって実現すればいいのでしょうか

strstrだとABCAのABCに部分一致してしまうので使えないと
思うので困ってます
517デフォルトの名無しさん:2008/01/10(木) 00:49:35
文字列の最後に空白をくっつけて
ABC空白 で探せばよくね?
518デフォルトの名無しさん:2008/01/10(木) 01:43:28
>>512
WinMainは<windows.h>のさらにどっか奥でプロトタイプ宣言が為されているので、
それと合わないとそういう風にエラーになってしまう。
519519:2008/01/10(木) 01:44:30
書き忘れた。
多重定義にならず、エラーになるのはextern "C"が付いているため。
520デフォルトの名無しさん:2008/01/10(木) 01:58:56
>>516
その例だと「AB AA ABCA BA BB」のなかに「ABC」という文字列はなかったとしたいのか?
だとするならばstrcmpでよくね?
521520:2008/01/10(木) 02:01:15
書いた後に気づいた。char str[] = "AB AA ABCA BA BB";ってことか。
char * str[] = { "AB", "AA", "ABCA", "BA", "BB" };だと思った。
セパレータが固定されてるなら>>517でよさそうだね。
ただし、後ろだけじゃなくて前後につけなきゃだめだけど。
522デフォルトの名無しさん:2008/01/10(木) 02:04:11
>>516
正規表現ライブラリを使ってみるととか
523デフォルトの名無しさん:2008/01/10(木) 02:26:09
オタだとばれない程度のプログラムってどんな物があるんでしょうか。
524デフォルトの名無しさん:2008/01/10(木) 02:30:31
>>523
中途半端なプログラムではなく、きっちりしたプログラムならヲタだと思われない。
また、言語知識以外にも専門的な知識が必要になるプログラムなら確実に思われないだろうな。
たとえば、半導体のキャリア輸送をシミュレートするプログラムとか。
525デフォルトの名無しさん:2008/01/10(木) 02:38:51
他には何かないのか。
526デフォルトの名無しさん: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;
}
527デフォルトの名無しさん:2008/01/10(木) 03:12:25
>>526
デバッグを他人に丸投げしたいのでなければ、エラーメッセージくらい張れ。
528デフォルトの名無しさん:2008/01/10(木) 03:50:09
>>527
すいません。以下です。コンパイラは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

529デフォルトの名無しさん:2008/01/10(木) 03:59:44
const忘れてるぜ
530デフォルトの名無しさん:2008/01/10(木) 04:01:44
- bool operator<(const event &a);
+ bool operator<(const event &a) const;

- bool event::operator<(const event &a) {
+ bool event::operator<(const event &a) const {
531デフォルトの名無しさん:2008/01/10(木) 04:02:27
>>529
えっ,どこですか?
priority_queue<const event>
としてみたのですがダメ。(コンパイル通らず)
532デフォルトの名無しさん:2008/01/10(木) 04:06:19
>>530
コンパイル通りました!
でも意味わかんねえス。今まで演算子のオーバーロードでそんなところに
constつけたことなかったよ。どういう意味ですか?
533デフォルトの名無しさん:2008/01/10(木) 04:06:26
笑ってしまっていいのだろうか……
534デフォルトの名無しさん:2008/01/10(木) 04:07:17
笑えよ・・・
535デフォルトの名無しさん:2008/01/10(木) 04:10:32
>>533,534
だんだん自分でも怖くなってきた。もしかして自分は、すごく基本的なことを
知らないとか言ってる?
536デフォルトの名無しさん:2008/01/10(木) 04:11:30
.>>528
そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
書き換えを伴わないメンバ関数は、全てconstメンバにしておくべき。
537デフォルトの名無しさん:2008/01/10(木) 04:11:58
538デフォルトの名無しさん:2008/01/10(木) 04:12:13
> 演算子のオーバーロードでそんなところにconstつけたことなかった
「演算子のオーバーロード」を「メンバ関数」に置き換えても、やっぱり同じことが言えるんだとしたら、
かなり基本的なことを学び損ねてると思う。
そうでないなら、まぁちょっとした誤解だから、すぐ知識の修正もできるだろうけど。
539デフォルトの名無しさん:2008/01/10(木) 04:24:38
bool operator<(const &TYPE)const;じゃないとダメなのはpriority_queueの問題でしょ

あと
>そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
「constなオブジェクトからは呼び出すことができない」じゃね
540デフォルトの名無しさん:2008/01/10(木) 04:38:54
>>537
微妙・・・
541デフォルトの名無しさん:2008/01/10(木) 04:48:34
priority_queueは内部でstd::lessを使うんだが、これが>>526の場合は
bool less(const event &a, const event &b){ return a < b; }
こんな感じなので、eventクラスのoperator<がconstメンバ関数じゃないとエラーになる
542デフォルトの名無しさん:2008/01/10(木) 05:41:08
>>536-541
色々こんな時間にありがとうございます。
自分の中ではとりあえず、
「priority_queue用に独自classに<(less)を定義する時は、引数と関数にconstをつける必要あり」
というルールで記憶することにしました。そして、
かなり基本的なことを学び忘れているようなので、とりあえず関連記事探して独習c++でも逝っときます。
関数にconstをつけるのは本当に知らなかった。メンバ変数にconstをつけるのは
意味なし、くらいに思っていたし。。
関数にconstつけるのは、メンバ変数を変更しない、という意味でいいんですよね?

あと、537が書いてくれたリンクはわかりやすかったんですけど、540の微妙…という
コメントは、どうしてですか?

543Gori:2008/01/10(木) 05:46:34
これら どの様な違いが有るのでしょうか?

Microsoft Visual C++ 6.0 Standard Edition

Microsoft Visual C++ 6 Professional

Microsoft Visual C++ 6.0 Enterpris
544つらいぜ独学: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;
}
の結果を あああああえ になるかと思ってたんですが、
実際は あああああえええええ でした。
これは何ででしょうか?
545デフォルトの名無しさん:2008/01/10(木) 07:05:59
aaa()に入ったら、引数が5でないかぎり
printf(え)を実行するじゃん。引数が5になるまで、
aaa()は5回呼ばれる。
546デフォルトの名無しさん:2008/01/10(木) 08:23:17
>>544
再帰関数の中で、再帰する前の処理をA、自分自身の呼び出しをB、再帰した後の処理をCとすると
その再帰は(ABC)になってるわけだろ。
で、ここのBをまた(ABC)に置き換えて…ってのを5回(4回か?数えるのメンドクセ。)やって
最後のときはBを消すって形で終わってるから最終的な形としては
(AAAAACCCCC)になる。
547536:2008/01/10(木) 10:25:10
>>539
そうそう、間違えた。訂正感謝。

>>542
微妙。まともじゃない解説をしているサイトも検索されるから。
548デフォルトの名無しさん:2008/01/10(木) 12:11:58
// ABase.h
class 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の定義が必要という状態になってしまい、困っています。
こういった循環参照を避ける手法はないでしょうか?
549デフォルトの名無しさん:2008/01/10(木) 12:17:13
質問させてください。
C++言語で
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でも同じでした。
改行が多すぎるとエラーが出たのでみずらくてすいません。
550デフォルトの名無しさん:2008/01/10(木) 12:47:53
>>548
これでどうかなぁ
でもかなり無理矢理な感

// 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
551デフォルトの名無しさん:2008/01/10(木) 12:54:24
>>549
void*を元と異なるクラスにキャストしてるのが原因かと

>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*を保持)
552548:2008/01/10(木) 13:17:57
>>550
レスthx

しかし、できれば書きたくないコードですね。
設計を見直した方がいいのかなぁ。
553デフォルトの名無しさん:2008/01/10(木) 13:47:15
>>552
こういう風にしてみるとか

// 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"
554デフォルトの名無しさん:2008/01/10(木) 14:38:23
標準偏差を求める計算式はどのようにしたらいいでしょうか?
555デフォルトの名無しさん:2008/01/10(木) 14:43:15
ググレカス
556デフォルトの名無しさん: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の定義を公開して
キャストするしかないのでしょうか?

説明不足で申し訳ありませんでした。
557デフォルトの名無しさん:2008/01/10(木) 15:24:17
>>556
callbackAを呼ぶときは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();
}
とか
558デフォルトの名無しさん:2008/01/10(木) 15:24:55
cでは変数のアドレスを表示するときに
printf("%p", i);
とかやってましたが、これをcout <<
でやるにはどうすればよいでしょうか?
559デフォルトの名無しさん:2008/01/10(木) 15:34:09
>>558
basic_ostream& operator<<(const void*)
が定義されてるから、
cout << static_cast<void*>(i);
だな。
560デフォルトの名無しさん:2008/01/10(木) 16:04:19
>>559
ありがとうス。実際は
void func(T& a)
{
cout << static_cast<void *>(&x);
...
}
としました。
561デフォルトの名無しさん:2008/01/10(木) 16:13:28
うわ、ありえねぇ。
562デフォルトの名無しさん:2008/01/10(木) 16:59:17
変数xが1〜6の間ならって表現したいなら
if(1<=x<=6){

でいいのでしょうか?間違ってるなら正しい方法おしえてください・・
563デフォルトの名無しさん:2008/01/10(木) 17:02:36
if (1 <= x && x <=6) {
564デフォルトの名無しさん:2008/01/10(木) 17:35:21
if (x >= 1 && x <= 6) ;
565デフォルトの名無しさん:2008/01/10(木) 17:48:21
switch (x) { case 1: case 2: case 3: case 4: case 5: case 6:
566デフォルトの名無しさん:2008/01/10(木) 17:53:14
>>565
xが整数じゃない場合もそれでOKなんですね? ありがとうございました。
これで課題が終わりそうです。
567562:2008/01/10(木) 17:54:27
ありがとうございます、そのふたつはどっちでもいいんでしょうか?
568デフォルトの名無しさん:2008/01/10(木) 17:59:25
1が前になったのは、質問者のをそのままコピーしたからだけど
別にどっちでもいい。
569デフォルトの名無しさん:2008/01/10(木) 18:43:51
>>566
いいわけねーだろバーカチョーン
570デフォルトの名無しさん:2008/01/10(木) 18:50:12
>>566は明らかに嫌味で言ってると思う。
571デフォルトの名無しさん:2008/01/10(木) 20:36:58
初心者です。
VisualC++ win32API
で、質問なんですが
VisualStudioでプログラムを実行したらちゃんと動くのに
exeファイルをクリックして実行するとフリーズしたりするのはなぜなんでしょうか?
572448:2008/01/10(木) 20:42:18
きたーーーーーー
解決しました。
コンソールアプリ→WINDOWSアプリに設定を変えるタイミングが悪かったみたいです。。
申し訳ありませんでした
あと>>456でもらったソースを貼り付ける必要がありました。
とにかく、おかげさまで先へ進めました。レスくれた人たち、まじでありがとうございます。
573デフォルトの名無しさん:2008/01/10(木) 20:43:16
>>571
お前の書いたプログラムにバグがあるからだろうと思う
574デフォルトの名無しさん:2008/01/10(木) 22:17:05
C言語に限ったことではないのですが、浮動小数点の変数で
float f = 1.0f
とすると、その変数型の可能な限り、1.000....となるのでしょうか
それとも小数点第2位以下は不定となるのでしょうか
575デフォルトの名無しさん:2008/01/10(木) 22:19:44
>>574
精度の範囲で1.000...
ってちゃんとしてくれるよ1.0に関してはな!
576デフォルトの名無しさん:2008/01/10(木) 22:22:49
早い返答ありがとうございます。
どういう場合に、まずいことが起こるんでしょう?
サンプルコードを見ると、1.fなどはほとんど無く1.0fという数字ばかりなのですが、
もしかして関係してるのでしょうか。
577デフォルトの名無しさん:2008/01/10(木) 22:31:08
0.1 とか2進数で無限小数になるから途中で打ち切られる。

1.f と 1.0f に特に違いは無いが、
言語によっては . で終われない場合もあるので
1.0f で慣れておいた方が良さげ。
578562:2008/01/10(木) 22:39:57
すみません、1〜6のときあああって出力して、6〜10ならいいいって出力、それ以外はうううって
出すのってこれでいいんですよね?なんかコンパイルするとエラーがでてしまうのですが・・
void aa(){
if (1 <= x && x <=6) {
printf("あああ\n");
}
else if(6 < x && x <=10){
printf("いいい\n");
}
else{
printf("ううう\n");
}
}
579デフォルトの名無しさん:2008/01/10(木) 22:42:09
x って何?
580デフォルトの名無しさん:2008/01/10(木) 22:42:57
xを定義しなさい
581デフォルトの名無しさん:2008/01/10(木) 22:47:23
int x =0;とかを2行目にいれればいいんですか?
582デフォルトの名無しさん:2008/01/10(木) 22:50:02
>>578
> なんかコンパイルするとエラーがでてしまうのですが・・
これは「何かが起こったんですが、これは何でしょう?」って言ってるのと同じだ。
ちゃんと質問しろ。
583デフォルトの名無しさん:2008/01/10(木) 22:50:27
x をどうやって指定するかを考えれば自ずと分かる
584デフォルトの名無しさん:2008/01/10(木) 22:51:58
何をしたいプログラムなんだ?
int x =0;とか入れればエラーは消えるが ううう しか出んプログラムになるぞ。
入力した数値や計算結果を使って出力を変えたいんじゃないのか?
585デフォルトの名無しさん:2008/01/10(木) 22:54:53
数字の定義は外部というか、プログラムの前の部分でしてあるはずなんです。
二人でやる課題で、xを定義とか入力に応じて帰るとかその辺は違う人がやるので・・
586デフォルトの名無しさん:2008/01/10(木) 22:56:54
>>585
どっちにしろ、関数aa()にxを入れなきゃ駄目だろ。
587デフォルトの名無しさん:2008/01/10(木) 22:59:14
外部、例えばmain関数でxが定義されていても、その関数からxを直接参照することはできない。
教科書でローカル変数とかグローバル変数とか調べて見れ。
588デフォルトの名無しさん:2008/01/10(木) 23:12:47
ええ、そうなんですか・・・
外部のxを読み込めみたいな命令ってどうやるんでしょうか・・
589デフォルトの名無しさん:2008/01/10(木) 23:13:45
>>588
いいから教科書で勉強しなおすんだwwwwwww

引数とかグローバル変数とか分からないの?
590デフォルトの名無しさん:2008/01/10(木) 23:16:34
お前は一生1から10まで人に聞いてすごすつもりかw
関数を勉強する最初の授業で習うようなことなんだから、ノートを見直して来い。
ノート取ってないなら教科書の関数のページ開いて嫁。
591デフォルトの名無しさん:2008/01/10(木) 23:25:19
教科書は一応あるけど何を言ってるのかよくわからないです。
外部の変数どう読み込むかって書いてないような・・
592デフォルトの名無しさん:2008/01/10(木) 23:40:36
そうだ、諦めよう!
593デフォルトの名無しさん:2008/01/10(木) 23:47:01
>>591
ITMediaの記事で
ジャストのおっさんが

人に聞くのがコミュニケーション能力かつ
正しい成長方法だっていったぞボケ
594デフォルトの名無しさん:2008/01/10(木) 23:51:30
warata
全く勉強しないで終わらせる気なのか?
595デフォルトの名無しさん:2008/01/10(木) 23:53:23
void aa(){
extern int x;
if (1 <= x && x <=6) {
printf("あああ\n");
}
else if(6 < x && x <=10){
printf("いいい\n");
}
else{
printf("ううう\n");
}
}
596デフォルトの名無しさん:2008/01/10(木) 23:55:13
>>593
聞いた事を元に、それなりに自分で考える時間も取らないと身に付かん。
597デフォルトの名無しさん:2008/01/11(金) 00:11:54
ありがとうございます。そんなコマンドあったのですね・・・
ご迷惑おかけしました
598デフォルトの名無しさん:2008/01/11(金) 00:23:25
formが出たときに何ができるのか分からないです。

OS:windowsXP
599デフォルトの名無しさん:2008/01/11(金) 00:39:42
エスパー様、>>598がお呼びです。
600デフォルトの名無しさん:2008/01/11(金) 00:59:14
自分で試せばいいのかもしれないですが、その力がないですorz
正確な測定方法でも良いのでご教示ください

Cとなんでもよいのですが、例えばC#やVB
ある文字列の中身の特定文字列を検索する場合だとします。
AEFASDEAEASDDという文字列があった中でDEAを検索する場合
Cならばまず文字列内を一文字ずつループでDを検索し、見つかればその直後にE、その直後にAと探していき
発見することができますが、C#やVBでは文字列の検索機能(メソッド?)があります

一見ループと条件分岐とメソッドの呼び出しになるのでどうしても前者がはやいとは思えません
ですが実際は前者がはやいのでしょうか?
601デフォルトの名無しさん:2008/01/11(金) 01:02:33
strstrでも使っとけ
602デフォルトの名無しさん:2008/01/11(金) 01:02:57
メソッドの方が多分ネイティブルーチン呼んでるから速いと思う。
603デフォルトの名無しさん:2008/01/11(金) 01:04:44
>>600
何故そう思うのですか?
或いは、何故Cならば検索する関数がないと思うのですか?
604デフォルトの名無しさん:2008/01/11(金) 01:05:05
>>602
んなこたーない。
605デフォルトの名無しさん:2008/01/11(金) 01:08:08
ああ、C と C# の比較か。
それなら C が速いんでないかい。
606デフォルトの名無しさん:2008/01/11(金) 01:08:13
>>604
お前の頭の悪さと
醜悪な固定観念にワロタw
607604:2008/01/11(金) 01:10:08
>>606
正解は、「一概には言えない」となる。
従って、「メソッドの方が云々」なんてくだらない思い込みに対しては「んなこたーない」で充分。
608デフォルトの名無しさん:2008/01/11(金) 01:11:29
そういう事を言えるのは、一概には言えないことを確かめてからだな。
609デフォルトの名無しさん:2008/01/11(金) 01:11:39
>>599
C++buridaの話なんですけど
フォトショをつなげると何かあるんでしょうか。
610デフォルトの名無しさん:2008/01/11(金) 01:12:05
C++ぶりだ?
611デフォルトの名無しさん:2008/01/11(金) 01:12:06
文字の検索アルゴリズムはちょっと面白い。興味があったら色々調べて見なさい。
612デフォルトの名無しさん:2008/01/11(金) 01:13:13
BM法と単純検索以外なんもねーだろ
あとはつまんねー長たらしい正規表現か

613デフォルトの名無しさん:2008/01/11(金) 01:13:43
KMP とかもあるお
614デフォルトの名無しさん:2008/01/11(金) 01:17:32
>>609
エスパー求む!
615デフォルトの名無しさん:2008/01/11(金) 01:19:39
僕に合った良い病院はないでしょうか。
616デフォルトの名無しさん:2008/01/11(金) 02:16:32
>>585
二人でやる課題なのに、各自の担当部分のインタフェース(データの受け渡し方法)を取り決めないのか?
それじゃ仮に君がC/C++の文法を理解していたとしても無理だ。
617デフォルトの名無しさん:2008/01/11(金) 02:25:59
>>609
正直な話、あんたが何を言っているか本気でわからん。
「C++burida」でググってみたらTOPに「ダイコンの豆知識」がでてきたぞ。
PhotoShopをつなげるというのも意味不明、何につなげるんだ?
そもそもPhotoShopはソフトウェアの名称で、つなげるという動詞を使うことは中々無いと思う。
>>598時点でのformに関してもあまりにも抽象的な単語で何を意味しているか不明。

順番に端折らずに、お前の聞きたいことを丁寧に書き込むんだ。
すれ違いならエロい人が誘導してくれる。
618デフォルトの名無しさん:2008/01/11(金) 03:07:11
大根に危うく吹きそうになった。そんなもん調べんなw
619デフォルトの名無しさん:2008/01/11(金) 03:18:16
プログラマ的に言うとPhotoShopなんてソフトウェアはない
620デフォルトの名無しさん:2008/01/11(金) 03:27:41
>>619
はいはい
621デフォルトの名無しさん:2008/01/11(金) 03:28:53
鰤大根かw
622デフォルトの名無しさん:2008/01/11(金) 03:47:27
そういえばこの冬はまだ一度も作ってないな。
623デフォルトの名無しさん:2008/01/11(金) 04:05:52
>>617
C++BuilderとFormはまあ判った。
フォトショとは何なのか(Photoshopとしても何の関係があるのか)判らん。

もちろん、何を質問しているのかなど全然判らん。
624デフォルトの名無しさん:2008/01/11(金) 08:06:56
CorelDRAWはVBAで制御できたよ('(゚∀゚∩

今のバージョンは知らんが
625デフォルトの名無しさん:2008/01/11(金) 12:33:03
STLの中で、make_heap()などのヒープ関連のアルゴリズムの
意味がわかりません。適当なコンテナにmake_heap(begin,end)すると、
先頭に一番大きい要素がくる、それだけなんですよね?
それじゃあ、make_heap()とか、存在している意義がないような。
626デフォルトの名無しさん:2008/01/11(金) 13:08:25
>625
「それだけ」ではないです。ヒープというデータ構造について調べてみるといいよ。
627デフォルトの名無しさん:2008/01/11(金) 13:51:39
>>626
調べてみると、
ヒープというデータ構造は、データの中から最大(最小)値を取り出すのに
いいということがわかりました。

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)
...
で、ヒープソート相当のことをできるんですね。

でも自分では使いそうにないなあ。
628デフォルトの名無しさん:2008/01/11(金) 14:17:30
STLのlistでコンテナの入れ替え(コンテナの中身ではない)を
する方法ってありますか?
629デフォルトの名無しさん:2008/01/11(金) 14:24:57
>>628
その「コンテナの入れ替え」を定義してください。
630デフォルトの名無しさん:2008/01/11(金) 14:32:04
型の違うもの同士の比較について教えてください。
structure_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型ではないのでどのように比較処理をすればいいのかわかりません。
どのように比較すればいいのでしょうか。もしよろしければ教えてください。
631デフォルトの名無しさん:2008/01/11(金) 14:39:38
if(strncmp(c,card_idm,strlen(c)){
hogehoge;
}
632デフォルトの名無しさん:2008/01/11(金) 14:42:43
>>630
一年諦めて、まともにCを勉強してから卒研に取り組んだら?
fgets()の使い方が阿呆すぎて話にならないんだけど。
633デフォルトの名無しさん:2008/01/11(金) 14:55:14
ポインタもまったく理解できてないな
634デフォルトの名無しさん:2008/01/11(金) 15:15:15
>>628
swapのことか?ならSTLコンテナ全て持ってる。
635デフォルトの名無しさん:2008/01/11(金) 15:37:11
>>629
コンテナの連結状態を変えたいんです

>>634
swapだと中身のコピーによる値の入れ替えになるんじゃないでしょうか?

例えばlistのコンテナが 1,2,3,4,5 と繋がってる場合に、3,4,5 を切り離して、
1と2の間に挿入し、1,4,5,6,2 という形にしたい場合に、中身の入れ替えでは
なく、コンテナの連結先のみを書き換えることで行う方法が無いかを知りたい
のですが。
636デフォルトの名無しさん:2008/01/11(金) 15:40:09
訂正
1,4,5,6,2 ではなく、1,3,4,5,2
637デフォルトの名無しさん:2008/01/11(金) 15:47:00
>>635
splice
638デフォルトの名無しさん:2008/01/11(金) 16:02:13
>>635
ならspliceメンバー関数だな
639デフォルトの名無しさん:2008/01/11(金) 16:04:20
現在VS2008のC++でコンソールアプリケーションを弄っていますが、
_beginthreadexでルーチンを呼び出してもメインスレッドで処理されてしまいます。
どなたかお助けくらさい。。。
640デフォルトの名無しさん:2008/01/11(金) 16:06:25
普通はそうならないので、ソース見せてよ
641デフォルトの名無しさん:2008/01/11(金) 16:26:11
>>640
ありがとうございます。
っと思ったらちゃんと別スレッドで処理されてました。
スレッドの他殺のテストをしてたのですが、アホな事をしてました・・・orz
642デフォルトの名無しさん:2008/01/11(金) 16:35:21
>スレッドの他殺

あんまりやらない方が・・・
ロック握ったまま死んじゃったりとか、
ファイル開いたまま死んじゃったりとか、
メモリ確保したまま死んじゃったりとか、
相当気をつけないとろくでもないことになりがち
643デフォルトの名無しさん:2008/01/11(金) 16:37:59
Visual Studioでゲームを作っています。
ビルドはできるのに何故かデバッグが実行できません。
エラー報告ウィンドウが出てきて強制終了;
このような場合にはどういった問題が考えられますか?
644デフォルトの名無しさん:2008/01/11(金) 16:42:35
デバッグが実行できないってのはどういう状態?
VisualStudio自体が落ちるとかそういうこと?
645デフォルトの名無しさん:2008/01/11(金) 16:51:20
ビルドはできるのですが、デバッグ開始を始めると枠だけ出てきて止まります。
「問題が発生したため終了します」という枠が出てきてエラーを報告するか否かをきいてくるんです。
報告しなくてもしても結局ゲーム自体は動きません・・・

説明下手ですいません;
646デフォルトの名無しさん:2008/01/11(金) 16:52:21
645追記>VisualStudio自体は落ちません!
647デフォルトの名無しさん:2008/01/11(金) 17:09:35
>>637,638
それでした!ありがとうございます
648デフォルトの名無しさん:2008/01/11(金) 17:14:18
>>627
調べ直せw
649デフォルトの名無しさん:2008/01/11(金) 17:23:56
template <typename T>
void func(const T& x)
{
//省略
}

という関数テンプレートを以下のように呼び出した
場合、

func("Hello");

xの型が char[6]になるのですが、何故 const char*& とならない
のでしょうか? "Hello" の型は明らかにconst char*のはずですが。
650デフォルトの名無しさん: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&)'

651デフォルトの名無しさん:2008/01/11(金) 17:43:36
うちの環境でそのままコピペしてgccに食わせたら、

(環境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

となった。
652デフォルトの名無しさん:2008/01/11(金) 17:44:27
>>645
それって単にプログラムにバグがあるだけなんじゃ?
デバッグじゃなければ動くのか?
653デフォルトの名無しさん:2008/01/11(金) 18:02:26
>>650
たぶんこう
typename result_type operator()(typename argument_type i) {
return (typename result_type) !(i % 2);
}
654デフォルトの名無しさん:2008/01/11(金) 18:09:17
>>649
>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] です
655デフォルトの名無しさん:2008/01/11(金) 18:28:28
class   Hoge{        
public:             
    template <typename T> 
    Hoge(){         
        //処理     
    }            
};               


としたときに、Hogeを実体化できません。

Hoge hoge; //当然ダメ
Hoge<int> hoge; //クラステンプレートと看做されてダメ
どうすれば実体化できるのでしょうか。

そもそもこれは合法ですか?
656デフォルトの名無しさん:2008/01/11(金) 18:29:29
>>654
なるほど。そういう仕様なんですね。てっきり文字列リテラルは
const char*だと思っていました。

では、
template <typename T>
void func(T x)
{
//省略
}

という関数テンプレートを以下のように呼び出した
場合、

func("Hello");

xはconst char*になるのですが、この場合は、const char[6]
ではないのでしょうか?これは通常の関数に配列を渡したときは
配列の先頭要素へのポインタになるのと同じ理屈でしょうか?
657デフォルトの名無しさん:2008/01/11(金) 18:41:48
>>656
void func(const char x[6])
と書くのが
void func(const char *x)
と同じだから、じゃないかなぁ
658656:2008/01/11(金) 18:47:20
Cや古いC++では文字列リテラルはchar*だったそうです。
今の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]


659デフォルトの名無しさん:2008/01/11(金) 18:49:45
>>657
そうですね。Cでも関数へ配列を渡すときは、要素へのポインタに
なりますからね。
660デフォルトの名無しさん:2008/01/11(金) 18:52:39
C++相談室 part60
http://pc11.2ch.net/test/read.cgi/tech/1200044614/

立てたから後は頼む
661デフォルトの名無しさん:2008/01/11(金) 22:53:45
C言語でなんですけど、いま4つの数と四則演算を使って10を作るというプログラムを作っています。
()は使用しません。
http://f4.aaa.livedoor.jp/~pointc/log302.html
ここを参考に作成していたのですが、うまく()をはずすやり方がわかりません。

(1+2)+(3+4), 1+(2+3)+4をひとつとしてカウントする方法です。

何かヒントをいただけませんか?
662デフォルトの名無しさん:2008/01/11(金) 23:08:49
>>661
そういうのは、逆ポーランド記法が有名じゃないか。
http://oshiete1.goo.ne.jp/qa2581924.html
http://smdn.invisiblefulmoon.net/ikimasshoy/cpp/polish.html
663デフォルトの名無しさん:2008/01/11(金) 23:49:07
>>662
なるほど!
逆ポーランド記法をつかってがんばってみます
664デフォルトの名無しさん: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] その他の制限: 関数を使うところまで
665デフォルトの名無しさん:2008/01/12(土) 00:14:40
>>664
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
http://pc11.2ch.net/test/read.cgi/tech/1197132472/
666デフォルトの名無しさん:2008/01/12(土) 00:15:36
期限が休日って・・・。
667デフォルトの名無しさん:2008/01/12(土) 00:16:47
スレ古いのと間違えたけどまぁいいか
668デフォルトの名無しさん:2008/01/12(土) 00:20:19
>>665
すみません、そっちにいきます。
669デフォルトの名無しさん:2008/01/12(土) 00:25:28
int* p = new int;
int& r = *p;
delete &r;

これっておk?
670デフォルトの名無しさん:2008/01/12(土) 00:26:29
おk
671デフォルトの名無しさん:2008/01/12(土) 00:29:06
>>669
文法的にはOK。動作もする。でも、嫌い。
可読性を下げる下手なコーディングはやめれ
672デフォルトの名無しさん:2008/01/12(土) 00:31:39
フォトショップとC++Builder 6は関係ないんですかね。
673699:2008/01/12(土) 00:32:45
サンクス
普段のコードで書こうとしているわけじゃないから大丈夫です
674デフォルトの名無しさん:2008/01/12(土) 00:38:20
>>672
>>598か?
どういう関係の話をしているんだ?PhotShopとC++Builderで結びつく内容はぱっとは浮かばん。
無理やりひねり出せばPhotoShopでいじった画像ファイルを管理するツールをC++Builderで作るとかか?
675デフォルトの名無しさん:2008/01/12(土) 00:59:50
文字列に数字入力して、それを一桁ずつ配列にいれる

ってどうやれば?
さっぱり
676デフォルトの名無しさん:2008/01/12(土) 01:09:39
char str[] = "1234567890";
int num[ 100 ] = { 0 };
for ( int i = 0; str[i] != '\0'; i++) {
num[ i ] = str[ i ] - '0';
}
677デフォルトの名無しさん:2008/01/12(土) 01:14:34
それやってること逆じゃない?
678デフォルトの名無しさん:2008/01/12(土) 01:17:48
逆も何も指定されてなくね?まぁ逆にしたいならこんな感じか?
num[ strlen( str ) - i - 1 ] = str[ i ] - '0';
679デフォルトの名無しさん:2008/01/12(土) 01:18:28
>>677
おまえはなにをいっているんだ?
680675:2008/01/12(土) 01:22:00
ありがとうございます!
681デフォルトの名無しさん:2008/01/12(土) 01:25:27
俺は>>677をエスパーした。でもやっぱ>>676でOKだと思うんだ。

char str[100] = { 0 };
int num = 1234567890
for ( int i = 0; num > 0; i++, num /= 10 ) {
str[ i ] = num % 10 + '0';
}
682675:2008/01/12(土) 01:26:07
>>676
それ2つ使って和とかって出せますかね?
683デフォルトの名無しさん:2008/01/12(土) 01:40:36
>>682
さすがにそれくらいがんばれよw
684675:2008/01/12(土) 02:02:19
よしがんばります(・_゚)
685デフォルトの名無しさん:2008/01/12(土) 02:53:18
>>662
逆ポーランド記法つかったらできました!
ありがとうございます!
686デフォルトの名無しさん:2008/01/12(土) 11:39:20
2次元配列で、例えば
int a[][] = { {1,2} , {3,4} };
とすると添え字がないといわれて怒られてしまいます
1次元配列では宣言と初期化が同時であれば要素数の指定は不要だった気がするのですが
2次元以上では必要となるのが仕様なのでしょうか?
687デフォルトの名無しさん:2008/01/12(土) 11:47:28
うん
688デフォルトの名無しさん:2008/01/12(土) 11:57:14
>>651,653
ありがとうございます。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>にしてみるとか、

689デフォルトの名無しさん:2008/01/12(土) 11:58:35
>>686
添字なしでよい[]は一番左の1個だけだったと思う。
690デフォルトの名無しさん:2008/01/12(土) 12:09:29
Yes. 残念ながら仕様です。
691686:2008/01/12(土) 12:11:57
レスありがとうございます
なるほど、仕様だったんですね
692デフォルトの名無しさん:2008/01/12(土) 12:55:28
650です。
以下のようにしたらコンパイル通りました。
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;
}
693デフォルトの名無しさん:2008/01/12(土) 12:57:10
650です。試して欲しいソースです。

#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;
}
694デフォルトの名無しさん:2008/01/12(土) 13:26:49
650です。
勝手なこと言ってすいません。VisualC++2005で自分でやってみます。
695デフォルトの名無しさん:2008/01/12(土) 14:06:00
まあ、もちつけ
696デフォルトの名無しさん:2008/01/12(土) 15:24:40
遅レスすみません549です。
解決したので報告しておきます。

>>557
レスありがとう御座います。

>callbackAを呼ぶときはpにはA*をvoid*にしたものを渡せばいいし
>callbackBを呼ぶときはpにはB*をvoid*にしたものを渡せばいいが

「callbackはライブラリ側から呼ばれるので、引数の内容は変更できない」というのを言い忘れていました。
申し訳ありません。

>どうしてもpにはD*を渡したいけどDは公開できないというのはわりと無理め
やはり無理ですか(汗

>class Z {
>virtual void dummy(){}
>};
>みたいなダミーを用意して

なるほど。そういう手もあるんですね。
勉強になりました。ありがとうございます。

結局、AとBのメソッドを一つのインターフェイスに変更して、
多重継承でなく、単一継承にすることで解決することにしました。

丁寧な回答をして頂き、大変助かりました。
ありがとうございました。
697デフォルトの名無しさん: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()) {
(省略:適当な入れ物に格納)
}
698デフォルトの名無しさん:2008/01/12(土) 15:40:26
>>697
freopen()のような事をしたいのか?
699デフォルトの名無しさん:2008/01/12(土) 15:42:43
だいたいifstreamクラスはistreamクラスを継承しているので
istreamはダウンキャストの方向になるぞ。
700デフォルトの名無しさん:2008/01/12(土) 15:47:41
ファイルを開く処理が istringstream にないのだから、
istream のレベルで open できないのは当たり前だと思うが。
701デフォルトの名無しさん:2008/01/12(土) 15:49:12
>>697です
即レスサンクスです
>>698
freopenが、正確にどの様なものか分からないのですが
ようは、ファイルを開いて、一行バッファーに読みこんで、コンテナでにほうりこみたいんですが
>>699
漏れもそう思ったんだけど、More Effective C++の中途半端な実装が
殆どファイル処理に関しては、引数が istream& dataSourceってな風に書いてあるんで
気になったしだいです
702デフォルトの名無しさん:2008/01/12(土) 15:51:55
istream& を使ってるということは、共通処理の部分なはずなのに、
open を使うという非共通処理を実行しようとしている時点で少し変。
ただ、やむを得ない場合もあるから、そういう時はダウンキャストするしかない。
703デフォルトの名無しさん:2008/01/12(土) 15:57:27
例えば、こんな実装が載っているんですが
このまんま、実装しても当然動かない訳で、こちらで、読解しながら
実装しているんですが、こんな場合、
この関数に、ファイルのオブジェクトを渡して処理する場合、具体的に
どうしたらいいのでしょうか?

void ALA::proccesAdaption( istream& dataSource )
{
while( dataSource ) {
ALA* pa = readALA( dataSource );
pa->proccesAdaption();
delete pa;
}
}
704デフォルトの名無しさん:2008/01/12(土) 16:02:30
>>783
istreamはifstreamの下位クラスだから、どこか外でopenした
ifstreamのオブジェクトをそのまま渡せばよい。
705デフォルトの名無しさん:2008/01/12(土) 16:06:42
あ、ごめん

×下位クラス
○上位クラス

だわ。
706デフォルトの名無しさん:2008/01/12(土) 16:06:52
>>704
どうもありがとう
707デフォルトの名無しさん: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()内で値を変更するには間接参照「*」がいると思うのですが…。
708デフォルトの名無しさん:2008/01/12(土) 17:01:25
>>707
num[0]と*numは同じ意味だから。
709デフォルトの名無しさん:2008/01/12(土) 17:01:42
>>707
*( num + 3 ) = 3とnum[ 3 ] = 3は同じことをしている。
710デフォルトの名無しさん:2008/01/12(土) 17:01:58
>>707
[ ]には*の効果がある。
a[3]は*(a+3)と書くのと同じこと
711デフォルトの名無しさん:2008/01/12(土) 17:06:42
int main(void)
{
  int a[3] = {0,1,2}
  func(a);
}

このaってのは配列の先頭アドレスで、a[i]の形で値を代入できるよな?
numも全く同じ操作をしている。
712デフォルトの名無しさん:2008/01/12(土) 17:21:58
>>708-711
おまえら仲良しさんだな
713707:2008/01/12(土) 17:22:53
>708-711
お答えありがとうございます。
num[0]と*numの意味が同じことは理解できています。

mainのa[3]の先頭アドレスと、
funcの*numのアドレスは同一なのですね。

なのでfunc内でも、ポインタを意識せずに演算ができる、と。

理解できました。ありがとうございます。
714デフォルトの名無しさん:2008/01/12(土) 17:51:38
ちなみに、VC2005とかでデバッグするときにウォッチウィンドウに
この場合は、 num,3とか入れると、
num[0]からnum[2]までが見れたりするぜ。
71525:2008/01/12(土) 22:40:30
cgar *filename;
filename = argv[1];
if (filename[0] != '-') {
break;
}
っていうソースを見たんですが、
ファイル名が-から始まったら問題が有るのでしょうか?
716デフォルトの名無しさん:2008/01/12(土) 22:42:48
オプションかどうかを判定してるんでねーの?
717デフォルトの名無しさん:2008/01/12(土) 23:05:19
引数がcgar**で渡される処理系ってなんだ。
718デフォルトの名無しさん:2008/01/12(土) 23:06:49
実行ファイル名ってargv[0]じゃなかったっけ?
719デフォルトの名無しさん:2008/01/12(土) 23:08:09
いや、typedef char cgarしているんだよ、きっと。
720デフォルトの名無しさん:2008/01/12(土) 23:08:35
./a.out filename
でしょ。
721デフォルトの名無しさん:2008/01/12(土) 23:08:45
>>718
実行ファイル名って言うか、実行モジュール名な。で、それが何か?
722デフォルトの名無しさん:2008/01/12(土) 23:17:11
皆さん、混乱させてしまって申し訳ないです。
char *filename;
filename = argv[1];
if (filename[0] != '-') {
break;
}

第一引数にファイル名を取って、そのファイルに結果を保存するって感じです。
実はかなり昔どこかで、
C言語ではファイル名に「-」を使えない
って読んだ記憶が有って、このソースを見つけてその記憶がよみがえってきたんです。
でも、そんな訳ないですよねぇ?
723デフォルトの名無しさん:2008/01/12(土) 23:19:29
>C言語ではファイル名に「-」を使えない
んなこたーない。まぁ、>716だろ。Unix系だとそういうプログラムも多いから。
# ちなみに、./-filename とでもすれば回避可能だから余り困らない。
724デフォルトの名無しさん:2008/01/12(土) 23:20:23
宿題スレから再びもどってきました

2つの数値(最大50桁)を文字列として入力させ一桁ずつを配列に入れる

2数の和を出す
(下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる)

これの方法誰か詳しく解説してください、、
725デフォルトの名無しさん:2008/01/12(土) 23:26:21
>>724
int 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;

動作確認はしていない。
たぶんこんな感じで動くだろ。
726デフォルトの名無しさん:2008/01/12(土) 23:41:09
std::numeric_limits<T>::max()

とか書くと、マクロmaxの引数が少ねーぞって言われるんだが、どうすればいいんだろう。
windef.hにマクロのmaxが書かれてるようで、これが邪魔っぽいが…
727デフォルトの名無しさん:2008/01/12(土) 23:46:37
>>726
WindowsC++プログラマの常識
#define NOMINMAX
728デフォルトの名無しさん:2008/01/12(土) 23:48:26
>>722
Unix 系だと通常コマンドオプションは "-x" とか "--string" となるので, "-"
ついた奴はファイル名ではないと判断するための処理ちゃうか?
# x は一文字オプション string は 1文字以上のオプション
# "-"とオプション文字の間に空白が入ってはいけない
ちなみに, 慣習的に "--" だけってのが "オプションの終わり" になってる
729デフォルトの名無しさん:2008/01/13(日) 00:10:06
>>725
ありがとうございます!

sum[ i ] = ( num1[ i ] + num2[ i ] + temp ) % 10;

の% 10 ってなんですか???
730デフォルトの名無しさん:2008/01/13(日) 00:12:06
あまりを求める演算
ex.
10 / 3 = 3 あまり 1
10 % 3 = 1
731デフォルトの名無しさん:2008/01/13(日) 00:53:05
>>718>>721
argv[0]に何が入ってるかは処理系依存と違ったっけ?
大体はOSが解釈した後のコマンド文字列の一節目が入ってると思うんだけど。
732デフォルトの名無しさん:2008/01/13(日) 01:55:57
>>731
プログラムを呼ぶ時に使った名前か、空文字列が入れられる、と定義されている。
733デフォルトの名無しさん:2008/01/13(日) 02:20:46
空文字・・そんなのこともあるのか・・
734デフォルトの名無しさん:2008/01/13(日) 02:21:13
char str[40] =
{ "( ´∀`)" };
(int *)str[48] = (int)str;
ってchar型の配列を用意して、( ´∀`)で初期化。
charの配列をintにキャストして、
その配列のアドレスを、int型のstr配列に代入しているって言う解釈で良い?
735デフォルトの名無しさん:2008/01/13(日) 02:23:55
>>734
両方名前がstrなのは意図したものなのか?
736デフォルトの名無しさん:2008/01/13(日) 02:24:13
左辺のキャストしたらコンパイル通らないことないか
737デフォルトの名無しさん:2008/01/13(日) 02:31:58
だって関数呼び出しにいちいち(void)って付けてるキチガイもいるんだぜ
738デフォルトの名無しさん:2008/01/13(日) 02:33:56
呼び出しにvoidってつけられるのか?
739デフォルトの名無しさん:2008/01/13(日) 02:36:23
>>738
付けてみろよ
何もなかったかのようにコンパイル通るから
740デフォルトの名無しさん:2008/01/13(日) 02:39:27
(void)func(); かあ。
どこかで見た事あるなあこれ。
何かの本だったような
741デフォルトの名無しさん:2008/01/13(日) 02:39:30
>>739
普通に怒られて通らなかったがw
742デフォルトの名無しさん:2008/01/13(日) 02:39:38
>>739
無理だった
関数宣言じゃないの?
743デフォルトの名無しさん:2008/01/13(日) 02:39:54
>>732
JIS 見る限り
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 の起動時などに…
744デフォルトの名無しさん:2008/01/13(日) 02:40:01
>>740
あぁ
745デフォルトの名無しさん:2008/01/13(日) 02:40:17
>>739
Borland C++ 5.5.1だと式の構文エラーって出たんだけど、なにか勘違いしてるんだろうか
746デフォルトの名無しさん:2008/01/13(日) 02:41:16
(void) ってキャスト云々の流れで出てきたのか
747デフォルトの名無しさん:2008/01/13(日) 02:44:05
func(void);かと思った



orz
748デフォルトの名無しさん:2008/01/13(日) 02:46:08
>>746
さぁ…
戻値持つ関数呼び出すときに「戻値を捨てる」って言うコンパイラへの
明示的な指示として導入されたのは記憶にあるが………
749デフォルトの名無しさん:2008/01/13(日) 02:46:22
>>740
Code Quality ~コードリーディングによる非機能特性の識別技法~
この本で見たかな
750デフォルトの名無しさん:2008/01/13(日) 02:47:18
何らかの警告を発する場合の回避のために使うんじゃなかったっけ?
lint とか。
751デフォルトの名無しさん:2008/01/13(日) 02:49:12
>>737
それは今の話と関係ないと思うけど。
今はキャストで右辺値に変換したら代入できんじゃないかという話で。
752デフォルトの名無しさん:2008/01/13(日) 03:05:06
>>751
"問題のあるポインタの変換"とか言われそうじゃね
753デフォルトの名無しさん:2008/01/13(日) 03:07:32
boost::filesystemで相対パスを絶対パスに変換するのって何て名前でしょうか?
754デフォルトの名無しさん:2008/01/13(日) 03:13:00
>>753
OS 依存なんじゃね?
755753:2008/01/13(日) 03:13:57
じゃWinので
756デフォルトの名無しさん:2008/01/13(日) 03:20:25
setjmp, lognjmp が理解できないです。
こんな物が標準ライブラリに有る事すら知りませんでした。
#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の
状態で再度呼び出される?
って理解で良いのでしょうか?
難しい...
757デフォルトの名無しさん:2008/01/13(日) 03:22:24
普通の人は一生使わなくてもいい関数だから
気にしなくていいと思う。
758デフォルトの名無しさん:2008/01/13(日) 03:23:04
>>756
コンパイラが吐いたアセンブリコードが読めればすぐに
理解できるんだけどな

longjmp()をした後はprintf...からスタートするよ
759デフォルトの名無しさん:2008/01/13(日) 03:23:42
int main()
{
ofstream fout;
fout.open("sample001.txt");
if (!fout) {
cout << "出力オープン処理が失敗しています\n";
return 1;
}
return 0;
}

こんな感じの定番なプログラムについてなのですが、
出力オープン処理が失敗する時ってどんな時ですか??
そんなことあるんでしょうか?
760デフォルトの名無しさん:2008/01/13(日) 03:25:48
>>759
FLOPPYやMDでライトプロテクト状態になってるとか
もっとも先にOSのエラーが出そうだが
761デフォルトの名無しさん:2008/01/13(日) 03:26:21
書き込み権限がないとか。
762デフォルトの名無しさん:2008/01/13(日) 03:27:32
>>759
読み取り専用
同名ディレクトリ
ファイル数上限
Device error
など
763759:2008/01/13(日) 03:34:25
なるほど。。ありがとございますm(_ _)m
764デフォルトの名無しさん:2008/01/13(日) 03:41:58
>>756
ちと違う。

setjmp() を呼び出す瞬間の CPU 状態が(スタックポインタ/プログラムカウンタ含めて)
env に保存される。 ただし、戻値を返すレジスタは 0 に設定されるが…

longjmp(1) をやると, env に保存されてた CPU 状態が書き戻されるが,
戻値を戻すレジスターは longjmp の引数 1 に書き換えられる

乱暴な言い方すれば, longjmp はサブルーチンコール無視した goto だ
765デフォルトの名無しさん:2008/01/13(日) 03:45:27
俺は一生使わないだろうな。
766デフォルトの名無しさん:2008/01/13(日) 03:47:59
例外代わりに使う事があるらしいが、
正直こんなの使うよりエラーコードのがマシ。
767デフォルトの名無しさん:2008/01/13(日) 03:49:00
longjmp()やると関数呼び出しの中からの関数呼び出しとかで
スタックにいろいろ積んでいても全部巻き戻される。
768デフォルトの名無しさん:2008/01/13(日) 03:50:01
>>766
事実C++の例外はlongjmp()に似てるな。
でもlongjmp()を使ってもC++の例外は実装できなかったので
cfrontは中止されネイティブコンパイラになったという話。
769756:2008/01/13(日) 03:50:46
>>758
>longjmp()をした後はprintf...からスタートするよ
そうなんですか?
if((val = setjmp(env)) != 0)による条件分岐は行われないんですか?
>>764さんの
>戻値を戻すレジスターは longjmp の引数 1 に書き換えられる
とありますが、longjmpの引数を0にした場合は、
if((val = setjmp(env)) != 0)

x =5に飛ばないんですか?
770デフォルトの名無しさん:2008/01/13(日) 03:53:45
>>769
条件分岐は当然行われるよ。
longjmpの引数を0にしたら x = 5; に飛ぶ。
771デフォルトの名無しさん:2008/01/13(日) 03:58:47
>>770
うそこけ
longjmp() は、0 を返すことは出来ない。
もし、 longjmp() の2番目の引数が 0 として呼ばれたならば、代わりに 1 を返す。
って書いてあるぞ。
772デフォルトの名無しさん:2008/01/13(日) 04:01:39
>>769
> x =5に飛ばないんですか?
飛ぶ.
つか, 本来は大域脱出するために設計されている仕組みだから
普通やらないけどな…

よく使うのが,
簡易言語のパーサとかやってて, リカバー出来ないエラーに遭遇.
途中結果を捨ててもいいから次のファイルの処理はやりたい.
けど, まともに状態戻しながら手順を踏んでもどったら大変.
えぇい! イニシャライズから, やり直してしまえぇ!!!
てな感じの時だ.
773デフォルトの名無しさん:2008/01/13(日) 04:02:20
タスクのステータスは,setjmp と longjmp を使ってコルーチンを処理するのに十分なものです。

longjmp を呼び出す前に,setjmp を呼び出さなければなりません。setjmp を呼び出して jmpb を設定するルーチンは,longjmp が呼び出されるまでアクティブなままでなければならず,戻ることはできません。この状態以外の場合,結果は予想できません。

longjmp は,値 0 を渡すことはできません。retval に 0 を入れて渡すと,longjmp はこれを 1 に置き換えます。

うーんなるほど
774772:2008/01/13(日) 04:04:09
>>771
うげ、0 で返す longjmp 納品してしまったよぉorz
それも, 去年の暮.
775デフォルトの名無しさん:2008/01/13(日) 09:01:45
プロの方々に質問です。
実際のプログラミングで、
cout時に
endlと\nを区別することはありますか?
776デフォルトの名無しさん:2008/01/13(日) 10:21:22
>>775
バッファをフラッシュしたいときだけendl、それ以外は常に'\n'使いますが。
# まさか、標準出力のときだけ別扱いするの?
777デフォルトの名無しさん:2008/01/13(日) 13:50:54
SIZE×SIZEの二次元配列を使いたいとき、
Cだと、
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];
みたいに書くしかないのでしょうか?
778デフォルトの名無しさん:2008/01/13(日) 13:58:59
横幅の情報がないとアクセスできないだろ。
int (*a)[SIZE]= new int[SIZE][SIZE];

普通に、
std::vector<std::vector<int>> a(SIZE, std::vector<int>(SIZE));
とかしとけ。
779デフォルトの名無しさん:2008/01/13(日) 13:59:23
>>777
int **a = malloc(SIZE * SIZE);
a[2][1] = 10;
の時点で間違ってる。
勉強やり直せ。
780デフォルトの名無しさん:2008/01/13(日) 14:09:21
>int **a = malloc(SIZE * SIZE);
>a[2][1] = 10;
>という風に書くのは普通だと思うのですが
いいえ
781デフォルトの名無しさん:2008/01/13(日) 14:30:48
すいません、、、(SIZEはdefineされているとして)
int 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()で代入してました。
(なのでちょっと不便と思ってた)

ありがとうございます。
782デフォルトの名無しさん:2008/01/13(日) 14:38:06
**がおかしいんとちゃう?
783デフォルトの名無しさん:2008/01/13(日) 14:40:21
>>781
>でいいですよね?

いいえ。
784デフォルトの名無しさん:2008/01/13(日) 14:41:04
>>782 なぜ?
785デフォルトの名無しさん:2008/01/13(日) 14:46:14
>>782-783
!!
でも2次元配列として使えてますよ、、、?
786デフォルトの名無しさん:2008/01/13(日) 14:59:42
>>785
使えるし値の出し入れをしてるだけなら問題もおきないだろうが
データの並びというか構造が
int a[2][4]; とか
int (*a)[SIZE]= new int[SIZE][SIZE];

って二次元配列宣言したときのものとは異なる
そこを混同してるっぽいから間違ってる言われてるのかと
787デフォルトの名無しさん:2008/01/13(日) 15:00:56
二次元配列宣言 → 適切じゃありませんすいません
788デフォルトの名無しさん:2008/01/13(日) 15:03:40
>>786
なるほど。
int a[2][4];は8個の連続した領域になっているのに対して、
int (*a)[4] = new int[2][4];は、4個ずつは連続しているが、
2つに別れているかもしれない、ということですよね?

789デフォルトの名無しさん:2008/01/13(日) 15:07:34
・・・
790デフォルトの名無しさん:2008/01/13(日) 15:15:59
やっぱ理解できてないじゃん。
791デフォルトの名無しさん:2008/01/13(日) 15:20:27
1からおさらいする必要性があるな。
792デフォルトの名無しさん:2008/01/13(日) 15:21:30
いや、0(=NULLぽ)からだろ。
793デフォルトの名無しさん:2008/01/13(日) 15:30:53
>>788
違います
int a[2][4]; も int (*a)[4] = new int[2][4]; も
8個連続しています

していないのは
>>781です
794デフォルトの名無しさん:2008/01/13(日) 15:36:18
>>793
int **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]);

ってしたら、連続領域にあるみたいなんですが?
795デフォルトの名無しさん:2008/01/13(日) 15:39:26
>>794
複数スレッド走っていて, i == 0 と i == 1 の間に他のスレッドに
プリエンプションされて, そっちのスレッドがmalloc() かけても
連続していると言い切れるかな?
796デフォルトの名無しさん:2008/01/13(日) 15:43:01
連続になったとしてもそれはたまたま連続になってるだけだし、
こういうこともできるって分かってるよな?

for (i = SIZE - 1; i >= 0; i++) {
b[i] = (int *)malloc(SIZE * sizeof(int));
}
797デフォルトの名無しさん:2008/01/13(日) 15:44:47
- for (i = SIZE - 1; i >= 0; i++) {
+ for (i = SIZE - 1; i >= 0; i--) {
798デフォルトの名無しさん:2008/01/13(日) 15:47:16
コピペ怖い
799デフォルトの名無しさん:2008/01/13(日) 15:52:47
>>794
連続領域にしたければmallocは1回にしなきゃ無理だ。
2次元のように扱いたいならマクロでも作れ。
#defeine ARRAY_ACCESS( arrya, x, y ) arrya[ x * SIZE + y ]
800デフォルトの名無しさん:2008/01/13(日) 15:54:01
781です。
>>796
わかってます。
ということは、788に書いたことはやっぱり正しいのですよね?

801デフォルトの名無しさん:2008/01/13(日) 15:58:09
802デフォルトの名無しさん:2008/01/13(日) 16:00:12
>>800
[]も演算子なんだ。ポインタをずらした部分にアクセスするための演算子。
ってことは何次元であろうと連続した領域じゃなくちゃ困る。
2次元以上の場合[ x ][ y ]とした場合、実際には「x * SIZE + y」ずらせばOKだけど
ここでSIZEをどこから持ってくるかが問題。
>>799のように自前で作成するかint (*a)[4]のように無理やり教えるか
803デフォルトの名無しさん:2008/01/13(日) 16:01:23
もういいです。
あなた達みたいな低脳に聞いたのが間違いでした。
804デフォルトの名無しさん:2008/01/13(日) 16:03:10
初めまして。これから始めてプログラミングに触れようとしている者です。
そこで質問なのですが、初心者ならこれがお勧めというコンパイラはありますでしょうか?
エディタはサクラを使う予定です。どうかご教授お願いします。
805デフォルトの名無しさん:2008/01/13(日) 16:07:19
>>804
gccがお勧めです。
806デフォルトの名無しさん:2008/01/13(日) 16:07:58
>>804
Windowsでいいよな。個人的にはVCだけどbcc推す人も多いかな?
807デフォルトの名無しさん:2008/01/13(日) 16:10:27
そうか、Windowsだったのか。という事は、サクラというのはサクラエディタのことなんだね。
808デフォルトの名無しさん:2008/01/13(日) 16:10:38
>>804
GCC(MinGW)かVC++
809デフォルトの名無しさん:2008/01/13(日) 16:27:23
>>802
そうか。。。。。
自分は、
malloc()を複数回使って (int **a;と宣言した上で)int a[9][9]を確保したとき、
a[1][2]と書くと、a[1]のポインタが指しているメモリ位置(xとする)があって、
その先頭からintの2個分あとの位置にアクセスする、という理解でした。
(つまりx[2])。
上記の理解のように動作させようとすると、(a[1])[2]としても駄目ですか?
810デフォルトの名無しさん:2008/01/13(日) 16:28:56
781です。
ちなみに803は自分のコメントではありません。
811デフォルトの名無しさん:2008/01/13(日) 16:36:57
>>809
a[1][2]が示す先は
「ポインタ配列の2番目の要素a[1]が示すアドレスを先頭とする領域」の
「3番目の要素[2]」となる。

上記解釈なら問題ない。
812デフォルトの名無しさん:2008/01/13(日) 16:40:56
じゃあまとめということで。

int 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;
}
なら問題はないということでいいですよね?
813デフォルトの名無しさん:2008/01/13(日) 16:48:09
今(a[2])[1]とa[2][1]の両方のソースをgccでコンパイルしたけど、
バイナリは全く同じでした。やっぱり何か間違ってるのかな。
アセンブラをみればいいんだろうけど、でもなんかいやだ。。。
はあ
814デフォルトの名無しさん:2008/01/13(日) 16:53:35
理解としてはだめだろ

>>781
>>812
二つはまったく一緒だぞw

int (*a)[SIZE] = malloc(SIZE * SIZE * sizeof(int));

>>781
の違いは分かるか?
815デフォルトの名無しさん:2008/01/13(日) 16:54:15
>>812
>>781もだが、ちゃんとfree()を記述しよう。
816デフォルトの名無しさん:2008/01/13(日) 16:58:34
>>812
SIZE×SIZEの領域のメモリは連続していないが、
二次元配列のように使えるという点ではOK
あと、a[2][1]=10 と書けばよい。
817デフォルトの名無しさん:2008/01/13(日) 17:06:57
>>776
バッファをフラッシュしたいときだけendl、それ以外は常に'\n'使いますが。
# まさか、標準出力のときだけ別扱いするの?
 
ありがとうございます。
返信が遅くなりすいません。
 
質問の背景は以下のとおりです。
・初心者の私の読んでいる、ある本(以後本A)では、\nを使っている
・本の著者のHPに私と同じ質問があってそこには確かに
 バッファをフラッシュしたいときだけendlで十分とある
・一方、他の本やHPなどではendlが多い(考えた上でのことか?)
・本Aに戻って、文字列の解説部分に、
 「同一綴りの文字リテラルがプログラム中に複数ある場合、
 (記憶域上)それらを同一として扱う処理系と、
 別個として扱う処理系がある。
 後者の場合、"\n"がプログラム中n個あれば合計2nバイトを占有する」
 と書いてある。
 
そこでプロのみなさんはどうしているのかな、
と思って質問させていただきました。
(つづく)
818デフォルトの名無しさん:2008/01/13(日) 17:07:42
すいません、再度細かく聞かせてください(他の方もお願いします)
・VC++は、同一文字リテラルをどのように扱うのでしょうか。
 (記憶域上、同一か別個か)
・だいたい、endlで行うバッファフラッシュのバッファとは
 なんなのでしょうか。CPU内部のCacheですか?
 (「# まさか、標準出力のときだけ別扱いするの?」
 というお話からして、標準出力とファイル出力で
 違うのでしょうか?どういうマシン語になるかという
 レベルがわかる方なら簡単な話なのかもしれませんが
 私には?です。)
・同一綴りの文字リテラルを別個として扱ってしまう処理系で
 かつ組み込み用途など特別に記憶領域が厳しい場合は
 どうしているのでしょうか?
 const char* p = "\n";
 として以後これを使う、なんてことを妄想中。。。
・質問の順序がぐちゃぐちゃですが、もっと基本的に
 「プログラム中の同一文字リテラル」といった場合、
 その”プログラム”というのは、
 main以下全体の(=リンク後の)プログラム全体なのでしょうか?
 言い換えると、同一綴りの文字リテラルを同一として扱う
 処理系では、複数ファイル・分割コンパイルなどしていても
 それぞれに共通な文字リテラルがある場合、
 リンク時?に本当にこれらの記憶領域共通化を
 図ってくれるものなのでしょうか?
 
バッファとかプログラムという基本的な言葉が釈然としない
初心者ですが、しっかりと分かっていらっしゃる様々な分野の
プロの方にご回答をお願いしたいと思っています。
819デフォルトの名無しさん: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
820デフォルトの名無しさん:2008/01/13(日) 17:16:52
>>818
とりあえず
"\n" は文字"列"リテラルだ
821デフォルトの名無しさん:2008/01/13(日) 17:19:05
>>818
・VC++は、同一文字リテラルをどのように扱うのでしょうか。
 (記憶域上、同一か別個か)

コンパイラオプションの文字列プールというので
どっちにでもできたと思う。
822775_817_818:2008/01/13(日) 17:20:11
>>820
 
ですね、すいません、訂正します。
823デフォルトの名無しさん:2008/01/13(日) 17:23:54
>>814
(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個の配列の先頭を指すポインタ」ということ?
824デフォルトの名無しさん:2008/01/13(日) 17:24:45
>>818

> ・VC++は、同一文字リテラルをどのように扱うのでしょうか。

オプションで指定できる。
バージョンや最適化レベルによっても変わるかも。
どちらにせよリテラルについては規格上不定なところも多いので、
そういうのに依存するようなコーディングはやめとけ。

> ・だいたい、endlで行うバッファフラッシュのバッファとはなんなのでしょうか。

効率化のためにOS等が入出力をある程度一括して行う。
そのときに一時的にデータを貯めておくのがバッファ。
バッファにたまってるのを強制的に書き出すのがフラッシュ。
825デフォルトの名無しさん:2008/01/13(日) 17:33:51
>>818
> ・同一綴りの文字リテラルを別個として扱ってしまう処理系で
>  かつ組み込み用途など特別に記憶領域が厳しい場合は
>  どうしているのでしょうか?
>  const char* p = "\n";
>  として以後これを使う、なんてことを妄想中。。。
使いまわす対象が"\n"であるなら、
・対象が2byteと小さいので、特に使いまわしは考えない。
・文字列の出力関数の仕様を、「最後に改行が出力される」とする。
といったところ。
使いまわし対象がもっと大きな文字列なら、
文字列個別にIDを割り当てて、IDから文字列の先頭ポインタを取得する関数を作る。
826775_817_818:2008/01/13(日) 17:34:56
>>821
>>824
ありがとうございます。

コンパイラオプションの文字列プールMSDNで見てみました。
どうやらそれらしいですね。
(2005EEでは(debugですが)”いいえ”になってました)

>>そういうのに依存するようなコーディングはやめとけ。
ということはendlを常に使えということでしょうか?

>>一時的にデータを貯めておくのがバッファ
はい、ここまでは分かるのですが、具体的に(HW上)
いったいなんなんだろう、と思ったものですから。
組み込みなどを入れると全体のシステムといっても
いろいろあると思いますし。。。
827775_817_818:2008/01/13(日) 17:38:20
>>825
ありがとうございます。
そうですね、2byteですからね。
問題にならないんだとは思ったのですが、、、
ちなみに825さんはどういった分野の方なのでしょうか。
そして結論として、通常は\nを使うよ、ということで
よろしいでしょうか?
828776:2008/01/13(日) 17:49:38
>>827
取り敢えずここまで斜め読み。

・なんで"\n"を使うの? '\n'で充分だと思うのだけど。
・ファイルへの出力は、フラッシュのタイミングを常に意識すると思うわけで、標準出力についても同様だという認識。
・ちなみに、標準出力は適宜フラッシュしないと見えないという切実な問題があるわけで。
# 標準出力については、改行するとフラッシュされる処理系もあるけどそれに依存するのは如何なものかと思うし。
・蛇足ながら、ファイルへの出力は適宜フラッシュしなくてもどうせクローズするからそのときでいいという発想もあり。
# その場合、endlは一切使わないということになるかも知れず。
829デフォルトの名無しさん:2008/01/13(日) 17:50:38
>>823

(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)の違いだ。
830825:2008/01/13(日) 17:50:51
>>827
組み込み屋です。
結論というか、一般論をいうなら、
基本はシンプルに書く。制約が厳しそうなら工夫して書く。
何がシンプルで何が工夫かは状況次第、臨機応変だ。
831デフォルトの名無しさん:2008/01/13(日) 17:51:02
>>826-827
横槍だけど

>>>そういうのに依存するようなコーディングはやめとけ。
>ということはendlを常に使えということでしょうか?
コンパイラの最適化の仕様に頼ったコーディングのことじゃない?

>具体的に(HW上)いったいなんなんだろう
メモリ。

>2byteだから問題にならない
組込みでCGIとかやったけど、意外に問題になることもある。
CGIの時は、クライアントでのHTMLの読み易さを捨てて、\nを全部消した。
で、>>825は「使いまわさない」と言ってるだけで、
「気にせず\nを文字列リテラルで使いまくる」とは言ってない。
対策として「最後に改行が出力される」出力関数を使うと言ってる。
こうすると\nは出力関数内の1箇所にしか出てこなくなるので。
832デフォルトの名無しさん:2008/01/13(日) 17:56:19
>ということはendlを常に使えということでしょうか?

それは出力先や目的によって異なるんじゃないかな。
例えば出力先がファイルなら、endlのみだとその度に
ディスクアクセスが発生する。
そういう負荷を緩和するためにバッファに蓄えられるわけ。
833デフォルトの名無しさん:2008/01/13(日) 18:07:59
>>819
自分の結果。
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を動的にはできないと思うんですが、
それは正しいですか?
834デフォルトの名無しさん:2008/01/13(日) 18:08:03
コンソールにメッセージを表示したいならその場で全部表示されないと困るよね。
ためといて後で一括して… なんてわけにはいかない。
ファイルに保存するときはファイルを閉じたときにツジツマがあってれば
だいたい困らないから、こまめにフラッシュする必要はないよね。
つまりはそういうこと。
835デフォルトの名無しさん:2008/01/13(日) 18:08:10
>>832
ファイルの場合、basic_filebuf<> オブジェクトに書き込み要求
をしますが、バッファの大きさを指定することはできますか?
あと、sputcなどのStream Bufferのメンバ関数を使えばバッファ
されずに直接ディスクに書き込むことになるんですよね?
836デフォルトの名無しさん:2008/01/13(日) 18:09:52
endlマニピュレータは関数ですけど、中で実行されているflush()関数
はStream Bufferのメンバ関数呼び出しなどを行っているのでしょうか?
詳しい人教えて。
837775_817_818:2008/01/13(日) 18:19:48
みなさん、ありがとうございます。
プロの方がいっぱいでなんだかうれしいです。
なるほど、と思うことばかりです。
結局は目的・用途・制約などで、
条件が厳しい場合にはしっかりと使い分ける。
そうでない場合には、見やすさなどでと
いうことですね。個人によりそうですが。

バッファ(=外部メモリでよろしいでしょうか?)に
ついて確認させてください。
endlで、バッファフラッシュとなったとき、
CPUは、メモリコントローラに対して、
その指示を出す、ということで
あっていますでしょうか。
 
あと、818の最後の質問にも分かるかがいたら
お答えよろしくお願いいたします。
VC++での例のオプションON時だけでも構いません。
 
もうひとつだけ追加でお聞きします。
職場や仕事なででの
コーディングルールの中に
この改行について
書かれていることはありますか?
プロの方にしか聞けないことだと思いますので。
ご回答よろしくお願いいたします。
(組み込み関係ではない方もお願いします。
そんなの気にしたことない!、とか)
 
838デフォルトの名無しさん:2008/01/13(日) 18:22:30
ライブラリレベルでのバッファとは別にOSが管理してるものとかもある。
そういう意味では「直接」書き込むなんて相当な黒魔術が必要だよ。
少なくとも今のWindowsなんかでは難しい。

だいたい、言語の規格としての定めはそこまで踏み込んだものじゃないから、
「どうなってるか」を知りたいのなら各処理系で実験してみるしかない。
(それでも最適化とかそのときの状況で色々だったりする)

>>836

それが必要なアーキテクチャならそう実装するだろうし、
そうでないならしない。
839デフォルトの名無しさん:2008/01/13(日) 18:26:11
以前Unix系のOSで、ファイルをクローズしてもファイルがフラッシュされてないことがあったな。
ファイルサイズが0のまんまなの。
840デフォルトの名無しさん:2008/01/13(日) 18:32:36
>>833
お前頭大丈夫?
括弧が左右対応してなくて気持ち悪くないの?
841デフォルトの名無しさん:2008/01/13(日) 18:33:26
遅延書き込み。
842デフォルトの名無しさん:2008/01/13(日) 18:48:06
>>833
初期化子でぐぐってみ
843デフォルトの名無しさん:2008/01/13(日) 18:51:16
コンストラクト時なら初期化子、そうでなければvector::assign
844デフォルトの名無しさん:2008/01/13(日) 21:13:09
勉強のためにMFCのCStringもどきを作成しました。
ほぼ期待通りのことができたのですが、
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;
}
〜以下略〜
}
845デフォルトの名無しさん:2008/01/13(日) 21:15:08
const char* を受け取るコンストラクタを作ればいいんじゃね
846デフォルトの名無しさん:2008/01/13(日) 21:29:06
strtokを使ってスペース、改行区切りで文字列を分解しようと思ったのですが
例えば"6 * 6 - 2"だときちんと分解されるのですが
"6 * ( 6 - 2 )"だと"("を分解して終わってしまうみたいなんですがどうしてでしょうか?
また、これをすべて分解するにはどうすればいいのでしょうか...よろしくお願いします。
847デフォルトの名無しさん:2008/01/13(日) 21:33:53
>文字リテラルを同一として扱う
>処理系では、複数ファイル・分割コンパイルなどしていても
>それぞれに共通な文字リテラルがある場合、
>リンク時?に本当にこれらの記憶領域共通化を
>図ってくれる

されるはずだが試してない。
気になるのならある程度長い特徴的な文字列で、
実際にコンパイルしてバイナリエディタでサーチしてみてくれ。
848デフォルトの名無しさん:2008/01/13(日) 22:08:06
>>844
勉強のためならあえて指摘しようかな。

operator const char *とbool IsEmptyはconstを付けよう。
friend CString operator +の引数はconst CString &にしよう。
849846:2008/01/13(日) 22:12:34
なぜか今やったらできました
変なとこに割り込んでしまって申し訳ないです...
850デフォルトの名無しさん:2008/01/13(日) 22:34:24
>>845
ありがとうございます。
明日に試してみます。

>>848
指摘ありがとうございます。
operator const char * の場合どこにconstをつけるべきなのでしょうか?
851デフォルトの名無しさん:2008/01/13(日) 22:37:54
>>850
const CStringに対して呼び出せるようにするってことね。

operator const char*() const
bool IsEmpty() const
852デフォルトの名無しさん:2008/01/13(日) 22:55:49
>>851
なるほど・・・

勉強になりました。ありがとうございましたm(_ _)m
853775_817_818_837:2008/01/14(月) 00:36:02
>>838
>>847
ありがとうございます。
 

>>838
言語仕様からしてそこは「あいまいだ」と
いうことですね。
それがわかったことはのすごい収穫です。
もともと、なんだかあいまいな表現だなあ、と
思っていたわけで、その直感は、それはそれで
合ってたわけですね。
 
>>847
はい、そのうちでよければ、やってみます。
共通化してくれそうな気も少ししてきました。
854デフォルトの名無しさん:2008/01/14(月) 01:04:52
ところで>>781はおkだよね?
>>783はどこからか連続領域とかいう条件もってきてだめっていってるんだよな?
(それか「厳密には二次元配列ではない」という意味か)
855783:2008/01/14(月) 01:36:11
>>854
連続した領域云々はともかくとして、
俺は>>815が気になったんで「いいえ」って言ってみただけ。
856デフォルトの名無しさん:2008/01/14(月) 01:45:46
納得した
857デフォルトの名無しさん: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))
みたいな感じで、
やたらと、__や_を使っているのですが、
これはどういう意味やメリットが有るのでしょうか?
858デフォルトの名無しさん:2008/01/14(月) 09:09:28
>gccでコンイルしているかコンパイル時に分かるんでしょうか?
Yes

>やたらと、__や_を使っているのですが、
__real__ は gcc の拡張機能で、gcc の組み込み複素数型の実数部を取得するキーワード。

_ が先頭に付いている識別子や、__ を含む識別子は処理系の予約語になってるから
(本当はもうちょっと規則がややこしい)、
ユーザ側で定義してはいけないことになっている。
だから、処理系がそういう識別子を使っても、
(ユーザがちゃんとこういう命名規則を把握しさえしていれば)
ユーザ側の識別子とは被らないようになっている。
859デフォルトの名無しさん:2008/01/14(月) 09:10:50
>>857

gcc:__GNUC__が定義されてる
他:そんなの知らん

ということ。
860デフォルトの名無しさん:2008/01/14(月) 09:40:43
>>858
おお、鋭いです
>__real__ は gcc の拡張機能で、gcc の組み込み複素数型の実数部を取得するキーワード。
この辺の事を詳しく書いているサイトって無いですか?
861デフォルトの名無しさん:2008/01/14(月) 09:44:45
カエレ!
862デフォルトの名無しさん:2008/01/14(月) 10:12:43
>>860
complex ヘッダでも嫁
863775_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になっているのかもしれません)
864デフォルトの名無しさん:2008/01/14(月) 11:14:05
無理。strcpy()を使うしかない。
865デフォルトの名無しさん:2008/01/14(月) 11:20:36
初期化は定数限定だろ
866775_817_818_837:2008/01/14(月) 11:41:33
>>864
>>865
ありがとうございます。
そうなんですね。だめですか。
constがprt定義についていても駄目でした。
となると、ここはdefineの代わりに
const char*を使うなんていうことは
できないということでしょうか。
(一般的にdefineの代わりにconstを使う方が
C++の場合よいよ、なんていう記述がどこか(本かHP)に
あったもんですから、確認させてくださいませ。)
あと、strcpyするためには、char str[xxx] のxxxが
あらかじめ決まってないといけないですよね。
なんかもどかしい感じがしてしまうのです。
867デフォルトの名無しさん:2008/01/14(月) 11:43:03
>>863
そもそも型が違う
strはarray of char、ptrはpointer、*ptrはchar
strncpy使え
868デフォルトの名無しさん:2008/01/14(月) 12:55:54
クラスの関数についてなのですが

bool operator<(const CLS& x) const {}

bool operator<(CLS& x) {}

の違いって何なんですか?
後半にconst つけるとどういう効果があるんですか
869デフォルトの名無しさん:2008/01/14(月) 12:59:44
そのメンバ関数はオブジェクトの状態を更新しない=メンバ変数を書き換えないよ

と明示している

あとmutableというキーワードもあってだな
870デフォルトの名無しさん:2008/01/14(月) 13:02:15
ありがとうございますサンクス 
871デフォルトの名無しさん:2008/01/14(月) 13:03:52
>>868
後者の非constメンバー関数はconstオブジェクトからは呼び出せない。
で、何で後者の引数にはconstをつけないんだ?
872デフォルトの名無しさん:2008/01/14(月) 17:14:12
WindowsのMSVC++や、UNIXのgccなどで、
64bit環境でコンパイルしても、32bit環境でコンパイルしても、必ず32bitや64bitであることが保証されている型はありますか?
__int32などを使えば良いのでしょうか?
873デフォルトの名無しさん:2008/01/14(月) 17:19:33
int32_t/uint32_t
int64_t/uint64_t

C99だけど大抵の環境で使えるだろう。
874デフォルトの名無しさん:2008/01/14(月) 17:32:13
残念ながら何の意地かしらんがVC++にはないよ
INT32とか使うしかない
875デフォルトの名無しさん:2008/01/14(月) 17:33:55
ビットフィールドで32bitにしてしまえばw
876デフォルトの名無しさん:2008/01/14(月) 17:34:31
あらそうなんだ。まあどっちに合わせるかだね。
俺は標準に合わせといた方が良いと思うけど。
877デフォルトの名無しさん:2008/01/14(月) 17:39:59
boost/cstdint.hpp
878872:2008/01/14(月) 18:11:46
やはり、まちまちなんですね。オープンソースなので、出来るだけコンパイラ依存のコードは避けていますが、
プリプロセッサで判別することにします。ありがとうございました。
>>877
C言語なのでboost使えないんです。抜き出して使おうと思います。
879デフォルトの名無しさん:2008/01/14(月) 18:28:37
stdint.h があるならそれを使うようにして、
ないなら環境ごとに自分で定義すれば?
880デフォルトの名無しさん:2008/01/14(月) 18:30:07
もうそうするって言ってるみたいだがw
881デフォルトの名無しさん:2008/01/14(月) 20:09:29
ヒープ領域にメモリを確保するのが遅いとよく聞きますが、
スタック領域にメモリを確保するのは遅くないのでしょうか?
882デフォルトの名無しさん:2008/01/14(月) 20:15:16
ヒープは仮想メモリを含む スタックは純物理メモリに格納
883デフォルトの名無しさん:2008/01/14(月) 20:18:06
スタック領域にメモリを確保するなんて、
esp レジスタの値をいじるだけだし。
ヒープに確保するのはそれはそれは複雑な処理だ。
884デフォルトの名無しさん:2008/01/14(月) 20:18:42
>>881
スタック上の領域は、確保した逆順にしか解放しない方式なので、仕組みが単純。スタックポインタというCPUレジスタを操作するだけなので高速。
ヒープは任意の順序で解放できるので、少し複雑になり、遅い。
885デフォルトの名無しさん:2008/01/14(月) 21:05:57
C++のクラスのコンストラクタのイニシャライザで構造体のメンバを初期化できないんですか
886デフォルトの名無しさん:2008/01/14(月) 21:08:28
できる
構造体のコンストラクタ呼べば
887デフォルトの名無しさん:2008/01/14(月) 21:08:45
構造体にコンストラクタを書くか、ボディでやるしかないんでは。
888デフォルトの名無しさん:2008/01/14(月) 21:12:59
その構造体もクラスで実装することを検討してはどうだろうか。
構造体って、APIに渡す時ぐらいか使わないなあ。
889デフォルトの名無しさん:2008/01/14(月) 21:13:09
>>882って本当?
890デフォルトの名無しさん:2008/01/14(月) 21:14:46
処理系によるとしか
891デフォルトの名無しさん:2008/01/14(月) 21:15:04
やっぱりコンストラクタが必要ですか
struct tag {
int x , y ;
}
みたいな小さい構造体にコンストラクタは馬鹿らしいと思うので、
コンストラクタ本体で代入することにします。
ご返答ありがとうございました。
892デフォルトの名無しさん:2008/01/14(月) 21:16:52
>>888
個人的には初期化方法のためだけにデータ型をクラスで実装するのは反対。
データ型なんて出てこないように全体的にクラス構成を考え直すということならアリだと思う。
893デフォルトの名無しさん:2008/01/14(月) 21:21:42
c++でクラスと構造体をそんな使い分けする意味なくね?
894デフォルトの名無しさん:2008/01/14(月) 21:30:44
意味無いかな?
Cと文法を共通化させるためとは言っても(structの元々の存在意義ってコレよね?)
せっかくclassとstructがあるんだから、オブジェクト定義とデータ定義で使い分けた方がソース見やすくならない?

まぁ標準ライブラリ自体がアレだから、あんまり意味無いのかなぁ・・・
895デフォルトの名無しさん:2008/01/14(月) 21:45:04
趣味でプログラミングしてきたのですが、
最近興味あるプログラムのソースがC++であることが多くなり
C++も使えなきゃ駄目だなと思っています。
Cでは1500行くらいのプログラムを書いた事が有ります。
ポインタは分かっているつもりです。
アセンブラはほとんど分かりません。ごく稀にgdbでdisassembleする程度です。
オブジェクト指向は分かっていません。構造体の強化バージョン程度の理解です。
こんな感じの自分に、オススメのC++を紹介して頂けないでしょうか。
まぁ、「プログラミング言語の本は、どんな本でも一冊しっかり読めば
基礎力は付く」ってのは無しで。
896デフォルトの名無しさん:2008/01/14(月) 21:48:36
俺は必要とあらば891みたいな構造体にもコンストラクタ付けちゃうけど、
嫌なら、ヘルパ関数作るという手もある。

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;
};
897デフォルトの名無しさん:2008/01/14(月) 21:49:04
>>895
OOPをC++でやりたいならGanf Of Fourの
「オブジェクト指向における再利用のためのデザインパターン」は買っとけ
898デフォルトの名無しさん:2008/01/14(月) 22:04:11
その本ってデザパタドシロートでもOK?
899デフォルトの名無しさん:2008/01/14(月) 22:05:24
>>898
素人でもいい。というかこの本以外に適当なC++でOOPをやってる
本が事実上ないんだよ。
後はネットで簡単なデザパタのページを見つけてそれを参考にいくつか
プログラムを自分で書いてみれば理解できる。
900デフォルトの名無しさん:2008/01/14(月) 22:06:30
別にデザパタ勉強するだけなら、
C++ の本に固執しなくてもいいんじゃないかな。
C++ に応用させればいいだけだし。
901デフォルトの名無しさん:2008/01/14(月) 22:08:21
>>900
それがそうもいかない。C++には他の言語にはあまりない
多重継承という機能がありそれを利用した独特のデザパタがあるし、
ポインタと仮想関数でOOPしなければならないという特殊事情が
ありboostの使用も視野に入れなければならなくなってくる。

他のOOP言語ではC++よりスマートにOOPを実現している。
902デフォルトの名無しさん:2008/01/14(月) 22:16:31
まあ、GoF だけならどの本でもいいんじゃね。
903デフォルトの名無しさん:2008/01/14(月) 22:32:37
マンガとかで、「実行中のプログラムを書き換える」ってネタが良く有るけれど、
実際、デバッグオプションも付けないでコンパイルしたプログラムを、
デバッガも使わず、プログラムの実行中に変数の中身を書き換える事って可能なの?
904デフォルトの名無しさん:2008/01/14(月) 22:36:14
可能
そういうツールもちゃんとある
905デフォルトの名無しさん:2008/01/14(月) 22:44:07
DOS 時代はメモリいじってゲームのパラメータいじって遊んでたな。
906デフォルトの名無しさん:2008/01/14(月) 22:44:18
マジで。
どうやれば実現できるんだろう?
ツール名教えて。
907デフォルトの名無しさん:2008/01/14(月) 22:46:51
>>906
すれ違いだけどうさみみハリケーンとかすぺしゃるねこまんま
名前がふざけすぎだけど中身はまとも
使い方は自分で調べろ

あとメモリエディタでぐぐるとか
908デフォルトの名無しさん:2008/01/14(月) 22:52:20
交換機で
(1)あらかじめ余分にメモリ領域を確保してLM作成。
(2)決まった手順でパッチを作成
(3)パッチをあてると、その領域に新関数を書き込み&旧関数の頭にはジャンプ命令を書き込み
ってのがあった。
動いたままパッチが当てられる。


909デフォルトの名無しさん:2008/01/14(月) 23:02:53
>>901
いきなりエリックガンマを読まなくてもいいだろ。
初心者に勧めるものではないな。
オブジェクト指向のこころのほうがアプローチが分かりやすい。
サンプルはJAVAだがあの程度なら覚えるのは簡単だし、分かりやすい
必要ならC++で記述するのもよし。
910デフォルトの名無しさん:2008/01/14(月) 23:16:12
>>901
「ポインタと仮想関数」って特殊事情ではないだろ。
むしろテンプレートなんかのほうがよっぽど特殊事情だ。
911デフォルトの名無しさん:2008/01/14(月) 23:36:10
C++以外でもインタフェースって名前で実質的な多重継承は使われてるだろ。
912デフォルトの名無しさん:2008/01/14(月) 23:40:31
実装を持てるか持てないかの違いは
あんたが思っている以上に大きい
913デフォルトの名無しさん:2008/01/15(火) 02:59:35
volatileってなんて呼ぶの?
ヴォラタイルであってる?
914デフォルトの名無しさん:2008/01/15(火) 03:18:07
俺はそう呼んでる。ってかfalseやnullと違ってそれ以外の読み方を聞いたことがない。
915デフォルトの名無しさん:2008/01/15(火) 03:34:00
>falseやnullと違ってそれ以外の読み方を聞いたことがない。
ファルスとナルであってる?
916デフォルトの名無しさん:2008/01/15(火) 03:36:30
>>915
ナルはいいけどファルスはやばいwww
917デフォルトの名無しさん:2008/01/15(火) 03:37:35
バルスみたいだな
918デフォルトの名無しさん:2008/01/15(火) 03:41:22
>>916
>ナルはいいけどファルスはやばいwww
ファルスでググったら勃起て出てきたwwww
こんどこらfalseをバルスって呼ぼうぜ!
919デフォルトの名無しさん:2008/01/15(火) 03:58:11
typedefされたものが早く理解できたためしがない
typedef double* vector  とか書かれても読む気しない。

型が増えると逆に理解に苦しむのっては少数派なのか・・・
920デフォルトの名無しさん:2008/01/15(火) 04:02:57
その程度だったら、typedefするほうもどうかと思う。
921デフォルトの名無しさん
まぁ、大きなスコープの中で「あれもこれもtypedef」みたいなやり方を
派手に押し進められると、さすがにね。