【初心者歓迎】C/C++室 Ver.48【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/05(火) 01:18:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0063デフォルトの名無しさん
2008/02/06(水) 17:56:43ごめん、よくわからない
0064デフォルトの名無しさん
2008/02/06(水) 18:59:44起動させると、はじめカレントディレクトリは
ルートディレクトリになってるんですけど
glutInit()を通過すると、◯◯.app/Contents/Resourcesが
カレントディレクトリになってんですよ
なんでこんな妙なところに行っちゃうんですかね
ちなみに◯◯.appの中身は以下の通りです
◯◯.app/Contents/Info.plist <--謎
◯◯.app/Contents/MacOS/○○.exe <--実際に動くc++コード
◯◯.app/Contents/Resources/icon.icns <--アイコンの絵
0065デフォルトの名無しさん
2008/02/06(水) 19:21:04::ZeroMemory(&d3dpp, sizeof(d3dpp));
と
D3DPRESENT_PARAMETERS d3dpp = {0};
はちがいますか?
0066デフォルトの名無しさん
2008/02/06(水) 19:23:400067デフォルトの名無しさん
2008/02/06(水) 19:30:09そこがアプリケーションのリソースを置く場所だから、
親切に(あるいは余計なお世話か)移動してくれてるんじゃないかな
0068デフォルトの名無しさん
2008/02/06(水) 20:39:50なるほど
Glutで何かしているのではなく
◯◯.exeに引数で渡してるんですね。
そんな気がしてきました。
ちょっとチェックしてみます。
0069デフォルトの名無しさん
2008/02/06(水) 22:00:07NULLポインタdeleteって問題ないんじゃないの?
0070デフォルトの名無しさん
2008/02/06(水) 22:03:06二重解放つったら解放したアドレスをもっかい解放のことだろ?
0071デフォルトの名無しさん
2008/02/06(水) 22:04:350072デフォルトの名無しさん
2008/02/06(水) 22:32:430073デフォルトの名無しさん
2008/02/06(水) 23:35:43クラスの中で定義した関数は勝手に inline となるのでしょうか?
inline をつけても意味は無いのでしょうか?
0074デフォルトの名無しさん
2008/02/06(水) 23:38:400075デフォルトの名無しさん
2008/02/06(水) 23:44:29inline指定してるのと同じになる。
実際にinline化されてるかはコンパイラ次第。
0076デフォルトの名無しさん
2008/02/06(水) 23:48:07deleteした後nullになるわけじゃないのね
WM_DESTROYが来た時点ではOSかが自動的にdeleteしちゃってるから多重解放
でエラーでかうのかな
0077デフォルトの名無しさん
2008/02/07(木) 00:42:460078デフォルトの名無しさん
2008/02/07(木) 00:47:50をスタティックリンクすることってできるんでしょうか?
0079デフォルトの名無しさん
2008/02/07(木) 00:54:200080デフォルトの名無しさん
2008/02/07(木) 03:40:14じゃあ何でエラーでるの?
newしたまま終了してしまっても最悪OSがエラー処理として解放してくれるって聞いたけど
0081デフォルトの名無しさん
2008/02/07(木) 05:19:50エラーが出る事と自動的にdeleteする事を同列に考えるなよ
そもそもソース出してないのに的確な答えが出せると思える?
つーか自分で考えて答え出すか出たんなら帰れよ、必要最低限のレスは付いたんだから
0082デフォルトの名無しさん
2008/02/07(木) 05:55:500083デフォルトの名無しさん
2008/02/07(木) 06:04:00その考えをおまえが否定したから聞いてきてるんだろ
0084デフォルトの名無しさん
2008/02/07(木) 06:42:38たとえば以下のように double の vector の配列を作ったとします。
std::vector<double> a[3][4];
この vector 配列の要素ごとに違う回数だけ push_back() で値を入れたとします。
そして vector のポインターを引数にとる以下の関数があり
void hogehoge (std::vector<double>* arg ){
for(std::vector<double>::const_iterator it=arg[0].begin();
it!=arg[0].end();
it++){
std::cout<<"arg[1] "
}
}
その引数に a[1] を以下のように入れた場合は
hogehoge(a[1]);
arg[0]というのは a[1][0] をちゃんとさしてくれるのでしょうか?
0085デフォルトの名無しさん
2008/02/07(木) 06:44:380086デフォルトの名無しさん
2008/02/07(木) 07:16:58当然さす
0087デフォルトの名無しさん
2008/02/07(木) 07:18:13newしたまま終了って、main/WinMain すら終了した後の話だぜ
008884
2008/02/07(木) 07:20:43ありがとう!
ってことは sizeof(vector<double> は要素の数にかかわらず値は変わらないって事か。
不思議。
0089デフォルトの名無しさん
2008/02/07(木) 07:23:40意味が分からん。
ポインタに [0] をつけたら
そのアドレスにあるオブジェクトを指す。
極めてシンプルな答え。
009084
2008/02/07(木) 07:30:440091デフォルトの名無しさん
2008/02/07(木) 07:31:390092デフォルトの名無しさん
2008/02/07(木) 07:35:21要素自体は動的確保されているからな
0093デフォルトの名無しさん
2008/02/07(木) 07:35:520094デフォルトの名無しさん
2008/02/07(木) 09:42:52ソートしたいです。どうすればよいですか?
0095デフォルトの名無しさん
2008/02/07(木) 09:45:440096デフォルトの名無しさん
2008/02/07(木) 10:00:45std::sort
0097デフォルトの名無しさん
2008/02/07(木) 14:14:420098デフォルトの名無しさん
2008/02/07(木) 14:26:10sort(vec.begin(), vec.end(), func);
と書きたい時、funcはどういう風に書けばよいでしょうか?
class func : public binary_function
{
bool operator()(const string &a, const string &b){}
};
と書いてみたのですが、コンパイルも通りません。
どうかお願いします。
0099デフォルトの名無しさん
2008/02/07(木) 14:29:080100デフォルトの名無しさん
2008/02/07(木) 14:30:57厳密に言うとstrict weak orderingを満たすように書く
ことになるが、
struct func : public binary_function
{
bool operator()(const string &a, const string &b) {
return a < b; //辞書順で昇順
}
};
sort( vec.begin(), vec.end(), func() );
とかでどう?
0101デフォルトの名無しさん
2008/02/07(木) 14:31:04VC6.0で自前のライブラリをまとめたStatic Link Libraryを作っています。
そのライブラリを実際に他のプロジェクトで使う際、リンクのところで以下のように躓きました。
・すでに LIBCMTD.lib(crt0dat.obj) で定義されています
これを筆頭に、大量にリンク警告がでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/08900/08806.html
libの方はシングルスレッドで。テストプロジェクトのほうはマルチスレッドでコンパイルしているのが問題のようでした。
両方マルチスレッドにしたところ…
・"libcmt.lib" は他のライブラリの使用と競合しています
今度はこれだけでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/03900/03888.html
libがReleaseコンパイルで、テストプロジェクトがDebugコンパイルなのが悪いようでした。
libをRelease版とDebug版の両方をつくり、適切にリンクするようにしたところ、エラーがきえました。
ここで疑問なのですが、今後の汎用性を考えるとlibは
・シングルスレッドDebug版
・シングルスレッドRelease版
・マルチスレッドDebug版
・マルチスレッドRelease版
をそれぞれ用意しておかなければならないのでしょうか?
一般的に用意されている"winmm.lib"などは、何も考えずにstdafx.hに
#pragma comment(lib, "winmm.lib")
と書いておけば、シングルスレッドだろうがマルチスレッドだろうが、DebugだろうがReleaseだろうが適切にリンクされました(警告やエラーでません)
自作のlibも同じくらい気軽に使えるようにするには、どのようにしたら良いのでしょうか?
0102デフォルトの名無しさん
2008/02/07(木) 14:32:02>>99を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) {
return a < b; //辞書順で昇順
}
};
か。
0103デフォルトの名無しさん
2008/02/07(木) 14:38:330104デフォルトの名無しさん
2008/02/07(木) 14:39:360105デフォルトの名無しさん
2008/02/07(木) 14:52:29>>103を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) const {
return a < b; //辞書順で昇順
}
};
か。おれはconstをよく忘れる。
0106デフォルトの名無しさん
2008/02/07(木) 14:53:31・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません
>>104
そんな「命令」なんてあるもんですか。
0107デフォルトの名無しさん
2008/02/07(木) 14:59:57MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。
0108デフォルトの名無しさん
2008/02/07(木) 15:05:41自前でキャッシュ用意しましたよ
0109デフォルトの名無しさん
2008/02/07(木) 15:16:46101です
お返事ありがとうございます。
>・Debug版は公開しちゃいけません
確かにそもそもDebug版は用意しておく必要ないですよね
ただ、d3d9.lib も、デバッグ版らしき d3d9d.libというものがあります。
もしかして「Debug/Releaseで自動的にリンクを変えている」なんていうのは私の妄想で
d3d9d.libは使われていないのでしょうか?
>・現行VCはシングルスレッド版ランタイムがありません
これはつまり、世の中に配布されてるlibはマルチスレッド版で作られており、
マルチスレッド版libは、シングルスレッドなプロジェクトで利用しても特に問題が起きないということでしょうか?
(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです
0110デフォルトの名無しさん
2008/02/07(木) 15:21:59まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。
そういうの避けたければスタティックリンクしてしまうといいかも。
0111デフォルトの名無しさん
2008/02/07(木) 16:08:21>(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
これですが、勘違いでした。
やはり「マルチスレッド版のlibファイル」を「シングルスレッド版のプロジェクト」からリンクすると、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
となってしまいました。
(上のは、Debugマルチ版LibをDebugシングル版のプロジェクトにリンクした場合の警告です)
>>110
なるほど。hファイルあたりで、#ifdef _DEBUG やら色々としているのでしょうか。
>そういうの避けたければスタティックリンクしてしまうといいかも。
ちょっとこの意味合いがわからないのですが、詳しく教えていただけますでしょうか
どこかのサイトへのリンクでも構いません
0112デフォルトの名無しさん
2008/02/07(木) 16:26:09以下の式で、shinが偽になるのはなぜでしょうか?
unsigned int a =10, b = 20;
char shin = ((a - b) < (b - a));
(a - b) = -10, (b - a) = 10 なので、shin = 真になるように思うのですが。。。
0113デフォルトの名無しさん
2008/02/07(木) 16:29:040114デフォルトの名無しさん
2008/02/07(木) 16:32:120115デフォルトの名無しさん
2008/02/07(木) 16:32:160116デフォルトの名無しさん
2008/02/07(木) 16:37:11コンパイラオプション/ZlっbトVC6にない?
これはobjファイルにLIBCMTD.LIBとかCRTへの参照を
埋め込まないようにするコンパイラオプション。
1つのlibで全てを賄えるようにもなる。
けど現実的には最適化・デバッグオプションの有無で、
少なくともRelease/Debugの2種用意すべきだと思うけど。
0117デフォルトの名無しさん
2008/02/07(木) 16:48:16Zlオプションを使ったところ、DebugプロジェクトからReleaseLibを使っても警告がでなくなりました。
ありがとうございます。
(最初 Zl が ゼット・アイだと思って混乱しましたw ゼット・エルですね)
しかし、StaticLibraryの作り方を詳しく解説しているサイトって全然見当たりませんね…。
Lib側としては、Releaseだけ用意しておけばいいと思うのですがどうでしょうか?
Libがバグっていないと仮定して利用するのが前提ですけど
0118デフォルトの名無しさん
2008/02/07(木) 16:51:38winmm.libってwinmm.dllの単なるインポートライブラリでは?
VCのランタイムをリンクしないライブラリならそういった問題は当然起きない
0119デフォルトの名無しさん
2008/02/07(木) 16:52:47DLLだとデバッグ版も提供なんて話聞かないし。
0120デフォルトの名無しさん
2008/02/07(木) 17:02:19あ、なるほど。そういえばlibにはもうひとつ「DLLとリンクするためのインポートライブラリ」という役目がありましたね。
winmmはそっちですか。
(拡張子変えればいいのになぁ…)
>>119
了解しました。
>ALL
大変参考になりました。
ありがとうございました!
0121デフォルトの名無しさん
2008/02/07(木) 17:19:25それを使ったプログラムもLibのソースをトレースできるようにだよw
0122デフォルトの名無しさん
2008/02/07(木) 17:23:39誰への返事だ??
0123デフォルトの名無しさん
2008/02/07(木) 17:26:130124デフォルトの名無しさん
2008/02/07(木) 17:36:050125デフォルトの名無しさん
2008/02/07(木) 18:04:43void foo() {
T x = T();
}
intやint*などの基本型に対してテンプレートでのデフォルト初期化
を可能にするために上のような表記が許されておりint*ポインタも渡せます。
(NULLポインタに初期化されている)
しかし、以下のポインタの初期化は許されていないのでしょうか?
int* p = int*(); //コンパイルNGでした
int i = int(); //OK
0126デフォルトの名無しさん
2008/02/07(木) 18:05:370127デフォルトの名無しさん
2008/02/07(木) 18:28:40それはできないけど、これならできる。
typedef int* pint;
template<typename T>
struct identity
{
typedef T type;
};
int* p1 = pint();
int* p2 = identity<int*>::type();
0128デフォルトの名無しさん
2008/02/07(木) 19:05:06void a( void* p ) {
if( rand() %2 ) delete p;
}
void main () {
char*pc = new char[100];
a(pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
みたいな。
0129デフォルトの名無しさん
2008/02/07(木) 19:08:340130デフォルトの名無しさん
2008/02/07(木) 19:13:57typedefで可能ということは単なるシンタックスの問題だという
ことですかね。だとしてもfoo<int*>()は結果的に
int*()となるからNGのような気もしますがね。
0131デフォルトの名無しさん
2008/02/07(木) 19:31:29リスト管理の時
リストのアイテムをdeleteしたとき、自動的に所属するリストからはずれる機能は、
stlでvectorとかlistとか使って所属リストを覚えて、リストからはずすより、
前後のポインタを持った、自己連結クラスのほうが速度的に早いですか?
というか、deleteしたとき、自動的に所属するリストから外れるtemplateみたいなもの
STLみたいな標準ライブラリにありますか?
0132デフォルトの名無しさん
2008/02/07(木) 19:34:12単純にシンタックスの問題っぽいよ
>postfix-expression:
> simple-type-specifier ( expression-listopt )
(略)
>simple-type-specifier:
> ::opt nested-name-specifieropt type-name
> ::opt nested-name-specifier template template-id
> char
> wchar_t
> bool
> short
> int
(略)
>type-name:
> class-name
> enum-name
> typedef-name
>class-name:
> identifier
> template-id
intやクラス名やtypedef名はOKだけどint*は構文に合致しないっていう・・
0133デフォルトの名無しさん
2008/02/07(木) 20:03:47そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。
>>131
逆に、リストにあるオブジェクトをremoveするときにdeleteしては?
0134デフォルトの名無しさん
2008/02/07(木) 20:22:12下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。
20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から
「神はわれわれから9光年以内にいる」と結論を下したという。
0135デフォルトの名無しさん
2008/02/07(木) 20:47:14/'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・
ヽ、┗ ノ
`ーー' γ⌒`ヽ /'⌒⌒ヽ、
,-ーー-、 .|| ̄ ̄ ( ┃ ⌒ヽ
/ ┃ ) || ∧_∧ \ ━┛ )
.(. ┃ ) ||. ( `ハ´;)
ヽ、__,ノ || _(つ¶¶と)__
/||'''''| 三 | |'(⌒)
/ '―――――`  ̄ \
`============'
0136デフォルトの名無しさん
2008/02/07(木) 20:51:06なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。
ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。
0137デフォルトの名無しさん
2008/02/07(木) 21:14:240138デフォルトの名無しさん
2008/02/07(木) 21:17:09C++のプログラムを実行すると
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2143: 構文エラー : ';' が '<class-head>' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2501: '_STD_BEGIN' : 識別名を宣言するのに、型が指定されていません。
c:\program files\microsoft visual studio\vc98\include\new(16) : fatal error C1004: 予期せぬ EOF が検出されました。
と出てしまいます。
どんなプログラムでもこのエラーが出てしまい実行できません…
どのようにすればこのエラーはなくなりますか?
0139デフォルトの名無しさん
2008/02/07(木) 21:18:22そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。
0140デフォルトの名無しさん
2008/02/07(木) 21:25:29必要なものが入ってないか入れる設定にしていない。
_STD_BEGINってのはSTLが使う宣言だからSTLが使えないんだろう。
(vectorでも使ってるんかね?)
俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ
0141デフォルトの名無しさん
2008/02/07(木) 21:37:29>>139
あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。
0142デフォルトの名無しさん
2008/02/07(木) 22:03:32Visual C++ 2008 Expressとかだとどうなる?
0143デフォルトの名無しさん
2008/02/07(木) 22:50:19(遅くなりましたが)
ありがとうございました。
0144デフォルトの名無しさん
2008/02/07(木) 23:20:56標準では用意されていないので、人によっては解放したらその領域を指
していたポインタ変数を (* 自分で *) NULL にしておくようにしてい
る人もいる。
どっちかって言うと、バグってた時の二重解放除けとか、変な領域を壊さ
ないようにと言う防御策だが。
void a( void** p ) {
if( rand() %2 ) delete *p;
}
void main () {
char*pc = new char[100];
a(&pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
0145デフォルトの名無しさん
2008/02/08(金) 01:48:100146デフォルトの名無しさん
2008/02/08(金) 01:50:440147デフォルトの名無しさん
2008/02/08(金) 01:59:05if( rand() %2 ){
delete *p;
*p = NULL; // delete後はNULLを入れておく
}
}
void main () {
char*pc = NULL; // ポインタは普通NULLで初期化しておく
if( rand() %2 )
new char[100];
a(&pc);
delete pc; // pcがNULLなら何もしない
}
0148デフォルトの名無しさん
2008/02/08(金) 01:59:41...
}
という処理についてなんですが、cinって最初はとりあえずtrueになるのですか?
すると、いつfalseになるんですか?
エラーフラグがたってればfalse、それ以外はtrueになるのかな?
cinで何かデータを読み込んだ後だけtrueになるのかと思ってました。
0149デフォルトの名無しさん
2008/02/08(金) 02:00:03pc = new char[100] でした。
0150デフォルトの名無しさん
2008/02/08(金) 02:04:09↓
標準入力からデータがcinに行く
↓
cinがtrueになる
↓
while(cin)が評価される
というかんじなんじゃね?
0151デフォルトの名無しさん
2008/02/08(金) 02:12:09C++では汎用ポインタへのポインタって合法だったっけ。
0152デフォルトの名無しさん
2008/02/08(金) 03:44:280153デフォルトの名無しさん
2008/02/08(金) 03:55:201つの関数にまとめたいと思うのですが、どうすればいいでしょうか?
void print((型が分からない) stream) {
stream << "hogehoge" << endl;
...
}
こんなのも考えてみたのですが、コンパイルできず、ダメでした。
template<class T>
void print(char *filename) {
T outStream;
if (filename) outStream.open(filename);
outStream << "hogehoge" << endl;
...
}
どうかよろしくお願いします。
0154デフォルトの名無しさん
2008/02/08(金) 07:25:40new ヘッダをインクルードする前に
new をマクロで置き換えてないか?
0155デフォルトの名無しさん
2008/02/08(金) 10:49:42std::ostream
0156デフォルトの名無しさん
2008/02/08(金) 11:53:19@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。
0157デフォルトの名無しさん
2008/02/08(金) 11:57:37つ[Doxygen]
0158デフォルトの名無しさん
2008/02/08(金) 11:59:11ありがとうございました。
0159デフォルトの名無しさん
2008/02/08(金) 13:23:53例外を投げたらその処理の中で解決した方が良いのか
それとも解決方法を使う側に投げっぱなしにしてしまうのか
例外をどういう形でthrowするのがいいのか
なんというか感覚的に掴みにくいというかなんというか
0160デフォルトの名無しさん
2008/02/08(金) 13:25:330161デフォルトの名無しさん
2008/02/08(金) 13:32:44帰ってきたものも向こうに?
0162デフォルトの名無しさん
2008/02/08(金) 13:34:05自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる
普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ
■ このスレッドは過去ログ倉庫に格納されています