【初心者歓迎】C/C++室 Ver.55【環境依存OK】
おつ
壱乙
4 :
デフォルトの名無しさん :2008/06/15(日) 03:23:26
おついち
乙一
インデントの話だが・・・ 俺はどっちでもおk派。VCに貼り付けてCtrl + spaceで一発解決w
(・ω・`)1乙 ←ポニーテール
 は思いつかなかったな〜
ちょっとてst
>>6 まぁでもコピペすらしない人多いと思うよw
8 :
7 :2008/06/15(日) 11:30:45
あぁん俺の環境じゃ も潰れるw f();   f(); f(); 	
■
>>8 で書き込み時の文
   f();  
f();  
	f(); 	
■
>>8 を素のIE/禁断の壷+IEで表示及びコピペした場合
の部分が潰れずに空白になる。コピペしても通常の半角空白。
他は潰れて消える。
■
>>8 をjaneで表示及びコピペした場合
 の部分が潰れずに空白になる。コピペしても通常の半角空白。
の部分はjane上では潰れずに空白になるけど、
コピペすると空白にならず、  になる。
&am;#9;は潰れて消える。
通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
ML系やHaskellやPythonみたいにインデントに文法上の意味がある言語は大変だよなー。 そういうスレを見てきた立場からすると「どうでもいいじゃん」って思ってしまう。
>>11 見てきたけど、Haskellスレでは全角スペース推奨、
Python宿題スレはロダ推奨で、全角スペースが使われてて、
Python初心者スレでは全角スペース(主に質問者)と が使われてるね。
>>10 乙
> 通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
も表示だけなら潰れない、と読めたのだが気のせい?
> コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
これはそのようだね
14 :
10 :2008/06/15(日) 13:04:58
>>13 > も表示だけなら潰れない、と読めたのだが気のせい?
ごめん素で間違えた。その通りです。
2ch も pre コマンドを採用すればいいのにね。 メール欄に pre と書くと pre タグが使われるようにする奴。
だな
a=c; b=a; と a=b=c; って同じことですか?
ちがう
19 :
デフォルトの名無しさん :2008/06/15(日) 15:48:08
まとめるとしたら b=a=c;だな
厳密に考えればそれも違うけどね。
=は左結合だから b=a=c;⇔b=(a=c); でも a=cが、aにcを代入した後のものを返すか、それ以前のaを返すかは未定。
まー、普通のプリミティブなデータ型なら、そこまで気にする必要はないだろうけどね 基本的には同じと思っていいよ ただ、それに囚われていちゃダメ C++ならoperatorでやりたい放題だし
>>22 20じゃないけど、
「ユーザー定義型のoperator=()の戻り値が、必ずしも*thisになってるとは限らない」
というのを考慮してるのでは。
アセンブリの話する気か?
aがvolatile指定されていた場合、 a=c; b=a; はaに対してwriteとreadが1回ずつ発生するが、 b=a=c; はaからreadする保証が無い。 ってことか?
保証されると思う。
>>21 代入した値、つまりはcと同じ
を返すに決まってるだろ個の貸す
CとC++を学び、そろそろGUIでゲームを作りたいのですが、 CかC++ベースでGUIプログラムを作るにはどうすればいいのでしょうか? 幅広く使用されている方法が望ましいです。
>>31 directXのラッパーライブラリあたりでも使えばいいんじゃない?
dxlibとかyanesdkとか
あとSDLとかでも
>>23 >>26 はちゃんとわかってるな。
論理上保障されないという事態が起きるのは、
bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。
スレッドが絡むとさらにカオスになるから触れないでおこう。
それ以外では気にすることではない。
>bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。 aがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。 ミスった
aがレジスタの場合も動作が違ってくる。 組み込み系の話だけど。
ああCPUその他のハードウェアによってはvolatileが 実現できない場合があるな
=演算子の式の値をどうコンパイラが解釈してるかなんだよね VC++2008の場合はvolatile bでbからロードしなおしていた
>>32 どもども、調べてみます。DirectXが王道ですかね
初心者向けのゲーム作る用の本とかは店においてるのはよく見るな
>>17 の俺は勉強始めたての素人で
今はまだ皆さんの回答の意味が理解できなさそうなのでとりあえず
a=b=cじゃなくてb=a=cだったら
同じことではないけどだいたい同じ
とだけ覚えておきます
ありがとうございました
今勉強したての素人から脱したんだよ。
普通にやってたら、この程度のことまず気にしてねーもんなw まー、俺は=演算子を1行に複数に書くこと自体やらないが
43 :
デフォルトの名無しさん :2008/06/15(日) 19:42:15
質問です 環境はWindowsXP,言語はCです. system関数(またはそれに近い関数)を使って別のプログラムを時間制限付きで起動させたいです 例えば,a.exeというプログラムを実行させて,30秒たっても処理が完了していなかったらa.exeを強制終了させたいです. なにか良い方法はありますか
>>43 CreateProcess / TerminateProcess
でも行儀のいい方法は書かないんだね。
処理が完了という判断は、a.exeのプロセスが生きているかどうかだけでいいのか?
48 :
43 :2008/06/15(日) 22:20:34
>>47 すみません,書き忘れました.
a.exe は処理が完了したら終了します.
>>44 どもありがとうございます
調べてみます
>>46 強制終了って前提条件が既に行儀悪いからな。
普通は数秒で終わるものがバグとかで終了しなかった場合、じゃないの? 俺はそう思ったけど。
相手がコンソールプログラムならGenerateConsoleCtrlEventの方が 少しはマシかな。
#define offsetof(type, member) ((size_t)&((type*)0)->member) このマクロの(type*)0->memberはどういう意味なのでしょうか? 0番地のtype型のメンバ変数memberでよいのでしょうか?
>>53 そのとおりなんだけど、実際にはそんなものは存在しなくて、直後にアドレスを size_t に
無理やり変更することで offsetof() が返すべき値を取り出している、というところまで
合わせて意味を持つ。コンパイラの実装を知っている立場でなければ、真似しちゃいけない。
>>52 よく読んでないけど last->next=p で入れてるんじゃね
>>52 last->next=p;
last=p;
と分ければわかりやすいでしょうか。
>>55-56 ありがとうございます
もう少しで分かりそうなんでもうちょっと頑張ります
58 :
デフォルトの名無しさん :2008/06/16(月) 16:11:09
事情によりコードはupできなくて申し訳ないのですが、質問させて下さい。 ヘッダで宣言したメンバ関数を.ccで実装するとき、いくつかの関数でmultiple definitionと言われてコンパイルできません。 インクルードガードはもちろんかけています。例えば、 [foo.h] #ifndef _FOO_H_ #define _FOO_H_ class foo{ private: int a,b,c; pulic int getA(); int getB(); int getC(); } #endif [foo.cc] #include "foo.h" int foo::getA(){return a;} int foo::getB(){return b;} int foo::getC(){return c;} とかなっているときに、getAはOKなのにgetBとgetCのみmultiple definitionと言われるような状況です。 他にも、引数なしのコンストラクタはOKなのに、引数付きでオーバーロードしたコンストラクタのみ mutiple definitonと言われたりします。 これらの現象は全て、問題の関数実装時にinline宣言すると消えます。これはどういう問題なのでしょうか。
59 :
58 :2008/06/16(月) 16:12:37
すみません
>>58 で、
public
のあとに:が抜けてました。
実際のコードではそういったミスはありません。
>>58 現象を再現できる最低限の断片を作って張ってくれ。
尤も、その過程で原因が判ることもしばしばだが。
例えば、getA()がエラーにならないのは使ってないからじゃないかと思うが>58だけでは判断できん。
61 :
58 :2008/06/16(月) 16:33:55
>>60 すみませんが今すぐは作れないので、後でまた張りに来たいと思います。
Cから呼び出したDLL内でEXCEPTION_ACCESS_VIOLATION (0xc0000005) が発生した場合、それをC側から補足できますでしょうか? 例外が発生したことを上の関数に返したいのですが 難しいでしょうか? よろしくお願いいたします。
>>62 Windowsの話なら、WinAPIスレで過去に話題になってたかと。
>>63 ありがとうございます。APIスレにいってきます。
65 :
58 :2008/06/16(月) 19:27:04
>>60 色々やってたら解決しました。
どうも元々ひとつだったヘッダファイルを細分化したときに、makefileの方で変なことをやってしまったのが原因ぽいです。
どうもありがとうございました。
なんでカウント変数にiを使うのですか? なにかの略なんですか?
iterator
indexの説もあったような
特に理由は無いけどindexだと思ってた。idxってのもよくあるし
古代FORTRANで、一文字トークンにaからhが予約されていて ユーザーが自由に使えるものがiからしかなかったのがそもそもの由来。
それたまに聞くけど、 n Σa_i i=1 とか数学で使う際の i って FORTRAN 以降で広まったものなのか?
古代FORTRANの場合宣言なしで使える変数があって、 I,J,K,L,M,Nあたりが宣言なしで整数、 それ以外が宣言なしで実数だった。
ありがとうございます
>>72 そもそも整数がその範囲に割り当てられた理由もあるんじゃね?
FORTRAN は数式を扱うことを目的に作られたから イテレーションによく使われていた i から始まり、 整数値としてよく使われていた n までを整数にした、 と考えるのが自然な気がするよ。
FORTRANのiはintegerのiだな。
数学で使われる方のiがintegerのiとは考えんのかね。
indexのiにきまってるだろ。
H の後に I があるなんてJokeだよ
LinuxもしくはOS Xでgccを使った場合の質問です。 - /usr/local/lib/libFOO.a - bar.cxx の2つがあり、bar.oとlibFOO.aを合体させて、 libbar.soというのを作りたいと思っています。 (libFOO.aも共有ライブラリの中に組み込んでしまいたい) この場合、 $ g++ bar.cxx -o bar.o したあとに、どのようにすれば良いのでしょうか。
マニュアルを読めばいいと思うよ
84 :
82 :2008/06/17(火) 01:23:16
なんでそんなことをする必要があるかと言うと、 色々なライブラリを必要に応じて読み込むソフトがありまして、 そいつに自作のライブラリを読み込ませるためには、 必ず共有ライブラリじゃないと駄目なんです。 なので、libFOO.aを読み込ませる場合には、 一回自分で共有ライブラリを作らないといけない、と。
>>81 HしてもIがなかったらJuniorが生まれてこないとは考えんのかね。
>>87 望まれないJuniorっていう不幸もあるからなぁ
Knockが足りなかったんだろう
つまんないからやめろ
91 :
デフォルトの名無しさん :2008/06/17(火) 19:06:29
抽象的な質問で申し訳ないですが あるクラスのメンバ関数を実装するとき、内部の処理をベタ書きすると 長くなるので、関数化したいことは良くあると思います。 このとき、その関数化したい処理そのものは、もとのメンバ関数の処理に比べて 低級な処理なので、同じクラスのメンバ関数として定義するのには違和感があります。 かといって、専用のクラスを作るほどではないと感じる場合があります。 こういう場合、どういった形で関数を定義するべきでしょうか。 例えば、積分をするためのループ処理1ステップ分を関数化して切り出したい場合などです。
よくわからんがprivate関数じゃだめなの?
アクセス制御で外からは見えない関数にすればいいよね
内部クラスの静的メソッドでいいよ。
>>91 自分専用ライブラリを放り込んでおく場所を決めておくと良いよ。
Cマガ休刊したんじゃないっけ?
>>98 そのサイトもアクセスできません・・・。
スレ違いですが質問させてください。
代わりにソースプログラムを配布しているサイトご存じないですか?
>>98 で落とせるけど。
文字コードは EUC な。
>>100 ダウンロードできました!!
ありがとうございます><
コピーコンストラクタを呼ばずにキャスト演算子使う方法はありますか? こんなんでエラーが出ちゃって困ってます class NoCopy{ public: NoCopy(int){} private: NoCopy(const NoCopy &); }; class Hoge{ private: operator NoCopy(){ return NoCopy(i); } }; int main(){ Hoge h(); static_cast<NoCopy>(h); //エラー! return 0; }
class NoCopy{ public: NoCopy(int){} private: NoCopy(const NoCopy &); }; class Hoge{ public: operator NoCopy(){ return NoCopy(i); } }; int main(){ Hoge h(); h.operator NoCopy(); //エラー! return 0; }
> Hoge h(); 引数無しでHoge型を返す関数のプロトタイプ宣言
>>102 何をしたいのか理解に苦しむけど、リファレンス返すのはどう?
#include <iostream>
#include <memory>
class NoCopy {
int val_;
NoCopy(const NoCopy&);
NoCopy& operator=(const NoCopy&);
public:
NoCopy(int val) : val_(val) {}
void dump() const { std::cerr << val_ << std::endl; }
};
class Hoge {
std::auto_ptr<NoCopy> nocopy_;
public:
Hoge() : nocopy_(0) {}
operator NoCopy&() {
nocopy_ = std::auto_ptr<NoCopy>(new NoCopy(1));
return *nocopy_.get();
}
};
int main() {
Hoge h;
NoCopy& nocopy = h;
nocopy.dump();
}
別にコピー禁止クラスにキャストしたい訳じゃなくて キャスト演算子が必ずコンストラクタを2回呼ぶのが気に食わなかっただけです 使い捨て一時オブジェクトのためにポインタ持たせたくないし、 直接関数呼び出しするくらいなら普通のメンバ関数にしようと思います ありがとうございました
ある圧縮ファイルの読み込み関数使ったら戻り値がバイナリデータへのvoid*なんですが これをFILE構造体に変える方法ってありますか? VC2008exp使ってます。
>>107 「FILE メモリストリーム」でググってみれば?
>>108 してますけど、どちらかというと精神的な問題なので
でも規格読むとstatic_castでキャスト演算子呼ぼうとすると
一時オブジェクト作るのに絶対コピーコンストラクタ使うらしいので諦めました
そんなあなたにPOD型
戻り値最適化って関数3段階経ても効くんですか? 戻り値最適化効いた結果が2回だと思ったんですけど
とりあえず2回呼ばれるというコードはどれ
#include <iostream> struct X{ X(){std::cout<<"X()"<<std::endl;} X(const X&){std::cout<<"X(X&)"<<std::endl;} }; struct Y{ operator X(){return X();} }; int main(){ Y y; static_cast<X>(y); return 0; } VC2008で X() X(X&) って表示された
g++ だと X() としか表示されないけど。 Release ビルドでもそうなる?
失礼します。 Visual Studio 2005、C++言語でファイルストリームを用いたファイル入出力について質問させてください。 ifstream fin("test.txt"); のように相対パスで指定した場合は正常にファイルが開かれるのですが、 ifstream fin2("C:\\Documents and Settings\\ORESAMA\\デスクトップ\\test.txt"); と絶対パスで指定するとファイルが開けません。 (ちなみに、C言語風にfopen()を用いた場合は絶対パス指定でもファイルオープン出来ました。) これはどのような原因が考えられ、またどのように対処すれば良いかご教授頂けないでしょうか。 何卒よろしくお願いします。
Releaseでも同じだった 規格上はこっちが正しいんじゃないのかしら
VC++ 2005 には fstream に日本語パスを渡すとファイルが開けないバグがあったはず。
>>118 最適化レベルあげてみてもだめ?
規格上は、コピーコンストラクタを省略できる所は省略していいって仕様が別の所に書いてある。
すげー分かりにくいけど。
ああ、バグじゃなくて、ロケール設定が必要だということらしい。 setlocale(LC_ALL, ""); と書いてみて。
いや、バグはバグでいいのか。
>>120 最適化設定色々いじくってみたがどうやっても2回呼ぶようだ
125 :
117 :2008/06/18(水) 00:46:30
>>119 即レスありがとうございます。
仰る通り試してみたところファイルは問題なくオープンできるようになりました。
しかし、setlocale()より後ろで
cout << "abcde\\あいうえお";
のように日本語の文字列を出力させようとすると、abcde\までが出力されて、プログラムが終了してしまいます。
何度も申し訳ありませんが、どうかご教示お願い申し上げます。
>>117 VC++8.0以降はfstreamはワイド文字版のファイル名を受け付けるよ
ということは L"..." にすればおk?
うん。ちゃんとUTF-16に対応できて、C++なのにstd::setlocale()で グローバルロケールを弄る必要も無いのが利点 難点は移植性がないことなので、気になるんならboostの力を借りるんだね
ファイル名を変数で指定し出すとまたややこしい事になりそうですね。
今なら全部UTF-16でコード書く方を勧めるけどね Win98もサポートするとかなら別だけど
ま、wchar_t*もchar*も受け取っちまうからねぇ VC++8.0以降だとcodecvt<>もわりとまともに動くと思うので string->wstring変換が簡単に書けるが codecvt<>で使ってるmbstate_tって、一応標準のクセに 標準的な初期化手段すら定められていないという恐ろしい状態だったように思う 「VC++では」 mbstate_t mbs = { 0 }; で初期化できるはずだけど
132 :
117 :2008/06/18(水) 01:09:50
うーんごめんなさい。 せっかくレス頂いたのに文字フォーマットなどの知識が足りないようで今イチ理解できてません。 皆さんのレスを見る限り今の私にはとても難しそうなので、おとなしくfopen()を使いたいと思います。 こんな初心者の質問につきあって頂き、ありがとうございました。
「FILE メモリストリーム」でググらなくても バイト列からストリームで入出力する方法はわかるんですけどね。 知りたいのはFILE構造体を入力として受け付けるライブラリに 別のアーカイブライブラリからの出力であるバイト列をぶち込む方法なんです。 やっぱり前者のほうを書き換えるしかないのかな……。
>>133 パイプでも使えばいいんじゃないの?
pipeで作って、FILE*が必要なほうにはfdopenして。
>>125 そのとき、いったいどんなエラーメッセージが出てくるの?
>>121 >>128 C++ならstd::locale::global(std::locale(""));使ってあげてください。
中でsetlocaleも呼ぶので心配しなくて平気。
VC++2005でstlで使用する場合 全体の設定はデフォルトのまま"C"にしておく。 std::locale::global(std::locale("C")) iostream系を使う場合は個々にロケールを設定する。 std::wcout.imbue(std::locale("")) std::wcin.imbue(std::locale("")) VC++2008では確認した限り直ってる
>>136 ctype以外のカテゴリをグローバルロケールに設定なんてしたくないよ
sstreamの数値フォーマッティングとかにまで影響があるし
やるならctypeだけに絞る
どっちみちWin32ならファイル名はUTF-16なんだから
ファイル名はUTF-16で扱っとかないと、「とりあえず日本語のファイルが開ける」
ようになるだけじゃん
140 :
91 :2008/06/18(水) 12:57:25
レス遅くなってすみません。ありがとうございました。 色々方法はあることがわかりました。 オブジェクト指向的にどれが正しいか…と考えるとよくわからなくなってしまいます。 privateメンバの中に書いてしまう方式で行こうかと思っています。
> 134 なるほど。 ありがとう、やってみる。 char dat[8] = "message"; HANDLE pipe_r; HANDLE pipe_w; BOOL res = CreatePipe(&pipe_r, &pipe_w, NULL, sizeof(dat)); DWORD dwSize = sizeof(dat); DWORD dwResult; WriteFile(pipe_w, (LPCVOID)dat, dwSize, &dwResult, NULL); int hCrt = _open_osfhandle((long)pipe_r, _O_TEXT); FILE * fp; fp = _fdopen(hCrt, "rb"); int n; while((n = fgetc(fp)) != '\0'){ putchar(n); } fclose(fp); // CloseHandle(pipe_r); CloseHandle(pipe_w); これでいいんかね? この場合 CloseHandle(pipe_r); するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
>>141 > するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
そういうこと。
_open_osfhandleの説明には、_closeが中でCloseHandleする、
_fdopenではfcloseが中で_closeすると書いてある。
あと、_open_osfhandleと_fdopenでモードの指定が食い違っているのと、
_open_osfhandleでのハンドルの型は、longではなく
intptr_t(またはINT_PTR)になっているということが気になった。
143 :
デフォルトの名無しさん :2008/06/18(水) 17:13:35
#include <iostream> class intl{ public: int il; void setil(int &i){il=i;} }; int main(){ int *i = new int; *i = 1; intl i_intl; i_intl.setil(*i); delete i; std::cout << i_intl.il; return 0; } というようなことをやると、1が出力されます。 私の理解ではintl::setil()は参照仮引数なので、呼び出し時に*iのアドレス、 つまりポインタiが渡され、*iとilが同一のメモリ領域を表すようになるのではと思います。 従ってiをdeleteしてしまうとilも消えるのではと思うのですが、そうなっていないようです。 私の考えのどこが間違っているでしょうか。よろしくお願いします。
ii_intl.ilが参照でもポインタでもないから、 setilの中では、iからilへ値がコピーされている。
deleteってのはオブジェクトをもう使わない、とシステムに返す命令。 中身をクリアするわけじゃない。 直後に i を参照すれば、その間に何の処理も行われないからメモリ上は前の値が残っている。 それを参照しているだけ。 いつどのタイミングで、このiの値が書き換えられるかは、誰にも予想できない。
げ、恥ずかしい。 144のいうとおりだった。 145は早とちり。
147 :
143 :2008/06/18(水) 17:35:28
レスありがとうございます。
クラスintlの定義を変えて
class intl{
public:
int *il;
void setil(int &i){*il=i;}
};
とした場合はやはりdelete後もilが残り、
class intl{
public:
int *il;
void setil(int &i){il=&i;}
};
とした場合はdeleteによってilも消えるようです。
>>144 によれば、iが参照渡しでかつilがポインタであっても
*il = i;
の場合はiのコピーが渡されるということのようですね…。
この場合、il自身はインスタンスi_intlが消えるまで生き残るということですよね?
うーん、ややこしい気がする…。
148 :
143 :2008/06/18(水) 17:35:56
sage忘れすみません。
> int *il; > void setil(int &i){*il=i;} 初期化してないポインタ il が指す場所に値を入れてるのでダメ。
参照をポインタと似たようなもんだと思っていたら訳ワカメになるよ。 どうやらポインタのほうも理解していないようなので、 まずポインタとメモリの動的確保をきっちり勉強したほうがいいね。
巷じゃMozilla Firefox 3.0の話題でもちきりだが、4.0世代はC++で開発するんだな・・・
いまままではCC??
memcpyは第三引数が0であっても正常に動作する事が保証されていますか?
規格に 0 だとダメとか特に書いてないから 0 でも大丈夫。
派生の質問だけど、第3引数が 0 で第1第2引数が NULL の場合はどうなんだろ。 memcpy の規格には領域が重なってるときは未定義ってことしか書いてないけど・・・。
そういや、いつの間にか規格が文書内検索できるようになってた。 結構文句きてたんだろうな。
Foxit Readerで見れなくなっちまった。
158 :
デフォルトの名無しさん :2008/06/19(木) 01:18:31
失礼します。 整数nを入力したときにn重for文として動作する関数を作る方法はありますでしょうか? 具体的には、 int* hoge = new int [n]; のように動的に確保した配列に for(int i=i0;i<imax;i++){ hoge[0] = i for(int j=j0;j<jmax;j++){ hoge[1] = j; ... //n-1回目ループ for(int k=k0;k<kmax;k++){ hoge[n-1] = k; //hogeに関する作業 } } ... }} のようにして、 hoge[n]={i0,j0,...k0} hoge[n]={i0,j0,...k0+1} ... hoge[n]={imax,jmax,...kmax} のように、nが変わってもhogeに値を代入できる関数です。 何卒よろしくおねがいします。
それはそんなループにしなくてもいいと思うんだが。
その例の理解に苦しむが、多分再帰を使うことで解決できるように思う
>>158 こんな感じでやるといいのでは
#include<stdio.h>
#define N 3
void show(const int hoge[])
{
int i;
for(i = 0; i < N; i ++) printf("%d ", hoge[i]);
printf("\n");
}
int main()
{
static const int hoge_min[N] = {0,0,0};
static const int hoge_max[N] = {2,4,9};
int hoge[N], i;
for(i = 0; i < N; i ++) hoge[i] = hoge_min[i];
while(hoge[0] != hoge_max[0]) {
show(hoge);
for(i = N-1; i >= 0; i --)
if(hoge[i]++ == hoge_max[i])
hoge[i] = hoge_min[i];
else
break;
}
return 0;
}
>>161 マイクロソフトのコンパイラが必要だよ
VC Expressでもいれるといい
164 :
158 :2008/06/19(木) 01:47:26
>>162 素早い回答ありがとうございます。
しかし、実行してみたら動作に疑問がありましたので、
さらにもう一点よろしいでしょうか?
結果が
000
001
002
003
...
と期待通りなのですが、
最後が
149
で終わってしまい、
hoge_max[0]まではカウンタが回ってくれません。
単純にhoge_max[0]を1多く設定すればよいのでしょうが、
この点うまくいかないでしょうか?
>>
C++のクラスのメンバ関数で delete this; ってアリなんでしょうか。 もちろん、delete thisはその関数の末尾に置かれており、 それ以後、開放したインスタンスにアクセスすることはありません
C++でクラスを作るときに コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子のほかに これは必ず定義しておいた方が良いものってありますか?
なお、そのクラスのインスタンスは、全てnew演算子でつくり、 自動変数としてインスタンスを生成することはないものとします
>>165 普通はやらないけど別にdelete this自体はしてもいいと思うよ
>>169 レスありがとうございます
ゲーム作ってて、キャラクターにAIクラスへのポインタを持たせて、
AIクラスを切り替えることで、行動を制御しようと思っています。
AIクラスを切り替える場合に、新しいAIクラスを作った後、今までのAIクラスを消す必要があったので、
delete thisするのが適当かな、と思ったのです
その使い方は全然適切じゃない。
切り替えるところでdelete 今までのAI;すればいいことじゃないのかな
AIを切り替える判断も、切り替えるために新しいAIクラスを生成するのも、AIクラスの仕事なんです キャラクターは毎フレームAIクラスのメンバ関数を呼び出し続けるだけ こんな感じで this->AI.update(this)
訂正 this->AI->update(this) ですね
>>166 「クラスによる」「プログラムによる」という当たり前のことがまず前提としてあって、
その上で定番的なものを挙げるなら、operator==()、operator<()、operator!()、あたりかなぁ。
>>164 実行してみたけどコードは読んでない?
答え書くのは簡単だけど、ちょっとは考えてみようや。
最後までループが回らないというのであれば、ループの判定箇所になにかある、と考えてみる
>>162 作のサンプルコードでは、ループの判定を行っている箇所が3箇所あるのはわかるかな?
1. while(hoge[0] != hoge_max[0])
2. for(i = N-1; i >= 0; i --)
3. if(hoge[i]++ == hoge_max[i])
それぞれが何をやってるかを考えればどう変えればいいかわかるはず
あなたが自分で書いているように、hoge[0]以外はhoge_max[i]まで回ってて、hoge[0] だけ hoge_max[0]まで回らないんだから
>>173 なぜそこまでAIにやらせたがるのかわからないけど、
新しいAIの最初の仕事を、古いAIの削除にするとかどうかな
>>173-174 それ、 AI が中で delete this したらキャラクタが持ってるポインタ AI を更新しないと
いけないはずなんだけど、どうなってるんだ?
179 :
158 :2008/06/19(木) 09:19:20
>>176 あ。。こう書かれたらわかりました。
ありがとうございます。
delete thisをしない
別にしてもいいんじゃね? 各AIは、キャラクタへのポインタを持っていて、 今のAIが次のAIを作成、キャラクタのAIを次のAIに変更して、AIは自殺 ってことだよね?何も問題ないかと。
#defineだとnamespace使えないですよね? enumとかはnamespaceに閉じ込められるんでしたっけ?
delete thisをするようなメソッドを含むクラスを auto変数として呼び出したとき危険じゃない?
>>185 見落としてた
あとはnew[]でインスタンスを生成したときも危ない罠
プログラミング組めって言われたんだがさっぱりわからんすorz 基数変換の簡単なやつといわれたんだかさっぱり・・・ m進数→10進数→n進数という過程で 元:2〜16進数(選択)→変換先:2〜16進数(選択) とりあえず途中までコピペで組んでみたんだけど結果がおかしいし 誰かご教授願います。 #include<stdio.h> #include<string.h> #include<math.h> int main(void){ int a, kisu1, kisu2, keta, data10shin, i, j,result,kisu; char motoData[128]; int opeData_10shin[128], convertedData[128]; //置換用 int taiouData_int[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; char taiouData_char[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int dataMoto[128], data2shin[128];
printf("***** 基数変換 *****\n"); printf("変換元の基数を入力して下さい\n"); scanf("%d", &kisu1); printf("変換元の数値を入力して下さい\n"); scanf("%s", motoData); //charデータとして処理 printf("変換先の基数を入力してください。\n"); scanf("%d", &kisu2); for (keta=0; motoData[keta]!='\0'; keta++){ } for (i = 0; i<keta; i++){ for (j=0; j<16; j++){ if (motoData[i]==taiouData_char[j]){ opeData_10shin[keta-i-1]=taiouData_int[j]; break; } } }
基数変換の考え方を復習しよう!
do{ a /= 10; keta += 1; } while (a > 0); ; for (i=keta-1; i>=0; i--){ dataMoto[i] = (int)(a/pow(10, i)); a -= dataMoto[i]*pow(10, i); result = 0; for (i=0; i<keta; i++){ result += dataMoto[i] * pow(kisu, i); } a = data10shin; //変換作業用のコピー i = 0; while(a!=0){ data2shin[i] = a * 2;
printf("%4d進数:%s\n", kisu1, motoData); printf("⇒%2d進数:", kisu2); for (i=keta-1; i>=0; i--){ for (j=0; j<16; j++){ if (convertedData[i]==taiouData_int[j]){ printf("%c", taiouData_char[j]); } } } printf("\n"); return 0; } }
>>186 new [] が危ないなら new(std::nothrow) とか new(std::nothrow) [] とかも危ないな。
コンストラクタ(コピー〜も含めて全部)を private にすればいいんだけどね。
193 :
デフォルトの名無しさん :2008/06/19(木) 12:38:52
>> 142
遅ればせながら多謝。
int hCrt = _open_osfhandle((long)pipe_r, _O_TEXT);
↓
int hCrt = _open_osfhandle((intptr_t)pipe_r, _O_RDONLY);
に変更しました。
ところで
>>141 のソースのfp使って
char buffer[2];
fread((LPVOID)buffer, 1, 2, fp);
fseek(fp,0,SEEK_SET);
fread((LPVOID)buffer, 1, 2, fp);
とやると2回目のfreadに失敗するんだけど
fseekってなんか制限あるんだろうか?
パイプはシークできないよ
195 :
デフォルトの名無しさん :2008/06/19(木) 13:34:57
>>194 Σ(゚д゚|||)
もうおとなしくテンポラリファイル用意するかな・・・・・・。
196 :
デフォルトの名無しさん :2008/06/19(木) 22:51:12
STLのlistコンテナで、iteratorが指している要素と、その次の要素を同時に使いたい場合どうしたらよいでしょうか。 例えば std::list<point> points 点列リスト std::list<point>::iterator itr = points.begin() とりあえず最初に合わせる Vec::Vec(point1,point2) 2点から成るベクトルを作成する、Vecクラスのコンストラクタ このとき Vec v1(*itr, *++itr) とかすると、最初の*itrまでインクリメントされてしまいます。 ダミーのiteratorを用意するくらいしか思いつかないのですが、他に方法はあるでしょうか。
std::list<point>::iterator itr0 = itr; itr++; Vec v1(*itr0, *itr); ダミーって。
ifstreamとofstreamの良い解説サイトないですか? 検索してみても出てくるのは簡単な使い方ばかりで、まとまったものが見つかりません。 リファレンスのようなものが見たいです。 お願いします。
DLL作成のいろはが書かれたサイト、もしくは参考書はないでしょうか? 検索してもヒットするのはさらっとソースコードが書かれているだけのページばかりで、 いろはがまったく解りませんでした。
すみません初心者です。 ポインタと配列のところで参ってしまってるんですが・・・ 本に拠ると int test[5]; で、test = &test[0]; というのはなんとなく理解できたんですが、 仮に ans = avg(test); のtestを参照渡ししたとして、 渡されたパラメーターがdouble avg(int t[]){の様に、 int型の配列に参照渡しされているんですが・・・ test = &test[0]; というのはアドレスにも関わらず、 int型の配列に参照渡しが可能な理由というのはなんなのでしょうか? 配列にはアドレスを参照渡しできると考えていいんでしょうか? 返信宜しくお願いします。
>>197 やはりそれが常識的な方法ですか。
普通のリスト構造の*nextポインタを使って *(itr.next)みたいにできる方法があるかなーというイメージでした。
その方法でやりたいと思います。どうもありがとうございました。
>>201 配列を保持している変数の実体は、配列の先頭要素のアドレス。
つまり、int型の配列はアドレスを意味しているため、型が合っているので渡せる。
その場合であれば、
double avg(int t[]){} ≒ double avg(int *t){} になる。
204 :
201 :2008/06/19(木) 23:20:32
>>203 どうもありがとうございます。
配列そのものをアドレスと認識してもいいんでしょうか?
>>201 関数の引数で配列を宣言すると、それはポインタの宣言になる。
規格書の 6.7.5.3 の 6 にこう書かれている。
> A declaration of a parameter as ``array of type'' shall be adjusted to ``pointer to type''
206 :
201 :2008/06/19(木) 23:30:13
>>205 どうも!
なるほど、だから double avg(int t[]){} ≒ double avg(int *t){}
ポインタを利用したものに変換できるんですね。
≒じゃなくて完全に=だからな
>>202 常識的つーか、引数の評価順が不定だからそうしないとやばい。
boost使えるんならboost::next()が使える。
>>200 別にそんな、「いろは」という程の知識は要らないよ。
だから詳細なサイトとか参考書が見つからない(見つかりにくい)のだと思う。
その「さらっと書かれたソースコード」だけでも、DLL作成に必要なことの多くを
既に説明してしまっているかもしれない。
>>204 注意だけど配列=ポインタではないからね。
他の人の回答は「関数の引数の場合」という前提だからね。
内部ロジックからGUIに幾つかのパラメータを渡して表示させたいのですが 引数にパラメータ番号をとり、それに応じた返り値を渡すようにするか パラメータを集めた構造体を返すか 引数に配列やlist、vectorの参照をとって、そこに値を格納させるか どういう方法が一般的ですか?
アクセサーを渡してそれ経由で。
>>213 アクセサーを渡すとはどういう事でしょうか?
内部ロジックのpublicメンバとして値を引き渡す関数を公開しようと考えていたのですが
それとは別の方法なのでしょうか?
機能追加でパラメーターが変化してしまう可能性があるので
パラメータひとつずつにアクセサ関数を用意するのは避けたいのですが・・・
内部ロジックにGUIをいろいろと考慮したメンバ関数を持たせるのは美しくない。 内部ロジックには値を得るためのクラスのインスタンスを渡す関数だけ追加して、 GUIとの調整はそのクラスでやるようにすればいい。 つーか > 引数にパラメータ番号をとり、それに応じた返り値を渡すようにするか これこそ「機能追加でパラメータが変化」するたびにif文で切り分けたり 関数テーブルで飛ぶような読みにくいソースを弄ることになると思うんだが。
クラスの中に同じクラスのポインタを持たせている場合、 そのポインタを使ってprivateメンバにアクセスできてしまうのですが、 これは環境依存などではない仕様なのでしょうか? VS2005上で書いたソース class A { private: int m_val; A* m_pNext; public: void SetNext(A* pNext) { m_pNext = pNext; m_pNext->m_val = 1234; // エラーにならない } }; A a1, a2; a1.SetNext(&a2); a1.m_val = 1111; // エラーになる
>>215 有り難う御座います
パラメータの読み出しを行う中継クラスを用意するのですか
ロジッククラスにパラメータクラスのインスタンスを保有させておいて、GUIにはその参照を渡すようにする
インターフェイスの整合はパラメータクラスとGUIクラスの間で対応する
質問続きで申し訳ありませんが
機能追加があり得るということを考えると、パラメータクラスの基底クラスのポインタを渡すことになりそうですが
この場合はGUI側でキャストして対応、でよいのでしょうか?
参考書や解説サイトではキャストは良くないと言うことですが・・・
>>219 ありがとうございます
そういう仕様で行きたいと思います
221 :
217 :2008/06/20(金) 11:28:28
>>219 ありがとうございます。
同じクラス同士なら別オブジェクトのprivateメンバをいじれてしまうのですね。
なんか気持ち悪いです。
>>218 機能が増えたら基底クラスを拡張するだろ。常考
>>221 他のクラスから触れないようにする指定であって、自分の管理下のメンバは触れないと困ると思うけど
自分が管理するんだから同じクラスの他のオブジェクトを受け付けるインターフェースを持たない設計にすればいいだけのことではなくて?
こんちわ!質問です。 WinApiのBitBltってクリッピングしてくれるんですか? テストコード書いたんですけど、自分でクリッピングしなくても動いてしまったのでちょっと不安です。
デザパタ厨がとおりますよっと
>>218 のやりたいことは恐らく
機能追加はDecorator パターン
値の取得はChain of Responsibility パターン
で解決する予感
GDIの関数を、本当にC言語固有のものだと思ったのだろうか
みなさんUNICODEへの対応はしていますか? 過去のプログラムへの対応はともかく、これから1から作るものに関しては対応しておいた方が良いのでしょうか?
プラットフォーム次第だろ Unicodeにかまけて肝心のShiftJIS以外でバグ出してたら世話ないという考え方もある
>>228 Shift JISに対応してないと困るんだが。
>>228 がWindowsを前提としているとは限らない件
233 :
デフォルトの名無しさん :2008/06/21(土) 09:24:40
stdio.hが無かったらプログラムが動かないから、漠然と「プログラムを動かすための原動力」みたい思ってて、 でもstdio.hもヘッダファイルである以上、C言語で書かれてると思ったのですが、 いざ開いて見てみるとよくわからん文字列や関数(?)みたいなののオンパレードだったのですが、 こういう「原動力ファイルを作るための言語及び法則」みたいなのってあるんでしょうか? それともやっぱあれも純粋なC言語なのでしょうか? それとも「stdio.hが原動力」という発想が間違ってるのでしょうか? なんかよくわからん質問ですみません
>>233 stdio.h → std io h → standard IO header → 標準入出力用のヘッダ
>それともやっぱあれも純粋なC言語なのでしょうか?
純粋なC言語。
マクロが読めてないだけでは。「C言語 プリプロセッサ」でググッてみ。
>>233 stdio.hファイル内のプロトタイプ宣言は呪文だ。
#incude<stdio.h>は呪文を発動させるおまじないだ。
237 :
デフォルトの名無しさん :2008/06/21(土) 10:58:27
238 :
デフォルトの名無しさん :2008/06/21(土) 10:59:49
シーザー暗号(英数字のみ記号は含まない)を復号化するプログラムを組もうとしているのですが const intで文字コードの値で使う部分にA〜Zとa〜zに1〜26。 0〜9に27〜36を入れて入力された変位分分ずらして今度はconst charで何番目かを読み 同時に36を越えた場合は、ソノ値から36を引いた値で出すようにしているのですが値が重複してしまう事があるんですが何故なんでしょうか?
俺の読解力を超えました。 プログラム言語でおk
>>238 なんとなくナローイング変換が絡んでそうだが、よくわからんのでソースうp
241 :
デフォルトの名無しさん :2008/06/21(土) 11:25:50
文字が37種類あるのか
普通に文字の変換が1から開始だからchar似なおすためのは37まであるんだろ?
>>241 ざーっと見た感じ暗号化も復号化もそれでできるんじゃね?
宿題は宿題スレへ
246 :
デフォルトの名無しさん :2008/06/21(土) 12:22:18
宿題じゃないですよ。 C++勉強してて何作ろうか→子供の頃暗号とかつくったなぁ→暗号でぐぐる→ああ、シーザー暗号っていうのやってみようか。ですので
>>246 勉強の目的は別にして、宿題とかでなく、勉強の派生で興味や趣味からプログラミングをしようとしているんだから、
その過程で発生した問題に対しては手軽に回答を得ようとせずに、いろいろと自分で情報を漁って解決するのが楽しいんじゃないのか?
>>241 出来てるように見えるんだが。
重複ってもしかしてaChangeCtoIで0になる部分のことか?
ch = aChangeCtoI[quiz[i]]+heni;
↓
ch = aChangeCtoI[quiz[i]]==0 ? 0 : aChangeCtoI[quiz[i]]+heni;
ifstreamとofstreamを使ってファイルの読み込み/書き込みをしたのですが、 ファイル名が日本語の時、エクスプローラで見るとファイル名が文字化けしています。 読み込みも書き込みもちゃんとできるんですが、なぜ文字化けするのでしょう? 環境はWinXPで、VC2008EEを使っています。
ファイル名に全角使わないでやってみ
252 :
249 :2008/06/21(土) 16:43:42
レスthx
>>250 半角のみのファイル名は問題ないのですが、全角が含まれる時に文字化けするのが気になりました。
>>251 ロケールを設定したら文字化けしなくなりました。
オセロゲームを作ってみようと思って基本は出来たんですが cinの仕様で文字を入れると延々とループしてしまうのでcharで入力してチェックしようとしたのですが 二桁のchar型の数値を直そうとすると二桁に対応すると一桁がだめに一桁に対応すると二桁がためになってしまうのですが 直すのに何かいい手はないでしょうか?
>>254 char in[]=" "; に大して20という文字列を入れて
これを、INTの20として使うにはどうしたらいいんでしょうか
INTのC
桁制限でもしてんじゃね?
2バイトの領域に20という2文字(3バイト)の文字列を入れるとかないわ
>>257 出来ました、ありがとうございます。
>>259 半角スペースを入れてしまったので""の間が狭いんだと思います。
>>261 専ブラのポップアップで見たらギリギリ足りてる
>>259 " "のこと?
2chだと半角スペースの連続が一つになるから、それだと思う。
ム板は連続する半角スペースもそのまま表示させて欲しいお
標準で<PRE>を挿入しろ! って、<PRE>で表示されるんだっけ?w
前スレの最後の方と、
>>6-16 で出てるインデントの話と同じだな。
ほんと支障出るから困るよな・・・。
pre付けて欲しいよ。
" "でがんばれ 専ブラには変換オプションがあるはず
270 :
200 :2008/06/21(土) 19:17:57
>>209 記述されている要素のそれぞれが何を意味していているのか?
がサパーリだったので「いろは」から噛み砕いての解説を必要としていたのですが、
どうにも見つかりませんでした。
>>211 msdnだけで(自分は)ソースコードはかけないので、
「いろは」の書かれたサイト(や参考書)が欲しかったのです。
どうでもいいけど、VC++前提で$catはねぇだろ……
さしあたって
>>211 に書かれている程度の記述は理解できたのですが、
DLLに限らず、オブジェクトのリンク関連は解ってない部分が多いです。
文法の解説はいくらでもサイトや参考書が見つかりますけれど、
各環境のコンパイラ、リンカへの指定法についてはなかなか見当たらないのが
ムガーーーッです。
>>270 その要素(コンパイルオプションとか、キーワード)でググれば良いんじゃね?
>>273 プログラム的には難しいところは全然無いよ。
ただ、頭が柔らかくないとダメ。
大きい企業の職業プログラマの人達は苦手な人が多いんじゃないかな?
(偏見だけどね)
>>273 つみ重ねだな。一度ものにした技は比較的に楽に使えるようになる。そういうのをどれだけ知ってるかが強さだ。迷路作成も解くのも重要な基本アルゴリズムだ。
じっくり読むんだ。
>>273 大きく分けて2つ、
「手でやるならどうするか」(ロジック)を考える能力と、
それをソフトウェアにやらせる技術があって、
両方出来る人も居れば、前者はあまり得意でない人も居る。
迷路なんかは前者の能力が主に必要だろうね。
確かに職業プログラマの人は苦手なの多いかもしれないけど、
彼等はgoogle先生に聞いたり、SE陣を揃えたり、
研究所との共同開発したりとチートが使えるからねw
別に職業プログラマでなくてもgoogle先生は使えるだろw
この迷路、ゴールまでのルートが何通りもできる迷路ですね。迷路と言えば複雑な1本道を作らないと。 もっといいアルゴリズムがいくつかあります。クグれば見つかりますよ。
簡単すぎるし余裕だと思われ。
質問なんですが、VC2008Expressと DXライブラリを使用していてファイルの読み込みをしようとすると error C2065: 'ifstream' : 定義されていない識別子です。 と出てコンパイルできません。コンソールだと上手くいくのですが ソース一部 #include <fstream> #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //省略 ifstream ifs("test.txt"); //省略 return 0; }
std::ifstream
>>280 ifstreamはstd名前空間につつまれてるんで
std::つけるかusingつかえ
うああ初歩的なミスでした ありがとうございます
284 :
デフォルトの名無しさん :2008/06/21(土) 22:30:40
異種の型でできた連結リストのクラスを作りたいのですが、どうすればいいでしょうか。 int型のリスト、double型のリスト、というものではなく、 1つ目の要素がintで、2つ目がdoubleで、といったものです。 ひとまず次の要素を指すポインタを用意しよう、と思ったところで、 その型をどうすればいいか分からなくなってしまいました。
struct node { struct node *next; int type; // 0=int, 1=double, ... union { int i; double d; } data; }; こんな感じ?
286 :
デフォルトの名無しさん :2008/06/21(土) 22:39:43
質問です。XPです。VC(コマンドプロンプト使用)です。 自分の参考書には書いていなくて、細かすぎてググるにも探しきれませんでした。 C++で、 クラスCが、仮想基底クラスA(パブリック派生)をもつクラスBから、パブリック派生した場合… つまり A->B→C (説明のために、->は基底クラスによるパブリック派生、→は通常のパブリック派生とします。 このとき、AにはAのデータの、BにはAの、CにはBのコンストラクタ初期化子が記述されているんですが、 Cを初期化するときに、自動的にBの、そしてそこからAのコンストラクタが呼び出されて欲しいところなんですが、 どうやらBのコンストラクタを呼び出そうとする前に、Aのコンストラクタが呼び出されるみたいなんです。 (それによってコンパイラからAのデフォルトコンストラクタを求められる。 BにAのコンストラクタ初期化子がせっかくあるのにCにまた書かなければならないというのはおっくうです! これが悩みです。。 CにAのコンストラクタ初期化子を書けば解決するのですが、 例えばA->B->C->D…などと派生する場合、派生したクラスの初期化子を全て書かなくてはいけなくなり、不便です。 また、もちろんvirtualを取ってA→B→Cとした場合も解決しますが、 どうしても仮想派生がしたい場合もあります。 コンパイラのせい等もあるのでしょうか?自分の理想通りに仮想派生する方法はあるのでしょうか? だれか分かる方、回答をお願いします。
ちょっとコストは増えるがこういうのも。 struct Base { virtual ~Base(){}; virtual void Get() = 0; } struct Int : public Base { int val; int& Get() { return &val; }; } struct Double : public Base { double val; double& Get() { return &val }; } main() { list<Base*> l; l.push_back(new Int); l.push_back(new Double); l[0].Get(); //int& が返る l[1].Get(); //double& が返る }
>>286 Aにデフォルトコンストラクタを設け、A初期化用の関数を別途用意してそれをBから呼ぶ
l[0]->Get() の間違いだった
292 :
デフォルトの名無しさん :2008/06/21(土) 22:57:34
293 :
デフォルトの名無しさん :2008/06/21(土) 23:07:17
286です
>>292 は意味無かったですかね;
>>289 なるほど…!
確かにそれなら解決ですね。
でもやっぱ、このクラスが大きくなったときに、
初期化して代入するわけだからコストは高くなるし…
(まぁ今のところその見込みはないですが;
そもそもどうして仮想派生すると素直にCからB,BからA,とコンストラクタが階層をたどってくれないんでしょうか?
仮想派生ってものがあいまいなのでわからないのです。
>>292 それはそういうもんだから仕方ないよ
追加で以下のようなクラスDとEを考えてみ
class D: public virtual A {
public:
D(int a) : A(a) { }
};
class E: public D, public C {
public:
public E() : D(3), C(2) { }
};
Eを構築したとき、Aは3に初期化されるべきか、2に初期化されるべきか?
295 :
294 :2008/06/21(土) 23:11:36
E()の前のpublicが余計だった、無視してくださひ
>>291 あ、無理だったw
仮想関数オーバーライドの場合は戻り値変えられないか
297 :
デフォルトの名無しさん :2008/06/21(土) 23:19:46
298 :
デフォルトの名無しさん :2008/06/21(土) 23:25:15
>>292 それはそういうもんだから仕方ないよ
まじですか。そういうもんですか。
ある意味求めていた明確な回答の一つです。
ありがとうございました!
疑うようで申し訳ないですけど、まじで、そういうもん?
299 :
デフォルトの名無しさん :2008/06/22(日) 00:16:50
>>298 C++的にはそういうもの。
理にかなっていると思うけど、そうでもないの?
>>271 cl /help でコンパイラに指定できるスイッチが出てくるんだけど。
サイトや参考書がどうしたこうしたじゃなくて付属のマニュアルを読めるようになろう。
MSDNとかすげえ役に立つよ?C#の開発とかネットで検索してたのは初歩の頃だけで
後は大抵MSのドキュメントで事足りる、というか、そっちの方がはやいし正確だ。
狭く深い情報はMVPのブログで。
データというか乱数の種じゃ
303 :
デフォルトの名無しさん :2008/06/22(日) 01:32:12
データとして乱数の種1byteのみというのだから、あってるんじゃないか。
今日始めたばかりなんですけど どこかここ見て初心者は勉強するといいよっていうお勧めのサイトとかありますかね?
猫でもわかるプログラミング がいいかもね、それより入門本を買うのを勧める。
本気で勉強するなら、最初は内容よりも見やすい本を買うといいかも。 どうせ関連図書を数十冊買う事になるんだから・・・
数十冊は買わねーよw
309 :
デフォルトの名無しさん :2008/06/22(日) 07:46:11
恥ずかしくて聞けなかったのですが、グローバル変数とスタティック変数って どう違うのでしょうか?メモリに確保されるのはどちらも同じだし。長所、短所が よく分かっていません。違いが分かる方ご教示お願いします
グローバル変数はどの関数からも関係なくアクセス出来るでしょ スタティック変数は宣言した関数内で閉じ込められるでしょ
>>309 クラス内のスタティック変数の場合は310のとおり。
クラス外の場合(グローバル変数にstaticをつけた場合)は変数のスコープが
そのソースファイル内だけになる。(他のソースファイルから参照不可)
と思う。
312 :
311 :2008/06/22(日) 10:03:49
310は関数内の話だったかorz クラスのメンバにした場合はクラス内で唯一の変数となる。 インスタンス化せずに使用可能。 まあ調べた方が確実だ。
>>309 たとえば、乱数を複数個発生させる場合を考えてみてください。
seed() で乱数を初期化し、rand() を望む数だけ呼んで乱数を得ますよね。
rand() を使うためにグローバル変数を準備する必要はありません。
けれどもrand() を呼ぶたびに新しい乱数が生成されるのは、不思議ですよね。
rand は内部的にグローバル変数使ってるが
>>314 ん、たしかに rand() 関数内 static だと seed() がアクセスできませんでしたか。失礼。
seed じゃなくて srand な。
typedefは型の別名を定義できますが、 個別の変数に(ポインタでなく)別名を定義できないでしょうか 可読性の都合上、別の名前で同じ変数にアクセスしたいのです #defineでのマクロ定義は予想外の動作が怖くて使えません
C++ならエイリアス使えば良いよ
C++なら参照使えばいい でも同じ変数に別の名前なんか付けたらむしろ可読性落ちそうだけど 別物だと誤解されてバグ出たらどうするつもりだ?
いや、エイリアスを使いたくないんですよ ブロックごとに使い捨てするオブジェクトが必要なんですが、 別々のオブジェクトを使ったり、毎回生成するのがもったいないんで、 共通のオブジェクトを使おうと思ったものの、オブジェクト名がtukaisute1じゃアレなんで
エイリアスの機能が欲しいのにエイリアスを使いたくないって何をしたいんだ…
それってオブジェクト名がカコワルイからって聞こえるが アレじゃない名前にすれば解決なのか?
>>320 「別名を定義=エイリアスを定義」なんだが。
後ろの説明も矛盾してるな、ブロックごとに必要なのか共通でいいのか。
だから、ポインタ(というか4byte)を使いたくないって書いてるじゃない #typedefのオブジェクトバージョンが欲しいのよ
ポインタ…?
C++ なら参照になると何度も言ってるし C だとどうしようもない
要するにないんですね #defineでなんとかするかなぁ……
それだけはやめてくれ
ポインタでいいのに何を気にしているんだろう。 アセンブリ言語やってない奴はこれだから。 エイリアスが作れたとしても、 エイリアスは内部的にはポインタのようなもので実装される。
何がしたいのかまったくわからんが、一時的な4byteくらいケチるなよ
と思ったら、このケースだとポインタでは実装されないか。 最適化されて同一視されそう。 ポインタ使った場合もそう最適化されんのかな?
>>329 だから、エイリアスは使いたくないといってるのに
ちゃんと質問文読もうね
>>330 4byteとはいえ、というか4byteだからこそ何百万回も確保しては消すのが精神衛生上よろしくない
int n = 123; int &nn = n; みたいな例を考えると、 最適化しなければnnのためにポインタと参照、逆参照のコードが吐かれるけど 最適化するとnnのためのコードは消えるよ nnへのアクセスがnへのアクセスと同等に扱われる 不安ならcc -Sとかやってアセンブラのコード確認してみ
参照だと最適化で同一視されるだろうに
要するに(ローカル)変数の使いまわしがしたいだけだろ。 まあ、最適化コンパイラの出力を見たことも無いくせに 速度を求めたがる時期にはよくあること。 どこぞのスレにあった、とにかくAPIを使った方が ファイルの読み書きが速いと思っている人と一緒。
>>333-335 情報が小出しで悪いんだけど、
このケースでそう最適化してくれるほどコンパイラが頭良いとは思えないんだよねぇ
なにせメソッド内でメンバ変数の別名を定義したいって状況だし
むしろ、それで最適化されるコンパイラは怖くて使えん
根本的に方法変えてみるか
確保して消す、って、関数の頭にでもローカルでポインタ変数確保してやればよかろうに 関数抜けるときのスタック調整であわせて一緒に消してくれるよ 速度も変わらん
精神衛生上の話でいえばマクロで変数名が変わる方がよろしくないだろ
ああ、メソッド内で別のオブジェクトのメンバ変数を、だな 別に気にするほどじゃないことは分かってるんだけどね 今10億個のオブジェクト生成したが、一瞬だったぜ……
>>336 アホか。グダグダ「思えない」とかアホなことを言う前に自分で試せよ。
メンバ関数からメンバ変数にアクセスするんなら、もともと
this経由のポインタアクセスだろ。
メンバ変数へのリファレンスを定義した場合、
最適化しなければ、thisに対してさらにポインタアクセスを行う。
つまり、参照段階が一段増える
最適化すれば、直接this経由でのポインタアクセスになる
つまり何もかわらないし、一切オーバーヘッドは発生しないんだよ。
つまり、(必要な方の)コピーをローカル変数に用意し 終わったら該当する方に書き戻す。 ロード/ストアなアーキテクチャ的にも、レジスタ割付等の最適化的にも こうすべきとしか思えないが。
「参照使え」だけで十分だって。 #defineとか言ってる時点で初心者丸出しなんだし・・・
ポインタ格納する時はpつけろよ!!!わかりにくいだろ!!!!!
システムハンガリアンですね、わかります。
コンパイラが頭良くない→俺はそんなことまで考えてる偉いプログラマ→このコンパイラ設計したプログラマ達馬鹿
つまり、
>>336 は「俺様頭いいwwwwwwww」って思い込んでる厨房
それ以前の問題として、自分で何でもかんでも試してみて覚えて言ったほうが身につくと思うんだが・・・ 脳内プログラマはイラネって思うのは俺だけ?
アセンブラが読めないから仕方なく妄想だけで語ってるんだろ
学生時代、ポインターにはpつけろ!bool型にはbつけろ!配列ならaをつけろ!3次元ならaaつけろと教えられましたが 就職したら、そんなの使うなって怒られました。 Z80アセンブラを見るだけで興奮したりUNIXやらLINUXの大規模なプログラムのソースコード見たりするだけで勃起しそうになる俺変態
それ、ただのアンチハンガリアン どっちが正しいわけじゃないが、その会社のやつらの考えはさすがに古臭い
そういうのって、クラスとかenumとかは何付けるの?
>>350 システムハンガリアンでググっておくべき
>>352 もしかしてシステムハンガリアンだとかアプリケーションハンガリアンの概念の話をするつもり?
そういうレベルじゃないと思うぞ
そういうレベルだと思うけどw 今日日システムハンガリアン使うなんてただのアホだけっしょ
それを広めたMSですら最近は否定しとるからな
例外のインスタンスってどこに置かれてんの? if(func()){ throw std::runtime_error("aaa"); } とかってしたとき、スタック上だと消えちゃうよね?
>>356 専用の領域が用意されてたり、動的に確保されたりする。
>>357 dクス
専用の領域ってことはスレッドローカル的なものになるよね。
グローバルじゃ無理だし。その辺は処理系依存か。
動的確保の方法だったら、
場合によっては std::bad_alloc が出る可能性もあるってことか・・・。
>>358 例外の確保に失敗するような状況なら根本的に打つ手無しじゃない?
std::bad_allocが動的確保だったら…
参照渡しはポインタと同じでアドレスが渡されるが、 関数内での参照は別名と変わらんよ。 アドレスのコピーとかしてない。
>>359 うん、そうだと思う。ちょっと思っただけ。
でもその関数内でauto_ptr<char>とかで大量に確保してた場合だと、
抜ければ空きが出るから・・・。
まぁruntime_errorの分でちょうど溢れるほど
絶妙なことはまずありえないだろうけどねw
>>360 動的だとすると、std::bad_allocだけは先に固定で一つ用意されてるのかもね。
例外クラスを作る時にメモリ確保エラーが出たら std::bad_alloc 例外が代わりに投げられることになる。
代わりというか、例外クラスがそもそも作られてないから当然の話やね。 例外クラスが作られた後にその例外を投げるまでの間に さらに例外が発生すると std::terminate 関数が呼ばれて abort される。
質問です、if文中の代入はどういう解釈をすればいいのでしょうか? たとえば、 bool Result = false; if(Result&=Func()){ ... } bool Func(){ ... } というソースコードがあり、Funcがtrueを返した場合trueと評価されるのでしょうか?falseと評価されるのでしょうか?
Result = Result && Func(); if (Result) { } と考えればいい。
>>365 Result &= Func();
if (Result) {
と一緒
>>366-368 ありがとうございます、危うくエンバグするところでしたorz
ただの代入ならまだしも、こういった形での代入はするべきではないのでしょうね…。
>>366 それだとResultがfalseのときFunc()が呼ばれないよ。
元のは常に呼ばれるけど。
クラスAとBがあって、 AのメンバにBのポインタがあり、Bのメンバを操作するメソッドがある BのメンバにAのポインタがあり、Aのメンバを操作するメソッドがある この場合、 ・クラスBのプロトタイプ宣言 ・クラスAの定義 ・クラスBの定義 ・クラスA、Bのメソッドの定義 っていうような順番で書くしかないですよね?
・クラスAのプロトタイプ宣言 ・クラスBの定義 ・クラスAの定義 ・クラスA、Bのメソッドの定義 でもよいじゃないか
>>373 いや、それはそうだけどww
ていうか、同じじゃないですか
>>374 ありがとうございます
うーん、見難いソースになっちゃうなぁ
>>375 相互依存してるのが問題の原因だろ。そこを解決しないと簡単にはならないよ。
>>372 クラスBから呼ばれるメソッドを持つクラスaを宣言する。
クラスaのポインタを持つクラスBを宣言する
クラスaを派生させたクラスAを宣言する。
そんなお互いベッタベタに依存してるようなクラスならカプセル化の意味ないから 設計を考え直した方がいい
ゲーム作るとキャラクターとゲーム管理クラスが相互参照するのはよくあること ていうか、ほとんど必須 まぁ俺はゲーム管理クラスをシングルトンにするけど と、エスパーしてみる
>>356 VC++だとスタックだよ。投げた時点のスタックに、
例外処理が終わるまでアクセス可能だから、そういう芸当ができる。
>>380 まじすか。
途中の関数内のデストラクタ起動とかどうやってるんだろう・・・。
C的な発想では簡単にできないらしい。 この例外のせいでというかおかげというか、 C++は当初Cへ変換してからコンパイルする、ということは (効率を度外視しない限り)不可能ならしい。
うおう。「当初」は抜いてくれい。
「な」も抜いた方がいい
385 :
デフォルトの名無しさん :2008/06/23(月) 03:56:56
char text[18] = "りんごバナナすいか"; char* item1 = text[0〜5]; char* item2 = text[6〜11]; char* item3 = text[12〜17]; cout << item1 << '\n'; cout << item2 << '\n'; cout << item3 << '\n'; : りんご : バナナ : すいか 上記のように一次元配列を分割して参照したいのですが、良い方法はありませんか?
char text[] = "りんご\0バナナ\0すいか"; char *item1 = text; char *item2 = strchr(item1, '\0') + 1; char *item3 = strchr(item2, '\0') + 1; 求めているものがこれだとは思えないが 俺はエスパーじゃないのでこれ以上はわからん。
>>385 #include <string>
...
std::string text = "りんごバナナすいか";
std::string item1(&text[0], &text[6]);
std::string item2(&text[6], &text[12]);
std::string item3(&text[12], &text[18]);
cout << item1 << '\n';
cout << item2 << '\n';
cout << item3 << '\n';
LIFOっていうのの仕組みを読んだら再帰がちょっとだけ分かってきた
そんなもの干草のベッドで寝そべってちょっと考えれば分かる事だろ。
おんじ:スタックオーバーフローに気をつけるんじゃ ペーター:ぷっ
初心者な質問です。 動的リンクライブラリ(.dll)ってのを 使ったり作ったりした事が無いのですが どういう状況で用いるべきものなのでしょうか? 例のようなものもあれば教えて下さい。
画像の展開みたいな汎用性が高くていろいろなところで使う物とか
・ユーザーサイドで差し替えれるようにしたいばあい ・複数アプリで使用したいばあい ・ライセンス条件でDLLでの配布(またはソース公開)が義務付けられてるばあい
>>394-395 回答どうもです。
作るとしたら複数のアプリケーションに流用できるような
独自形式のファイルフォーマット扱う場合とかに作ったりするべきなのかな。
>・ユーザーサイドで差し替えれるようにしたいばあい
>・複数アプリで使用したいばあい
ってのが気になるのですが
差し替えるとは古いdllを新しいもので上書きするような感じなのでしょうか?
また、複数アプリでライブラリ使うってだけなら静的リンクライブラリでもいいのではないかと思うのですが
その辺り詳しく教えていただけると嬉しいです。
dllにもバグはあるだろうし、改善もするだろうしねぇ 複数アプリで同じ機能いちいち積んでたらもったいないじゃん
静的リンクだとアプリごとにライブラリが組み込まれるので サイズが大きくなるから、DLLにしたい場合もある。 差し替えが有効な例は、独自ファイルのアクセスDLLなどなら、 ファイルフォーマットを変えた場合に、アプリ全体ではなく DLLのみの更新ですむと。 あとプラグインとして機能追加できるような設計をしたい場合なども、 DLL使うのが良いのじゃないかなと。
400 :
399 :2008/06/23(月) 18:23:44
すいません、POVまちがいです。
using namespace std; fstream fs( "C:\\a.txt", ios::in); string strtoken; while( !fs.eof() ){ fs >> strtoken; cout << strtoken << endl; } これに AAA BBB CCC と書かれたファイル(CCCの後ろに\n有り)を読ませると、 AAA BBB CCC CCC と、最後のトークンが2回出力されてしまいます。 最後CCCの後ろの改行を無くせば再現されないところまでわかったのですが、対処法がわかりません。 どうすれば最後のトークンが2回出力されるのを防げるでしょうか。
CCCの後ろが即eofになってれば防げるよ
>>402 CCCの後が即eofになってない場合の対処はどのようにすれば良いですか?
>>401 while (fs >> strtoken)
cout << strtoken << endl;
のように書くんだね。
何で
>>401 のコードでそうなるかというと、fs.eof()が偽でも
fs >> strtoken;は失敗する可能性があるのに、それをチェックせずに
strtokenを出力しているからだ。
CCCまで読んだあと、streamには最後の改行が残っている。ので、
fs.eof()は偽を返す。が、空白文字しか残っていないので、
fs >> strtokenは失敗するんだよ。
while( !fs.eof() ){ strtoken.clear(); fs >> strtoken; if(!strtoken.empty()) cout << strtoken << endl; } これでどうだろう?
>>399-400 適当にググってみたけど、
ttp://blog.livedoor.jp/b2pencil/archives/440812.html とかに
[check] Directional button POV:
North: Digital40
East : Digital41
Weast: Digital42
South: Digital43
ってあるのと、
#define NUM_DIGITAL 16
...
typedef struct {
...
char NumDigital;
char Digital[NUM_DIGITAL];
} JOYSTICK_STATE;
...
js.NumDigital = NUM_DIGITAL;
ってしてるから
NUM_DIGITAL を44以上にして
JOYSTICK_STATE::Digital[43] を見てみるとか、
もしくは NUM_DIGITAL は16のままで、
Digitalの43ビット目を見るとかそんなんじゃねーの?
知らないけど。
あ、こう書くのがベストなのかな while( !fs.eof() ){ if( fs >> strtoken ) cout << strtoken << endl; }
>>405 なるほどわかりやすいですね。ありがとうございます。
>>404 >>407 ありがとうございます。理由がわかりました。
fs >> stroken が失敗したときに1以外を返すという事も知りませんでした。
そういった情報はどうすれば調べられるのでしょうか。
リファレンスistreamの>>演算子の項目を見ても書いてなかったように思って・・。
なぁC++ってなんて呼ぶん?
>>408 それは
fs >> strtoken;
if( fs ) ........
と一緒。
operator>> が 1 とかを返すわけじゃない。
operator>> は fs 自身を返す。
その fs の basic_ios::operator void* が働く。
>>409 しーぷらすぷらす
しーぷらぷら
しーぷら
しーたすたす
しーぴーぴー
しーいんくりめんと
どれでもお好きなのをどうぞ
しぷぷ
413 :
デフォルトの名無しさん :2008/06/24(火) 19:59:56
クラス内クラスで、元クラスのインスタンスをメンバに持つというのは不可能なのでしょうか。 class hoge{ public: class fuga{ public: hoge hogehoge; std::vector<hoge> vhoge; }; }; とやると、hogehogeがincomplete typeと言われます。 ところが、hogehogeを消してvhogeのみにするとコンパイル可能になります。 こういった書き方は不可能なのでしょうか、また、コンパイルを通ったhogeのvectorは使用しても大丈夫なのでしょうか。
シープラが一番多いんじゃないか?当然、略読みだが
又も、無限大のインスタンスを作ろうとしている。 スパコンを持ってしても、そのクラスはメモリーオーバーで使えない。
hogehogeをポインタにしたらいけるんじゃね?
class hoge { class fuga; }; class hoge::fuga { hoge hogehoge; };
418 :
413 :2008/06/24(火) 20:32:16
>>415 やっぱりそうなりますか。
元クラスだけインスタンス化して内部クラスをインスタンス化しなかったり、
内部クラスだけインスタンス化したりすれば大丈夫かと思ったのですが…。
このあたりのC++の微妙な振る舞いが中々身に付きません。
経験を積むしかないでしょうか。
>>416 それだとできるみたいです。ありがとうございます。
ただやっぱり危険っぽいので大人しく別クラスにしようかと思います。
元々は、元クラスのvectorを2本返すメンバ関数を作るためなので、別クラスは気持ち悪いのですが…。
419 :
413 :2008/06/24(火) 20:38:43
>>417 おおお!凄い!ありがとうございます!
ただちょっとわからないのは、それは最初の(ダメな)書き方と比べて何が違うのでしょうか。
単なる文法上の規則ですか、それとも、振る舞いの違うコードになるのでしょうか。
すみませんが教えて頂けると助かります。
文法上の違い、単なる決まりごと 最初のはfugaの定義中にhogeの定義が完成されてないから。サイズが不明 void f() { g(); } void g(); が許される言語もあれば許されない言語もあるのと同じようなもの
>>418 > 元クラスだけインスタンス化して内部クラスをインスタンス化しなかったり、
> 内部クラスだけインスタンス化したりすれば大丈夫かと思ったのですが…。
ここのフィーリングがよくわからないなぁ。
>>413 のコードのhogeクラスのサイズが無限大になるのは、物凄くシンプルな結果というか、
他に何も判断材料が無きゃ誰だってそう考えるだろ、っていうモノに俺には思えるんだけど、
どういう風に「微妙な振る舞い」なのかなぁ。
まあもっと静的に考えろって話です
>>421 無限にはならんだろ。
hogeはfugaを持って無いし。
424 :
421 :2008/06/24(火) 21:26:05
ごめん、素で読み間違えマスタ。
425 :
413 :2008/06/24(火) 21:28:21
>>420 なるほど、よくわかりました。ありがとうございます。
>>411 正しい読み方のみおしえてやれ
しーだぶるぷらす
しーぷらすぷらす
が正しい
しーぷるぷらすに見えた
OK、こうなったらこの俺がD&Eを紐解くぜ。 -- C++設計と進化(禿著) 第3章 C++の誕生 ページ80 より -- 寄せられた案の中から私はC++を選んだ。(中略) ++は"次"とか"そのあと"とか"インクリメント"を意味する。 発音はつねに 'プラスプラス' だ。 第一位のC++と二位のCは、(以下略)
429 :
428 :2008/06/25(水) 00:12:47
× 第一位のC++と二位のCは、(以下略) ○ 第一位のC++と二位の++Cは、(以下略) 前置インクリメントは大事だよな。
431 :
デフォルトの名無しさん :2008/06/25(水) 00:23:53
.txtなのにインデントが意味分からんことについて事情聴取したくなってきた
433 :
431 :2008/06/25(水) 00:32:20
済みません。 何回も打ったりしているうちにメチャクチャになりました・・・。
・何でputsとprintfを使い分けてるの? ・改行したらそこで横軸終了ですよ
>>431 ヒント:
(縦2、横3)
+ -----+ -----+ -----+
l l l l
l l l l
l l l l
+ -----+ -----+ -----+
l l l l
l l l l
l l l l
+ -----+ -----+ -----+
436 :
431 :2008/06/25(水) 00:57:20
ああああああ、ありがとうございます!!!! できました!!!!
>>429 「C++の値はCだけど、++Cの値はC+1だ」なんて言う人が++Cに投票したのかな。
c言語の勉強に本腰を入れようとしてる学生です。 それでテキストエディタを探しているのですがフリーでダウンロードできる物で良い物を教えていただけませんか?
>>438 エディタとコンパイラを別途用意してシンプルな状態から始めたいのなら別だが、
VSExpressでいいんじゃないかなあ。
sakuraエディタとかでいいんでない?
個人的にはvim
440 :
デフォルトの名無しさん :2008/06/25(水) 19:13:14
配列の要素数を取得する手段で、 _countof などのマクロを使う方法などがありますが、 引数に配列を受け取るメソッド内にて、 void func(int i[]){ _countof(i); } と組むとビルドエラーになります。 配列を受け取るメソッド内では、引数で要素数を受け取らずに、 配列内の要素数を把握することは可能なのでしょうか? よろしくお願い致します。
>>440 取れないことはないけど、止めた方が良い
int v[16]; func(v); がやりたいだけだったら、テンプレート+参照渡しという手もあるな。 template <size_t Size> func(int (&args)[Size]) { ... } サイズがコンパイル時に決まってないといけないし、コード膨れそうだけど。
別にtemplate<typename T> func(T& args)でいいんだけどね。
そういうのは止めた方が良いって・・・ 教えるならせめてboost::arrayやRangeの考え方を
template<typename RundomAccessLvalueRange> void func(RundomAccessLvalueRange& args) こうするんですね、わかります。
>>439 ありがとうございます。
コンパイラはボーランド社の無償で使えるのを使っています。
>>448 それは古すぎて最近のライブラリに対応しきれなかったりコンパイラのバグ・言語仕様未実装が多かったりするから、
おとなしくVCExpressの最新版使っておけ。
>>448 ググるなら「VC++Express」で。
最新は2008、もちろん無料。
451 :
デフォルトの名無しさん :2008/06/25(水) 20:59:14
VS重杉大嫌い
>>451 適当な環境を用意してgccでも使えば?
モバイルノートに NTEmacs と Mingw で遊んでる
>>451 別にvcbuildでもnmakeでもcl直叩きでもやればいいじゃん
makeだけGNUmake使ってもいいしな
うーむ?
456 :
451 :2008/06/25(水) 21:11:21
おまえらもっと漏れにもわかるように説明しやがってください。
>>456 コンパイラをコマンドラインで実行すれば重すぎと表現されているVSを起動せずにすむということでは。
VS起動した後テキストエディットが重たいのなら嫌いになってもいいけど、
大して使ってないのに奇妙なところで嫌いになってしまうのはよくないよ。
システムを休止状態にするSetSystemPowerState関数とは逆の意味の関数はありますでしょうか。 アプリケーション実行中はマウス等の操作が無くても休止状態にならない機能を実装したいです。
>>458 case WM_POWERBROADCAST:
if (wParam == PBT_APMQUERYSUSPEND) {
return BROADCAST_QUERY_DENY;
}
break;
なるほど
461 :
458 :2008/06/25(水) 21:33:06
NMAKE派である俺のMakefileを公開してやる。推論でほとんど済む。 # makefile CSC = csc CSFLAGS = /nologo /o /d:TRACE VBC = vbc VBFLAGS = /nologo /optimize /d:TRACE VJC = vjc VJFLAGS = /nologo /o /d:TRACE .cs.exe: $(CSC) $(CSFLAGS) $< .cs.dll: $(CSC) $(CSFLAGS) /t:library $< .vb.exe: $(VBC) $(VBFLAGS) $< .vb.dll: $(VBC) $(VBFLAGS) /t:library $< .jsl.exe: $(VJC) $(VJFLAGS) $< .jsl.dll: $(VJC) $(VJFLAGS) /t:library $< .java.exe: $(VJC) $(VJFLAGS) /x:all $< .java.dll: $(VJC) $(VJFLAGS) /x:all /t:library $< .SUFFIXES: .cs .vb .jsl .java CFLAGS = /nologo /O2 CPPFLAGS = /nologo /O2 /EHsc CXXFLAGS = /nologo /O2 /EHsc
>>450 ありがとうございます。
ところでコンパイラって複数入ってても問題ないんですか?
VCと関係があるのは下3行だけでは J#への異常なこだわりはなんだ
しかもCはじめようって人にサッパリ向かない。 hello.cを作ったんですがどうすればいいですか?なんていわれるよ
>>463 コマンドラインから使いたいなら、環境変数の設定はバッチファイルでするようにしたほうがいい。
INCLUDEとかLIBとかかぶる。
467 :
デフォルトの名無しさん :2008/06/25(水) 22:09:49
IntelコンパイラはVCコンパイラより速いって本当ですか? だったらどうして前者は普及してないんですか?
どうして普及していないと思ったの?
>>458 SetThreadExecutionState
>>469 そうそう。459よりその方が妥当と思う。
459だと手動でも休止にできなくなりそう。
458の質問から判断すると、電源設定による休止のことだろうから。
Cのソースをcppにしてコンパイルしようとしてるんですが、エラーが出てしまいました。 if(strncmp(header_buf, "RIFF", 4)){ fprintf(stderr, "Error: %s is not RIFF.", filename); fclose(fp); return NULL; } error C2664: 'strncmp' : 1 番目の引数を 'unsigned char [20]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です こういうエラーなんですが・・・・ どうすれば直せますか
エラーメッセージに書いてある通りにすればいい。
const_cast<char *>(static_cast<char *>(header_buf)) で消えない?
if(strncmp(reinterpret_cast<const char*>(header_buf), "RIFF", 4)){
const_cast 要らんし、 static_cast じゃダメだろ
・header_bufの型をunsigned char[20]ではなくsigned char[20]にする。 ・reinterpret_castでキャストする。
singed char と char は別の型だと何度言えば
longとintはどう違うんですか。32bit環境で
代入、比較したら警告が出る
>>472 ブフォ
むしろ俺が作ってるのもいずれそういうコードを書くことになるわwww
Cは型チェックがヌルいからね。
>>484 mp3のタグ解析じゃなくて?
RIFF、headerのあたりでそう思ったんだけど違うかなw
こないだID3v2の仕様とか眺めて「これはひどい」とか思ってたとこ
487 :
デフォルトの名無しさん :2008/06/26(木) 02:04:50
お願いします。 C++で三角関数を計算させたいときに、 a = 0; b = sin(a.); とするとエラーになってしまいます。 bを計算させるにはどう記述すればいいのでしょうか。
#define This (*this)ってどう?
>>487 b = sin(static_cast<double>(a));
とりあえずエラーとはなんぞや ターミネートしたのか?
変数名の後ろに小数点つけても意味はないんだ というか別の意味になる
>>488-492 回答ありがとうございます。
コンパイルできました。完全知識不足です
>>490 すいませんそのオチすら理解できてないです
じゃあ #include <cmath> が抜けてるんだろう
完全に . の問題だろ。
#include <mat.h>
497 :
デフォルトの名無しさん :2008/06/26(木) 10:32:18
VisualStudio2005(90日評価版)で、C++を使って、WindowsMobile用のアラームを作ろうとしています。 でもなんかよくわからないエラー↓が( TДT) プログラム '[56ca06d2] ErinnTimer.exe' はコード -1073741571 (0xc00000fd) で終了しました。 エラーの発生タイミングとしては、下記の2種類でした。 1.実行直後(何も表示されず落ちる) 2.入力時(チェックボックスをクリック or 日時指定コントロールの日時を変更) Windows Mobile 6 Proのエミュレータと実機(Advanced/W-ZERO3 [es])両方で同じ状況です…。 上記のエラーコード(0xc00000fd)でぐぐってみたら、 「unknown software〜」とか「Stack Overflow」とかも書いてあるエラーメッセージが引っかかるんですけど、 デバッグ時の出力は上記のとおりで、なんだか違う気がします…。 というか、解決方法がわからないです(´;ω;`) さらによくわからないのは、リビルドするとしばらくはエラーが出ないこと…。 また、ときどき「Second Chance Assersion Faild」っていうエラーになること…。 こちらのエラーになる条件は、今のところわかりません…。 エラー駆除のため、何をしたらいいかアドバイスをいただけたら幸いです。 よろしくお願いいたしますm(_)m
どうせでかい配列を作っちまったんだろ
WinMain() の1行目にブレークポイントして毎回止まるか? その後はひたすらF5/F10/F11でステップ実行。
500 :
497 :2008/06/26(木) 10:53:43
>>498 たぶん配列作ってないです…。
# C++での配列の作り方知らないので…。
自分でやっているといえば、時間を通常の40倍に計算して表示してることです。
その辺なんか問題ありますかね…。
時刻の算出は下記のようにやってます。
CTime curTime=CTime::GetCurrentTime();
CTime tmpTime=CTime(curTime.GetYear(), curTime.GetMonth(), curTime.GetDay()-1, 0,0,0);
__time64_t t1 = curTime.GetTime();
__time64_t t2 = tmpTime.GetTime();
__time64_t t = t1-t2;
t *=40;
return CTime(t);
501 :
497 :2008/06/26(木) 10:55:36
>>499 すみません、WinMain()ってどこにあるんでしょうか…(´;ω;`)
ソリューション内検索してもないのですが…
theAppで検索してみるとか
503 :
499 :2008/06/26(木) 12:10:47
>CTime tmpTime=CTime(curTime.GetYear(), curTime.GetMonth(), curTime.GetDay()-1, 0,0,0); 昨日の0時なら、今日の0時-24Hじゃない? 話、飛んですまんが。
504 :
497 :2008/06/26(木) 12:22:50
>>502 「theAPP」で検索すると2箇所がヒットしますが、WinMain()との関連性がわかりません(´;ω;`)
とりあえず、theAPPでヒットする場所にのみブレークポイントを設定し、F10をちょこちょこ押してみました。
すると、「crt0dat.c」というファイル内の「#include <dbgint.h>」と書かれている行から矢印が動きません。
10回以上おしても進まなかったので、F5を押しました。
# ステップ実行のいみがなーい;;
そうすると通常起動しました。(今回は実行直後には落ちなかったようです)
通常起動まで行った場合は、日時指定コントロールの時間の数字を「▼」で1つ下げただけでエラーで落ちました…。
そこで気づいたのは、「▲」で増やした場合はエラーにならなかったということです。
落ちる前に、少しだけ表示されるエラーメッセージに「m_time=-1」って書いてあった気がします。
日時指定コントロールで、時間として不正な値が入ってしまったということでしょうか???
C++とプログラミングの学習 に関する質問です 当方未経験中途採用のプログラマ見習いです。 C++でプログラムを組まなければならなくなったので力を貸して欲しくて書き込みました。 入社してから基本放置プレイされており、その間は基本的にC言語、C#、プログラマの心得、 ITプロ等のサイトで色々な情報収集等、自分で課題を見つけて勉強の繰り返しをして過ごしていました。 どれも、ひとつを深く追求という訳じゃなく、何が来てもいいように色々な情報を広く浅く収集してたつもりです。 今回渡されたのがまず、C++で文字列やバイナリを書き換えたり、特定の情報をデータ構造の中から 抜き出すプログラム等、処理としては簡単な物というか、処理の流れとして何をしたら実現できるか という部分までは自分で導きだせるのですが、C++でそれを実現する手段を自分の与えられた環境下で C++らしく実現する方法っていうのがうまく見つけられません。(日本語あってるか・・・?) C++には何か色々なライブラリがあったり、コンパイラによって違ったり、STLとか・・・? 環境によって違ったりするというのはうすぼんやりとは解るんですけど、 正直情報が多すぎて自分では何と何と何を組み合わせてやればいいのかわからないというか、 うまく言葉にできなくてすいません・・・。頭の中で情報のマッピングが出来てないっていうのかな・・・? 環境はVista、VC2008 先輩に言われたのは「MFCとか使うんじゃなくてWin32(…だったかな?)で書いてね」 といわれた記憶があります。 そこで質問内容からまとめて聞きたい事を。 ・今回、そういった指定を受けた上で、何を調べたら良いのでしょうか?という一時的な回避策。 (何という概念について知るべきとか、どういった単語で検索すればいいか等) ・複雑(に自分からは見える)C++の世界に、根本的な理解を深めながらプログラミングする為のアプローチとしては何から知ればよいでしょうか? 何かキーワードを与えてくださればあとはそれに関して自分で調べられる限りは調べますんで よかったらアドバイスお願いします。質問が抽象的すぎてすいません。
506 :
497 :2008/06/26(木) 12:30:37
>>503 えぇと、すみません、私の日本語読解力が足りないみたいで、何を聞かれているのかわかりません;;
今日の0時から24時間引いても、昨日の0時でも同じ時をあらわしていると思います。
なんでtmpTimeを作ったかというと、単に40倍するときに桁があふれないように年月日を除きたかっただけなんです。
今日でも昨日でもよかったんですけど、1日分くらいずらしておいたほうがいいかなと思っただけなんです。
それだけなんです。ほんとすみません
>>505 とりあえず、なにをしたいのか書かないと答えようがない。
>>507 すいません、あまり根本的な質問や細かい質問をいちいちするのも嫌がられるかなと思ったので、
何かとっかかりになるようなキーワードや、C++とそれを取り巻く世界の構造を掌握するための
ヒントみたいな物をもらえたらって感じで書いたんですが。
引き続き上記の情報も募集しますが、
なんか、正直そんな悠長な事言ってられる状況じゃないっぽいんで
今必要な物は完結に書きます(笑
・C++でファイルの操作をする
・ファイルの読み込み、書き出し
・フォルダ内から全てのファイルのパスを取得する
・文字列とバイナリの入り交じったデータをどう扱えばよいか
・そういったデータから必要なデータ構造(文字列)を抜き出す方法
(バイナリ部分は一部分だけで、今回は必要の無い物です)
・もしバイナリとして扱うべきとした場合、文字列の検索等
(どうもうまく調べられないです)
・特定位置への文字列の注入
これらに関して何か検索すべき単語やヒントがあったらお願いします。
>>508 まずはやってみようぜ。
今どこまでできててどこでつまってんの
>>508 ファイル操作はWin32のリファレンスをしっかり読む
文字列やバイナリのデータは、forと配列をつかってとりあえず自分で作ってみる
>>508 ファイルの構造が固定長レコードなのかそれ以外なのかによって違う
それ以外の例 画像ファイル内のコメント等
[種別(バイナリ)][長さ(バイナリ)][文字列]...
[文字列長(バイナリ)][文字列][文字列長(バイナリ)][文字列]...
>>509 ありがとうございます!
今の所、どうやって作ろうかっていうのを考えた段階で、
コーディング初めてもバイナリと文字列どう扱っていいんだろう?
って所で詰まるなと思い調べてばかりいました。
たしかに
>>509 さんの言う通り、つまってから聞かなきゃ聞き様が無いですよね。
しかも、実際に詰まらなきゃ解決策の試しようが無いですもんね。
一人でどうしたらいいだろうかと悶々と考えていたので、冷静な判断力に欠けてました・・・
とりま、なりふり構わずに「動くものができりゃいいや」ってつもりで造って見ます。
おそらく”バイナリと文字列”のところでつまづくと思うんで、その時また来る事にします。
ありがとうございました!
うーん
態度が悪いわけじゃないし、文章が下手なわけでもないけど、 俺も読んでて「うーん」となったw
>>510 なるほど、Win32のリファレンスですね。調べて読んで見ます。
すいません、解ってたはずなのにアホな事してましたね。
とりあえずできる範囲でやってみます。
>>511 ファイルの構造は
中に色々な情報を持ったオブジェクトがツリー状につながって入っています。
画像データだけがオブジェクトの中にバイナリで入っています。
抜き出したい情報はオブジェクトの中に文字列で書かれていて、
欲しい情報に画像データは含まれないので無視したいんです。
なので、そのオブジェクトを入れるための構造体やクラス?
を作って、必要なオブジェクトを捕まえるのがいいのかなとか考えてました。
1つのオブジェクトの例はこんな感じで
オブジェクトの名前
[種類][このオブジェクトの種類]
[親][親オブジェクトの名前]
[子][子オブジェクトの名前、・・・、・・・]
[色][扱ってる色の種類]
[サイズ][画像のサイズの座標X、Y、X2、Y2]
全体の構成としてはこんな感じ
[文字列だけのオブジェクト]
[文字列とバイナリの入った箱のあるオブジェクト]
[文字列だけのオブジェクト]
[文字列とバイナリの入った箱のあるオブジェクト]
>>513 >>514 うーん、たぶんプログラマとしての資質の問題なんでしょうね。
もともとプログラムが好きで好きでやってる人と
仕事として選んだ結果"勉強"として調べようとしてる差が
行動力の差に出ているんですよねきっと。
すんません、ちょっと顔洗って出直してきます。
選択肢の多さというか、広さに圧力的なものを感じたのでは。 それでトップダウンの方向で把握しようとしてるのだと思う。 トップダウンはトップダウンで必要だけど、 プログラマ的には、まずはボトムアップだね。 手探りでも、とりあえずやってみて具体的な知識を持つこと。
>>517 まったく持ってその通りですね。
問題を先に見つけてしまうのも行動力が伴っての物で
壁を見つけたらまず壁まで行くべきだと学習しました。
レスポンス付けてくださった皆様
自分がここで質問するレベルじゃないって事がわかりました。
誰にも相談出来なくて一人で色々悩んでいるうちに悩みの迷路にはまってたみたいです。
ですが、皆様がご指摘してくれたおかげでやるべき事を明確にする事が出来ました。
誰にも聞けない事や、聞いてもあまり答えてもらえない事が多くて
全て自己解決しなきゃいけないと思って少し苦しくなってました。
でも勇気を出してここで質問したら、思いのほかちゃんと対応してくれる人がいて
問題にぶちあたっても手を貸してくれる人はいないわけじゃないんだと思い正直かなりほっとしました。
なのでとりあえず体面気にせずにがむしゃらにやってみようと思います。
今度来る時はちゃんと質問としてできるレベルにしてから質問しに着たいと思います。
どうもありがとうございました。
519 :
497 :2008/06/26(木) 13:37:59
たぶん1個解決しました! 解決したのは > 2.入力時(チェックボックスをクリック or 日時指定コントロールの日時を変更) 日時指定コントロールの初期値を今日の00:00:00にしたら、「▼」で値を変えてもエラーにならなくなりました! 原因はたぶん明示的な初期化をしてなかったためと思われます。 そのせいで、「1970/01/01 00:00:00」として初期化され、 「▼」を押すことで扱える範囲外の時刻となり、エラーが吐き出されたっぽいです。 ずっと「9:00:00」って表示されてたので、 「0以下なわけでもないし…。」 と思ってたのですが、JSTになってたためにこの時間だっただけで、GMT的には00:00:00でした…(;´Д`)
520 :
497 :2008/06/26(木) 14:12:02
とりあえず起動直後にエラーになったらどこかでステップ実行してみたいと思います。 レスいただいた方、ありがとうございました。 お世話になりましたm(_)m
なんか一生懸命さが伝わってきていいな 動かなかったものが動いたときの嬉しさというか 懐かしいような羨ましいような
えーりんタイマー…
マビノギじゃねえの?
可能なことかどうか知りませんが ある大きな整数型配列,たとえばPH[100][100][100][100]みたいなのを 大量に作りたいとします。 要素数は大きくても、入れる値は高々0-1024までの値か入らないとします。 Int変数のマックスじゃなくて最大値を1024にする代わりに 使用メモリ減らす、っていう操作は可能でしょうか? また可能ならばどのようなコマンドでできますか? よろしくお願いします・
>>525 必要な機能は自分で作る。そのためのプログラミング言語だ。
10Bit配列のクラスを作る
1-1024ならできる。0-1024なら11びt必要
>>525 詰まんない苦労したくないなら16bitで妥協して
[100][100][100][100]くらいなら200MB弱だから、
>大量に作りたいとします。
となると32bit環境では10個作るのも難しいね。
仮に1要素10bitできちきちに詰めたとしても120MBだから、
「大量」となると大差ない。やはり32bit環境では難しいよ。
結論:苦労しないで1要素16bitでやって、プラットフォームは
64bit環境にするのが正解。
Effective C++って難しいですか?
質問です IHoge *p1 = new CHoge(); IHoge *p2; CHogeはIHogeを継承したもので、メンバ変数が追加されています。 p1の「内容」をp2にコピーするにはどうしたらよいでしょうか? p2 = p1; のように、ポインタをコピーするのではなく、独立したクローンを作りたいのです。 今のところvirtual IHoge *clone()=0; をIHogeに用意しておき、継承したクラスにオーバーライドを強要する。 くらいしか思いつかないのですが、なにぶん数が増えてきますと実装ミスがおきそうです。 (clone内でコピーすべきメンバ変数のコピーを書き忘れるとか)
>>529 10進の0と1は1bitで表現するから結局11bit必要じゃね?
>>530 32bitとか関係なくてOSの制限じゃないかしら。
それも仮想メモリという魔法で一括でとろうとしない限りは大丈夫なんじゃないの?
アプリ単位のメモリ制限があるんだっけ?
>>532 親クラスのoperator=を呼び出すのが常套手段。
後は差分の変数のみコピー。
>>536 それは、cloneメソッドの実装を楽にする方法ということでしょうか?
確かに楽にはなるのですが、メンバ変数をコピーし忘れるのを確実に防ぐのは難しそうですね・・・
潜在的なバグになりそうな要素は導入したくないところなのですが・・・
そのために親クラスの領域のコピーは親に任せるってことじゃないのか
>>536 は
>>537 それからコピーコンストラクタの実装も忘れずに。
代入演算子関数とコピーコンストラクタは継承されない。
>>535 32bitアプリだとアドレス空間が32bitで表せる4GBしかない。
しかもシステムに1-2GB程予約されるので、アプリで使える空間は最大3GB程度。
仮想メモリがいくらあろうと、アドレス空間が空いてなきゃ割り当てられない。
>>525 なんでそんなことしようとしてるのか知りたいわ
>>543 IntelCPUってずいぶん前から36bitアドレス空間サポートしてない?
サーバOSとかあっさり64Gとかつめるじゃん。
>>545 ホントにプログラマ?
そう思うならそのサーバOS積んだ環境で、[100][100][100][100]みたいな
手軽なやり方でぼこぼこ大量に確保してみりゃいいじゃん。
物理アドレスは32本以上出てるから物理メモリは4G以上詰める。 いくつかのプロセスが合計で4G以上を使うのは可能。 プロセス単位のアドレス空間が4Gというのはフラットメモリモデルでの制限で、 セグメントモデルを採用すればもっといけるがそんなOSは見たことがない。 あとPSEという仕組みがあって、昔のEMSのような仕掛けで4Gのメモリ空間の中に 4Gを越えるメモリをマップできる。
CPUから出てるアドレスバスは32本のままじゃない?8バイト単位でしか読み書きしないから。
それなんて8088?
難しい。32bitWindowsの場合は1プロセスあたり2Gまでしか使えないが /3Gスイッチをつけると3Gまで可能なのかな。 この辺がシステムに1-2GB程予約されるという言い回しになってるのかなあ
とりあえず足りなければ別スレッドにすればおk?
スレッドの場合同じアドレス空間を共有するからダメ。 共有メモリを介して複数プロセスで仕事をやらせれば多少はいけるかな。 unix版のoracleはそういう構造になってる。 windows版のoracleはスレッド構造にしたせいで 同じ32ビットCPUならメモリ的な限界が早く来る。
要するに64bitの時代がすぐそこまで来てるって事だな 16bitの時もEMSでひでえ苦労させられたしな・・・・
しかし問題は64bit CPUがこれ以上高速化させられないという事だ 高速化で出来る事はほとんど32bit時代にやってしまってる 後は本当に個人でジョセフソン素子でも使うしかない
95が出た頃は4GBのメモリ空間が無限大に感じたけど、今だと狭く感じるな。
[100][100][100][100]こんなことしないおれにとっては今んところ 64bitいらね
つーかそういう配列使うならCPUの速度もスーパーコンピュータ並みに 速くないと使い物にならないと思わないか? メモリ領域だけ広くなってもなあ
なんか知らんが、デカい配列の変わりに赤黒木をデータ構造に使ってしまえば良いという問題でもない?
RAMを(4GB以上)積めば32bit環境でも大容量メモリを容易に 使えると思い込んでる書き込みが散見されるけど、C/C++使う 際にポインタのビット数って概念が無いんだろうかね? ハードが36bitアドレス空間だろうがなんだろうが、ポインタが32bit なんだから言わずもがなだと思うんだが。sizeof(ポインタ)をやった ことがないのか?
後から出てきてボケかますのってどうなの
天然がタイミングをきちんと見計らってたら、それはもう天然じゃないからね。 ある意味、仕様だよ。
562 :
デフォルトの名無しさん :2008/06/27(金) 11:37:27
初歩的な質問ですいませんが、 他のクラスからメンバにアクセスしたいときってどうすれば良いのですか? 例えばCmyDlg.cpp内でm_edit_myを宣言していて、 それをCmainDlg.cppからm_edit_myにアクセスしたいです。 例えばCmyDlg内ですとm_edit_my.GetWindowText(CString);なんかでアクセスできますよね。。。 同じことを他のクラスから知りたいです。 初心者ですいませんがよろしくお願いします。 環境はWindowsXP, VisualC++2005, MFCです。
563 :
デフォルトの名無しさん :2008/06/27(金) 12:03:19
friend
ともだちいない
そこら辺を歩いている人に、friendと書いた紙を張れば友達にな・・・
CmyDlg::getM_edit_my(); CmyDlg::setM_edit_my(); つくれ
#define private public 困った時のよく効く呪文
そもそもmainDlgがインスタンス持ってないというオチ
「.cpp内でm_edit_myを宣言していて、」
571 :
567 :2008/06/27(金) 13:55:30
>>569 public: static CWnd m_edit_my;
自分は562じゃないんだが、 オブジェクトHoge をprivateにしてGetHoge() , SetHoge()を作るのと Hogeをpublicにするのとで何か違いあるの?
HogeがprivateでGetHoge()を提供してSetHoge()を提供しなければ読み取り専用になる
メンバ Hoge がなくなるような変更がクラスに加えられたときでも メンバ関数経由にしておけば関数の実装次第で対応可能
VisualC++ 2008 Express Editionについてですが、ビルドのメニューが見つかりません どこら辺を触ればビルドのメニューが表示されますか?
ツールバーにビルドって書いてない?
それが見つからないんです
ExpressEditionにはその機能ないよ。
ビルドはプロジェクトを開いてないと出てこないだろ
580 :
デフォルトの名無しさん :2008/06/27(金) 15:24:39
教えてください。C++にて どのクラスでもよく使う関数群をまとめてクラス(hoge)を作成して使用しているんですが 各クラスから使用するときは hoge->function();という感じで使うことになります。 これを標準で備わっている関数と同様に hoge->なしの function();という記述で呼ぶようにすることが出来るでしょうか。 もし可能ならその方法を教えてください。
ただの関数ならnamespaceで閉じ込めて使えば幸せになれるよ。
Cの非常に初歩的な疑問なんですが、 char *str = "hoge"; とするとポインタ str には文字列 "hoge" の初めの文字のアドレスが入るんですよね。 ということは、この初期化時にそのアドレスから文字列5バイト分確保されるんですか? char *str = "hoge" char str[] = "hoge" これを比べた時に何が違うのかよく分からないのです
>>582 char *str1 = "abcd";
char str2[] = "abcd";
printf("%d %d\n", sizeof(str1), sizeof(str2));
こうやれば分かってもらえるだろうか。
上はポインタ、下は配列。
ポインタは文字列があるどこかを指すだけ。 配列は要素一つ一つが確保され、strに入る。
プログラムのある領域に "hoge" が置かれて、そのアドレスが代入されるのが *str コピーされる(strcpyと同じ)のが str[] アドレス比較してみりゃ、全然違うとこになってるのがわかる。
586 :
デフォルトの名無しさん :2008/06/27(金) 15:52:33
>583-585 ありがとうございます。 なんとなくイメージはつかめた気がします。
>>581 namespaceというのは見たことはあるのですが、使ったことは無かったので
ぐぐってみたのですが、
namespaceで変数や関数を宣言すると
クラスとは違い、実態をnewせずに使用できるということなのでしょうか。
>>587 namespaceの中は、外からその名前で区別されるだけで普通の空間と同じ。
もしかしてクラスのメンバー以外で関数作ったこと無いのか?
C#とかから入った人だとそんな感じになりそうだな
static定義した関数なら、インスタンスを作る必要ない。
>>581 はファイルスコープのstaticに掛けたネタ?ワタシよく知らないけど。
無名名前空間について言及してないと分かる程度の知識があるならネタでないとも分かるはずだが。
593 :
デフォルトの名無しさん :2008/06/27(金) 16:10:51
メモリマップファイルでファイル操作をしています。 そしてファイルサイズの拡張はできるのですが、縮小ができません。 テキストファイル"abcdefg"(7byte) から "abc"(3byte)となるように、 ファイルのサイズを縮める方法を教えてください。 環境はVC++2008、Windowsです。
596 :
587 :2008/06/27(金) 16:34:21
なんとなくわかってきました。namespaceは、 ただ単に、名前の範囲を示しているキーワードだったんですね。 でもそうすると、 namespace abc { class hage{ function() } } abc::hage* hoge=new abc::hage(); abc::hoge->function(); こんな感じになるんでしょうか。 using namespace abc とすると hoge->function(); でしょうか。 hage->は無くなりそうにありません(涙 う・・・わからなぃ。
とりあえず入門書でも買って読め
namespace abc { function() } して using namespace abc してみ。
599 :
587 :2008/06/27(金) 16:42:03
>>598 あ、なるほど。
クラスにしてはダメなんですね。
静的に記述してしまうと。
だいたいわかりました。
とりあえずやってみます。
教えて頂いた皆様、ありがとうございます。
>>598 namespaceで囲むメリットってなんなの?
グローバルに放り出したくないってこと?
いや、なるべく元の書き込みにあわせただけ。
602 :
591 :2008/06/27(金) 16:52:15
こうするとOOPで幸せになるんだがなあ。 namespace abc { class hage{ public: static function(); } } abc::hage::function();
>>601 なるほどです。
>>602 using namespace abc;
hage::function();
こうはできるが、
using namespace abc::hage;
function();
こうはできないんですよね?
604 :
デフォルトの名無しさん :2008/06/27(金) 17:53:29
std::vector<double> vec(10) というのがあるとします。 既に存在するCの関数、例えば double sum(int size, double* array) { double total = 0; for(int i=0; i<size; i++){ total += array[i]; } } の第二引数にこのvecを渡したいのですが、 単なる配列のようにvectorを扱うことはできるのでしょうか。
>>604 sum(vec.size(), &vec[0]);
できる
607 :
604 :2008/06/27(金) 18:03:50
608 :
591 :2008/06/27(金) 18:04:40
using abc::global_func;
で、確認しました。
>>603
609 :
604 :2008/06/27(金) 18:05:19
vectorの内部の実装で、 データが連続したアドレスの配列上にあるというのは、 仕様で保証されているんですか?
vectorやstringはされてる sum(v.size(), &v.front())
611 :
604 :2008/06/27(金) 18:34:43
612 :
593 :2008/06/27(金) 18:44:25
>>595 サンクス。
でも引数にどうわたせばいいのかわからないや。
MapViewOfFileで取得したポインタを渡せばいいのかな?
HANDLE hFile;
HANDLE hMap;
hFile = CreateFile(...);
hMap = CreateFileMapping(hFile,...);
void* p = (void*)MapViewOfFile(...);
int fileendpoint = ...;
p += endpoint;
UnmapViewOfFile( p );
CloseHandle( m_hMap );
SetEndOfFile((HANDLE)p);
SetEndOfFileに渡すのはhFileだろ。 SetFilePointerで移動して呼んでみては。
>>608 たびたびすみません。
#include <stdio.h>
namespace abc
{
class Hoge
{
public:
static void global_func()
{
printf("func\n");
}
};
};
int main()
{
using abc::Hoge::global_func;
global_func();
return 0;
}
こうやってみたんですが、以下のエラーがでます。
error C2873: 'abc::Hoge::global_func' : シンボルを using 宣言の中で使用することはできません。
Hoge は namespace じゃないから
Hogeが名前空間じゃないから?
つまり、あるクラスのメンバ関数を何の修飾もせずにクラス外から呼び出すことはできないということですか?
クラス外からメンバを呼び出したい場合は必ず呼び出しもとのインスタンスが必要になる。 例外はstaticメンバ関数だけじゃなかったか?
>>617 無理ですね
別名をつければいけますがw
C++で関数のエイリアスを作る方法は知りませんのでCの作法で書くと次のとおり
#include<iostream>
namespace abc{
class Hoge{
public:
static void global_func(){std::cout << "global_func()" << std::endl;}
};
void (*hoge_func)()=Hoge::global_func; // 別名
};
int main(){
void (*func)()=abc::Hoge::global_func; // 別名
func();
using namespace abc;
hoge_func();
return 0;
}
>>620 なるほど。ありがとうございます。
>>580 さんが望んでたものに一番近そうなのが、同じnamespace内で
別名をつける方法っぽいですね。
622 :
620 :2008/06/27(金) 19:32:43
>>621 多分C++での作法があると思います
調べてください
623 :
621 :2008/06/27(金) 19:36:40
>>622 以下のように記述することで関数名も同じまま呼び出すことができました。
#include <stdio.h>
namespace abc
{
class Hoge
{
public:
static void global_func() { printf("func\n"); }
};
static void global_func() { Hoge::global_func(); }
};
int main()
{
using namespace abc;
global_func();
return 0;
}
624 :
608 :2008/06/27(金) 20:26:33
>>622 (
>>623 ごめん、直します。)
void (*global_func)() = Hoge::global_func;
// void global_func(){ Hoge::global_func(); };
std::vector<double[2]> v; って出来ないんですか?
オセロのプログラムを書こうと思ったら、オセロって存外複雑だな・・・。
コンピュータの思考ルーチンを組むんでなければ、そんなに難しくはないと思うけど・・・ 打てる場所がないときはパスとか、細かいところは面倒いかも
オセロのプログラムを3日で作らせるのが、うちの新人研修なんだが
>>625 double[2]を構造体で包めばできる
VC2003、C++のmanagedでプログラムを組んでいます。 何もない状態からビットマップ画像を作成し、画素値を自分で設定して pictureboxか何かに描画しようとしているのですが、うまくいきません。 現在はフォームクラス内にメンバ「Bitmap* bm」を置き、フォームのコンストラクタで this->bm = new Bitmap(512,512); 実際にボタンが押された時に System::Drawing::Color color; color.FromArgb(255,255,255); for(int i=0;i<512;i++) for(int j=0;j<512;j++) bm->SetPixel(i,j,color); pictureBox->Image=bm; と記述して表示しようとしているのですがうまくいきません。 どこか根本的に間違っているのでしょうか。よろしくお願いします。
631 :
575 :2008/06/27(金) 20:57:55
VisualC++ 2008 Express Editionってコンパイルと実行ってどうやるんですか?
>>630 どこが間違ってるって、スレが違う。C++/CLIスレへどーぞ
>>632 すみません、C++/CLIのくだすれが落ちてるのでここぐらいしか聞くとこがなくて・・・。
636 :
575 :2008/06/27(金) 21:04:09
>>633 出来ませんでした。
>>634 hellを表示するように作ったのですが前に作ったhello worldが表示されてしまいます。
>>627 単純に表示、入力、ひっくり返すまでは直ぐできるけど
置けるか置けないかとか実装していくとすげー疲れる
639 :
575 :2008/06/27(金) 21:15:26
640 :
608==638 :2008/06/27(金) 21:34:10
>>622 (
>>623 ごめん、直します。)
void (*const global_func)() = Hoge::global_func;
// void global_func(){ Hoge::global_func(); };
int (*pointer)(int, int) = NULL; をtypedefを使って書くにはどう書けばいいのでしょうか。
>>641 typedef int (*pointer_t)(int, int);
pointer_t pointer;
見た目はこっちのがわかりやすいから、俺はこれが好き。 typedef int pointer_t(int, int); pointer_t *pointer; メンバ関数に使えないのが欠点だけど。
>>642 >>643 ありがとうございます。
記述が分かりづらくてよく分からなくなるんですけど、
後者の方は、本当に関数のポインタという感じで分かりやすいです。
645 :
超初心者 :2008/06/28(土) 03:51:19
言語はc++です エディットボックスによって入力されてくる10個のint xを左から小さい順 にソートするプログラムを教えてください。 エディットボックスによるint xの入力と処理後の数列を表示する文章は出来ています xを小さい順に選択して並べていく文章が検索したのですがイマイチわかりませんでした
バブルソートすればいいんじゃないか
648 :
超初心者 :2008/06/28(土) 04:27:28
↑ 自力で解決しました といっても誰もレスしない時間帯でしたね^^; 2レス潰して失礼
#include <iostream.h> void main(){cout << "ああ、" << 20 << "歳になると年金を・・・。" << endl;} をコンパイルしようとすると warosu.cpp(1) : fatal error C1083: include ファイルを開けません。'iostream.h': No such file or directory って出ちゃうんですが何をどうすれば良いかさっぱりです。
#include <iostream> using namespace std; int main(){...}
#include <iostream> void main(){ using namespace std; cout << "ああ、" << 20 << "歳になると年金を・・・。" << endl; }
有難う御座います。
iostreamはヘッダーじゃなくって、オブジェクトっていうかライブラリーだから.hいらねっす
もう夏休み?
ってかココは、初心者歓迎スレ
iostream.hだったのはもう十何年も前のこと。
おまえは何を言っているんだ(画像ry
stream.h時代のストラウストラップ本を愛読してます(><)
中身はなんでもいい。
ライブラリに音引きがつくと、見慣れないせいか なんか違う単語みたいに見えるな。
ライブラリーだと図書館とかそっちを思い浮かべるな
667 :
デフォルトの名無しさん :2008/06/28(土) 18:20:58
何故PC関連は伸ばさないのか、昔は違和感いっぱいだったな memory メモリ menber メンバ もう麻痺したけど
menberはすごい違和感を感じるな
伸ばすと語尾が濁ったりして間違われるから。 Oの上に線とか0には斜線とかと同じノリ
た、タイプミスなんだからねっ!
MとN間違えるとか・・・Dvorak配列のキーボード使えよ。 QWERT配列より使いやすいぞ。
へー
だんこん(なぜか変換しない)の世代はダメだな。
QWERTY配列じゃね?
「違和感を感じる」は凄い違和感を覚えるな。
日本語や英語の初心者も歓迎なスレってことでひとつ。
ニホンゴ・・・ニポン人とはじめてのCですね、わっかります。
vectorのソースって読みづらいね。
違和感を感じるは一回調べたことあるが誤用ではなかった筈
ソースとか自分で調べればいいのでは? ”ぐぐれ”
>>680 679じゃないけど、疑問に思ったらとりあえずググれ。
正確には違和感を覚えるだが、違和感を感じるでもそれほど間違いでもない、
ということらしい。
684 :
デフォルトの名無しさん :2008/06/28(土) 23:36:58
配列を作ると、それに当てられるメモリ領域が連続して取られるとのことですが、 たとえば a[100] とか作ったときに、メモリ上に100個の連続した空き領域が一つもなかったらどうなるんですか?
スタックエラーになる
>>684 自動変数として確保したならスタックオーバーフローで、普通は死ぬ。
ヒープならmallocはNULLを返し、newならstd::bad_alloc例外がスローされる。
二次元配列で[100][100]とかやると適当に[0][200]とか入れると(ry
688 :
デフォルトの名無しさん :2008/06/29(日) 00:28:23
よく分からない単語は暇なときググっとけ。
あるクラスで static const int hoge の値でメンバ変数の配列のサイズを宣言したいのですが 定数式が必要と怒られるのでダメなのでしょうか?
static const intでも大丈夫なはずだけど、古いコンパイラだと対応してないのか とりあえずenum{hoge=100,};あたりでごまかしたら?
692 :
デフォルトの名無しさん :2008/06/29(日) 08:16:57
Visual C++ 2008 で常に警告レベルは最大で開発を行っています。 構造体のデータを VOID * にコピーする際に memcpy を使用しているのですが VOID * の変数に対して、 初期化されていないローカル変数 'hogehoge' が使用されます という警告が出てきます。 このときの VOID * の変数の初期化に困っています。 当然ながら NULL を代入するわけにもいかないですし・・・ 警告レベルを下げずに綺麗な対処法はありますでしょうか、 よろしくお願い致します。
うそーん memcpyに渡すときに&でアドレスを取るのだから 初期化や代入してなくても、警告を出すコンパイラなんてないと思うんだけどな。 初期化されてないまま関数に渡すと言う意味で警告が出るようなら char buf[100]; sprintf(buf, "%d", 10); でも警告が出るはずだし。 ていうか、memcpy関係なくて、本当に初期化してないだけな気配をすごく感じるんですけど。 とにかくその部分のコードを張って欲しいね。
まさか、 struct hoge h = {...}; void *m; memcpy( m, &h, sizeof(h) ); みたいなコードなのか? m = malloc( sizeof(h) ); とか m= &hogememory; とか居るだろうに。
>>694 レスありがとうございます。
コード眺めてたら、分岐上で malloc してる箇所を通らないケースがありました。
非常に情けない・・・
わざわざすみませんでした。
printfの書式の質問なんですが、 double型を出力する際に%.0fで指定すると少数第1位が四捨五入されるのでしょうか?
>>690 宣言に初期化子も含んでないと定数式として使えないよ。
四捨五入ではなくて単に小数点以下が表示されなくなるだけ。
>>698 しかし
double a=0.8;
printf("a=%.0f",a);
出力
1
となるんですが・・・
>>699 %fのデフォルトは小数点以下6桁までなのでその精度に
変換される
要するに四捨五入される
%.0fならint型の変数にdoubleを代入したのと 同じような結果になるはずだが
>>699 必ずしも処理系が標準に準拠しているとは限らない
705 :
690 :2008/06/29(日) 19:40:06
>>691 .hファイルで
static const int hoge;
を宣言して、.cppファイルでその値を
const int 適当なクラス名::hoge =512
と512で初期化して
.hファイルないで
char msg[hoge];
はダメみたいですが
.hファイル内でhogeを初期化したり
.cppファイル内でhogeを配列数に私用することは出来るようです
なにか使い方が間違ってるのかな・・・?
つー事は最後の桁は四捨五入ではなくて誤差が含まれているから 承知しとけって事か
>>707 見落としてました
.hファイルで
static const int hoge =512;
とすることで無事に動くようになりました
ありがとうございました
>>708 そうするとそのヘッダを他のファイルから読み込めなくなると思うが、
それでもOKなのかな?
>>709 整数型のstaticでconstなメンバは、宣言時に初期化できることは規格にあるけど。
シンボルが多重定義になるってことじゃないか?
>>709 たぶんクラスメンバの話。
そうでなくても static にしてあるんで問題ない。
なるほど。static 付いてると大丈夫なのね。
>>705 規格は知らないから確実じゃないけど、
cppファイルで初期化する場合、
ヘッダでは値が分からないから
使えないんじゃないかな。
>>714 所詮は変数なので使える。
他ファイルからは値側からなので最適化はできないだろうけど
716 :
714 :2008/06/29(日) 22:18:11
>>715 ではなぜ?
理由は691の「古いコンパイラだと対応してないのか」しか出てない。
ちなみにVS2008EEだと以下の内容が出力された。
error C2057: 定数式が必要です。
warning C4200: 非標準の拡張機能が使用されています : 構造体または共用体中にサイズが 0 の配列があります。
UDT にサイズが 0 の配列が含まれているときに、copy-ctor または copy-assignment オペレータを生成することはできません。
error C2720: 'Test::hoge' : 'static ' ストレージ クラスの指定子が識別子に対して誤って指定されています。
718 :
714 :2008/06/29(日) 22:28:56
>>717 ありがとう。見逃してた。715は間違いということでよい?それとも違う話?
719 :
714 :2008/06/29(日) 22:35:14
691のようにcppファイルで初期化した場合、 cppファイルでは配列数として使えるから、 697の説明も正確じゃない気もするけどなあ。
C++の知識を万遍無く使わないと解けないような宿題をください。あまりにも難しいのはナシの方向で・・・ (ようするにその問題解くと一通り機能を習得(長期記憶)できるような問題) 一通り勉強したんですが、どうにも忘れっぽくて。
>万遍無く 卒倒するレベルの宿題に・・・。 まぁ言いたいことは分かるけどw
問. C++の機能を満遍なく使ってプログラムを書け。
クラス、継承、仮想関数、例外処理、STL、あと何だろう
>>720 C++はリファレンス見ながら使って覚えるものだ。毎日たくさんコード書くしかない。
・非const参照の引数に一時オブジェクト ・const参照に一時オブジェクト ・typenameキーワードが必要になる状況 ・vptr初期化タイミング ・char配列の領域に任意のクラスを配置new出来るかどうか さて・・・
>>720 テンプレートは、一応後の方にした方がいいと思うよ。
>>727 だね。多重継承とテンプレートは誤用しやすいから慣れてから使ったほうがいいかもね。
テンプレートのみで静的な正規表現処理を書けるようになったら一人前
一人前じゃねーよ そういうのはキ○ガイ
書ける・書けない、の話をしてるんだから、一人前で正しい。 書けない奴が、この話を「書く・書かない」の話にすり替えて、 「俺は書けないんじゃない、書かないんだ! だって俺はマトモだから!」 とか吠えるのは逃げ口上。
話をすり替えてない。 普通の人は書けない。書けるのはキ○ガイじみている。
おまえら軽いジョークにそこまで絡みますか
templateに何かコンプレックスでもあるのかw
テンプレートはSTLとかみてると便利そうなのは解かるが 自分でどう使っていいのか皆目見当がつかないなぁ
理解すれば当然のように使うようになるよ
既存のテンプレートライブラリを継承して 独自の派生テンプレートクラスのようなものを作っては失敗すると理解が深まるかもしれん。
インスタンスfooのint* hogeを操作したいときはどう記述するのでしたっけ? *(foo.hoge) = 1; でよかったっけ・・・?度忘れしてしまいました
かっこつけた方が好きだ
お好きなように
fooがポインタの場合は(*foo).hogeの方が正しのか。普通は -> 使うだろうけど。
foo->*hoge とか foo.*hoge は意味違うしなあ
ドット演算子とアロー演算子は、優先順位が最高度だからね。 結合の件で迷ったら、とりあえずfooとhogeを合わせて1つの変数名くらいに考えていい。
.* がオブジェクトからメンバを参照する ->* がオブジェクトへのポインタからメンバを参照する
コピーコンストラクタなんだけど CSample(const CSample& obj) とあるとき objはコピー元、コピー先どっちだっけ?
コピー元
忘れたなら調べてほしい。知らないことならまるで忘れたかのような口調はやめてくれ>< それともどこかの方言なの?>だっけ
コンストラクタなんだからコピー先はthisに決ま
リストコンテナ使うとシャッフル機能があるぜ
皆さんはキーボードの配列はQWERTY配列なんですか?
ふじこlp 配列です。
あざっす
俺は、Dvorak配列だよー。
oeaいませんか
758 :
デフォルトの名無しさん :2008/06/30(月) 21:16:04
動的にクラスの配列を作成し、クラス配列のポインタを返却するメソッドにて、 動的に確保したクラスの配列を delete で解放したいのですが、 そのメソッドの呼び出し側 (配列のポインタを受け取った側) で delete すれば、 正常に解放されるのでしょうか? メソッド内で確保したデータが解放されてるか不安になってしまいました。。。 よろしくお願い致します。
>>758 デストラクタにprintfとか入れて試してみたら?
配列のはdelete [] だけどね。
>>758 開放されるが、あまりかっこよいとはいえない。
share_arrayの出番だけどboostになってしまうか
配列の計算の値が〜+e〜となります 正確な値にするためにはどうすればよいでしょうか? 一応問題の箇所は double a[i][j] int i,j; for(i=0;i<52;i++) { for(j=0;j<102;j++) { if(j==0 && i==0) { e[i][j] = ( e[i][j] + e[i][j] ) / 2; ←の部分だと思ってます cout << " " << e[i][j]; ()の中を2すると値は1とちゃんとでました } } cout << "改行" << '\n'; }
>>759 >>760 >>762 レスありがとうございます
確かに、呼び出し側に解放させるのはカッコよくないですね
構造を見直したほうがいいかも、ですね
>>763 ゴミが残ってるからじゃないの?
0とかで初期化すればどうかな?
がんばって全角スペースいれたかw
配列の初期化ってこんな感じでしょうか? 初歩的な質問で恐縮です for(i=0;i<101;i++) { for(j=0;j<201;j++) { if(i==25) { if(50<=j && j<=100) { e[i][j]=100; } else { e[i][j]=0; } cout << " "<< e[i][j]; } else { e[i][j]=0; cout << " " << e[i][j]; } } }
>>763 その引用部分より前に問題があるんじゃないか?略さずに貼るべし
getcで読み込んだ文字を文字列に代入するのはどうやったらいいですか?
どうしても初期化で100とか入れなきゃダメなのか? ゴミデータが嫌なだけならmemsetで0で埋めるだけでも・・・
>>767 int c[101][201];
みたいな配列なの? 半端だな……
そうだと仮定すると、↓みたいな感じでいいんでないの。
std::fill(&c[0][0], &c[100][201], 0);
std::fill(&c[25][50], &c[25][101], 100);
std::copy(
&c[0][0], &c[100][201],
std::ostream_iterator<int>(std::cout, " "));
772 :
767 :2008/07/01(火) 01:34:29
>>1 のURLにソースうpさせてもらいました
ファイル名は7119.txt です
汚いソースですがよろしくおねがいします
VisualC++でboost::uBLASが動かないんですけど何か対策はありますk?
Boost総合スレに投稿するつもりが間違えました。
775 :
767 :2008/07/01(火) 08:26:11
ファイル名間違えてました・・・すいませんでした 再びよろしくお願いします・・・ 7154.txt
+e で表示されるのがいやなら、書式指定しなさいよ。
777 :
デフォルトの名無しさん :2008/07/01(火) 10:01:15
vector<double> vec(10); みたいなのがあって、適当な実数が格納されているとします。その時、 vec[0]+vec[1]+...+vec[9]=accumulate(&vec[0], &vec[10], 0); というのは分かるのですが、 vec[0]^2+vec[1]^2+...+vec[9]^2 を求めたいときはどうすればよいですか?
inner_product?
>>777 for(int i=0;i<vec.size();i++) sum+=vec[i];
>>779 まちがえた
sum+=vec[i]*vec[i];
inner_product(vec.begin(), vec.end(), vec.begin(), 0.0)
printf("%s", 0); で (null) と表示されるのはANSI等の仕様でしょうか? それとも非標準な親切設計なのでしょうか?
実は「%s」自体が標準には無い拡張だったりします。
forkについて 1プロセスで三回printfを実行して別プロセスを作成 そこからまた三回printfを実行して別プロセス 10プロセス実行完了したら最初のプロセスから終了していく そんな課題なのだけどforkが理解できなくて困っている… 申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
ごめん嘘ついた。
>>785 forkは分身を作る。
戻り値が0なら分身。
必要な関数や型名、そしてその使い方などは、皆さんどうやって調べているのでしょう? 例えば ・メッセージボックスにはMessageBox::Showを使う ・プログラムの終了にはCloseを使う ・描画をするにはGraphics型を使う などは、サンプルプログラムを見ればわかるのですが、自分で一から考え出せるとは思えません。 そもそもその関数や型の存在を知らなければ歯が立たないと思うのです。 自分がやりたいことに対する関数や型の見つけ方を教えてほしいです。
google
まあ1つの言語に慣れれば、他も大体似たようなものだし サンプルを片っ端から動かしてみて(読むのは後でいい) その動作を覚えていれば、必要になったときにそのサンプルを思い出すだろう。 あとは関数単位より、機能単位で探し物すればいい。見つからなけりゃ自作するはめになるし その後そのものの関数が見つかったりもするけど、それもまた勉強で。
運任せ、ということでしょうか。 検索して見つかればラッキー、そうでなけば自作か諦める、という選択肢になってしまうのですね。 自分のニーズに合ったものを常に探し出せる公式な機構というものは存在しないのでしょうか。 だとしたらかなり不便ではないですか? よく使うものは覚えていればいいですけど、漠然とした要求や、特殊な機能などは、 せっかくライブラリがどこかに存在しても結局は無いのと同じことになってしまいませんか。
792 :
デフォルトの名無しさん :2008/07/01(火) 12:18:09
2ch マイクロソフトのページで検索
>>791 正直、プログラマに向いてない、
と思いましたw
探しだしてくれるAIを作れ
>>791 ライブラリの提供元で調べる。(MSDNとか)
言語によっては言語の公式リファレンスみる。(PHPとか)
>>701 本を片っ端から買え。
ネットを片っ端から検索して嫁。
めんどくさくなったら、自分で作れ。(<-ある程度のプログラマーなら、これも多い)
とにかくやればできる、または要求が無理だと理解して違う道を探す。
不便だと思ったら便利にしたいと思うのがプログラマ。
×不便だと思ったら便利にしたいと思うのがプログラマ。 ○不便だと思ったら便利なツールを作るのがプログラマ。
>>782 char へのポインタが必要なところに int を渡しているので、未定義動作になる。
どんな動作をしても非標準じゃないけど、いきなりぶっ飛んだりしない親切設計。
>>788 C++/CLIじゃね?
MSDNでがんばれ
>>800 printf()のような可変長引数関数に0渡すときは、型がわからないから
単にint扱いだよ
たとえnull pointerを特別扱いしてくれるprintf()であっても、
sizeof(void*) != sizeof(int)な環境ではどうなるか分かったもんじゃないな
なんだ、質問者の意図がわからないアホか・・・
>>802 誰に言ってんの?
多分質問者の環境ではsizeof(void*) == sizeof(int)でかつ
printf()がnullpointerを特別扱いしてる(これは親切設計)から、
そのように動作してるんだよ。
可変長引数関数にnull pointerを渡したければ、
(void*)0
のようにキャストしなきゃだめ。
>>791 たとえばゲーム作るとするだろ。
その時、シナリオなり戦闘ルーチンなりは自分で作る。
ファイルを開いたりウインドウを閉じたりは、APIやライブラリや
フレームワークに用意されているはず。
自分で一から考え出すのは前者だろ。後者は(居れば)誰かに
聞いたりググったり、マニュアル読めば見つかる。
上の例は極端だけど、自分で一から考えなきゃいけないものが何か
切り分け出来ないのは単に経験不足だから、触ろうとしている環境の
サンプルをもう少し動かして感じをつかむしかない。
その環境で出来ることが全部サンプルでできるとは限らないけど
困らないぐらいには大抵網羅されている。
>そもそもその関数や型の存在を知らなければ歯が立たない
サンプルを一通り見てもそう思う?
>>800 とりあえず >803 参照。そのうえで、 "%s" にヌルポインタを渡した場合の動作も同じく
未定義動作。 "(null)" を出して済ませてくれるのは親切設計。場合によっては余計な
お世話かもしれない。(ファイルにリダイレクトしてて、後々まで気づかないとか。)
806 :
デフォルトの名無しさん :2008/07/01(火) 20:36:57
ベクターの各要素を定数倍するにはどうすればよいですか?
807 :
デフォルトの名無しさん :2008/07/01(火) 20:37:37
定数倍する関数作る
808 :
デフォルトの名無しさん :2008/07/01(火) 20:57:22
普通にループさせるんでいいんじゃね
std::transform(v.begin(), v.end(), v.begin(), std::bind2nd(std::multiplies<T>(), N));
810 :
デフォルトの名無しさん :2008/07/01(火) 23:45:48
ありがとうス。 今まで教えてもらったことを元に色々と書いてみたのですが、うまく動きません。 vector<double> multi(vector<double> &v1, vector<double> &v2) { vector<double> tmp(v1); for (unsigned int i = 0; i < tmp.size(); ++i) { tmp[i] *= v2[i]; } return tmp; } こういう関数があったとして、返り値のvector<double>は、いつまで存在している のでしょうか?この返り値をほかの関数の引数としてそのまま渡してしまったら駄目なのでしょうか? multi(multi(v1,v2), v3); たとえばこんな書き方↑です。multi()の引数を参照渡しではなく、値渡しに変更すると 正しく動くみたいなのですが、、、
>>810 >うまく動きません。
それを具体的に。
v1とv2の要素数は同じ?
>返り値のvector<double>は、いつまで
変数に入れたりする限り、ずっと有るよ。
正確には、コピーされていく。
大き目のint変数くらいに考えても良い。
812 :
デフォルトの名無しさん :2008/07/02(水) 00:20:41
>>811 ありがとうございます。
v1とv2の要素数は同じです。うまく動きません、というのより、コンパイルが通りません。
変数に入れずに、直接関数に渡したら駄目ですか?
渡された側の関数では、参照貰いで引数を貰うようになってます。
813 :
デフォルトの名無しさん :2008/07/02(水) 00:22:40
コンパイルエラーを書くのを忘れてました。 ソース #include <vector> using namespace std; vector<double> multi(vector<double> &v1, vector<double> &v2) { vector<double> tmp(v1); for (unsigned int i = 0; i < tmp.size(); ++i) { tmp[i] *= v2[i]; } return tmp; } void func(vector<double> &v1, vector<double> &v2) { multi(multi(v1,v2),v1); } int main() { return 0; } エラー $ g++ hoge.cpp hoge.cpp: In function 'void func(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)': hoge.cpp:11: error: invalid initialization of non-const reference of type 'std::vector<double, std::allocator<double> >&' from a temporary of type 'std::vector<double, std::allocator<double> >' hoge.cpp:3: error: in passing argument 1 of 'std::vector<double, std::allocator<double> > multi(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)'
windowsプログラミングを触り始めたのですが、CLRを用いる場合何か問題点など有りますでしょうか。 やりたいことはPhotoshopなどの様にレイヤー管理ウィンドウの表示です。 表示のオンオフ用のチェックボックスとレイヤーを複数選択状態を指定の2つで、 互いに独立している(表示オンオフとレイヤーの選択は依存しない)なのですが、 VB・javaの経験が有るため、CLRならばユーザーコントロールで作り〜と実装の目処は立てられるも、 それ以外の方法では敷居が高く出来るならCLRで開発を行いたいと思っております。 また、今後ゲームのミドルウェア開発をしていく上でCLRを使ったプログラミングを行っていっても良いのでしょうか。 MFCなど様々な開発方法があり、どれを勉強していけばよいのか考えあぐねています。 とりあえずプラットフォームはwindowsのみなのでCLRを使っていこうとは思っているのですが、何かおすすめの勉強方法が有りましたら宜しくお願いいたします。
>>813 一時オブジェクトは非constな参照引数に渡せない。
変更しない物にはconst付けるクセ付けろよ。
>>813 >>726 の1行目のやつだね。引数にconst付けてみ。
実は最初そう思ったんだけど、
VC++2005で試したら普通にコンパイル通っちゃったんだよね・・・
>>814 パフォーマンスを気にする類ならCLRはGC動くから使わない方が良いけど、
そうでないなら別に問題無いと思う。
個人的にはユーザーインターフェースはWTLが良いかな、と。
ちなみにCLR使うとなるとC++/CLIっていうC++派生の別言語になる。
818 :
デフォルトの名無しさん :2008/07/02(水) 00:46:38
>>815-816 ありがとうです。
ためしてみます。
726は全部確かにツボをついた質問ですね。
・非const参照の引数に一時オブジェクト
・const参照に一時オブジェクト
この2つの質問って同じことじゃないですか?
・typenameキーワードが必要になる状況
そういう状況があったというのはどこかで読んだけど、具体的にどうだったかは忘れた。
・vptr初期化タイミング
この質問は意味自体が分かりません。
・char配列の領域に任意のクラスを配置new出来るかどうか
たしかvectorを使う方がいいとかどこかで聞いたような気がするけど。
たしかにこんな質問にすらすら答えられるようだったら結構すごいと思うけど、、
あと、テンプレートで正規表現の処理なんかも書けないな。俺も2年くらいC++
使ってるけど、まだまだだな〜
2年やっててあんな質問してるようじゃ相当マズイと思うんだけど。
>>817 ありがとう御座います。WTLを早速試してみます。
横でdirectXを動かそうと思っているのでなるべくパフォーマンスは軽い方が良いですし頑張ってみます。
インデックス演算子のオーバーロードなんですが 多次元配列のインデックスをオーバーロードすることは出来るのでしょうか?
823 :
デフォルトの名無しさん :2008/07/02(水) 03:49:13
できるけど、実装がちょっと面倒だし、利点もあまりないように思う。 どうしても多次元配列じゃないとだめ? 関数の形にしたほうが簡単でいいのでは? array[i][j][k]; => 面倒 array(i,j,k); => 簡単
vectorにクラスをつっこんだときに、push_back使ってコンストラクタを呼び出すと一時オブジェクトがデストラクタを呼び出してしまい、スマートなプログラムが組めません。 static std::map<int, myclass *> classMap; class myclass{ int myid; BOOL f; TCHAR Text[256]; public: myclass(int id, LPCTSTR str){ f = FALSE; myid = id; _tcscpy(Text, str); classMap.insert( std::make_pair(myid, this)); } myclass(const myclass &cpyc){ ((myclass *) &cpyc)->f = TRUE; f = FALSE; myid = cpyc.myid; _tcscpy(Text, cpyc.Text); classMap.erase(myid); classMap.insert( std::make_pair(myid, this)); } ~myclass(){ if(!f) CtrlMapping.erase(myid); } }; int main(){ std::vector<myclass> mc; for( int i = 0; i < 10; i++) mc.push_back(myclass(i, _T("hoge"))); return 0; } てなかんじなのですが、 ((myclass *) &cpyc)->f = TRUE; のあたりとかとくに無理矢理感が否めず、全体的に、他にもっとスマートなやり方等はないのでしょうか。 classMapをクラスのメンバに入れると、リンクエラーが起きます。これは何故でしょうか。 あともう一つ、基本的な話でスミマセンが、コピーコンストラクタの中で、プライベートなメンバにアクセスできるのは何故ですか?(呼べないとものすごく困りますが) 質問多くてスミマセン…^^;
>>824 shared_ptrでも使ったら?
> classMapをクラスのメンバに入れると、リンクエラーが起きます。
宣言だけして、実体の定義してないんだろ。
>プライベートなメンバにアクセスできるのは
同じクラスだから
>>823 csvファイルの操作を行う、内部に二次元配列を持つクラスを
作りたいのですがインデックス演算子の方が直感的かとおもうので・・・
関数の形でも問題ないのでそういう方向で行きたいと思います
あと、CSVファイルを操作するとき二次元配列をそのまま内包するより
列をリスト構造で繋いで
行をそのリストの配列、もしくはリストのリストという形にした方が操作しやすいですか?
stlをあんまり知らない俺が予想でカキコ 1. ((myclass *) &cpyc)->f = TRUE; ↓ cpyc.f = TRUE; 2. classMapはintとmyclassへのポインタのmapだから、 これがmyclassのデストラクタを呼ぶことは無いんでは? 3. リンクエラーは涌かんね 4. privateってのは他の「クラス」からのアクセスを制限してる。 ほかの「インスタンスからの」じゃない。 # そういう風になった理由は知らないけど...
ああ for( int i = 0; i < 10; i++) mc.push_back(myclass(i, _T("hoge"))); なんて書いてるからか。 これでmcにpush_backされているのはmyclassの一時オブジェクトだよ。 for( int i = 0; i < 10; i++) mc.push_back(*(new myclass(i, _T("hoge")))); でどうか?
>>827 1. constの存在を忘れてるよ。対症療法で答えるならmutableを使うことになると思う。
2. push_backの引数に渡した一時オブジェクトが無駄という話。
3. cppファイルかどっかに変数の実体も作ってやらないとだめなの。関数の実体を書くのと同じ要領で。
>>828 そのnewした一時オブジェクトはどこへ行っちゃうの?
830 :
デフォルトの名無しさん :2008/07/02(水) 11:07:19
>>829 push_backの引数って、vectorの中に入る時には、コピーされるから一時オブジェクト
でも問題ないんじゃなかったっけ?
>>830 コピー元へのポインタが失われてメモリリークする。
>一時オブジェクトがデストラクタを呼び出してしまい... と >そのnewした一時オブジェクトはどこへ行っちゃうの? の話がゴッチャになってないか?
>>824 つーかそのコードだとobjectのIDとインスタンスのポインタを
classMapとやらで管理してるようだが、
コピーコンストラクタでコピー元のIDをそのままコピってるから
おかしなことになるんだろ
A生成→IDA, &A登録
BをAからコピーコンストラクタで生成→IDA, &A削除、IDA, &B登録(いいの?)
A破棄→IDA, &B破棄(いいの?)
vectorにpush_back()する際に起きるのは、こういうことだ
この時点でBが生きてるがclassMapには何も残ってない
何のつもりのIDだか知らんが、設計一から見直せよ
同じIDのオブジェクトが複数存在する状況があるから面倒な事になるんだよな。 myclassはコピー不可にすべきだな。
835 :
824 :2008/07/02(水) 12:35:38
>>825 ,827
実態登録するの忘れてました…
privateのほうは、ほかのオブジェクトからアクセスできないものだと思いっきり勘違いしてました。
同じクラスなら大丈夫なんですね…
shared_ptr使ってポインタの配列として扱うのでも問題はないのですが…
>>829 どうmutableを使ったらよいかよくわからないです…
>>833 そもそもコピーコンストラクタなど使いたくなくて、
vectorでpush_backするときに、一時オブジェクト使わずにコンストラクタを呼び出したいのですが、
一時オブジェクトができてしまうと、コンストラクタでマップに登録されるまではよいのですが、
そのまま(コピーコンストラクタを使わずに)コピーすると、一時オブジェクトが破棄されると同時にデストラクタが呼び出され、マップが破棄されてしまうので、
それを避けるために、コピーされたときにコピーされたことを示すフラグを立て、デストラクタ時にマップを破棄しないようにしているのです。
実際IDにはコントロールのハンドルか何かを使うつもりなので、同じIDのオブジェクトは作らない前提なのですが…
普通にshared_ptrかptr_vectorの出番だろ。
837 :
824 :2008/07/02(水) 13:04:30
>>836 ptr_vectorとか知らなかった…
これの出番です! これ使ってきます!
VC++2008で class sample { wchar_t *name; public: sample( const wchar_t *src ) { int len = wcslen( src ) + 1; name = new wchar_t [ len ]; wcscpy( name, src ); } ~sample( void ) { if ( name ) delete [] name; } }; みたいにやるとデストラクタでヒープ破壊が起きて例外が来るんだが、これはC++仕様?それともCRTか何かのバグ? メモリ解放出来ないからリークしまくって困ってるんだが、どうにかならんだろうか
ほかのnewしたメモリを使っている部分でメモリ破壊を起こしていると言うことはないか?
あるいはコピーコンストラクタと代入演算子を書いていないからか。
もっとも単純にした状態で出る?
842 :
838 :2008/07/02(水) 18:53:46
>>838 のクラスをそのまま流用したときは出ないです
main()でインスタンス作って終了ですら発生します
出ないのに発生する? よくわからん、こっちで再現できるだけの材料ある?
入門書一通り読み終わったんですが 次はどんな方法で勉強すればいいですか?
>>844 とりあえず作りたい物を作ってみる
作りたい物を作っていく上で問題にぶち当たったら
その問題を解決するようにしていく
文法と規則を覚えたら後はこれの繰り返し
int main() { sample s(L"こんにちは"); } こんなんやってもこっちでは再現しねえよ VC9だよな? 俺が試したのはSP当たってねえExpressだけど
847 :
838 :2008/07/02(水) 19:09:24
手元の環境では
>>838 のコードに色々メンバを追加してくと発生します
再現性のある資料はさっきのコード位しかないですねwchar_t*に限らずint*とかでも例外が来ました
>>845 ありがとうございます
オセロ作っちゃいます
>>847 そういうのは、コンパイルするだけで再現可能な最小のコードに切り落として、
正確に使ってる環境とコンパイルオプション添えて、
MSに報告してやれよ
nameを複数回解放してないか コピー作られたとき
>>847 メンバを追加しないと発生しないんだったら、それも載せないと意味ないだろう
852 :
838 :2008/07/02(水) 19:52:42
もう少し研究してみることにする
pw.insert(map<double, float>::value_type(power, f)); これってどういう事をしてるんですか? STLさっぱりなんでmapとかわかりません
(power, f)というペア(型はstd::pair<double, float>)をpwに挿入している ようだな
>>852 とりあえず、デストラクタ内の if (name) は意図どおりには動かないぞ。
sampleのオブジェクトがスタックなのかヒープなのかは知らんが
どちらにしろ、nameが0(NULL)で「初期化」されることはない。
したがって、「確保されていたらdelete」の判断には使えない。
まあ、NULLをdeleteしてもかまわないわけだがね。
あと、皆も言ってるが、この手の「中身の実体を別途(ヒープに)確保する」ものは
自分でコピーコンストラクタを書かない限り、コピー(代入)はうまく動かない。
仮にsampleの用法が「必ずヒープから確保して、実体コピーはしない」というものだけであっても
宣言だけはしてコピー不可にしておくべき。
857 :
デフォルトの名無しさん :2008/07/03(木) 10:56:51
[\033[1;30m\] こんな感じのカラーコードってありますよね これは黒白合わせて8色+ダークしかないんでしょうか。 RGBみたいに自由に指定して色を作ったりは出来ないんでしょうか
ANSIのエスケープシーケンスだろ、スレ違いだけどRGB指定は無いよ。
>>857 最近のxtermやrxvtは256色表示ぐらいは出来るらしい。
↑の30のかわりに38;5;%d (%d: 0 〜255)
みたいなシークエンスを送るようだ。
スレ違いでしたか、申し訳ない Macの初期装備ターミナルでも256表示出来るかな…? 試してみます、ありがとう
861 :
デフォルトの名無しさん :2008/07/03(木) 19:30:23
ゲームでキャラにマウスカーソルを乗せるとカーソルの形が変わるものがあります。 このようにマウスカーソルをオリジナルのものに変えるにはどうすればいいですか? VC++2008,Vistaです
>>861 LoadCursorやLoadImageでカーソルをロードするかCreateCursorでカーソルを作成してSetCursorする
WM_SETCURSOR
エスケープシーケンスはokって
>>1 にあったな
すまんかった
>>856 >デストラクタ内の if (name) は意図どおりには動かない
そーか?
sampleには一見すると引数無しのコンストラクタが無いので、
生成する時nameの初期化は強制されると思うんだが。
コピーしたときにどうなる?
>865 nameはプリミティブだからデフォルトコンストラクタとか 喚ばれないよ?
初期化は強制される。 コピーの時も元が初期化されているので未初期化の領域をdeleteすることは無い。 ただし、コピーコンストラクタによって2重deleteが発生し得る。
#define nusigned unsigned #define usnigned unsigned #define unisgned unsigned #define unsgined unsigned #define unsinged unsigned #define unsigend unsigned #define unsigndn unsigned #define edfault default #define dfeault default #define deafult default #define defualt default #define defalut default #define defautl default #define erturn return #define rteurn return #define reutrn return #define retrun return #define retunr return
870 :
デフォルトの名無しさん :2008/07/04(金) 02:40:03
失礼します #include <stdio.h> #include <math.h> main() { double pi,i,n,f; for(n=0;n<200;n++){ f=pow(16,n); i=(1/f)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6)); pi+=i; printf("%lf\n",pi); } } のpi+=iの部分の意味が分からないのですが、これは何をしているんでしょうか? piにiを足しながら代入ですかね? ご指導お願いします。
pi=pi+i
複合代入演算子
873 :
デフォルトの名無しさん :2008/07/04(金) 03:23:15
ありがとうございました!
>>865 >>868 されねーよ。
実際に調べてみろよ。アセンブラコード出力して。
規格にあると言うなら、なんて書いてあるのか示してくれよ。
俺が追ってない、最新規格ならそうだってんなら納得するから。
あ、俺が知ってるのは、 sampleにPODなメンバしかなく、コンストラクタを明示的に書いてない場合に 例えば new sample ならメンバは初期化されないで、 new sample() なら0で初期化されるということと 引数ありのコンストラクタがあるのにデフォルトコンストラクタが無い場合には 上のような引数無しでのオブジェクトは作成不可能ということだけだがね。 で、コンストラクタを書いた時、 初期化コード内に現れてないメンバを勝手に初期化してくれるとは知らなかったね。 配列も初期化してくれるのかい?大きなお世話なんだが。 可変長構造体でも、placement newを使えばコンストラクタを利用できるわけだが これはどこまでゼロフィルしてくれるのね。 まあ、可変長構造体自体がC99以外では未定義だし サイズ0の配列は独自拡張らしいから別の話になるか。 確かにPODと非POD両方を持つクラスのデフォルトコンストラクタなら 自動的に他のメンバを初期化するという仕様に決まってるかも、と思わないでもない。 実際には()の有無にかかわらずPODメンバは初期化していないようだが。 仕様は知らん。
VC++のdeleteはかなりいい加減なポインタを渡しても落ちない。 newやmallocで確保したアドレスのリストを持っててそれと一致しないと無視という構造で 複数回deleteしようが、nullポインタをdeleteしようが、 文字列リテラルへのアドレスをdeleteしても落ちない。 >デストラクタでヒープ破壊が起きて例外が来るんだが の状況判断が根本的に間違ってると予想するよ。 どこかでnameのポインタをそのまま外部に渡してるとか さらしてないところでnameをいじってるとかそんなところだろ。
>>876 え?VC8で2重解放したら、即例外投げられたよ?
>874-875 >引数ありのコンストラクタがあるのにデフォルトコンストラクタが無い場合には >上のような引数無しでのオブジェクトは作成不可能ということだけだがね。 838のコードを対象にしてんだから、まさしくそういう意味で、 「初期化が強制される」、って言ってるんじゃないの?
>>874 そういうならnameに何も初期化・代入せずに
>>838 のsampleのインスタンス作るコード書いてみろよ。
あのさ、
デストラクタ内に if (p) delete p; というコードがあるわけ。
で、コンストラクタ内に、 p = new wchar_t[]; というコードがあるわけ。
つまりね、ここから想定されるのは、
「コードを書いた者は」
「newされたメモリが代入される前には」
「pはNULLになっているはずだ」
と考えているということ。
これが間違いだ、との指摘が
>>856 の前半なの。わかってる?
>>856 の「初期化」の直前に「0(NULL)で」と書いてあるでしょ?
「初期化されることはない」じゃなくて、「NULLで初期化されることはない」なの。
これに対して、
>>865 がどれほど見当違いな事書いてるかわかる?
「NULLで初期化されることはない」に対して「初期化は強制される」と書かれたら
「NULLでの初期化が強制される」読むでしょ。これが
>>868 の書き込み。
あ、「意図通りに動かない」というのも 書いた者が「初期化されてなかったら解放する」という意図を 「そもそも初期化されないことはない」というのは当然だけど 「コンストラクタが完了していない(未初期化)の状態が起こりえるコード(が省略されている)であっても NULLかどうかで(newによる代入が行われたかの)判定は出来ない」ということだよ。
882 :
868 :2008/07/04(金) 07:50:48
>>880 そういう意味なら良いよ。
俺はif(name)には言及して無いし、if(name)が無意味なのは同意する。
コンストラクタ完了時にnameが未初期化のケースは無いと言っただけ。
>>838 が困ってるのはヒープ破壊の方の話だからな。
問題をまとめると ・コピーコンストラクタが書かれてないので、コピーしたときにポインタが多重になり、 デストラクタで同じアドレスが複数回解放される可能性がある ・デフォルトコンストラクタが書かれていないので、引数無しでインスタンスを作成した 場合に、ポインタの値が不定のまま(VCだと0xccccccccでNULLではない)デストラクタで 解放を試みられる。
>引数無しでインスタンスを作成した場合に 引数無しでインスタンスは作成出来ない。
聞かれて無いがついでに解決策 ・コピーコンストラクタ、デフォルトコンストラクタを書いて、正しくポインタを取り扱いましょう。 ・手作業でメモリ確保せずに、std::vector<wchar_t>やstd::wstringをバッファとして使いましょう。
>>884 あぁそうか。ならデフォルトコンストラクタの部分は無しで
ごめん、しつこいようだけど、もう一言だけ追加させて。
>>856 の前半をわざわざ書いたのは、C++以外の言語では
>>880 の真ん中の仮定が通用するものが多いわけ。JavaとかDelphiとか。
だから、それを勘違いしていて、たとえこのコードでは問題なくても
他の場所でバグを抱え込んでいる可能性が充分あるから。
で、ヒープが壊れるという現象は、オーバーフローなんかも多いけど
この人の場合は「(ヒープから確保した以外の)未初期化の不定なポインタのdelete」
による可能性も十分あるかと。
もちろん、コピーや代入による「2重delete」の可能性も高いけど。
>>887 >この人の場合は「(ヒープから確保した以外の)未初期化の不定なポインタのdelete」
>による可能性も
一応聞くけど「
>>838 に貼られたコードが」ではなく
「
>>838 の認識で書かれたコードが」って意味だよな?
一番問題なのは、自分が悪いとは微塵も 考えて無いことだなw
>>898 そうだなw
予想どうり2重解放してるなら、デバッガで追えばすぐ分かる間違いだし。
if ( name ) delete [] name; を「意図どおりには動かない」と
言っているが、これが分かりにくいんだな。
現に、
>>856 自身の念入りな解説(
>>880 )で、本当の意図が分かった人が
複数いるわけで、ここは「ちゃんと読まないてめーが悪い」と考えるのじゃ
なくて、相手に誤解させず、はじめから意図どおりに読ませる書き方を
しないと。
現実世界で、自分が正しいはずなのにコミュニケーションが
うまく行かないってはめにおちいるよ。
『nameの「初期化」(←強調付き)』と書いているものを
『nameへの代入』と解釈したり(sampleのコンストラクタ内でやってるのは「代入」ですね)
『sample(のインスタンス)の初期化』と解釈する人の事なんか知りません。
現に
>>867 はちゃんと「nameの初期化」の意味を理解してます。
・必ずコンストラクタを通る。 ・プログラマが定義していない初期化(全て0フィル等)は行われない。 ・newが失敗したときは例外が飛ぶのでsampleオブジェクトの生成も失敗する。 以上のことから デストラクタ実行時にname==0という状態は考えられず、 if(name) という記述に怪しいニオイを感じる。 というだけのことではないの?
>>893 それはお前の思い込み。
struct A{
const wchar_t* name;
A(){ name=L""; } // A():name(L""){}
};
上記のように初期化リストを使わない書き方をもって、
「nameは初期化されない」と言うのが一般的とは到底思えない。
何故なら、そう言うと未初期化になると受け取られることが予想出来るため。
厳密な初期化の話をするなら俺なら「」の強調程度で済まさずちゃんと書く。
「wchar_t*型(の自動変数)はNULLに初期化されない」なら分かるけどな。
>>895 うまいね、一票だな
>厳密な初期化の話をするなら俺なら「」の強調程度で済まさずちゃんと書く。
そうだよね。これが「ちゃんと読まないてめーが悪い」とは考えない大人な
ものの考え方だよ。
あのさ、 sampleオブジェクトの生成が失敗して例外が投げられた時、 sampleのデストラクタが実行されるのか?
>>898 ということは、
さらされてるコードではnameに 『有意な値が設定されない』 状況はsampleオブジェクト
の生成失敗であって、その状況で通りもしないif(name)の動作が意図されないとか、
言及に値する?
それともnameに 『有意な値が設定されない』 でdelete [] nameが実行されるケースって
あるのかしら?
sampleのインスタンスがコピーされたりnameのポイント先が他から無理やり開放されたりとか、
想像で障害を増やすことはできるけど、その場合はif(name)の意図如何にかかわらず
吹き飛ぶだろうから、そもそも着眼するまでも無い様に思うが。
初期化子で初期化するときにdeleteされても安全なオブジェクトを作る→ コンストラクタから例外を投げる時には地震のデストラクタを呼べば良い。 初期化子で例外が起こった場合は?
>>899 >それともnameに『有意な値が設定されない』で
>delete [] nameが実行されるケースってあるのかしら?
件のコードで普通に生成する限りは、ないよ。
>>900 >コンストラクタから例外を投げる時には地震のデストラクタを呼べば良い。
それは止めた方が良い。
そもそもauto_ptrなどを使うべきだけど、
そうでないならtry-catchして必要な後処理をすること。
>初期化子で例外が起こった場合は?
諦める、でおk
function-try-blockでも止められないし。
RAIIに則って作ればどこで例外が出ようと、
例外安全になる。
RAIIこそC++の真髄だよな
903 :
デフォルトの名無しさん :2008/07/04(金) 18:22:55
C++に関する本で、演習(解答も)ついてるおすすめの本ってありますか?
マルチすな糞
あああーーー 誰か答えてやれよ
俺が答えられればいいんだけど。そういう本は10年以上前に読んだきりなんだよ。 最適化で「なぜここで聞く?」と書いた責任を感じてしまった。orz
SetCommState()が失敗するんですが、設定するだけでなんで失敗があるんですか? 各項目には値を代入できているんです。実行時にエラーになるならわかるんですが
>>909 意味が分かりません
コンパイルエラーということでしょうか?
>>911 関数の戻り値にFALSEがかえるんです。
>>912 GetLastError で調べてください
>>914 そのURLにはSetCommStateがいっぱいあって、問題が特定できません。
エラーが発生するコードを載せましょう。
またMSDNをよく読みましょう。
コードの文字が右に来たときに折り返す設定ってどうやるんですか?
エディタ次第
>>916 自己解決しました。サンプルが間違ってましたfParityにFALSEではなくNOPARITYが入ってました。
原因が絞れて解決できました、ありがとうございました。
>>919 WebMasterに伝えてあげたいんだけど、サンプルのどこが間違えているの?
サンプルを見て勉強するときは、 コピペじゃなく、考えながら手で写しましょう
○×ゲームくらい簡単に作れるだろうと思ってたら自分への課題にしたけどめちゃめちゃむずかったです AIとか訳分からんです 課題のレベルを下げるべきでしょうか?
まずは両プレイヤーが人間操作でゲームが出来るようにすること。 そのあとAIというか、評価関数を作ること。 「そのマスに置くのは何点くらいか?」を返す関数をね。 相手が勝つのを防げるか、自分のマークと繋がってるか、などで 適当に点数をつける。精度は徐々に上げていけばいい。
>>923 ありがとうございます
その方針で頑張ってみます
323 242 323 だったけ?これが、基本形
>>920 dcb.fParity = NOPARITY;で検索できる全てです。
ただFALSEもNOPARITYも0なので不具合は無いのかもしれません
NOPARITYはdcb.Parity = NOPARITY;に入れましたが、この記述事態がこのサイトに見つかりません。
自分はCビルダーではなくVCなのでもっとわかりませんが、他の2サイトのCビルダー用のコードにはParityにNOPARITYが入っていました
dcb.Parity = NOPARITY;自体はデフォルトがあって省略できるのかもしれませんが不明です。
で、○×を少し拡張して五目並べをだな。
char In[1]; CString workStr; CString m_editx; workStr.Format(_T("%s%c"), m_editx, 'In'); m_editx = m_editx + workStr; これを実行するとDebug Assertion Failed! というエラーがでるのですが、これはなんですか?
>>928 どういうアサーションが仕組まれてるのか分からないが、
%cに対して'In'を指定してることに対して怒っている事はまあわかる
まずはIn[0]にするべきだな そもそも'In'なんてコンパイル通らない気がするんだが m_editxが何も参照していないのはわざとか?どうでもいいけど まー、MFCの方で聞いた方が適切だとは思うが
FormatってCStringオブジェクト渡しても大丈夫なの?
>>929 % c を % s にして実行すると、ハンドルされていない例外が発生しました。というエラーが出ます。
Inはchar In[1] で固定なのですが、エディットボックスにどんどん連結で入れていく方法はないでしょうか
>>932 なんでそんなことしちゃったの?
> % c を % s にして実行
#include <cstringt.h> char Inr[1]; CAtlString workStr; CString m_editx; workStr.Format(_T("%s%c"), m_editx, Inr); m_editx = m_editx + workStr; エラーが悪化しました。
すいません、エラーは全然関係ないところでした。 まずそっちのDebug Assertion Failed!を特定します。すいません
936 :
デフォルトの名無しさん :2008/07/05(土) 06:09:45
GCC 4.0.1をOS Xで使っています。 === hoge.h === template<typename T> class hoge { private: T val; friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2); } === hoge.cxx === template<typename T> hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2) { hoge<T> h = h1; h.val += h2.val return h; } のようにすると、compile後にoperator+が使用できません。 宣言だけされて、定義がないと思われてしまうようです。 hoge.hのclass hogeの中で friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2); { hoge<T> h = h1; h.val += h2.val return h; } とやってしまえば、operator+を使用できるようになります。 定義はhoge.cxxの中で書きたいのですが、どこを修正すれば良いでしょうか。
間違ってたらスマンね。詳しいわけじゃないから。 結論から先に書くと、ヘッダに定義も書いておいてやらなきゃダメなんじゃないかなと。 テンプレートってのは特殊化されるまでは実体を持たないので、 いくら.cxxの中に定義を書いたところで その翻訳単位の中で具体的な型を与えて実体化させてやらないと 出来上がったオブジェクトには含まれようがない。 つまり関数foo<int>を利用する場合 他のオブジェクトのいずれかにfoo<int>の具体的なコードが存在するか 自分の翻訳単位に具体的なコードを作るための定義が存在しないと 翻訳プログラムは「みつかんねーし自作も出来ねーよクソが」と怒るわけだ。
939 :
936 :2008/07/05(土) 07:47:19
>>937-938 ありがとうございます。
>>938 の方法でいけました。
ただしfriendがoperatorの場合は、
さらにclass宣言の前にoperatorを宣言しないと駄目なようです。
通常のfriendはclass宣言の後ろに書くと思いますが、
operatorの場合だけ(?)は前方に書かないとなぜかGCCでは通りませんでした。
940 :
936 :2008/07/05(土) 07:49:15
template<typename T> class hoge { private: T val; friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2); } hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2); としていたのを、 templaate class hoge<T>; hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2); template<typename T> class hoge { private: T val; friend hoge<T> operator+<T>(const hoge<T>& h1, const hoge<T>& h2); } としました。(ちと汚いが…)
941 :
936 :2008/07/05(土) 07:50:05
>>940 >templaate class hoge<T>;
ではなく、
template<typename T> class hoge;
です。
>>931 CStringはそうやっても大丈夫なように工夫されてたと思う
#include <iostream> #include <atlstr.h> int main() { CStringA s = "this"; CStringA ss; ss.Format("%s %s a pen", s, "is"); std::cout << static_cast<LPCSTR>(ss) << std::endl; } へえ。確かにこんなのが動くみたいだな。 ちらっとヘッダ見たけど、データメンバがポインタ一個だけで、それがちゃんと 文字列部分を指していて、長さ情報みたいなのはポインタが指してる部分より前に 隠してあるようだ。 てことは、static_castでoperator LPCSTR()を呼び出さずに reinterpret_castでもいいのかな?
944 :
デフォルトの名無しさん :2008/07/05(土) 11:07:01
Bus Errorが起きます。 randl=random()%3; tp = strtok(word[randl],","); odata[0] = atoi(tp); //cout << odata[0] << endl; while ( tp != NULL ) { tp = strtok( NULL,"," ); if ( tp != NULL ) { odata[bcount] = atoi(tp); //cout << odata[bcount] << endl; bcount++; } } word[randl]には{ 1,1,1,5,4,15,6,7,5,1 }といったchar型の二次元配列が入っています。 それらを , を境に分解し、odata[]の中に一つづつぶち込んでいます メモリの書き込みがどうのこうの、と調べたので出てきたので此処が怪しいと思うんですが、 一体このスクリプトでどういう状況のときにバスエラーが出るのかわかりません。 ちなみに実行すると何度かは成功し、たまにバスエラーが出る状況なので、 「変数によって不正な値が作られている」だと思うのですが…… 想定されるエラーの理由、 もしくは、「,を境に分けたいならこんな書き方のほうがいいよ」というのがあればご教授ください。 関係ないとは思いますがMacOS Xです
>>944 問題が再現する最小のコードを張ってください
長くなる場合には
>>1 のアップローダを使ってください
Macか、CPUは?
947 :
デフォルトの名無しさん :2008/07/05(土) 12:46:11
世間一般では、クラス、メソッドなどの概要、inputo、output、return値などのコメント説明って ヘッダー、ソースのどっちに記載するのが普通ですか?
>>947 ヘッダに書いておくと、IDEが読み込んでバルーンヘルプに解説が出てくるから便利だな。
949 :
デフォルトの名無しさん :2008/07/05(土) 12:50:43
>>947 そうですよね。 cppの方に記載してるソースこの間見つけて
すごい違和感を感じました。
.hに書くのは利用者向けコメント .cppに書くのは実装者(後のメンテナ)向けコメント
テンプレートの定義はヘッダに書くのが普通ですよね(複数のcppから使う場合)。 今までそうしてて問題なかったんですが、初めて、テンプレート関数の特殊化を使ってみたとき // hoge.h #ifndef HOGE_H #define HOGE_H template<typename T> void hoge(T a) { ... } template<> void hoge<int>(int a) { ... } #endif 特殊化した方の関数を使おうとすると、リンク時に「既に***.objで定義されている」と出るようになりました。(inlineと指定したら問題なくなりました 特殊化した関数の中身はcppに書けと言うことですか?
そりゃまったく同じ名前、引数の関数が2ヵ所以上にあったらぶつかるだろ
typedef enumで定義されている 値はC++で使う場合、クラスにラップした方がいいぉか?
クラスでもnamespaceでもお好きに。
まー、規約次第だろう 統一はしろ
>>954 namespaceでの定義方法がよくわからないぉ?
namespace foo { enum bar { hoge, piyo, puni }; } foo::bar x = foo::hoge;
クラスラップした後の話だろうw namespaceは
新しいクラスを作って中に関数を作ってそれを元のクラスから呼び出したいのですが、 クラス名::関数名(); 静的でないメンバ関数の呼び出しが正しくありません というエラーが出て呼び出せません
静的じゃないなら、そのクラスのインスタンスを生成しなきゃ呼べないだろ
静的で使うのならstaticつけれ
クラス名 std; std.関数名(); インスタンスの生成ってこうですか? エラーなくなりましたありがとうございます!
VC++2008でプログラムを作り、デバッグボタンを押すと一瞬だけ何か黒い物が表示されてそれ以外は何も動きません 実行結果が見えるようにしたいのですがソースコードのどこに何を書けばいいのでしょうか?
>>962 何かいろいろと勘違いしているかもしれんが・・・うまくいったならいいかw
静的関数というものを理解してなさそうで怖いな
デバッグありで実行せずデバッグなしで実行する 適当に入力待ち状態にしてそこで止める等々
>>963 mainのreturnにブレークポイント設定するとかCtrl+F5で実行するとか
getchar()でも駄目だった
>>966 ,
>>967 で行ったら確かに止まった、ありがたい
でもなんだか釈然としない
getchar()で駄目な理由として 上でscanf()等を使って文字列入力をしてる場合等がある
_kbhit
// C801.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; int main() { Console::Title="一番簡単な数の表示"; int a=123,b=456; Console::WriteLine("A="+a+" B="+b); Console::WriteLine("A+B="+(a+b)); Console::WriteLine("A-B="+(a-b)); Console::WriteLine("A*B="+a*b); Console::WriteLine("A/B="+(double)a/b); return 0; } //入力したコード
>>969 こういうことだから理解してくれ
ブレークポインタ使うならF5
ブレークポインタ使わないならCtrl+F5
>ブレークポインタ
gccかC99で関数のルートアドレス?だか返す マクロあったけど名前思い出せない たじけて
聞くは一時の恥、知らぬは一生の恥というので聞かせてもらう・・・・ ルートアドレスって何?
関数の呼び出し元の関数のアドレスのことじゃね?
聞くは一時の恥、聞かれるは一生の不覚
なんか違う
std::cout等を使うクラスを定義する場合は 宣言上部でusing namespace std;するのが流儀?
毎回 std:: を付ける流儀
>>980 自分だけでやってるならアリかもしれないが
複数人で何かを作るのならやめておいたほうがいい
ヘッダのグローバルスコープでusingしなければなんでもいいよ。
関数内でusing void f(){ using namespace std; ... }
基本クラスCObjectで作った新しいクラスの中で元のダイアログウィンドウを塗りつぶしたいんですが どうやって指定すればいいんですか? CWnd* myPICT=GetDlgItem( IDD_RS232C_TEST_DIALOG ); CClientDC myDC( myPICT ); CRect myRECT; myPICT->GetClientRect( myRECT ); CPen penBlack( PS_SOLID, 1, RGB(0,0,0) ); CPen* oldPEN=myDC.SelectObject( &penBlack ); CBrush myBrush; CBrush* oldBrush; myBrush.CreateSolidBrush( RGB(128,128,128) ); oldBrush=myDC.SelectObject( &penBlack ); dc.Rectangle( myRECT ); myDC.SelectObject( oldPEN ); myDC.SelectObject( oldBrush );
その質問で困っていることを分かってもらおうとするのは無茶だろw
すいません、'GetDlgItem' : 関数に 1 個の引数を指定できません。 というエラーです。
誰か次スレお願い。 俺無理だった。
>>987 IDD_ってダイアログリソースのIDだろ?
DialogBox()かCreateDialog()でしか使えないよ。
GetDlgItem()は対象のウィンドウ内の
子ウィンドウ(ボタンやテキストボックス)のハンドルを取得するためのもの。
CWndを継承してないのなら、
第一引数にウィンドウハンドルを渡す必要がある ::GetDlgItem(HWND, int)
を呼ぶことになる。
今のソースでは根本的に無理だと思うので、
入門書やネットでダイアログの基本的な使い方を見た方がいい。
なるほど、がんばってみます。どうもです。 組込Cと比べてC++は地獄ですね
C++というかVC++じゃ
いや、VC++というよりMFCだなw
言語とOSとシステムコールの違いも勉強しなきゃだね。
あ、CWndの話が出てるのは後側だけか
次スレ〜
俺が立ててこよう
1000ならC/C++消滅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。