【初心者歓迎】C/C++室 Ver.46【環境依存OK】
ソースコードを載せる人はちゃんとインデントをつけましょう。
半角スペース、タブ文字は2chでは使えません。
全角スペースを使ってもいいですが、 と入力すると半角スペースとして表示されます。
全角スペースではそのままコピペして使うことができないので、
ここにソースを貼るときはできる限りエディタでタブ文字等を に置換しましょう。
本当か?
うん
本当
やべえ、うちの2chブラウザだと、
& nbsp;って文字まで半角スペースに変換しやがる
何この無駄な機能w ふざけんなww
>>3の が見えないってことか?
ハイ機能だな
ポップうpで見れば問題解決なのだが
/**/
test
失礼します。
当方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 スキップ ==========
というメッセージが出てしまいました。
これらはどのように対処すればいいのでしょうか。
>>12です。
Cとしてコンパイルをしないといけないのかと思い
extern "C" {
を加えてみたのですがやっぱりかわりませんでした。
必要なライブラリをリンクしてないからでしょ
アーケードのをクリアしたなあ。
8面で穴に落とす係りの奴が出てきて一発殴ると終わるよね。
レバーを入れるのと同時にパンチを連打すると当たりやすいんで
やたら忙しくココココココンってレバーをやりながらボタン連打してた。
ジャブが二発入ったらストレート、あとはその繰り返しで
適当に上下に振って動かしながらやれば何とかなるよね。
誤爆
17 :
デフォルトの名無しさん:2007/12/28(金) 20:03:19
>>14 おっしゃるとおりでした。
2日間もバカみたく考えてましたw
無事解決しました。
ありがとうございました!
18 :
デフォルトの名無しさん:2007/12/29(土) 13:39:40
ファイル読み込みについて質問です、
ファイルの何バイト目から読み込むというのはできるっぽいんですが、
ファイルのX行目から読み込みたい場合、
getlineをX回実行という方法で行うんでしょうか?
>>18 それで不都合がなければそれでいいんじゃね?
Yes
ランダムで何行目って読む場合は各行の場所を保存しておくと便利
21 :
デフォルトの名無しさん:2007/12/29(土) 14:05:53
>>19-20 別に不都合はないんですが、直接飛べる方法があるなら
そっちの方が早いかなと思いまして
ありがとうございました
専用フォーマットにしていいんなら
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[];
......
にすればすぐ読み出せるぞ。
質問です。
引数をリストにしたいのですが、
リストを作るところで、困っています。
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);
}
何か良い方法はないでしょうか?
リストのことをちゃんと書いた本でも読め。
そうでもなければおとなしく std::list 使っとけ。
>>24 すいません。
c++では無いんです。
ああ、そうか!
ちょっと良い案思い浮かんだんで、試してきます。
とりあえず、双方向リストはリングリストにすると実装しやすいよ。
良く見たら確かに C99 だな。
まあ、exit(0); じゃなくて return 0; でいいと思うが。
どっちも同じと言えば同じだが。
int n = 2007;
if ( n == false) {
// nが偽だったら実行
exit(-1);
}
の内側が実行されてしまいます。
どうすれば治りますか?
直るも何も、int と bool を比較している時点で何かおかしい。
できたー!
んですが、どこかで失敗しているらしく、終了しません。
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;
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);
>>28 確かに、
>>29 は正しいが、C,C++ではよくあること。
その if より前に n に false が代入された。
あるいは、その処理系では、false が、 2007 とされている。
あるいは、どこかその処理より前で、
#undef false
#define false 2007
を書かれている。
C/C++ でも if(!n) とすればいい話だな。
もし n が真偽を表現しているのであれば。
34 :
25: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;
にしたら動きました。
感動!
new->argv じゃなくて new->prev じゃないの?
#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で通る(警告は出る)んですが、
これって規格上問題ないんですか?
2行に分ければいいじゃん
規格上は戻り値の型が void の場合は
return 文は引数を取ってはならない。
hoge()がvoidなのにreturnして怒られない?
つーかこの仕様だとreturn要らないような気がするのだが
test の型も void だから通すコンパイラもありはする。
でも、規格上は問題あり。
まあ、おとなしく { } つけろってこった。
戻り値型voidの関数でvoidをreturnするのは合法だと思ったが
普通は合法なら警告はでない。
んなこたーない。
46 :
デフォルトの名無しさん:2007/12/29(土) 22:26:28
すいません、コールバック関数って何ですか?
例えば、
typedef int (CALLBACK *OPEN)(char *);
typedef int (CALLBACK *CLOSE)(int);
ここで記述されているCALLBACKというものがそうらしいのですが、
さっぱりわかりません。
>>46 環境が何だか分からんが、そのCALLBACKは何処かで#defineされてるもので
コールバック関数とは直接的には関係ない。
>>46 CALLBACKはWindowsなら__stdcallの別名で通常は修飾なしの関数と同じ。
コープバック関数ってのはイベント通知や内部でユーザー定義の関数呼び出す場合に関数に渡すユーザー関数のポインタ。
どうみてもコールバック用の関数ポインタ
CALLBACKならWindows環境だと__stdcall
実はWindowsのエントリポイントであるWinMainにつけるWINAPIも、__stdcallだったりする
__stdcallは呼ばれた側がスタックの解放をするって動作を指定する
だからコールバックできるんですね
コールバックはどっかから呼び出してもらう関数のこと
折り返し電話してもらうことをコールバックっていうよね
あれと同じで、自分から明示的に呼び出さない
自分、っていっているのは、右手が恋人のおまいじゃなくて、コールバック関数が定義された側の処理
>>49 コールバックできるかどうかに__stdcallは関係ないよ。
>>50 そりゃ「できるかどうか」に限定すれば関係ないけどね
52 :
25:2007/12/30(日) 08:28:19
すいません。
どうしても解けない問題なので、お教えください。
1000 ガンダム 2000 ウルトラマン 3000 ウルトラマン 4000 仮面ライダー
のような数字と文字列をメンバに持つ構造体で、
もし、文字列が同じだった場合、リストを繋ぎ変えてこの場合
1000 ガンダム 3000 ウルトラマン 4000 仮面ライダー
と言う風にしたいんです。
どこを直せば良いでしょうか?
typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
char *data;
char *argv;
}ListNode;
ListNode *first, *last, *point;
/*first(1000 ガンダム)->(2000 ウルトラマン)-> (3000 ウルトラマン)-> last(4000 仮面ライダー)というリストが出来た。*/
53 :
25: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;/*文字列がかぶっていないので次のリストの文字列と比較*/
}
>どこを直せば良いでしょうか?
データ構造の設計を0から。
55 :
25:2007/12/30(日) 09:07:15
え、リストじゃ駄目ってことですか?
じゃあ、何が良いんですか?
配列?
学校の課題とかならともかくリスト構造使う意味がわからない
57 :
25:2007/12/30(日) 09:23:39
えっと、引数の個数がいくつ有るか分からないからです。
引数・・・まあいいか
リスト構造わかってるのになんでわからないのかわからない、それ自体写しか?
データ構造って指摘されてるのは"1000 ガンダム"とかいれちまってるせいじゃないの
それにしたってまあ比較は出来るけど1000と"ガンダム"でわけようぜ
というかなんでその問題が解けないか全く理解出来ない
59 :
25: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の条件がどうしても書けなくて...
ペア管理って、だから構造体にいれんじゃないの
つなぎかえなら図でも書いてみろ、やることは単純だ
whileの条件はわかりやすくしたきゃ末尾にnullでも明示的にいれとけ
要素の除外を効率的に行うには確かにリストは最適ではあるわな。
リストの組み替えをしたいなら、
リストの組み替え前と組み替え後の状態を紙に書いて、
どう変化させればいいかを考えてみるといい。
あと、リストを実装する場合、
リストの端っこは、NULL にするより、
端っこを表すダミーのノードを作った方が実装しやすい。
62 :
25:2007/12/30(日) 09:50:28
わかりました。
もちょっと努力してきます。
ていうか、そのためのlastなんじゃないの?>61
コマンドラインからだろうとファイルからだろうと、通常事前に件数は把握できるだろうから
その必要がない限りリスト構造を使う意味はないと思うが。
>>63 違う。
ダミーのノードは全ての有効なノードとは異なるノード。
有効なノードが0個の時でも存在してないといけないわけで。
66 :
25: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);
はじめまして。
現在ステレオの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の形式とかはなんとか理解は出来たので、読み込み方がわかれば多分大丈夫だと思います。
ファイル全体を一気に読み込むのは流石に調べて分かったんですが、場所指定しての読み込みがどうしても分からなかったので
質問させていただきました。どうかよろしくお願いします。
fseekで読みたい場所にシークするだけじゃん。
あとx86系CPUならエンディアン変換はしなくていい。
CPUもリトルエンディアンなら、単純に2バイトずつ読めばいい。
任意の位置からの読み込みは、C++のstream類ならseekg、
CのFILE*ならfseekといった具合に、位置を指定する方法があるのでそれを使う。
70 :
67:2007/12/30(日) 16:42:45
ありがとうございます。エンディアンは気にしなくて良いのですね。
あと、ファイルをシークするということは、一度ファイル全体を読み込み、
そこからシークしてデータを取り出すということですよね?
waveファイルって1つが結構大きいので、既に再生用にwaveをメモリに読み込んでいることもあり、
データをチャンネルごとに分けて読み込むうえに更に読み込み用にファイルを読み込むとなると
あとで全体のデータは破棄するにしても結構メモリ食うな〜と思うのですが、
やはりそうしないと読み込むのは無理ですかね?
>66
}while(this == NULL);
これでいいのか?
strcmpの後のifだけど、これはたぶん、>65氏の言う「ダミーノード」の方法で消すことが可能。
「次」がある限り、「次の次」は、(ダミーかもしれないが)必ず存在する。
「次」がダミーなら、strcmpのifが真になることはないはず。
ところで、この書き方だったら比較は必ず次の要素と行われてるから、
ウルトラマンウルトラマン仮面ライダーだったらいいけど、
ウルトラマン仮面ライダーウルトラマンだったときに後ろのウルトラマンが
消えてくれない気がするんだけど、なんでこんなアルゴリズムにしようと思ったの?
普通に書いたら
・まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
・次に、上の操作で出来たリストの二番目と、それ以降すべての要素と比較、かぶってたら以下略
・それをリストの最後から二番目まで繰り返す
にならない?
それともよく知らないけど>66の方が効率いいの?
あと、よけいなお節介だけど、変数名にthisとかnewとか使う癖があるなら、直した方が良い。
>>70 シークはこれから読み書きする位置を指定する行為。
この段階ではまだ読み込みは行っていないぞ。
73 :
67:2007/12/30(日) 17:00:59
>>72 そうなんですか! よく調べもせずに申し訳ありませんでした。
折角のC++なので? seekgを使ってみたいと思います。
お答えして頂いてどうもありがとうございました!
>>66 >if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/
> this->next = NULL;
>else
> this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
>free(this->next); /*(2000 ガンダム)を消す*/
何をfreeしているか考えよ
75 :
25:2007/12/30(日) 17:23:42
>>71,74
すいません。
有り難うございます。
ちょっと色気出してみようと思って、練習もかねてList使ってみたのが間違いだったのか?
今までList自体触った事無いから、難しい。
まぁ、趣味でプログラムやっているから気長にやります。
free(this->next); /*(2000 ガンダム)を消す*/
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
が正しいですね。
今日からC言語の勉強を始めた超初心者なんですが、質問させてください。
MS-DOSでディレクトリの移動をやってたんですが、
cd \での移動と、(指定されたパスが見つかりませんと出る)
dir \での移動が出来ません(ファイルが見つかりませんと出る)
まさか入門書の本編にすら行かないうちに詰まるとは思いませんでした。
どなたか助けてください…。
、
それC言語関係ない。
dirは移動するコマンドじゃない。
>free(this->next); /*(2000 ガンダム)を消す*/
>this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
freeした物のnextわ参照してどうする
tmp = this->next;
this->next = tmp->next;
free(tmp);
79 :
25:2007/12/30(日) 17:36:45
>>78 そーですね。
なんか皆さんがアドバイスしてくれるから、
みwなwぎwっwてwきwたwww
なんかいい感じになってきたかも!
81 :
25: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し続けるのか書けない....*/
>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){
……
}
}
}
これでだめ?
ていうか、さ
リストに追加する段階で重複チェックすればいいじゃん
わざわざリスト全部作ってから除去しなくても。
create table list (
id integer not null,
name varchar(16) not null unique,
primary key (id)
);
insert into list (id, name) values (2000, "ガンダム");
85 :
25: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;の使い方が分からないです。
もう駄目かもしれません。
なんか正直、何をやってもプログラムを書ける気がしなくなってきました....
こういう絶望感に包まれた場合、どうすればまたプログラムを書けるようになれますかね?
気分転換にプログラミング以外の事をする。
コンピュータから離れても良いかもしれない。
>>85 だから、リスト構造はあんたには早過ぎると言ってるでしょう。
>}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
だね。
次の次とか処理順で頭悩ませるぐらいなら再帰にしたらどう?
リストを試行錯誤で実現するにはまだ早いという感じだなあ。
何か本でも読んだ方がいいんじゃね。
C++でグラフィックをいじるにはどうすればいいんでしょうか。
唐突過ぎるとマルチうぜーとか書かれるぞ
まずなにがしたいのかを書かないとエスパーしか答えられないぞ
ゲームを作りたいならDirectXとか
一人で作るレベルならC++よりCがいいと思うな、ゲームなら
ここであえて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;
}
>>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>も勝手に入力から判断してくれる書き方はないですか?
>>99 今程度の知識で暇つぶしできるほどの改造は無理だ。
どのゲームなのか?そのゲームがC++で書かれているのかすらわからないじゃないか。
っつうかマルチでしょ?
宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。
>>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
日本語が変だぞ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()関数が表示するだけで
内部要素を変更しないことをハッキリ示すためですか?
htmlファイルからリンクのURLだけを抜き出してその文字列を変数に入れたいん
ですがどのようにすればいいでしょうか?
getlineで一行つづ読み込んで"<a href="http:"を探せばいいかな。と思ってたんですが
メモ帳でスレのhtmlファイル開いてみるとURLの途中で改行があったんで悩んでます
107 :
デフォルトの名無しさん:2007/12/31(月) 04:37:38
いちどによみこんで整形する 改行や空白をなくす
108 :
デフォルトの名無しさん:2007/12/31(月) 05:52:34
gccで変数名を表示できる拡張機能ってどう書くんだっけ?
>>105 const参照でコンテナを受け取った関数から使えなくなってもいいならつけなくていいよ。
110 :
デフォルトの名無しさん:2007/12/31(月) 09:06:53
後置演算子++のオーバーロードについて質問です。
Type operator ++(int)とありますが、
クラスTypeで宣言した演算対象が、float型とかの場合でも
仮引数は(int)なのでしょうか?
(float)にはならないでしょうか?
どの解説本みても(int)で、詳しい説明がなくてよくわかりません。
まあfloatをインクリメントって普通しないからね。
オーバーロードしたいならもちろんfloat型を引数に。
わざわざそんなんせず1足してやる方が無難な気がするけどねぇ
T& operator++(void)じゃなくて?
115 :
25: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;
}
}
}
頑張ってよかった!
感動した!
いい気持ちで正月を迎えられます。
それにしても混同しそうになる
サーバソケットでTCPの10〜100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って
・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする
というのが一般的なのでしょうか?
recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?
要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。
120 :
デフォルトの名無しさん:2007/12/31(月) 16:49:41
char bun[] ="すごく長い文章が入っている";
FILE 構造体へのポインタしか受け取ってくれない関数に,
この文字列があたかもファイルに入っているかのように
思わせて処理させることはできないものでしょうか?
C++ ならいつも std::string と std::istringstream で
ストリームとして抽象的に処理しているのですが,
どうしても C のライブラリを使う必要があって,
勝手が違って悩んでいます.
121 :
120:2007/12/31(月) 16:57:40
標準的な方法ではできないようですね.
使いたいライブラリのソースが手に入って,
手を突っ込んでいいとのことなので素直にそうします.
いやぁ,ストリームなんて変な演算子オーバーロードで
やだなぁ,とか思っていたのにいつの間にかストリーム
べったりの人間になってました.慣れって怖い.
>>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;
となっています。
こういうときは何を疑えばいいのでしょうか?
よろしくお願いします。
hoge3のインスタンスがたくさんできてる予感
125 :
123:2007/12/31(月) 17:51:13
すみません、言われてから一番下のクラスを見直したら速攻で解決しました、
最後の多重継承にvirtualをつけてませんでした(汗
けどどういう条件でvirtualをつけるべきなのかよくわからない・・・
ともあれありがとうございました。
そもそもそこまでの多重継承になるなら設計がおかしいのでは。
>>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
>>128 エスパーするとDraw_XとDraw_Yを直接数字に置き換えるとか
#define Draw_X (rand()/800)
#define Draw_Y (rand()/600)
134 :
デフォルトの名無しさん:2008/01/01(火) 21:05:24
C++を勉強したいのですが
初心者向けで分かりやすい本があったら 教えて下さい。
Cはある程度は把握してます
何かお勧めの本はありますかね?
Accelerated C++とか。
137 :
デフォルトの名無しさん:2008/01/01(火) 23:08:21
やさしいC++
とかって 分かりやすいんですかね?
>>134 CとC++はかなり違う言語だから、なめてかからないほうがいいよ。
STLやらBoostやら、C++は変態すぎる。
かなり違う言語だけど、慣れれば簡単なもんだ。
いい本を選べよ。
141 :
デフォルトの名無しさん:2008/01/01(火) 23:40:20
分かりやすい本とかお勧めの本は
やっぱりそれぞれ違いますよね?
ロベールかぁ..
本屋でいろいろ立ち読みしてみて 読みやすい本を選ぶのがいいんですかね?
>>139 C++がCより使いやすい要素はあるんですかね。
「使いやすい」の定義によるんじゃない?
初心者に勉強させるって意味なら混乱する要素満載でとても使いやすいとは思えないけど
>>142 クラス。
iostreamなんかは窓から投げ捨てていい。
145 :
デフォルトの名無しさん:2008/01/01(火) 23:58:01
STL
>>142 C++は使いやすいというよりも、強力な言語だと思う。強力であるが故に使いこなすのが難しい面が多々ある。
例えば文字列クラスを作ると、最初から言語仕様に組み込まれていたかのように文字列を扱えるなんて、強力というか自由度高すぎ。
例外処理も地味に便利だよなあ
演算子オーバーロードとか例外とか最近の言語なら珍しくないって。
STL と参照があるだけで C より随分楽になるわ。
>>149 C++で成功したから、最近の言語で実装されるようになったんだろ。
例外はJavaが早くね?他にもあるかもしれんが・・・
>>151 MPLを使わないのにC++に慣れてるとか大きく出たね
それでC++が簡単と言うのは違うんじゃないかい?
あんたにとっては簡単かもしれんけど、一般論ではないわな
>>151 何私は最先端ですみたいになってんの?
あんなもんライブラリでも作る必要がなければ使わない。
使えない。可読性が低くなる。
ライブラリ作らないでプログラムしてるのはすごいな
MPLより"やばい"type_traitsがtr1に入ってるぞ
可読性が低い==俺は勉強してないので読めない
mplってboost?
水掛け論したいなら他でやれ。
プログラムがおかしい。
>>156 type_traitsのどこがやばいの?traitsの考え方は難しくないし
コンパイル時の型の判定は便利だからboost使っている。
今でもiterator_traitsやchar_traitsはある。
>可読性が低い==俺は勉強してないので読めない
就職したら正論が通用しない場合があることがわかるよ。
>>159 とりあえず、 ,とか?とか使うのやめて読みやすく書き直して味噌
>>159 負数または INT_MAX を超える値を入力してない?
164 :
159:2008/01/02(水) 13:05:17
実行時のコマンドが誤ってました。お騒がせしてサーセン
>>159 宿題丸投げした挙句デバッグも人任せ?お前の肩の上についている物体は飾りか
ムキっていうかうざくなるのは当然
こんなんみりゃ誰だってうざくなるわ
>>165 肩の上って…
首を傾げてるってことかあぁぁ!!!!!!111
こういうのは真性だからねぇ、わざわざ言わずにスルーだな
まあ根っこからこういう奴っているんだよな、治らないよ、小さい時の教育の問題だろう
171 :
165:2008/01/02(水) 13:29:09
ゴメン言い過ぎた。
今度から気をつけるよ。
こういうのを見て毎回思うことは、
宿題スレと質問スレの住人、絶対かぶってるよな
うん
誰も
>>159のプログラムが間違ってることは指摘してやらないんだなw
strcatのcatって何の略ですか?
GoogleでもYahooでもどこでもいいから、検索して最初の10ページくらいは見て欲しいな
そもそも検索したかどうか知らないけど
どうでもいいが、
>>176のバッファオーバーラン対策コードはsを初期化しているかが曖昧だから不完全だ。strlen(s)がsizeof(s)を超える場合がある。
と思った。
初期化されてなかったら、それはバッファオーバーランとは別問題だろ
strcpyとかならまだしも、catは連結なんだから初期化前提
中途半端に"〜.ex"とかになった場合に誤動作しそうで怖いな
また別の問題だけど
C++でなにか簡単に動くプログラムはないだろうか。
はろーわーるど
マージャン、囲碁、将棋、チェス、好きなのを選べ。
はっきり言ってboostより分かりやすいC++はないんだろうか。
boost分からなければ無理に使うことは無い
boostってそんなにわかり易かったかな?
lambdaとか。
lambda はともかく、半分以上は分かりやすいと思うが。
boost::spiritは必見
とりあえず使い方を覚えて便利さを享受すること
にしてる。中身は天才達が作ってるだろうから。
for_eachでのlambdaは秀逸だと思う。bindも
凄く使いやすい。
便利だけど特別分かりやすいとは思わなかったな
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 ...
というように、バイナリが変わってしまっていました。何がいけないのでしょうか??
16進の文字列から数値に変換→書き込み
でおk
>>191 static const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, };
fout.write( data, sizeof(data) );
194 :
デフォルトの名無しさん:2008/01/03(木) 02:58:56
これからは開発文字コード体系を
UTF−16ベースにしないと
プログラマーから嫌われそうだ
>>192 >>193 なるほど。こうすればよかったんですね。ありがとうございますm(_ _)m
・・なんか、いきなりあれですが。
今まで他の質問サイトでよく質問してたんですが、ここの方が返信早いし、
しかもここの人たちはポイントもらうためとかではなく無償で教えてくれるんですよね。。
なんかしんみり嬉しくなりました。また行き詰ったらご教授願いたいのでよろしくお願いしますm(_ _)m
>>197 よそから使う必要がなければ、見えなくするためじゃないか。
>>198 いえ、なんてーか、グローバル変数でstaticなら、それも理解できるんですが……
これ、関数内の話ですよね?
>>199 それって、constじゃないんですか?
>>200 constだけだと関数内では「書き換え不能」って意味だけじゃないかな?
staticがついて定数になったと思うけど。
組み込みなんかだと値をROMに収めるためにはstatic constを指定してやらないと駄目だったような・・・
C++が使える組み込みなんて少ないかもしれないけど
んーとねstaticはスタック上に領域確保するのを防ぐ狙いがあったよーな
確保した領域に値をコピーする手間が省けるのでメモリと処理時間の節約になるっぽい
スコープが関数内に限られた外部変数って考えるといいっしょ
でもmain関数内の変数ってコンパイラにもよると思うけど実質staticじゃなかったっけ?
私の理解が間違っているかもしれませんが……一応確認
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の理由については初めて知りました。
よろしければ、参考文献などを教えていただけないでしょうか?
お願いいたします。
>>203 書き換え不能の「変数」と「定数」の違いがある気がすると思って書いたんだけど。
そこまで詳しくないから間違ってるかも。
Googleで「c++ const 定数」あたりでぐぐれば?
205 :
193:2008/01/03(木) 16:27:08
組み込み屋なので、こういう場合static const にしちゃうんだよな。
>>201と
>>202(最後の1行はよく知らないが)の言うとおりだよ。
非static 非const →書き換え可能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。
非static const →書き換え不能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。(処理系により異なるかも?)
static 非const→書き換え可能な静的領域に配置。プログラム開始時に一度だけ、ROMから静的領域へのコピーが発生する。
static const →書き換え不能でROMに配置。コピーは発生しない。
>>203 staticが外部からアクセスできないんは文法上の話
メモリ上に変数の領域が確保されてるんやからアドレス渡せばアクセスできるんよ
>>204-206 なるほど……色々と教えてくださってありがとうございます。
どうも、組み込み系の話が必要になってきそうですね。
そこら辺の文献でも読んでみます。ありがとうございました。
このスレには滅多に書き込まないけど、ずっと読んでる。
ホントためになる話が多いよな。各人の知識経験に感嘆するぜ。
初心者向けのCの本を一冊読み終わり、問題もだいたい解けるようになりました。
次に難し目の問題集を買って、それをクリアーしたらC++に移ろうと思います。
しかし、本を読んで理解して・・・の繰り返しでモチベーションが萎えて来ました。
僕は独学でパズル感覚でプログラミングの勉強をしているので
CあるいはC++を使ったら何が出来るのかということが、ちょっと想像がつきません。
そこで
■ この言語で何(どういうモノ)が作れて、
現実にはどういう場で役に立っているのかというのを教えていただきたいと思います。
よろしくお願いします。
C/C++は汎用性高すぎて組み込みからサーバ、GUIアプリケーションまで色々としか‥‥
とりあえず「こんなソフト欲しい」って思ったら自作してみるといいお
>>209 何ができるのかというと、何でもできるということになる。
目標がC/C++の勉強だけだと気力も萎えるだろう。そういう時は、何でも良いからアプリを作るのが一番。
釣りな感じもするけどまぁいいか。
実用的なプログラミング言語だと、言語によってできることできないことにはほとんど差がない。
どちらかというと環境の差だったり環境が用意されているかの違いの方が大きい。
なので、コンピュータ上でできることはほぼ何でもできる、と言ってよい。
でも、これだとあまりうれしくない返答だよな。
どれだけ低レベルな処理が可能かというのについては多少差があるけど、C / C++ はその方面では強い。
具体的には、オペレーティングシステム(Windows とかね)や、組み込み系(電子機器の制御、マイコン等)の
プログラミングに使われたりもする。
逆に言うと C / C++ そのままだと基礎的すぎて、ライブラリとか使わないと凝ったこと、派手なことはさせにくかったりする。
ということで、提案としては、
・OpenGL, DirectX とか使って、ゲームとか 3D CG 系で遊んでみる。
・(英語があまり苦にならなければ)
http://online-judge.uva.es/problemset/ で問題を解いてみる。
(ACM国際大学対抗プログラミングコンテストの問題集でオンラインで判定もしてくれる)
あたりかなぁ。あるいは宿題スレの回答者になってみてもいいかもしれないよ?
>>209 本を読んで理解することは非常に重要だが、実際に組んで動かしてみるのはもっと重要。
理解を深める意味でも、モチベーションの意味でもな。
あと、言語だけでなく、データ構造とアルゴリズムの勉強は欠かさないように。
パズル感覚なら楽しめるはず。実践の題材を見つけることもできると思う。
題材はGUIアプリで見た目にこだわるより、
CUIでいいから、内部動作にこだわると良い。
>>212 C++が使える環境ではC++で書きたいな。(あくまで希望)
言語を覚えたからどうこうというのがそもそもおかしい
何か目的があって言語を覚えたんじゃないのか
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();
}
>>210 >>211 ありがとうございます。
アプリを作る方向で考えてみます!
>>213 ありがとうございます。
英語は、雰囲気でわかりますw
実践的な問題を解いてみるのは、楽しいと思います。
頑張ります。
>>214 ありがとうございます。
データ構造やアルゴリズムは、読んでて楽しいのでどんどん勉強したいと思います!
>>216 いや、暇つぶしです。
今、フリーター〜無職なんで、何かやってるアピールを親にしないと・・・
哲学とか、医療問題とか、どうでもいいものをいろいろ勉強してました。
昔、ウェブサイト作ってFLASHのACTION SCRIPTやJAVA SCRIPTとかをいじるのが好きだったんで
全く違うけどパソコン関連ってことでCをやってみたら楽しかった・・・って感じです。
>>217 何やらヒゲのおじさんが微笑んでますが
参考になりそうなサイトですね。読んでみます。
ありがとうございます。
221 :
デフォルトの名無しさん:2008/01/03(木) 20:03:21
質問させてください。
当方、すでに出来上がっているプログラムに追加・改変して別のプログラムを作るという授業を受けている学生です。
VisualStudio2005、C++で開発しています。
ちなみに、授業を受けている割にはC++についての知識は皆無です。
今作っているのはノベルゲームのような物です。
文章を表示して、キーを入力すると次の文章を出力する、という動作を行いたいのですが、キーの入力を受け取ると、文章が一気に進んでしまいます。
これを防止する為にキーが入力されても一定時間無視するという処理を行いたいのです。
そこで皆様にお聞きしたいのですが、キーの入力(OnKeyDownで取得)を一定時間(例えば10ミリ秒)無視するためにはどのようにプログラミングすれば良いのでしょうか?
わかりにくいかと思いますが、どうかよろしくお願いします。
if( 一定時間 != true )
{
キー入力;
}
そもそも一気に進んでしまうのがおかしいのでは
何をクラスにしたらいいのかの指針をください
何をしたいのか書かないとエスパーじゃなきゃ無理w
>>225 類似オブジェクトの共通特性を抽出してクラスにすればいい
「押されているかどうか」ではなく、「押された瞬間」を検知すれば、そういうことは無くなる。
>222も参考に、その方向考えてみたらどうかな。
>ちなみに、授業を受けている割にはC++についての知識は皆無です。
ここに誰もつっこまないのは何故だ・・・
教えようがないじゃん
論述形式の宿題とか?
>>229 そういうもんじゃない?
情報学科卒の生徒にHelloWorldから、とまでは言わなくても、
それに類する所から始めないといけない現実。
すでに出来上がっているプログラムって吉里吉里みたいな仕様になっているのか?
なんかよくわからんけどソースうpしてくれなきゃわからん
今日はものすごく調子が悪くてとても
C言語について調べる気がしないんですが。
誰かレスお願いします。
>>233 何かを限られた時間で作るときの目標として
ゲームにこだわる必要はないんですかね。
>>235 どこから「ゲーム」が出てきたんだ?
エスパーで答えれば
好きにしろ、人に聞くな、目標を立てるところからが勉強だ。
人生相談スレではありません。
ゲームといえば、ライフゲームとスタートレックかな。
>>212 >家電製品とかのシステムもC/C++で書かれていたりするんですか?
Cがほとんどだと思う。
ある程度メモリとCPUパワーに余裕があれば、C++も選択肢になるだろうな。
組み込みはC++が多い
組み込みC++ってそんな贅沢させてくれるのか?
Cがほとんどじゃまいか?
今は組み込みも(全体的に)だいぶ性能上がってるんじゃないか
コンパイラさえ対応していれば使うよ。
コストなんてどちらにせよコード次第。
組み込みは一回しか経験したことないけど、一応C++だったな
でもnewを使わなかったし、ベターCって使い方だったけど・・・
組み込み全く知らんのだけど、newを使わない事による組み込み的なメリットって何かあるのかね?
例外処理省いてバイナリをコンパクトに出来るとかそのあたりかね
newは例外投げるし。
性能は大分上がってるけど、16bit環境も珍しくないからな。
8bitは流石に見なくなったが。(やってるところもあるだろうが。)
C++でやるかどうかは、コストよりも政治的な要素が強い希ガス。
MDAツールが使える、といった明確なメリットがなければ、
Cで押し切られそうだな。
248 :
212:2008/01/04(金) 00:43:39
むーそうだったのですか。
ハードウェア言語?とかいうのを使っているのだと思ってました。
ありがとうございますm(_ _)m
>>245 メモリが少ないのでヒープが小さくなる。その結果newに失敗する可能性があるとか
リアルタイムが要求される場合に遅いとか?
>>245 普通のnew/deleteは、空き領域の断片化によってメモリ不足に陥る可能性がある。
例外はコンパイルオプションいじらないと普通は投げないんじゃないかな。
代替策として、静的確保した領域にplacement newしたり、
断片化しないように制限を付けたメモリ管理を取り入れたりと、工夫してる。
携帯電話みたいにOSが入ってる環境ならnew(mallocも)とか使うだろうけど
IOから自分で実装するような組み込みならまず使わないと思うよ。
環境によっちゃRAMやスタックの使用量を監視しながらデバッグすることだってあるし。
C++で組み込みっつったらBREWとかしか思いうかばんなぁ
>>252 組込みのソフトが何で開発されたか、なんて普通表に出てこないから。
詳しくは言えないが、おまいらの目に触れるところで
C++(全部ではないが)使って作られたもの知ってるよ。
日立(ルネサス)のはC++コンパイラだったな
【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回温度を測定するプログラムです。
現在の時刻を取ってきて、Sleepで寝かせる時間を計算すれば良いんじゃないかな。
>>255 cron使うわけにはいかないの?
どうしてもプログラム内で完結したいなら、alarm()かsetitimer()だろうね。sleep()でもできなくはないけど。
残念ながら、alert()なんてのは知らん。
>>256-257 レスありがとうございます。
やっぱりそうなりますか。
alertじゃなくてalarmでした。
そもそもcronのソース読めばいいじゃないか
それはめんどくせえじゃん
そもそもcron使えばいいじゃないか。
>>255 引っ越す前から見てるんだけど
時間の分解能を定義してないのはなぜよ?
sleep とか alam でやれば当然誤差累積だし…
精度とか確度とかって数学の時間に習わなかったか?
何で偉そうなの?
266 :
255:2008/01/04(金) 17:22:32
>>263 引っ越し前からの長期に渡る応援ありがとうございます!
精度は1秒あればOKです。
sleepにせよ、alarmにせよ、
仕掛ける前にtime_tを取ってきて、
それから逆算してやろうかなと思っててわざわざ書きませんでした。
数学は得意です。
自分で微分を発明しました(`・ω・´)シャキーン
ライプニッツもしくはニュートン乙
凄い奴が書き込んでたんだな。しかも前スレから。
いや、>255が他のスレから移動してきただけのことだろ。
度忘れしてしまったので助けて
引数にポインタをとる関数があるのだが
このポインタのアドレスを自動変数のものに書き換えるのはNG
このポインタに自動変数を代入するのはOK
でいいんだよね
寝ぼけてるから日本語でokになってしまったorz
a(int* p)
{
int local = 10; //適当
p = &local; //NG
*p = local; //これはどうだったっけ?
}
>>273 //これはどうだっけ?
OKだよ。 ってか、なんでこの程度の事が分からん。
//NG
これの理由は説明できるか?
>>273 *p = local; //これはどうだったっけ?
問題ない
pの指す領域に10の値が代入される
pがもつ10の値と、localが持つ10の値は、それぞれ別の領域に格納されている状態になる
よくわからんが混乱してしまった、最近疲れてる予感orz
あれだ、auto変数は関数から脱出した瞬間ナイナイされちゃうからな
するとポインタpは意味の無いところを示してしまうのでエラーになるんだ
文字列から指定の文字列を省いて他の変数へコピー
例えば
文字列が入った変数 MOJI[]="aaabbbccc\0" 指定の文字列="bbb"だと
MOJI→他の変数へaaaccc\0をコピー
できれば
aaabbbccc→ポインタ使ってMOJI自身をaaaccc\0に
ってしたいんだけど、どのようにすればいい?
ドゥアブルポイントゥアァァァァ
strstrでbbb探してbbbのに続くバイトをヌル文字まで一文字ずつ前にコピー
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"に変更済み
>一文字ずつ前にコピー
馬鹿がいる。
>char tmp[strlen(a) + 1];
c99使いがいる。
# つーか、一時領域要らないだろw
283 :
281: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));
}
>>283 いや、未だc89じゃ通らないし。つーか、char const * pじゃなくてchar * pだろよ。
>>283 strcpyでコピー範囲が重なってるから動作が未定義になるぞ。
さらに指定の文字列は複数回出現する可能性も有るから・・・
さらに言えば指定文字列を取り除いた後に前後の文字列がくっついて取り除くべき指定文字列になる可能性も。
ex. aabbcからabを取り除くとabcになって再度abが出現。
ありがとう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);
}
strcatも未定義動作になるから止めれ。
>>276 ポインタpも関数から脱出した瞬間ナイナイされるので安全。
strcpy()で、前方への移動ができない実装ってあるんかいな。
未定義には違いないけど。
>>273 >p = &local; //NG
これもOKだよ
よく考えろ、pもローカル変数だ
>>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;
}
>>292 そういう話をしてるんじゃないと思うが。
何が「ほう?」なんだか。
>>292 君が何を言いたいのか分からない
要するに、そのコードがどうした?
何か問題でも?
>>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
297 :
292:2008/01/05(土) 15:00:49
ごめん、俺が悪かった。物凄く勘違いしてたらしい。いじめないでくれ。
ローカル変数のポインタをリターンするときに注意が必要なんだっけ?
あれ?戻った先で使おうと思っても残ってる保証がないんぢゃ? > 298
そうだね。
int* f()
{
int a = 10;
return &a; // NG
}
特に構造体とか大きいものを返したいときに、
コストを避けようとしてやってしまう人もいるかも。
素直に値で返すか、引数に格納先のポインタを貰うべし。
そんな時のための動的確保ですよ > 300
>>300 動的確保するならauto_ptrですな。
std::auto_ptr<int> f()
{
return std::auto_ptr<int>( new int(10) );
}
ヒープ領域に確保されるから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度行う方法は分かるのですが、片方を固定した場合どのようにすべきでしょうか。
TCHAR (*hoge)[260];
hoge = (TCHAR (*)[260])malloc(sizeof(TCHAR)*260*num);
sizeof(TCHAR)*260
を
sizeof(hoge)
にするとどうなる?
あるいは
hoge = (TCHAR (*)[260])malloc(sizeof(*hoge)*num);
typedef すると分かりやすいよ。
typedef TCHAR Path[MAX_PATH];
Path *hoge;
hoge = (Path *)malloc(sizeof (Path) * num);
310 :
304: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の方が分かりやすいですね。
型宣言の * は間接参照演算子とは別物。
>>310 TCHARはマクロでワイド文字(wchar_t)とマルチバイト文字(char)を切り替える
VCならプロパティからUnicode文字セットを使用するようにすればワイド文字になる
後"test";は_T("test");もしくはTEXT("test");って書くように。そうすれば切替の対象になるから。
構造体にすると見慣れた形になる。
typedef struct { TCHAR str[260]; } Path;
Path* hoge = (Path*)malloc(sizeof(Path) * num);
煩雑かな。
なんて言うかポインタの配列と多次元配列へのポインタを勘違いしている様な希ガス
int *p[10]だとint型のポインタが10個あるポインタの配列
int a[10][10]とかの多次元配列へのポインタなら int (*p)[10]
C言語で何か分かりやすいプログラムはないでしょうか。
helloworld
int main(){
return 0;
}
多分これが一番分かりやすい
C++Builder 6でコンパイルした後
printfでテキスト文を表示したいんですけど
どうすればいいんでしょうか。
実行すれば良いんじゃない。
日本語をコマンドプロンプトや「メモ帳」で表示させたいです。
できれば背景が白い所に分かりやすく表示させたい。
マジレスきぼんぬ。
コマンドプロンプトの配色を「白地に黒文字」に設定
#include <stdlib.h>
system( ); で、適当に
コマンドの命令だが、
color F0
とか
#define color(x) printf("\033[%dm", x + 30);
MS使用だったかも知れないが。
system("notepad.exe puni.cpp");
詳しくは調べて
324 :
304:2008/01/06(日) 02:57:35
>>314 それを観て何となく納得出来ました。
キャストが初めて観るので、もうちょっと弄ってみます。
レスくれた皆さんありがとうございました。
動的メモリの解放がいまいちよく判りません。
以下の(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[] の様な気もしますが、
判る方がいましたらよろしくお願いします。
>>321 ファイルに出力した後にそのファイルを開けばいい。
fp=fopen("test.txt","r");
fprintf(fp,"hoge");
fclose(fp);
system("test.txt");
>>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;
>>321 >>318でエディションがPersonal以外ならOutputDebugString。イベントタブに出力される
329 :
325:2008/01/06(日) 08:55:02
>>327 レスありがとうございます。問題が解決しそうです。
どちらの delete でもコンパイルが通っちゃうから自信が持てない・・・
>>315 全然関係ないが、自分が一番最初に見たC++のサンプルはこれだ。
#include <iostream>
int main(int argc, char *argv) {
std::cout << "Hello World !" << std::endl;
return 0;
}
ついでに、一番最初に聞いたクラスの説明は
猫も人もみな哺乳類なのです
だ。
>>330 mainの引数もまともに書かないとは、悪いサンプルだな。
俺はこれだった・・・
static char _main[] = { 0x81, 0x21, ...., 0x21 }
PDPほにゃらら専用とかかいてあった
最近Win32APIを使ったソフトを作り始め、色々とサンプルを見て回ってるのですが
多くがひとつの.cppファイルにまとまってるようなコードや、グローバル変数が多いソースで、
それを元にコードを打ち始めたらひとつのファイルに何千行というコードが入り、設定情報
をグローバル変数で共有するような気持ち悪いコードになってしまいました。
Win32を用いたコードでうまくOOPの概念を取り入れて、出来るだけすっきりとしたコードを書きたいのですが、
なにかアドバイスがあればご教授願います。
APIを直接呼ぶんじゃなくて、APIを包み込むクラスかしてから使う。たとえばファイル関係のクラスを作って外からAPIを見えなくする。
>>333 Win32API 直叩きじゃなくて、MFCや.NET Framework使ったほうが良いよ。
MFCや.NET Frameworkみたいなのを作りたいんだろ。
SDLとかwx使おう是
VCLも愛して
暇だしVCLをC++に移植するか
340 :
333:2008/01/06(日) 16:30:59
皆さん ご回答ありがとうございます。
どうやらMFCってのがうまくAPIを纏めているようなのでそれを使いたいと思います・・・
>>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);
>>343 いや、少なくともfor文はいらなくね?advance使えば?
というより、こういうのは思いっきりtemplateの出番だと思うんだが。
>>343 そもそもデータ構造を
struct Hoge {
double d; int n; string s;
};
vector<Hoge> hoge;
とできないの?
ちなみにvector<>::iteratorはランダムアクセスできるので
AAA.erase(AAA.begin()+index)でOK
>>344 >>345 ありがとうございます。
既にクラスの階層構造を何段か組んでいるので、これ以上階層化するのは避けたいと思いまして。
最後の1行の場合、indexがint型だからコンパイルエラーにならないでしょうか?
>>346 RamdomAccessIteratorなら加算がオーバーロードされてるからおk
348 :
343:2008/01/06(日) 19:35:53
まずはこの方法でためしてみます。
AAA.erase(AAA.begin()+index)
>>347 重ね重ねありがとうございますm(_ _)m
#include <stdio.h>
から始まる基本関数で
何か表示する物はあるんでしょうか。
Random Access Iteratorだから
AAA.erase( AAA.begin() + index );
BBB.erase( BBB.begin() + index );
CCC.erase( CCC.begin() + index );
でいいんじゃね?
printfとか簡単な関数でもいいんですが。
コンパイラの設定でブリーダーができません。
質問はコミュニケーション言語日本でお願いします。
これからテンプレートの勉強を始めようと思っているんですが
テンプレート:クラスみたいなもん
STL:テンプレートのあつまり
みたいな認識ってまちがっていますか?
関数テンプレートの使いどころというか選択についてです
気にしなくて良いレベルなのだと思いますが
引数にaとbを取り、大きな方を返す関数テンプレートがあったとします。
この場合、大きい値を返す関数のint用のものfloat用のもの・・・・といった具合にたくさんの関数を用意するのとでは
どちらが良いのでしょうか?
ここで関数テンプレートを使うとなんというかもったいないというか処理が無駄に大きく膨らんでいる気がしてならないです
今すぐに想像はできないのですが、ここでいう大小を比べる程度のものでなく、もっと大きなものならば関数テンプレートが有効だとは思います
大事なところがorz
つまり処理数が多いものならば関数テンプレートを利用した方が良い、などの明確だったりしないまでの決まりのようなものはあるのでしょうか?
>>356 何で?
ぜんぜんもったいなくないと思うけど。
呼び出されてる型のものだけが具体化されるから
効率的だと思うし、実際std::maxテンプレートはあるじゃない。
>>356 >int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
これが面倒じゃないと思うならがんばれば?
360 :
356:2008/01/06(日) 20:41:07
>>358 ありがとうございます
そうですよねorzもったいないと感じている自分がおかしくてならないです
積極的に使っていこうとおもいます
だから、std::max()を使えってば。
>>360 おかしくないです。出てくるコードの大きさを見積もることは必要なことです。
>>356 >int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
保守性を考えるとこの考え方はは良くない。
バグがあったら全部直さなきゃいけないし、直し忘れが出てくる可能性がある。
ステップ数が少ない場合でも、バグが出るときは出る。
こういう場合を想定してテンプレートが出てきたわけだし。
templateを使うとexeがバカでかくなるって言うアホがいるんだよな
俺も会社でよく言われるんだわ
そういやテンプレートを使う機会が無い
仮にばかでかくなったとして、どのぐらいのサイズなら問題だと感じるんだろう……
環境によってさまざまだろうね。
組み込み環境なら結構致命的になりかねん気もするけど、それならC++にするメリット少ないし。
一般的なソフトウェアならCDやDVDに入りきらなくなったらとかじゃないのかな?
仮にテンプレート使わなかったとしても、
似たような物作るわけだしな。
>>365 昔のコンパイラは知らないけど、信じがたい。
具現化されるのは自分で呼び出してるものだけだから。
インライン化とか別の理由で大きいんでない?
それともテンプレート使わなくても、もともとバカでかく
なるプログラムかもしれん。
>>370 大きなクラスを丸ごとテンプレートにしたんじゃないか?
オブジェクトファイルのサイズだけ比較すればずっと増えるんじゃね?計ったことないけど
373 :
デフォルトの名無しさん:2008/01/06(日) 23:01:42
VC++2008express editionでコンソールアプリケーションを作れるか実験してみた結果
できませんでした。
どうしたもんでしょう。
それだけじゃ、何が起こったのかサッパリ
C言語の質問なんだが。
持たせたファイルポインタからファイルネームを得たいんでファイルポインタからメンバーを見てみたら
tmpfnameってのがあったけど、このtmpfnameってそのファイルの名前と考えておk?
あと、これって環境依存?
環境依存
FILE構造体の中身は処理系依存
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;
}
ポインタを関数に渡しているといってもポインタという値を渡してるだけ。
そのポインタを関数の中で書き換えてもmainじゃ影響されないから引数消して返り値使うとか、
ポインタのポインタを引数でとるかのどっちか。
>>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;
}
全く試してないけど、これでどうよ?
>>381 俺も全く試してないけど
>*a[1]=2.0;
なんか嫌な臭いがする。
優先順位、これでよかったっけ?
*a[1]は*(a[1])だったはずだな。
やりたいのは(*a)[1]か?
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]);
}
その後で↑の状態に戻してからビルドして実行すると最初と同じなのにエラーが出なくなっている
こういったことが起こるのはどのような理由でしょうか
すべてのソースを貼り付けるとか
エラーの内容を書くとか
そういう努力をしないとエスパー以外答えられないと思うよ
エスパーしてみる。
ファイル内に改行があってfscanfが2回目以降読み込みに失敗している。
多分初期化忘れ。エラーが出ない方はたまたま
390 :
デフォルトの名無しさん:2008/01/07(月) 05:17:35
>384
優先順位って難しいね.
みんなちゃんと覚えてるの?
391 :
デフォルトの名無しさん:2008/01/07(月) 06:18:31
別スレから誘導されて来ました。
改めて、こちらで質問させて下さい。
まず、フラッシュメモリにデータを書き込みます。
そしてそのデータが書き込まれたセクタ?(アドレス?)を取得する方法ってありますでしょうか?
誰だよ、誘導したのwここでもスレ違いだろw
少なくともCレベルじゃメモリアドレスしかわからんだろうから無理じゃね?
OSレベルの話になるね。
>>392 そうですか…
かなり難しいようですね…
環境は、Win32(XP Pro) + VC++ なんですけど…
DOS 時代なら INT 25H(アブソリュートディスクリード)使えば何とかなると思うけど・・・。
395 :
デフォルトの名無しさん:2008/01/07(月) 07:22:43
396 :
393:2008/01/07(月) 07:56:40
>>394-395 助言ありがとうございます。
がんばって調べてみます!
とりあえず、395さんの紹介して頂いたページを見てみたいと思います。
>>390 自信ない使い方をするときに括弧使えばいいだけだろ。
>>390 考えるのがめんどくさいので、常に括弧付。
可読性も向上。
>>398 int a = (b + (c * d)) - e;とか書くの? 却って可読性が落ちる希ガス。
lispに慣れてればどうということはない
>399
煽りとしてはどうかなあ?
素朴な疑問だろ?
左結合か右結合か、考えるの面倒だよね。
だからきっと、
a = (b = (c = 0));
って書くんだよ。
404 :
デフォルトの名無しさん:2008/01/07(月) 14:43:30
>>399 ぶっちゃけa = b + c * d - eよりはよっぽどわかりやすい
俺は
a = b + (c * d) - e
だな。
順読み以外は括弧付ける派。
a = c * d + b - e
b,c,d,eの順序に意味がある場合の話だろうjk
質問があります。
今C言語を勉強しようか考えている所なのですが
これを学ぶ事によって、ボンバーマンのようなゲームは作成可能でしょうか?
また作れると仮定しまして、C言語よりボンバーマンのようなゲームを作るのが
簡単な言語はありますでしょうか?
もしよろしければ教えてください、お願いします。
410 :
デフォルトの名無しさん:2008/01/07(月) 15:52:46
>>408 どんな言語でも何かを作る時apiや構文等の知識は必要となり
簡単ていう概念はとっぱらったほうがいい。
どんなもんでもある程度確立した物を作るのはめんどうなもんだ。
誘導ありがとうございます。
簡単と言う発言は軽率でした
言語にも向き不向きがあるかと思ったので、
より作りやすいと言う意味でした
それでは誘導先に行ってきますので、
こちらでの質問は取り下げさせてください
412 :
デフォルトの名無しさん:2008/01/07(月) 22:33:27
藤原紀香相手に中だしSEXするよりは簡単だろう
C++の標準I/Oライブラリについてですが、
basic_istream<>やbasic_ostream<>はbasic_streambuf<>
を利用してバッファ入出力を行ってますが、継承はして
ないですよね?basic_istream<>やbasic_ostream<>は
コンポジションとしてbasic_streambuf<>を保持してるのですか?
.jpgとかをいじるのは古いプログラムなんですかね。
417 :
デフォルトの名無しさん:2008/01/08(火) 03:01:57
入力がEUCで漢字コードを検索したい場合、どうやればいいんでしょうか?コンパイラはシフトジスが基本みたいです
>>415 「いじる」ってのをどういう意味で使ってるのかよく分からんが
JPEG<=>ビットマップの変換は古いというか普通ライブラリを使う
419 :
デフォルトの名無しさん:2008/01/08(火) 04:01:05
int iskanji(int c)
{
return (0xA1 <= c && c<=0xfe)
}
std::vector<int[10]>みたいなことをやりたいのですが、ベクタのベクタにするか、
メンバ変数に配列を持つ構造体のベクタにするしかないんでしょうか
>>419 EUC の1バイト目はもうちょっと範囲広いし、
3バイト文字も存在する。
どこのEUCだか。
>>420-421 int[10] は要素数 10 の int の配列型だよ。でもコピーコンストラクタや代入演算子が
使えないんで vector には入れられない。 >420 の言うような回避方法が必要。
バイナリのデータを1バイトづつ読み込んでいって、FFといデータの前に
次の値を書き込むというのをやりたいんですが、こういったことをやる場合、
ifstreamで読み込んでいってデータを見つけたら位置を取得→
ofstreamを使って取得した位置に書き込みという風にやらないといけないのでしょうか?
>>425 C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
データの挿入もこれに当てはまる。(ただし元の内容の後ろに追記はできる。)
ってことで新しいデータを含んだファイルの内容を全部 ofstream に突っ込むことが必要。
>>420 std::vector<int(*)[10]>とか
>>425 入出力を別のファイルにしておいて、入力データが「FFとい」だったら
それを出力する前に「次の値」を出力すればよろしい。
一つのファイルでそれを実現するのは、(サイズが変わるのであれば)むずかしい。
>>426 >C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
いいえ。
430 :
426:2008/01/08(火) 13:23:52
ごめんよ。サイズの変わらない書き換え(上書き)はできるね。データの挿入ができないんだ。
>>426-430 ありがとうございます。勉強になりました。
バイト配列にデータを全部読み込んで、配列をFFの一つ前のデータまで書き込んで→
新しい値を書き込んで→残りの配列を書き込む という方法でやりたいと思いますm(_ _)m
>>431 istreambuf_iteratorとostreambuf_iterator使うと簡単にできそうだな。
速いし。
webカメラ(usb接続)のドライバの取得方法と、
プログラム内でそのドライバを作用させる方法をご教授願えないでしょうか
環境は.net 2003 c++です
ドライバ直じゃなくて普通はDirectShow経由じゃね?
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>>(……
ここで詰まったのですが、どう書けば良いのでしょうか。
それとも>>のオーバーロードだけすれば済むような単純な話ではないのでしょうか?
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を使用してコンパイルを成功させるには環境をどのようにすれば良いのでしょうか。
無い関数は作る!
勉強になるから作ってしまおう
439 :
437:2008/01/08(火) 21:18:41
すみません。目的としては他の人が作ったソースをコンパイルすることなのです。
使用するソースコードは既に用意されているので、(非常に長いソースコードです)
できればソースコードをいじらないでコンパイルしたいのです。
>>439 まずどの環境のどのコンパイラをターゲットに書かれたソースか調べる。
>>439 別のファイルに関数を作ればいいから、ソース変更しなくてもいいよ。
443 :
433:2008/01/08(火) 22:40:06
>>434 VFWを使っていますので残念ながらDirectShowを使うことができません
カメラをUSBポートから引っこ抜いてから再度差し
カメラを動作させるといったことをしたいのですが…
C++で、比較的大きくてかつ静的な連想配列を宣言したいんだけど、
ソースコードにどうやって埋め込むのがスマートでしょうか??
class Hoge {
public:
const std::map<A, B>& GetMap() {
static Hoge singleton;
return singleton.m_map;
}
private:
Hoge() {
// ここで初期化
}
std::map<A, B> m_map;
};
こんな感じか?
>>330 それを実行するのにはコンパイラには何か必要なんですかね。
>>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 が参照)
となり、やはりだめです。。
もうにっちもさっちもいきません。どなたかアドバイスお願いします
#include <windows.h>
コンパイルオプション -W
>>448 よく分からんけど先頭行に
#include<windows.h>
でいけるかも
>>444 ソート済み const 配列の形で定義して、 lower_bound() とかする関数を
インターフェースとしてかぶせとけばいいんじゃない?
452 :
448:2008/01/09(水) 02:06:46
説明不足ですみませんでした。
とある参考書を使っていて、「DxLib」というファイルをインクルードして
進めていくらしく、それで#include"DxLib"となっているみたいです。
>>449-450 れすありがとうございます。
#include<windows.h> としたんですが、同じエラーがでました。
コンパイルオプションってどうやっていじるんでしょうか。
BCC developerのプロジェクト設定で
●コンソールアプリケーション(-WC)
Windowsアプリケーション(-W)
というようにチェックするところがあるんですが、
このことですか?
あたりが付いてるならとりあえずやってみてから質問してはどうか
454 :
448:2008/01/09(水) 02:16:38
やってみたんですが、だめでした。
根本的に間違ってるんでしょうか
457 :
448:2008/01/09(水) 02:54:28
>>456 ありがとうございます!
さっそくやってみます
2008じゃだめなん?psdkも一緒にインスコできるぜ
460 :
デフォルトの名無しさん:2008/01/09(水) 03:56:03
ポインタの基本的なことなのかもしれませんが、良く分からず悩んでおります。
2次元、3次元配列をポインタにキャストして操作したいのですが、
以下のような操作は問題ないのでしょうか?
int* hoge = (int *)new int[2][3];
例えば、上のようにcastして、1次元配列のint[5]と同じように
操作しても問題ないでしょうか?
C++のブースト以外のプログラムってないでしょうか。
意味が分からないぞw
ライブラリのことならそりゃいっぱいあるよ
>>460 CもC++も配列はあくまでも一次元。(多次元と表現するけど。)
今の場合は、int[3]を要素として二つ持つ一次元配列だから
int (*p)[3] = new int[2][3];
だと思う。
>>461 断言できないが、簡単に試したら、問題なかった。
でも、気持ち悪いので、出来るだけキャストはやめて欲しい。
466 :
460:2008/01/09(水) 04:23:49
>>461 >>464 >>465 みなさんありがとうございます。
できれば変なキャストはさけたいのですが、
呼び出さなければいけないDLLのメソッドが
int * で待ってまして、どうやって2次元配列、3次元配列を渡せば
よいのか悩んでおります。
(ちなみにFortranのDLL)
いちおう上のようなやりかた
int* hoge = new int[2][3];
で渡して動作しているよう?なのですが、
なにか動きがおかしいようです・・
メモリ的にはint[5]と同じなので、問題ないのかな?
とも思うのですが・・
2 * 3 = ?
468 :
460:2008/01/09(水) 04:41:41
469 :
460:2008/01/09(水) 04:47:58
>>466 int (*p)[3] = new int[2][3]; にして&p[0][0]を渡せばいいんでない?
キャストしないとコンパイルエラーだし、コンパイルを通すための無理やり
キャストは正直気持ち悪い。
int* hoge = (int *)new int[2][3];
いや待てよ。上の場合だと
delete [] hoge;
が未定義動作になる可能性がなきにしもあらずな気がしないでもない。
大丈夫かもしれんが移植性と規格を考えたら、
>>470のほうが安心だな。
472 :
460:2008/01/09(水) 05:39:13
>>470-471 ありがとうございます。そちらの方がやさそうですね。
ためしてみます。
ちなみに3次元配列の場合は
int (*c)[2][3]= new int[5][2][3];
のような感じですよね?
473 :
460:2008/01/09(水) 05:39:46
「よさそうです」の間違いでした。
最初から1次元配列で確保しておいて、オフセットを調整した方がいい希ガス。
オフセット計算用にこんな関数でも用意して。
static int offset(int w, int x, int y) {return w * y + x;}
>>448 俺は前にbccでWinMainの引数型不一致でコンパイル通らなかったことがある
詳しいことは忘れたが第三引数がTだったような、違うかったような
スレ違いかもしれませんが7-zip32.dllで
自分で作ったデータを直接zipで保存する方法分かる人いませんか?
具体的に言うと
自分で作ったデータをファイルとして出力→7-zipでファイルを指定して圧縮 はできるのですが
圧縮範囲をポインタで指定→ファイル名を指定して書庫作成 ができないのです。
>>477 ファイルアーカイバで、ファイル以外のものをアーカイブする機能があるとも思えないが。
そもそも、なんでファイルに出力しちゃいけないの?
>>478 数が多いので出来ればいちいちアウトプットしたくないんです。
最悪 ファイル出力→書庫作成→ファイル消去
ってしようと思ってます。
やっぱりこういったdllには基本的にないんですかね?
圧縮したいだけならアーカイバのDLLを使わないで圧縮ライブラリ使ったら?
そのとおり
>>479 7-zip32.dllのAPIリストを流し読みしてみたが、メモリソース展開用の関数は無いっぽい。
出力先はメモリで受け取れるみたいだけどなw
480が言ってるようにzlibなりを使うのも手。
(その場合他のアーカイバと互換性を持たせるのは少し面倒だが)
あとは7-zip32.dllのソースをいじってメモリソース対応版を作るのも良いかも。
該当箇所を探すのが少し面倒だろうけど。
軽く調べたら7zip(7-zip32.dllではなく、本家のほう)のcommon/StdInStream.h .cpp
を修正すればメモリソースに対応できると思う。
あとは自分で調べるか詳しい人に聞いてね
統合アーカイバDLLってのは、基本的はファイル経由ばかりかと。
極端に言えば、昔の(今もあるけど)コマンドラインインターフェースを
そのままDLLに渡して動かすために作られたようなものだから。
各DLLに共通の操作を実現させるために、基本的な処理が中心だし。
だから、その元になるものを参考にすれば、大抵はオンメモリの操作になる。
例えば、TAR32.DLLではなくてzlibを使うとかね。
全てにそういうのがあるわけじゃないだろうけど。
485 :
デフォルトの名無しさん:2008/01/09(水) 17:44:08
>>463 ライブラリ詰め合わせとかがあると便利なんですけど
誰かマジレスお願いします。
>>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;
}
>ライブラリ詰め合わせ
そりゃいくらでもあるぞ。目的も環境も判らんからなんとも言えんが。
>>485 割とまじめに答えたんだがな
存在するなら
欲しい機能名 ライブラリ
で適とーにぐぐれば見つかるだろ
いろんなライブラリが片っ端から詰め合わせてあるのが欲しいとか?w
ねーよwwwww
アーカイバの展開なら00AM型Susieプラグインがメモリストリームからの展開サポートしてるのにね。
FILE_ATTRIBUTE_TEMPORARYを付けてCreateFileして、
Windowsにバッファフラッシュされないことを期待。
>>488 ここ2、3年新しいライブラリとかは作られていないんですかね。
携帯全盛期でほとんどプログラム終わってると困るんですけど。
キャノンの説明受けに行くのでちょとでも関係あることあればいいんですけどね。
「キャノン」って書いてる時点で
ぶっちけた話C++でformに写るようにするには
VBしかないんでしょうか。
画像表示さえできればボンバーマンくらいはすぐできるだろう
今ならjavaとかが手軽でいいんじゃないか
VC2005で簡単にゲーム作ってみようと思ったんですが、
getch()でキーコード受け取ったら、カーソルキーが全部224で判別できないんです。
これをどうにかして識別する方法を教えてください。
別にgetchに拘らなくてもいいですが、出来ればC/C++の標準ライブラリに入っているものだと嬉しいです
>>491 488が否定しているのは詰め合わせのようなものの存在を否定しているだけだぞ。
>>495 そもそも getch は標準関数じゃない
>>495 とりあえず「ゆきいるか」でググってLunaでも使っとけばいいと思う。
>>495 カーソルキーは二つのコードが送られてくる気がする
224 が制御コードで続くコードでカーソル方向が判別できるはず
501 :
495:2008/01/09(水) 21:31:18
回答ありがとうございます。getchって標準ライブラリじゃなかったんですか、初めて知りました…
>>498 あんまり外部のライブラリ使いたくなかったんです。ちょっと試しにやってみようかって程度だったので。
>>500 その発想は有りませんでした。試してみたら確かに取得出来ました!
new( _CLIENT_BLOCK, __FILE__, __LINE__)っていう文字列にトラウマがあって使いたくないんじゃね
>>493 ・CLI+Windows.Form
・VCL
>>502 ヘッダファイル内で new が置換されると困るだろ?
困るってのは、具体的に言えば operator new あたりが一番困る。
レスありがとうございます。おおよその目的がわかりました。
newを使うファイルでいちいち
#define new DEBUG_CLIENTBLOCK
を定義するのがめんどくさそうですね
それ専用のヘッダファイルを用意するとか。
最後にインクルード。
509 :
448:2008/01/09(水) 23:13:00
>>458 なにからなにまでありがとうございます。。いじくってみます。
>>476 そのへん調べてみます
STLにたどりつかねぇ、焦っちゃダメだ・・基礎がおろそかになる
511 :
476:2008/01/09(水) 23:54:28
>>509 すまん、今試したらTは何の関係も無かったw
何でエラー出てたんだっけな……
512 :
476:2008/01/10(木) 00:03:07
連投すまん、うちのエラーはLPCSTRでC++としてコンパイルした時だった(LPSTRならコンパイル通る)
つまり少なくとも
>>448みたいにCがついていないのじゃ関係無かったすまん
513 :
448:2008/01/10(木) 00:14:32
わかりました。わざわざ教えてくれてすいません
>>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がそのまま展開されずに残るって言う・・・
試してないけどね!!
以下の文字列があったとします。
AB AA ABCA BA BB
この中かからABCが含まれているか検査したいのですが
どうやって実現すればいいのでしょうか
strstrだとABCAのABCに部分一致してしまうので使えないと
思うので困ってます
文字列の最後に空白をくっつけて
ABC空白 で探せばよくね?
>>512 WinMainは<windows.h>のさらにどっか奥でプロトタイプ宣言が為されているので、
それと合わないとそういう風にエラーになってしまう。
519 :
519:2008/01/10(木) 01:44:30
書き忘れた。
多重定義にならず、エラーになるのはextern "C"が付いているため。
>>516 その例だと「AB AA ABCA BA BB」のなかに「ABC」という文字列はなかったとしたいのか?
だとするならばstrcmpでよくね?
521 :
520:2008/01/10(木) 02:01:15
書いた後に気づいた。char str[] = "AB AA ABCA BA BB";ってことか。
char * str[] = { "AB", "AA", "ABCA", "BA", "BB" };だと思った。
セパレータが固定されてるなら
>>517でよさそうだね。
ただし、後ろだけじゃなくて前後につけなきゃだめだけど。
オタだとばれない程度のプログラムってどんな物があるんでしょうか。
>>523 中途半端なプログラムではなく、きっちりしたプログラムならヲタだと思われない。
また、言語知識以外にも専門的な知識が必要になるプログラムなら確実に思われないだろうな。
たとえば、半導体のキャリア輸送をシミュレートするプログラムとか。
他には何かないのか。
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;
}
>>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
const忘れてるぜ
- 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つけたことなかったよ。どういう意味ですか?
笑ってしまっていいのだろうか……
笑えよ・・・
535 :
デフォルトの名無しさん:2008/01/10(木) 04:10:32
>>533,534
だんだん自分でも怖くなってきた。もしかして自分は、すごく基本的なことを
知らないとか言ってる?
.
>>528 そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
書き換えを伴わないメンバ関数は、全てconstメンバにしておくべき。
> 演算子のオーバーロードでそんなところにconstつけたことなかった
「演算子のオーバーロード」を「メンバ関数」に置き換えても、やっぱり同じことが言えるんだとしたら、
かなり基本的なことを学び損ねてると思う。
そうでないなら、まぁちょっとした誤解だから、すぐ知識の修正もできるだろうけど。
bool operator<(const &TYPE)const;じゃないとダメなのはpriority_queueの問題でしょ
あと
>そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
「constなオブジェクトからは呼び出すことができない」じゃね
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の微妙…という
コメントは、どうしてですか?
543 :
Gori: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回呼ばれる。
>>544 再帰関数の中で、再帰する前の処理をA、自分自身の呼び出しをB、再帰した後の処理をCとすると
その再帰は(ABC)になってるわけだろ。
で、ここのBをまた(ABC)に置き換えて…ってのを5回(4回か?数えるのメンドクセ。)やって
最後のときはBを消すって形で終わってるから最終的な形としては
(AAAAACCCCC)になる。
547 :
536:2008/01/10(木) 10:25:10
>>539 そうそう、間違えた。訂正感謝。
>>542 微妙。まともじゃない解説をしているサイトも検索されるから。
// 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の定義が必要という状態になってしまい、困っています。
こういった循環参照を避ける手法はないでしょうか?
質問させてください。
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でも同じでした。
改行が多すぎるとエラーが出たのでみずらくてすいません。
>>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
>>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*を保持)
552 :
548:2008/01/10(木) 13:17:57
>>550 レスthx
しかし、できれば書きたくないコードですね。
設計を見直した方がいいのかなぁ。
>>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"
標準偏差を求める計算式はどのようにしたらいいでしょうか?
ググレカス
レスありがとう御座います。
説明不足の部分がありましたので、補足させて頂きます。
実際この処理を使う場面では
//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の定義を公開して
キャストするしかないのでしょうか?
説明不足で申し訳ありませんでした。
>>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 <<
でやるにはどうすればよいでしょうか?
>>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);
...
}
としました。
うわ、ありえねぇ。
変数xが1〜6の間ならって表現したいなら
if(1<=x<=6){
でいいのでしょうか?間違ってるなら正しい方法おしえてください・・
if (1 <= x && x <=6) {
if (x >= 1 && x <= 6) ;
switch (x) { case 1: case 2: case 3: case 4: case 5: case 6:
>>565 xが整数じゃない場合もそれでOKなんですね? ありがとうございました。
これで課題が終わりそうです。
567 :
562:2008/01/10(木) 17:54:27
ありがとうございます、そのふたつはどっちでもいいんでしょうか?
1が前になったのは、質問者のをそのままコピーしたからだけど
別にどっちでもいい。
571 :
デフォルトの名無しさん:2008/01/10(木) 20:36:58
初心者です。
VisualC++ win32API
で、質問なんですが
VisualStudioでプログラムを実行したらちゃんと動くのに
exeファイルをクリックして実行するとフリーズしたりするのはなぜなんでしょうか?
572 :
448:2008/01/10(木) 20:42:18
きたーーーーーー
解決しました。
コンソールアプリ→WINDOWSアプリに設定を変えるタイミングが悪かったみたいです。。
申し訳ありませんでした
あと
>>456でもらったソースを貼り付ける必要がありました。
とにかく、おかげさまで先へ進めました。レスくれた人たち、まじでありがとうございます。
>>571 お前の書いたプログラムにバグがあるからだろうと思う
C言語に限ったことではないのですが、浮動小数点の変数で
float f = 1.0f
とすると、その変数型の可能な限り、1.000....となるのでしょうか
それとも小数点第2位以下は不定となるのでしょうか
>>574 精度の範囲で1.000...
ってちゃんとしてくれるよ1.0に関してはな!
早い返答ありがとうございます。
どういう場合に、まずいことが起こるんでしょう?
サンプルコードを見ると、1.fなどはほとんど無く1.0fという数字ばかりなのですが、
もしかして関係してるのでしょうか。
0.1 とか2進数で無限小数になるから途中で打ち切られる。
1.f と 1.0f に特に違いは無いが、
言語によっては . で終われない場合もあるので
1.0f で慣れておいた方が良さげ。
578 :
562: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");
}
}
x って何?
xを定義しなさい
int x =0;とかを2行目にいれればいいんですか?
>>578 > なんかコンパイルするとエラーがでてしまうのですが・・
これは「何かが起こったんですが、これは何でしょう?」って言ってるのと同じだ。
ちゃんと質問しろ。
x をどうやって指定するかを考えれば自ずと分かる
何をしたいプログラムなんだ?
int x =0;とか入れればエラーは消えるが ううう しか出んプログラムになるぞ。
入力した数値や計算結果を使って出力を変えたいんじゃないのか?
数字の定義は外部というか、プログラムの前の部分でしてあるはずなんです。
二人でやる課題で、xを定義とか入力に応じて帰るとかその辺は違う人がやるので・・
>>585 どっちにしろ、関数aa()にxを入れなきゃ駄目だろ。
外部、例えばmain関数でxが定義されていても、その関数からxを直接参照することはできない。
教科書でローカル変数とかグローバル変数とか調べて見れ。
ええ、そうなんですか・・・
外部のxを読み込めみたいな命令ってどうやるんでしょうか・・
>>588 いいから教科書で勉強しなおすんだwwwwwww
引数とかグローバル変数とか分からないの?
お前は一生1から10まで人に聞いてすごすつもりかw
関数を勉強する最初の授業で習うようなことなんだから、ノートを見直して来い。
ノート取ってないなら教科書の関数のページ開いて嫁。
教科書は一応あるけど何を言ってるのかよくわからないです。
外部の変数どう読み込むかって書いてないような・・
そうだ、諦めよう!
>>591 ITMediaの記事で
ジャストのおっさんが
人に聞くのがコミュニケーション能力かつ
正しい成長方法だっていったぞボケ
warata
全く勉強しないで終わらせる気なのか?
void aa(){
extern int x;
if (1 <= x && x <=6) {
printf("あああ\n");
}
else if(6 < x && x <=10){
printf("いいい\n");
}
else{
printf("ううう\n");
}
}
>>593 聞いた事を元に、それなりに自分で考える時間も取らないと身に付かん。
ありがとうございます。そんなコマンドあったのですね・・・
ご迷惑おかけしました
formが出たときに何ができるのか分からないです。
OS:windowsXP
自分で試せばいいのかもしれないですが、その力がないですorz
正確な測定方法でも良いのでご教示ください
Cとなんでもよいのですが、例えばC#やVB
ある文字列の中身の特定文字列を検索する場合だとします。
AEFASDEAEASDDという文字列があった中でDEAを検索する場合
Cならばまず文字列内を一文字ずつループでDを検索し、見つかればその直後にE、その直後にAと探していき
発見することができますが、C#やVBでは文字列の検索機能(メソッド?)があります
一見ループと条件分岐とメソッドの呼び出しになるのでどうしても前者がはやいとは思えません
ですが実際は前者がはやいのでしょうか?
strstrでも使っとけ
メソッドの方が多分ネイティブルーチン呼んでるから速いと思う。
>>600 何故そう思うのですか?
或いは、何故Cならば検索する関数がないと思うのですか?
ああ、C と C# の比較か。
それなら C が速いんでないかい。
>>604 お前の頭の悪さと
醜悪な固定観念にワロタw
607 :
604:2008/01/11(金) 01:10:08
>>606 正解は、「一概には言えない」となる。
従って、「メソッドの方が云々」なんてくだらない思い込みに対しては「んなこたーない」で充分。
そういう事を言えるのは、一概には言えないことを確かめてからだな。
>>599 C++buridaの話なんですけど
フォトショをつなげると何かあるんでしょうか。
C++ぶりだ?
文字の検索アルゴリズムはちょっと面白い。興味があったら色々調べて見なさい。
BM法と単純検索以外なんもねーだろ
あとはつまんねー長たらしい正規表現か
KMP とかもあるお
僕に合った良い病院はないでしょうか。
>>585 二人でやる課題なのに、各自の担当部分のインタフェース(データの受け渡し方法)を取り決めないのか?
それじゃ仮に君がC/C++の文法を理解していたとしても無理だ。
>>609 正直な話、あんたが何を言っているか本気でわからん。
「C++burida」でググってみたらTOPに「ダイコンの豆知識」がでてきたぞ。
PhotoShopをつなげるというのも意味不明、何につなげるんだ?
そもそもPhotoShopはソフトウェアの名称で、つなげるという動詞を使うことは中々無いと思う。
>>598時点でのformに関してもあまりにも抽象的な単語で何を意味しているか不明。
順番に端折らずに、お前の聞きたいことを丁寧に書き込むんだ。
すれ違いならエロい人が誘導してくれる。
大根に危うく吹きそうになった。そんなもん調べんなw
プログラマ的に言うとPhotoShopなんてソフトウェアはない
鰤大根かw
そういえばこの冬はまだ一度も作ってないな。
>>617 C++BuilderとFormはまあ判った。
フォトショとは何なのか(Photoshopとしても何の関係があるのか)判らん。
もちろん、何を質問しているのかなど全然判らん。
CorelDRAWはVBAで制御できたよ('(゚∀゚∩
今のバージョンは知らんが
625 :
デフォルトの名無しさん:2008/01/11(金) 12:33:03
STLの中で、make_heap()などのヒープ関連のアルゴリズムの
意味がわかりません。適当なコンテナにmake_heap(begin,end)すると、
先頭に一番大きい要素がくる、それだけなんですよね?
それじゃあ、make_heap()とか、存在している意義がないような。
>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)
...
で、ヒープソート相当のことをできるんですね。
でも自分では使いそうにないなあ。
STLのlistでコンテナの入れ替え(コンテナの中身ではない)を
する方法ってありますか?
>>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型ではないのでどのように比較処理をすればいいのかわかりません。
どのように比較すればいいのでしょうか。もしよろしければ教えてください。
if(strncmp(c,card_idm,strlen(c)){
hogehoge;
}
>>630 一年諦めて、まともにCを勉強してから卒研に取り組んだら?
fgets()の使い方が阿呆すぎて話にならないんだけど。
ポインタもまったく理解できてないな
>>628 swapのことか?ならSTLコンテナ全て持ってる。
>>629 コンテナの連結状態を変えたいんです
>>634 swapだと中身のコピーによる値の入れ替えになるんじゃないでしょうか?
例えばlistのコンテナが 1,2,3,4,5 と繋がってる場合に、3,4,5 を切り離して、
1と2の間に挿入し、1,4,5,6,2 という形にしたい場合に、中身の入れ替えでは
なく、コンテナの連結先のみを書き換えることで行う方法が無いかを知りたい
のですが。
訂正
1,4,5,6,2 ではなく、1,3,4,5,2
現在VS2008のC++でコンソールアプリケーションを弄っていますが、
_beginthreadexでルーチンを呼び出してもメインスレッドで処理されてしまいます。
どなたかお助けくらさい。。。
普通はそうならないので、ソース見せてよ
>>640 ありがとうございます。
っと思ったらちゃんと別スレッドで処理されてました。
スレッドの他殺のテストをしてたのですが、アホな事をしてました・・・orz
>スレッドの他殺
あんまりやらない方が・・・
ロック握ったまま死んじゃったりとか、
ファイル開いたまま死んじゃったりとか、
メモリ確保したまま死んじゃったりとか、
相当気をつけないとろくでもないことになりがち
643 :
デフォルトの名無しさん:2008/01/11(金) 16:37:59
Visual Studioでゲームを作っています。
ビルドはできるのに何故かデバッグが実行できません。
エラー報告ウィンドウが出てきて強制終了;
このような場合にはどういった問題が考えられますか?
デバッグが実行できないってのはどういう状態?
VisualStudio自体が落ちるとかそういうこと?
645 :
デフォルトの名無しさん:2008/01/11(金) 16:51:20
ビルドはできるのですが、デバッグ開始を始めると枠だけ出てきて止まります。
「問題が発生したため終了します」という枠が出てきてエラーを報告するか否かをきいてくるんです。
報告しなくてもしても結局ゲーム自体は動きません・・・
説明下手ですいません;
646 :
デフォルトの名無しさん:2008/01/11(金) 16:52:21
645追記>VisualStudio自体は落ちません!
>>637,638
それでした!ありがとうございます
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&)'
うちの環境でそのままコピペして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
となった。
>>645 それって単にプログラムにバグがあるだけなんじゃ?
デバッグじゃなければ動くのか?
>>650 たぶんこう
typename result_type operator()(typename argument_type i) {
return (typename result_type) !(i % 2);
}
>>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; //クラステンプレートと看做されてダメ
どうすれば実体化できるのでしょうか。
そもそもこれは合法ですか?
>>654 なるほど。そういう仕様なんですね。てっきり文字列リテラルは
const char*だと思っていました。
では、
template <typename T>
void func(T x)
{
//省略
}
という関数テンプレートを以下のように呼び出した
場合、
func("Hello");
xはconst char*になるのですが、この場合は、const char[6]
ではないのでしょうか?これは通常の関数に配列を渡したときは
配列の先頭要素へのポインタになるのと同じ理屈でしょうか?
>>656 void func(const char x[6])
と書くのが
void func(const char *x)
と同じだから、じゃないかなぁ
658 :
656: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]
>>657 そうですね。Cでも関数へ配列を渡すときは、要素へのポインタに
なりますからね。
661 :
デフォルトの名無しさん:2008/01/11(金) 22:53:45
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] その他の制限: 関数を使うところまで
期限が休日って・・・。
スレ古いのと間違えたけどまぁいいか
668 :
デフォルトの名無しさん:2008/01/12(土) 00:20:19
int* p = new int;
int& r = *p;
delete &r;
これっておk?
おk
>>669 文法的にはOK。動作もする。でも、嫌い。
可読性を下げる下手なコーディングはやめれ
フォトショップとC++Builder 6は関係ないんですかね。
673 :
699:2008/01/12(土) 00:32:45
サンクス
普段のコードで書こうとしているわけじゃないから大丈夫です
>>672 >>598か?
どういう関係の話をしているんだ?PhotShopとC++Builderで結びつく内容はぱっとは浮かばん。
無理やりひねり出せばPhotoShopでいじった画像ファイルを管理するツールをC++Builderで作るとかか?
675 :
デフォルトの名無しさん:2008/01/12(土) 00:59:50
文字列に数字入力して、それを一桁ずつ配列にいれる
ってどうやれば?
さっぱり
char str[] = "1234567890";
int num[ 100 ] = { 0 };
for ( int i = 0; str[i] != '\0'; i++) {
num[ i ] = str[ i ] - '0';
}
それやってること逆じゃない?
逆も何も指定されてなくね?まぁ逆にしたいならこんな感じか?
num[ strlen( str ) - i - 1 ] = str[ i ] - '0';
680 :
675:2008/01/12(土) 01:22:00
ありがとうございます!
俺は
>>677をエスパーした。でもやっぱ
>>676でOKだと思うんだ。
char str[100] = { 0 };
int num = 1234567890
for ( int i = 0; num > 0; i++, num /= 10 ) {
str[ i ] = num % 10 + '0';
}
682 :
675:2008/01/12(土) 01:26:07
>>676 それ2つ使って和とかって出せますかね?
684 :
675: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次元以上では必要となるのが仕様なのでしょうか?
うん
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個だけだったと思う。
Yes. 残念ながら仕様です。
691 :
686: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で自分でやってみます。
まあ、もちつけ
遅レスすみません549です。
解決したので報告しておきます。
>>557 レスありがとう御座います。
>callbackAを呼ぶときはpにはA*をvoid*にしたものを渡せばいいし
>callbackBを呼ぶときはpにはB*をvoid*にしたものを渡せばいいが
「callbackはライブラリ側から呼ばれるので、引数の内容は変更できない」というのを言い忘れていました。
申し訳ありません。
>どうしてもpにはD*を渡したいけどDは公開できないというのはわりと無理め
やはり無理ですか(汗
>class Z {
>virtual void dummy(){}
>};
>みたいなダミーを用意して
なるほど。そういう手もあるんですね。
勉強になりました。ありがとうございます。
結局、AとBのメソッドを一つのインターフェイスに変更して、
多重継承でなく、単一継承にすることで解決することにしました。
丁寧な回答をして頂き、大変助かりました。
ありがとうございました。
宜しくオナガイシマス
環境: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()) {
(省略:適当な入れ物に格納)
}
>>697 freopen()のような事をしたいのか?
だいたいifstreamクラスはistreamクラスを継承しているので
istreamはダウンキャストの方向になるぞ。
ファイルを開く処理が istringstream にないのだから、
istream のレベルで open できないのは当たり前だと思うが。
>>697です
即レスサンクスです
>>698 freopenが、正確にどの様なものか分からないのですが
ようは、ファイルを開いて、一行バッファーに読みこんで、コンテナでにほうりこみたいんですが
>>699 漏れもそう思ったんだけど、More Effective C++の中途半端な実装が
殆どファイル処理に関しては、引数が istream& dataSourceってな風に書いてあるんで
気になったしだいです
istream& を使ってるということは、共通処理の部分なはずなのに、
open を使うという非共通処理を実行しようとしている時点で少し変。
ただ、やむを得ない場合もあるから、そういう時はダウンキャストするしかない。
例えば、こんな実装が載っているんですが
このまんま、実装しても当然動かない訳で、こちらで、読解しながら
実装しているんですが、こんな場合、
この関数に、ファイルのオブジェクトを渡して処理する場合、具体的に
どうしたらいいのでしょうか?
void ALA::proccesAdaption( istream& dataSource )
{
while( dataSource ) {
ALA* pa = readALA( dataSource );
pa->proccesAdaption();
delete pa;
}
}
>>783 istreamはifstreamの下位クラスだから、どこか外でopenした
ifstreamのオブジェクトをそのまま渡せばよい。
あ、ごめん
×下位クラス
○上位クラス
だわ。
配列の関数渡しについて質問です。
----------------------------
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()内で値を変更するには間接参照「*」がいると思うのですが…。
>>707 num[0]と*numは同じ意味だから。
>>707 *( num + 3 ) = 3とnum[ 3 ] = 3は同じことをしている。
>>707 [ ]には*の効果がある。
a[3]は*(a+3)と書くのと同じこと
int main(void)
{
int a[3] = {0,1,2}
func(a);
}
このaってのは配列の先頭アドレスで、a[i]の形で値を代入できるよな?
numも全く同じ操作をしている。
713 :
707:2008/01/12(土) 17:22:53
>708-711
お答えありがとうございます。
num[0]と*numの意味が同じことは理解できています。
mainのa[3]の先頭アドレスと、
funcの*numのアドレスは同一なのですね。
なのでfunc内でも、ポインタを意識せずに演算ができる、と。
理解できました。ありがとうございます。
ちなみに、VC2005とかでデバッグするときにウォッチウィンドウに
この場合は、 num,3とか入れると、
num[0]からnum[2]までが見れたりするぜ。
715 :
25:2008/01/12(土) 22:40:30
cgar *filename;
filename = argv[1];
if (filename[0] != '-') {
break;
}
っていうソースを見たんですが、
ファイル名が-から始まったら問題が有るのでしょうか?
オプションかどうかを判定してるんでねーの?
引数がcgar**で渡される処理系ってなんだ。
実行ファイル名ってargv[0]じゃなかったっけ?
いや、typedef char cgarしているんだよ、きっと。
./a.out filename
でしょ。
>>718 実行ファイル名って言うか、実行モジュール名な。で、それが何か?
皆さん、混乱させてしまって申し訳ないです。
char *filename;
filename = argv[1];
if (filename[0] != '-') {
break;
}
第一引数にファイル名を取って、そのファイルに結果を保存するって感じです。
実はかなり昔どこかで、
C言語ではファイル名に「-」を使えない
って読んだ記憶が有って、このソースを見つけてその記憶がよみがえってきたんです。
でも、そんな訳ないですよねぇ?
>C言語ではファイル名に「-」を使えない
んなこたーない。まぁ、>716だろ。Unix系だとそういうプログラムも多いから。
# ちなみに、./-filename とでもすれば回避可能だから余り困らない。
724 :
デフォルトの名無しさん:2008/01/12(土) 23:20:23
宿題スレから再びもどってきました
2つの数値(最大50桁)を文字列として入力させ一桁ずつを配列に入れる
2数の和を出す
(下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる)
これの方法誰か詳しく解説してください、、
>>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;
動作確認はしていない。
たぶんこんな感じで動くだろ。
std::numeric_limits<T>::max()
とか書くと、マクロmaxの引数が少ねーぞって言われるんだが、どうすればいいんだろう。
windef.hにマクロのmaxが書かれてるようで、これが邪魔っぽいが…
>>726 WindowsC++プログラマの常識
#define NOMINMAX
>>722 Unix 系だと通常コマンドオプションは "-x" とか "--string" となるので, "-"
ついた奴はファイル名ではないと判断するための処理ちゃうか?
# x は一文字オプション string は 1文字以上のオプション
# "-"とオプション文字の間に空白が入ってはいけない
ちなみに, 慣習的に "--" だけってのが "オプションの終わり" になってる
729 :
デフォルトの名無しさん:2008/01/13(日) 00:10:06
>>725 ありがとうございます!
sum[ i ] = ( num1[ i ] + num2[ i ] + temp ) % 10;
の% 10 ってなんですか???
あまりを求める演算
ex.
10 / 3 = 3 あまり 1
10 % 3 = 1
>>718 、
>>721 argv[0]に何が入ってるかは処理系依存と違ったっけ?
大体はOSが解釈した後のコマンド文字列の一節目が入ってると思うんだけど。
>>731 プログラムを呼ぶ時に使った名前か、空文字列が入れられる、と定義されている。
空文字・・そんなのこともあるのか・・
char str[40] =
{ "( ´∀`)" };
(int *)str[48] = (int)str;
ってchar型の配列を用意して、( ´∀`)で初期化。
charの配列をintにキャストして、
その配列のアドレスを、int型のstr配列に代入しているって言う解釈で良い?
>>734 両方名前がstrなのは意図したものなのか?
左辺のキャストしたらコンパイル通らないことないか
だって関数呼び出しにいちいち(void)って付けてるキチガイもいるんだぜ
呼び出しにvoidってつけられるのか?
>>738 付けてみろよ
何もなかったかのようにコンパイル通るから
(void)func(); かあ。
どこかで見た事あるなあこれ。
何かの本だったような
>>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 の起動時などに…
>>739 Borland C++ 5.5.1だと式の構文エラーって出たんだけど、なにか勘違いしてるんだろうか
(void) ってキャスト云々の流れで出てきたのか
func(void);かと思った
orz
>>746 さぁ…
戻値持つ関数呼び出すときに「戻値を捨てる」って言うコンパイラへの
明示的な指示として導入されたのは記憶にあるが………
>>740 Code Quality ~コードリーディングによる非機能特性の識別技法~
この本で見たかな
何らかの警告を発する場合の回避のために使うんじゃなかったっけ?
lint とか。
>>737 それは今の話と関係ないと思うけど。
今はキャストで右辺値に変換したら代入できんじゃないかという話で。
>>751 "問題のあるポインタの変換"とか言われそうじゃね
boost::filesystemで相対パスを絶対パスに変換するのって何て名前でしょうか?
755 :
753:2008/01/13(日) 03:13:57
じゃWinので
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の
状態で再度呼び出される?
って理解で良いのでしょうか?
難しい...
普通の人は一生使わなくてもいい関数だから
気にしなくていいと思う。
>>756 コンパイラが吐いたアセンブリコードが読めればすぐに
理解できるんだけどな
longjmp()をした後はprintf...からスタートするよ
int main()
{
ofstream fout;
fout.open("sample001.txt");
if (!fout) {
cout << "出力オープン処理が失敗しています\n";
return 1;
}
return 0;
}
こんな感じの定番なプログラムについてなのですが、
出力オープン処理が失敗する時ってどんな時ですか??
そんなことあるんでしょうか?
>>759 FLOPPYやMDでライトプロテクト状態になってるとか
もっとも先にOSのエラーが出そうだが
書き込み権限がないとか。
>>759 読み取り専用
同名ディレクトリ
ファイル数上限
Device error
など
763 :
759:2008/01/13(日) 03:34:25
なるほど。。ありがとございますm(_ _)m
>>756 ちと違う。
setjmp() を呼び出す瞬間の CPU 状態が(スタックポインタ/プログラムカウンタ含めて)
env に保存される。 ただし、戻値を返すレジスタは 0 に設定されるが…
longjmp(1) をやると, env に保存されてた CPU 状態が書き戻されるが,
戻値を戻すレジスターは longjmp の引数 1 に書き換えられる
乱暴な言い方すれば, longjmp はサブルーチンコール無視した goto だ
俺は一生使わないだろうな。
例外代わりに使う事があるらしいが、
正直こんなの使うよりエラーコードのがマシ。
longjmp()やると関数呼び出しの中からの関数呼び出しとかで
スタックにいろいろ積んでいても全部巻き戻される。
>>766 事実C++の例外はlongjmp()に似てるな。
でもlongjmp()を使ってもC++の例外は実装できなかったので
cfrontは中止されネイティブコンパイラになったという話。
769 :
756: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に飛ばないんですか?
>>769 条件分岐は当然行われるよ。
longjmpの引数を0にしたら x = 5; に飛ぶ。
>>770 うそこけ
longjmp() は、0 を返すことは出来ない。
もし、 longjmp() の2番目の引数が 0 として呼ばれたならば、代わりに 1 を返す。
って書いてあるぞ。
>>769 > x =5に飛ばないんですか?
飛ぶ.
つか, 本来は大域脱出するために設計されている仕組みだから
普通やらないけどな…
よく使うのが,
簡易言語のパーサとかやってて, リカバー出来ないエラーに遭遇.
途中結果を捨ててもいいから次のファイルの処理はやりたい.
けど, まともに状態戻しながら手順を踏んでもどったら大変.
えぇい! イニシャライズから, やり直してしまえぇ!!!
てな感じの時だ.
タスクのステータスは,setjmp と longjmp を使ってコルーチンを処理するのに十分なものです。
longjmp を呼び出す前に,setjmp を呼び出さなければなりません。setjmp を呼び出して jmpb を設定するルーチンは,longjmp が呼び出されるまでアクティブなままでなければならず,戻ることはできません。この状態以外の場合,結果は予想できません。
longjmp は,値 0 を渡すことはできません。retval に 0 を入れて渡すと,longjmp はこれを 1 に置き換えます。
うーんなるほど
774 :
772:2008/01/13(日) 04:04:09
>>771 うげ、0 で返す longjmp 納品してしまったよぉorz
それも, 去年の暮.
775 :
デフォルトの名無しさん:2008/01/13(日) 09:01:45
プロの方々に質問です。
実際のプログラミングで、
cout時に
endlと\nを区別することはありますか?
>>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];
みたいに書くしかないのでしょうか?
横幅の情報がないとアクセスできないだろ。
int (*a)[SIZE]= new int[SIZE][SIZE];
普通に、
std::vector<std::vector<int>> a(SIZE, std::vector<int>(SIZE));
とかしとけ。
>>777 int **a = malloc(SIZE * SIZE);
a[2][1] = 10;
の時点で間違ってる。
勉強やり直せ。
>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()で代入してました。
(なのでちょっと不便と思ってた)
ありがとうございます。
**がおかしいんとちゃう?
785 :
デフォルトの名無しさん:2008/01/13(日) 14:46:14
>>785 使えるし値の出し入れをしてるだけなら問題もおきないだろうが
データの並びというか構造が
int a[2][4]; とか
int (*a)[SIZE]= new int[SIZE][SIZE];
って二次元配列宣言したときのものとは異なる
そこを混同してるっぽいから間違ってる言われてるのかと
二次元配列宣言 → 適切じゃありませんすいません
788 :
デフォルトの名無しさん:2008/01/13(日) 15:03:40
>>786 なるほど。
int a[2][4];は8個の連続した領域になっているのに対して、
int (*a)[4] = new int[2][4];は、4個ずつは連続しているが、
2つに別れているかもしれない、ということですよね?
・・・
やっぱ理解できてないじゃん。
1からおさらいする必要性があるな。
いや、0(=NULLぽ)からだろ。
>>788 違います
int a[2][4]; も int (*a)[4] = new int[2][4]; も
8個連続しています
していないのは
>>781です
>>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]);
ってしたら、連続領域にあるみたいなんですが?
>>794 複数スレッド走っていて, i == 0 と i == 1 の間に他のスレッドに
プリエンプションされて, そっちのスレッドがmalloc() かけても
連続していると言い切れるかな?
連続になったとしてもそれはたまたま連続になってるだけだし、
こういうこともできるって分かってるよな?
for (i = SIZE - 1; i >= 0; i++) {
b[i] = (int *)malloc(SIZE * sizeof(int));
}
- for (i = SIZE - 1; i >= 0; i++) {
+ for (i = SIZE - 1; i >= 0; i--) {
コピペ怖い
>>794 連続領域にしたければmallocは1回にしなきゃ無理だ。
2次元のように扱いたいならマクロでも作れ。
#defeine ARRAY_ACCESS( arrya, x, y ) arrya[ x * SIZE + y ]
800 :
デフォルトの名無しさん:2008/01/13(日) 15:54:01
781です。
>>796 わかってます。
ということは、788に書いたことはやっぱり正しいのですよね?
>>800 []も演算子なんだ。ポインタをずらした部分にアクセスするための演算子。
ってことは何次元であろうと連続した領域じゃなくちゃ困る。
2次元以上の場合[ x ][ y ]とした場合、実際には「x * SIZE + y」ずらせばOKだけど
ここでSIZEをどこから持ってくるかが問題。
>>799のように自前で作成するかint (*a)[4]のように無理やり教えるか
803 :
デフォルトの名無しさん:2008/01/13(日) 16:01:23
もういいです。
あなた達みたいな低脳に聞いたのが間違いでした。
初めまして。これから始めてプログラミングに触れようとしている者です。
そこで質問なのですが、初心者ならこれがお勧めというコンパイラはありますでしょうか?
エディタはサクラを使う予定です。どうかご教授お願いします。
>>804 Windowsでいいよな。個人的にはVCだけどbcc推す人も多いかな?
そうか、Windowsだったのか。という事は、サクラというのはサクラエディタのことなんだね。
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]としても駄目ですか?
781です。
ちなみに803は自分のコメントではありません。
>>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でコンパイルしたけど、
バイナリは全く同じでした。やっぱり何か間違ってるのかな。
アセンブラをみればいいんだろうけど、でもなんかいやだ。。。
はあ
理解としてはだめだろ
>>781 >>812 二つはまったく一緒だぞw
int (*a)[SIZE] = malloc(SIZE * SIZE * sizeof(int));
と
>>781 の違いは分かるか?
>>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以下全体の(=リンク後の)プログラム全体なのでしょうか?
言い換えると、同一綴りの文字リテラルを同一として扱う
処理系では、複数ファイル・分割コンパイルなどしていても
それぞれに共通な文字リテラルがある場合、
リンク時?に本当にこれらの記憶領域共通化を
図ってくれるものなのでしょうか?
バッファとかプログラムという基本的な言葉が釈然としない
初心者ですが、しっかりと分かっていらっしゃる様々な分野の
プロの方にご回答をお願いしたいと思っています。
おまえらは, このコードの出力に何を期待しますか?
#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
>>818 とりあえず
"\n" は文字"列"リテラルだ
>>818 ・VC++は、同一文字リテラルをどのように扱うのでしょうか。
(記憶域上、同一か別個か)
コンパイラオプションの文字列プールというので
どっちにでもできたと思う。
822 :
775_817_818:2008/01/13(日) 17:20:11
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個の配列の先頭を指すポインタ」ということ?
>>818 > ・VC++は、同一文字リテラルをどのように扱うのでしょうか。
オプションで指定できる。
バージョンや最適化レベルによっても変わるかも。
どちらにせよリテラルについては規格上不定なところも多いので、
そういうのに依存するようなコーディングはやめとけ。
> ・だいたい、endlで行うバッファフラッシュのバッファとはなんなのでしょうか。
効率化のためにOS等が入出力をある程度一括して行う。
そのときに一時的にデータを貯めておくのがバッファ。
バッファにたまってるのを強制的に書き出すのがフラッシュ。
>>818 > ・同一綴りの文字リテラルを別個として扱ってしまう処理系で
> かつ組み込み用途など特別に記憶領域が厳しい場合は
> どうしているのでしょうか?
> const char* p = "\n";
> として以後これを使う、なんてことを妄想中。。。
使いまわす対象が"\n"であるなら、
・対象が2byteと小さいので、特に使いまわしは考えない。
・文字列の出力関数の仕様を、「最後に改行が出力される」とする。
といったところ。
使いまわし対象がもっと大きな文字列なら、
文字列個別にIDを割り当てて、IDから文字列の先頭ポインタを取得する関数を作る。
826 :
775_817_818:2008/01/13(日) 17:34:56
>>821 >>824 ありがとうございます。
コンパイラオプションの文字列プールMSDNで見てみました。
どうやらそれらしいですね。
(2005EEでは(debugですが)”いいえ”になってました)
>>そういうのに依存するようなコーディングはやめとけ。
ということはendlを常に使えということでしょうか?
>>一時的にデータを貯めておくのがバッファ
はい、ここまでは分かるのですが、具体的に(HW上)
いったいなんなんだろう、と思ったものですから。
組み込みなどを入れると全体のシステムといっても
いろいろあると思いますし。。。
827 :
775_817_818:2008/01/13(日) 17:38:20
>>825 ありがとうございます。
そうですね、2byteですからね。
問題にならないんだとは思ったのですが、、、
ちなみに825さんはどういった分野の方なのでしょうか。
そして結論として、通常は\nを使うよ、ということで
よろしいでしょうか?
828 :
776:2008/01/13(日) 17:49:38
>>827 取り敢えずここまで斜め読み。
・なんで"\n"を使うの? '\n'で充分だと思うのだけど。
・ファイルへの出力は、フラッシュのタイミングを常に意識すると思うわけで、標準出力についても同様だという認識。
・ちなみに、標準出力は適宜フラッシュしないと見えないという切実な問題があるわけで。
# 標準出力については、改行するとフラッシュされる処理系もあるけどそれに依存するのは如何なものかと思うし。
・蛇足ながら、ファイルへの出力は適宜フラッシュしなくてもどうせクローズするからそのときでいいという発想もあり。
# その場合、endlは一切使わないということになるかも知れず。
>>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)の違いだ。
830 :
825:2008/01/13(日) 17:50:51
>>827 組み込み屋です。
結論というか、一般論をいうなら、
基本はシンプルに書く。制約が厳しそうなら工夫して書く。
何がシンプルで何が工夫かは状況次第、臨機応変だ。
>>826-827 横槍だけど
>>>そういうのに依存するようなコーディングはやめとけ。
>ということはendlを常に使えということでしょうか?
コンパイラの最適化の仕様に頼ったコーディングのことじゃない?
>具体的に(HW上)いったいなんなんだろう
メモリ。
>2byteだから問題にならない
組込みでCGIとかやったけど、意外に問題になることもある。
CGIの時は、クライアントでのHTMLの読み易さを捨てて、\nを全部消した。
で、
>>825は「使いまわさない」と言ってるだけで、
「気にせず\nを文字列リテラルで使いまくる」とは言ってない。
対策として「最後に改行が出力される」出力関数を使うと言ってる。
こうすると\nは出力関数内の1箇所にしか出てこなくなるので。
>ということは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を動的にはできないと思うんですが、
それは正しいですか?
コンソールにメッセージを表示したいならその場で全部表示されないと困るよね。
ためといて後で一括して… なんてわけにはいかない。
ファイルに保存するときはファイルを閉じたときにツジツマがあってれば
だいたい困らないから、こまめにフラッシュする必要はないよね。
つまりはそういうこと。
>>832 ファイルの場合、basic_filebuf<> オブジェクトに書き込み要求
をしますが、バッファの大きさを指定することはできますか?
あと、sputcなどのStream Bufferのメンバ関数を使えばバッファ
されずに直接ディスクに書き込むことになるんですよね?
endlマニピュレータは関数ですけど、中で実行されているflush()関数
はStream Bufferのメンバ関数呼び出しなどを行っているのでしょうか?
詳しい人教えて。
837 :
775_817_818:2008/01/13(日) 18:19:48
みなさん、ありがとうございます。
プロの方がいっぱいでなんだかうれしいです。
なるほど、と思うことばかりです。
結局は目的・用途・制約などで、
条件が厳しい場合にはしっかりと使い分ける。
そうでない場合には、見やすさなどでと
いうことですね。個人によりそうですが。
バッファ(=外部メモリでよろしいでしょうか?)に
ついて確認させてください。
endlで、バッファフラッシュとなったとき、
CPUは、メモリコントローラに対して、
その指示を出す、ということで
あっていますでしょうか。
あと、818の最後の質問にも分かるかがいたら
お答えよろしくお願いいたします。
VC++での例のオプションON時だけでも構いません。
もうひとつだけ追加でお聞きします。
職場や仕事なででの
コーディングルールの中に
この改行について
書かれていることはありますか?
プロの方にしか聞けないことだと思いますので。
ご回答よろしくお願いいたします。
(組み込み関係ではない方もお願いします。
そんなの気にしたことない!、とか)
ライブラリレベルでのバッファとは別にOSが管理してるものとかもある。
そういう意味では「直接」書き込むなんて相当な黒魔術が必要だよ。
少なくとも今のWindowsなんかでは難しい。
だいたい、言語の規格としての定めはそこまで踏み込んだものじゃないから、
「どうなってるか」を知りたいのなら各処理系で実験してみるしかない。
(それでも最適化とかそのときの状況で色々だったりする)
>>836 それが必要なアーキテクチャならそう実装するだろうし、
そうでないならしない。
以前Unix系のOSで、ファイルをクローズしてもファイルがフラッシュされてないことがあったな。
ファイルサイズが0のまんまなの。
>>833 お前頭大丈夫?
括弧が左右対応してなくて気持ち悪くないの?
遅延書き込み。
コンストラクト時なら初期化子、そうでなければvector::assign
勉強のために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;
}
〜以下略〜
}
const char* を受け取るコンストラクタを作ればいいんじゃね
846 :
デフォルトの名無しさん:2008/01/13(日) 21:29:06
strtokを使ってスペース、改行区切りで文字列を分解しようと思ったのですが
例えば"6 * 6 - 2"だときちんと分解されるのですが
"6 * ( 6 - 2 )"だと"("を分解して終わってしまうみたいなんですがどうしてでしょうか?
また、これをすべて分解するにはどうすればいいのでしょうか...よろしくお願いします。
>文字リテラルを同一として扱う
>処理系では、複数ファイル・分割コンパイルなどしていても
>それぞれに共通な文字リテラルがある場合、
>リンク時?に本当にこれらの記憶領域共通化を
>図ってくれる
されるはずだが試してない。
気になるのならある程度長い特徴的な文字列で、
実際にコンパイルしてバイナリエディタでサーチしてみてくれ。
>>844 勉強のためならあえて指摘しようかな。
operator const char *とbool IsEmptyはconstを付けよう。
friend CString operator +の引数はconst CString &にしよう。
849 :
846:2008/01/13(日) 22:12:34
なぜか今やったらできました
変なとこに割り込んでしまって申し訳ないです...
>>845 ありがとうございます。
明日に試してみます。
>>848 指摘ありがとうございます。
operator const char * の場合どこにconstをつけるべきなのでしょうか?
>>850 const CStringに対して呼び出せるようにするってことね。
operator const char*() const
bool IsEmpty() const
>>851 なるほど・・・
勉強になりました。ありがとうございましたm(_ _)m
853 :
775_817_818_837:2008/01/14(月) 00:36:02
>>838 >>847 ありがとうございます。
>>838 言語仕様からしてそこは「あいまいだ」と
いうことですね。
それがわかったことはのすごい収穫です。
もともと、なんだかあいまいな表現だなあ、と
思っていたわけで、その直感は、それはそれで
合ってたわけですね。
>>847 はい、そのうちでよければ、やってみます。
共通化してくれそうな気も少ししてきました。
ところで
>>781はおkだよね?
>>783はどこからか連続領域とかいう条件もってきてだめっていってるんだよな?
(それか「厳密には二次元配列ではない」という意味か)
855 :
783:2008/01/14(月) 01:36:11
>>854 連続した領域云々はともかくとして、
俺は
>>815が気になったんで「いいえ」って言ってみただけ。
納得した
マクロの質問です。
#ifndef __GNUC__
のようなマクロが定義してあるんですが、gccでコンイルしているかコンパイル時に分かるんでしょうか?
#define hoge(r,i) ¥
({ ¥
hoge _z_; ¥
huga(_z_) = (r); ¥
meso(_z_) = (i); ¥
_z_; ¥
})
#define hoge(z) (__real__ (z))
みたいな感じで、
やたらと、__や_を使っているのですが、
これはどういう意味やメリットが有るのでしょうか?
>gccでコンイルしているかコンパイル時に分かるんでしょうか?
Yes
>やたらと、__や_を使っているのですが、
__real__ は gcc の拡張機能で、gcc の組み込み複素数型の実数部を取得するキーワード。
_ が先頭に付いている識別子や、__ を含む識別子は処理系の予約語になってるから
(本当はもうちょっと規則がややこしい)、
ユーザ側で定義してはいけないことになっている。
だから、処理系がそういう識別子を使っても、
(ユーザがちゃんとこういう命名規則を把握しさえしていれば)
ユーザ側の識別子とは被らないようになっている。
859 :
デフォルトの名無しさん:2008/01/14(月) 09:10:50
>>857 gcc:__GNUC__が定義されてる
他:そんなの知らん
ということ。
>>858 おお、鋭いです
>__real__ は gcc の拡張機能で、gcc の組み込み複素数型の実数部を取得するキーワード。
この辺の事を詳しく書いているサイトって無いですか?
カエレ!
863 :
775_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になっているのかもしれません)
無理。strcpy()を使うしかない。
865 :
デフォルトの名無しさん:2008/01/14(月) 11:20:36
初期化は定数限定だろ
866 :
775_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が
あらかじめ決まってないといけないですよね。
なんかもどかしい感じがしてしまうのです。
>>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 つけるとどういう効果があるんですか
そのメンバ関数はオブジェクトの状態を更新しない=メンバ変数を書き換えないよ
と明示している
あとmutableというキーワードもあってだな
870 :
デフォルトの名無しさん:2008/01/14(月) 13:02:15
ありがとうございますサンクス
>>868 後者の非constメンバー関数はconstオブジェクトからは呼び出せない。
で、何で後者の引数にはconstをつけないんだ?
WindowsのMSVC++や、UNIXのgccなどで、
64bit環境でコンパイルしても、32bit環境でコンパイルしても、必ず32bitや64bitであることが保証されている型はありますか?
__int32などを使えば良いのでしょうか?
int32_t/uint32_t
int64_t/uint64_t
C99だけど大抵の環境で使えるだろう。
残念ながら何の意地かしらんがVC++にはないよ
INT32とか使うしかない
ビットフィールドで32bitにしてしまえばw
あらそうなんだ。まあどっちに合わせるかだね。
俺は標準に合わせといた方が良いと思うけど。
boost/cstdint.hpp
878 :
872:2008/01/14(月) 18:11:46
やはり、まちまちなんですね。オープンソースなので、出来るだけコンパイラ依存のコードは避けていますが、
プリプロセッサで判別することにします。ありがとうございました。
>>877 C言語なのでboost使えないんです。抜き出して使おうと思います。
stdint.h があるならそれを使うようにして、
ないなら環境ごとに自分で定義すれば?
もうそうするって言ってるみたいだがw
881 :
デフォルトの名無しさん:2008/01/14(月) 20:09:29
ヒープ領域にメモリを確保するのが遅いとよく聞きますが、
スタック領域にメモリを確保するのは遅くないのでしょうか?
882 :
デフォルトの名無しさん:2008/01/14(月) 20:15:16
ヒープは仮想メモリを含む スタックは純物理メモリに格納
スタック領域にメモリを確保するなんて、
esp レジスタの値をいじるだけだし。
ヒープに確保するのはそれはそれは複雑な処理だ。
>>881 スタック上の領域は、確保した逆順にしか解放しない方式なので、仕組みが単純。スタックポインタというCPUレジスタを操作するだけなので高速。
ヒープは任意の順序で解放できるので、少し複雑になり、遅い。
C++のクラスのコンストラクタのイニシャライザで構造体のメンバを初期化できないんですか
できる
構造体のコンストラクタ呼べば
構造体にコンストラクタを書くか、ボディでやるしかないんでは。
その構造体もクラスで実装することを検討してはどうだろうか。
構造体って、APIに渡す時ぐらいか使わないなあ。
処理系によるとしか
やっぱりコンストラクタが必要ですか
struct tag {
int x , y ;
}
みたいな小さい構造体にコンストラクタは馬鹿らしいと思うので、
コンストラクタ本体で代入することにします。
ご返答ありがとうございました。
>>888 個人的には初期化方法のためだけにデータ型をクラスで実装するのは反対。
データ型なんて出てこないように全体的にクラス構成を考え直すということならアリだと思う。
c++でクラスと構造体をそんな使い分けする意味なくね?
意味無いかな?
Cと文法を共通化させるためとは言っても(structの元々の存在意義ってコレよね?)
せっかくclassとstructがあるんだから、オブジェクト定義とデータ定義で使い分けた方がソース見やすくならない?
まぁ標準ライブラリ自体がアレだから、あんまり意味無いのかなぁ・・・
趣味でプログラミングしてきたのですが、
最近興味あるプログラムのソースがC++であることが多くなり
C++も使えなきゃ駄目だなと思っています。
Cでは1500行くらいのプログラムを書いた事が有ります。
ポインタは分かっているつもりです。
アセンブラはほとんど分かりません。ごく稀にgdbでdisassembleする程度です。
オブジェクト指向は分かっていません。構造体の強化バージョン程度の理解です。
こんな感じの自分に、オススメのC++を紹介して頂けないでしょうか。
まぁ、「プログラミング言語の本は、どんな本でも一冊しっかり読めば
基礎力は付く」ってのは無しで。
俺は必要とあらば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;
};
>>895 OOPをC++でやりたいならGanf Of Fourの
「オブジェクト指向における再利用のためのデザインパターン」は買っとけ
その本ってデザパタドシロートでもOK?
>>898 素人でもいい。というかこの本以外に適当なC++でOOPをやってる
本が事実上ないんだよ。
後はネットで簡単なデザパタのページを見つけてそれを参考にいくつか
プログラムを自分で書いてみれば理解できる。
別にデザパタ勉強するだけなら、
C++ の本に固執しなくてもいいんじゃないかな。
C++ に応用させればいいだけだし。
>>900 それがそうもいかない。C++には他の言語にはあまりない
多重継承という機能がありそれを利用した独特のデザパタがあるし、
ポインタと仮想関数でOOPしなければならないという特殊事情が
ありboostの使用も視野に入れなければならなくなってくる。
他のOOP言語ではC++よりスマートにOOPを実現している。
まあ、GoF だけならどの本でもいいんじゃね。
マンガとかで、「実行中のプログラムを書き換える」ってネタが良く有るけれど、
実際、デバッグオプションも付けないでコンパイルしたプログラムを、
デバッガも使わず、プログラムの実行中に変数の中身を書き換える事って可能なの?
可能
そういうツールもちゃんとある
DOS 時代はメモリいじってゲームのパラメータいじって遊んでたな。
マジで。
どうやれば実現できるんだろう?
ツール名教えて。
>>906 すれ違いだけどうさみみハリケーンとかすぺしゃるねこまんま
名前がふざけすぎだけど中身はまとも
使い方は自分で調べろ
あとメモリエディタでぐぐるとか
交換機で
(1)あらかじめ余分にメモリ領域を確保してLM作成。
(2)決まった手順でパッチを作成
(3)パッチをあてると、その領域に新関数を書き込み&旧関数の頭にはジャンプ命令を書き込み
ってのがあった。
動いたままパッチが当てられる。
>>901 いきなりエリックガンマを読まなくてもいいだろ。
初心者に勧めるものではないな。
オブジェクト指向のこころのほうがアプローチが分かりやすい。
サンプルはJAVAだがあの程度なら覚えるのは簡単だし、分かりやすい
必要ならC++で記述するのもよし。
>>901 「ポインタと仮想関数」って特殊事情ではないだろ。
むしろテンプレートなんかのほうがよっぽど特殊事情だ。
C++以外でもインタフェースって名前で実質的な多重継承は使われてるだろ。
実装を持てるか持てないかの違いは
あんたが思っている以上に大きい
volatileってなんて呼ぶの?
ヴォラタイルであってる?
俺はそう呼んでる。ってかfalseやnullと違ってそれ以外の読み方を聞いたことがない。
>falseやnullと違ってそれ以外の読み方を聞いたことがない。
ファルスとナルであってる?
バルスみたいだな
>>916 >ナルはいいけどファルスはやばいwww
ファルスでググったら勃起て出てきたwwww
こんどこらfalseをバルスって呼ぼうぜ!
typedefされたものが早く理解できたためしがない
typedef double* vector とか書かれても読む気しない。
型が増えると逆に理解に苦しむのっては少数派なのか・・・
その程度だったら、typedefするほうもどうかと思う。
まぁ、大きなスコープの中で「あれもこれもtypedef」みたいなやり方を
派手に押し進められると、さすがにね。