【初心者歓迎】C/C++室 Ver.72【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/03/05(金) 16:51:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0322313
2010/04/02(金) 17:00:48ありがとうございます!
>ただ考え方としては型名で、Cとの互換からTagとしての属性を残している
この一言ですっきりしました。
あと >>315 さんの calc の行と合わせて、>>319 さんの言う 「ほとんど同じ」 も合わせて、
すっきりしました。 ありがとうございました。
0323デフォルトの名無しさん
2010/04/02(金) 17:53:270324デフォルトの名無しさん
2010/04/02(金) 22:32:560325デフォルトの名無しさん
2010/04/03(土) 15:29:48過去の蓄積との整合性を保つのが面倒だし一度使い出すと今後ずっと縛られることになるしなぁ
標準で実装されてるならともかく、
いくらboostみたいな有名なライブラリとはいえ非標準に依存するのはちょっと違和感あるなと時々思う
0326デフォルトの名無しさん
2010/04/03(土) 16:49:37> 非標準に依存するのはちょっと違和感あるなと時々思う
外部ライブラリもAPIすら使わないで
標準C/C++の範囲だけで書かれた有名なソフトウェアは
俺は一つもしらんのだが。
C/C++の限界でしょそれは。
0327デフォルトの名無しさん
2010/04/03(土) 19:02:31フレームワークみたいな使い方になっちゃうってことじゃない?
0328デフォルトの名無しさん
2010/04/04(日) 02:34:350329デフォルトの名無しさん
2010/04/04(日) 02:37:59そうとは限らない。
0330デフォルトの名無しさん
2010/04/04(日) 02:48:38C++では0ではない事が規格で保証されている
理由を聞くとアドレスを取るためだと
0331デフォルトの名無しさん
2010/04/04(日) 10:28:120332デフォルトの名無しさん
2010/04/04(日) 12:02:22C++は仮想関数などポインタに入れて使う使い方もあるので
(もっともvtableなどで元々0ではないかもしれないが)空の
構造体やクラスでも0にはならないように設計されている
0333デフォルトの名無しさん
2010/04/04(日) 12:25:49> メンバ変数のないメンバ関数だけのクラスのサイズは0でよいのでしょうか?
むしろほぼ間違いなく0にはならないことが保証される。
例外はEBOが働いた時のみ
0334デフォルトの名無しさん
2010/04/04(日) 12:31:200335デフォルトの名無しさん
2010/04/04(日) 12:43:37EBO (Empty Base Optimization)
空の基底クラスの最適化。
メンバ変数を一個も持たない、空のクラス、というものが出来ることがあります。
しかし空のクラスであっても、アドレスは一意に決めなくてはならないので、
izeof( EmptyClass ) は 0 にはなりません。
EmptyClass arr[100];
assert( &arr[0] != &arr[1] ); // アドレスは違ってて欲しい単独で使う時には
この無駄は仕方のないところですが、 例えばこの空クラスから他のクラスを派生
するときは、EmptyClass の分のサイズは 0 にして、派生クラスのメンバ変数の
分だけを確保する、という最適化が可能です。 C++の規格で許されているこの
最適化のことを、Empty Base Optimization と呼びます。
0336デフォルトの名無しさん
2010/04/04(日) 12:43:45sizeof(空の構造体)が0になることがC言語の標準規格で保証されていたかは
記憶にないけど、もしそうならC++と互換性が無い点になるだろうね。
でもsizeof(空の構造体)==0に依存したソースってどんなんだ?
0337デフォルトの名無しさん
2010/04/04(日) 16:00:36ISO C 6.2.6.1 p2
> Except for bit-fields, objects are composed of contiguous sequences of one or more bytes, ...
C でもサイズは 0 にならないよ。
0338336
2010/04/04(日) 16:14:04ほー。
じゃあむしろEBOが特例でサイズが0となり、
それ以外は標準C/C++では必ず1 or more バイトはかかるわけだ。
ありがとう。
0339デフォルトの名無しさん
2010/04/05(月) 00:47:17struct hoge fuga[42];
で&fuga[0] < &fuga[1]でないと色々厄介だからね。
0340デフォルトの名無しさん
2010/04/05(月) 14:34:38class impl_a : public iface {...};
impl_a a1, a2, a3(a1); // ok
a1 = a2; // ok
iface &i1 = a1, &i2 = a2; // ok
iface i3, i4(i1); // ng
i1 = i2; // ng
ifaceの生成コピー代入を禁止したままimpl_aの生成コピー代入を許可する、再利用性のあるイディオムはありますか?
protectedな生成コピー代入をifaceに持たせれば仕様は満たすのですがこれは再利用性がなく
boost::noncopyableではimpl_aもコピー代入不可になってしまうので条件に合いませんでした
0341デフォルトの名無しさん
2010/04/05(月) 17:54:44どうすればいいでしょうか?
切り替え自体はできてます。
2kXPVista7、OSデフォルトかOffice付属のIME
検証自体はwindows 7 office2007IME VC++2008Expressでしてます。
http://codepad.org/cVmmTnfL
0342デフォルトの名無しさん
2010/04/05(月) 20:30:55生成すら不可にしたいならインターフェースクラスにするとかかな?
良いのが思いつかないので下で探して。
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms
0343デフォルトの名無しさん
2010/04/05(月) 23:01:28メンバ変数ポインタの型の代入演算子に依存しないディープコピーの方法はないでしょうか?
0344デフォルトの名無しさん
2010/04/05(月) 23:04:54{
}
0345デフォルトの名無しさん
2010/04/05(月) 23:05:54> メンバ変数ポインタの型の代入演算子に依存しないディープコピーの方法はないでしょうか?
素直に普通にCopy Constructorを書くとそうならない?
テンプレート引数をT型とすると、
// Copy Constructor
MyClass(const MyClass& other)
{
pointer = new T(*other.pointer); // pointerは生ポインタ or スマートポインタ型とする。
}
じゃダメなんすか?
0346345
2010/04/05(月) 23:06:50// Copy Constructor
MyClass(const MyClass& other)
{
pointer = new T( *( other.pointer ) ); // pointerは生ポインタ or スマートポインタ型とする。
}
じゃダメなんすか?
0347デフォルトの名無しさん
2010/04/05(月) 23:37:38汚いけどこれでどうよ。
#include <new>
class A { public: A() {} };
class B {
public:
B() : m_a(operator new(sizeof(A))) { }
~B() { operator delete(m_a); }
A* GetA() { return reinterpret_cast<A*>(m_a); }
const A A1;
const A A2;
const A A3;
void Copy(const A B::*p) {
GetA()->~A();
new (GetA()) A(this->*p);
}
private:
void* m_a;
};
int main() {
B b;
b.Copy(&B::A1);
b.Copy(&B::A2);
b.Copy(&B::A3);
}
0348デフォルトの名無しさん
2010/04/06(火) 00:08:37ポインタ型メンバのポイント先とでもいえばいいのかな?
>>346
これも言葉足らずでした
コピーコンストラクタや代入演算子のような相手方の実装に依存しないコピー、ということでした
0349デフォルトの名無しさん
2010/04/06(火) 00:50:070350デフォルトの名無しさん
2010/04/06(火) 00:51:33コピーコンストラクタやコピー代入演算子を使わずにコピーしろというのか?
0351デフォルトの名無しさん
2010/04/06(火) 06:40:360352デフォルトの名無しさん
2010/04/06(火) 07:22:33というか、相手方の実装に依存しないためのコピコンや代入演算子じゃないのか
0353デフォルトの名無しさん
2010/04/06(火) 07:23:23相手方の実装におもいっきり制約かけてんじゃん
0354デフォルトの名無しさん
2010/04/06(火) 08:22:59void* で持ってて型情報が消えてるんだけど deep copy したいとか。
だったら、type erasure あたりでぐぐれば参考情報があるかも。
0355デフォルトの名無しさん
2010/04/07(水) 05:32:010356デフォルトの名無しさん
2010/04/07(水) 05:38:11ttp://www14.big.or.jp/~ken1/tech/tech19.html
0357デフォルトの名無しさん
2010/04/07(水) 13:23:05生のリソース開放処理が失敗した場合に例外も戻り値も使えないのでエラーを通知する方法が無いように思えるのですが
開放に失敗した時に、(侵入的ではない方法で)何か処理をしたい場合はどうすればいいんでしょうか?
0358デフォルトの名無しさん
2010/04/07(水) 19:30:14インターフェースってそういうもんじゃないの?
0359デフォルトの名無しさん
2010/04/07(水) 19:34:56リソース解放を行って成功したかどうかを返すメンバ関数を追加する。
デストラクタにも解放処理は置くけど、こっちはエラーを通知しない。
かわりにログを吐くか、あるいはその場で死ぬか。
0360デフォルトの名無しさん
2010/04/08(木) 16:29:190361デフォルトの名無しさん
2010/04/08(木) 16:44:570362デフォルトの名無しさん
2010/04/08(木) 18:44:460363デフォルトの名無しさん
2010/04/08(木) 19:04:04少なくとも、POSIXのclock()はプロセッサ時間だよ。
0364デフォルトの名無しさん
2010/04/09(金) 11:16:13プロジェクトP1の中にLobbyForm.hというヘッダーファイルがあり、プロジェクトP2内のmymain.cppの中でLobbyForm.hをインクルードしています。
当然mymain.cppの2行目に#include "LobbyForm.h"と記載しています。
これでVisualC++2008EEにてソリューションのビルドをかけると以下のエラーが出ます。
エラー 2 fatal error C1083: include ファイルを開けません。'LobbyForm.h': No such file or directory c:\users\********\documents\保存用\projects\lobbyformmain\lobbyformmain\mymain.cpp 2
LobbyForm.h(インクルードするヘッダーファイル)の場所
C:\Users\********\Documents\保存用\projects\LobbyFormLib
mymain.cpp(インクルードの宣言場所)の場所
C:\Users\********\Documents\保存用\projects\LobbyFormMain\LobbyFormMain
どの部分を直せばビルド可能になりますでしょうか?教えてください。
0365デフォルトの名無しさん
2010/04/09(金) 11:17:300366デフォルトの名無しさん
2010/04/09(金) 11:26:15できました、ありがとうございます!
0367デフォルトの名無しさん
2010/04/09(金) 14:32:0465536種類もポート番号があるならば、最初からプログラムごとにバラバラの番号を指定しておけばよいような気がします。
HTTPは80などと標準を作ることによるメリットとはなんでしょうか?
0368デフォルトの名無しさん
2010/04/09(金) 14:48:37例えば
IE は 80
FireFox は 81
Netscape は 82
Lynx は 83
Opera は 84
みたいにしたほうがいいって思ってるの?
0369デフォルトの名無しさん
2010/04/09(金) 14:52:29見なして通さない所があるからだよ
NNTPは119だっけ
0370デフォルトの名無しさん
2010/04/09(金) 16:16:25いいというか、大量に番号がある中でわざわざバッティングするようなことをしなくてもと思ってました。
>>369
そういった守り(?)の理由があるのですね、勉強になりました、ありがとうございます。
0371デフォルトの名無しさん
2010/04/09(金) 17:46:09予めどれを使うのかわかってなければ通信を成り立たせる事も出来ないだろうが
0372デフォルトの名無しさん
2010/04/09(金) 18:07:150373デフォルトの名無しさん
2010/04/09(金) 20:11:37double d = 0.0;
for (...);
{
d += DBL_EPSILON;
}
みたいなコードはそれを保証してくれるのでしょうか?
演算の誤差判定にしか使えないのでしょうか?
0374デフォルトの名無しさん
2010/04/09(金) 20:24:39等間隔でインクリメントということだよね?
そのコードは規格上では多分何も保証してくれてないけど、
IEEE754準拠の環境上ならそれでOK。
まぁdoubleでそれやると4500京回以上ループ回るが。
0375デフォルトの名無しさん
2010/04/09(金) 20:34:5052bit程度だからそんなに精度はないはず
0376デフォルトの名無しさん
2010/04/09(金) 20:44:07今時のCPUなら速いだろ
0377デフォルトの名無しさん
2010/04/09(金) 20:45:400378デフォルトの名無しさん
2010/04/09(金) 20:53:35DOS時代はリセットしかなかったからなあ
0379375
2010/04/09(金) 20:56:59おお、4500兆か。
億、兆、京と数えていたつもりだったんだが、万をすっかり忘れていた
0380デフォルトの名無しさん
2010/04/09(金) 20:57:190381デフォルトの名無しさん
2010/04/09(金) 21:17:14[0.0 - 1.0]
の間で常に
d + DBL_EPSILON > d
を満たせばいいということです。
できるみたいですね、ありがとうございます。
0382デフォルトの名無しさん
2010/04/09(金) 21:26:27むりっしょ
0383デフォルトの名無しさん
2010/04/09(金) 21:30:26必要ないなら整数最大値で整数を割った値を使う
0384デフォルトの名無しさん
2010/04/09(金) 21:50:05無理じゃねーだろ
0385デフォルトの名無しさん
2010/04/09(金) 22:14:580386デフォルトの名無しさん
2010/04/09(金) 22:21:41定義は
1.0+DBL_EPSILON > 1.0
が成り立つ最小の数値だから大丈夫
0387デフォルトの名無しさん
2010/04/09(金) 22:38:03struct foo {
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;
foo() : hprocess(GetCurrentProcess()), oldclass(GetPriorityClass(hprocess)) {
Sleep(10);
// SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
}
~foo() {
QueryPerformanceCounter((LARGE_INTEGER*)&end);
// SetPriorityClass(hprocess, oldclass);
std::cout << (int)(end - start) << std::endl;
}
};
int main()
{
{
std::cout << "test1 : ";
foo f;
double d = 0.0;
while (true) {
d += std::numeric_limits<double>::epsilon();
if (d > 1e-7)
break;
}
}
}
0388デフォルトの名無しさん
2010/04/10(土) 00:40:590389デフォルトの名無しさん
2010/04/10(土) 00:42:510390デフォルトの名無しさん
2010/04/10(土) 10:24:51VBだとデフォルトでそうなっているので、同じようにしたいのです
0391デフォルトの名無しさん
2010/04/10(土) 13:53:28普通に改行だけでちゃんと続きのインデントになってるぜ?
VB(6/.NET)がどうなのかは知らないが
0392デフォルトの名無しさん
2010/04/10(土) 14:01:12VBで↓を入力すると、強制的にこの形になるんです。二行目にタブを余分に入れても、タブを消してもこの形に戻ります
ある程度コードを書いてから、全体をifやforで括りたくなったときに威力絶大です
そういった機能は無いでしょうか?
Class tex
Inherits TextBox
Sub New()
Text = 123
End Sub
End Class
0393デフォルトの名無しさん
2010/04/10(土) 14:21:27範囲選択して Ctrl+K, Ctrl+F くらいしかできないな
0394デフォルトの名無しさん
2010/04/10(土) 14:28:30ショートカットキー使わせてもらいます
0395デフォルトの名無しさん
2010/04/10(土) 14:30:37一気に生理できました!すごく見やすいです。感激です。
0396デフォルトの名無しさん
2010/04/10(土) 19:12:42初潮迎えたのか
0397デフォルトの名無しさん
2010/04/10(土) 21:57:01俺が思っても言わなかったことを・・・
0398デフォルトの名無しさん
2010/04/10(土) 22:47:07初潮の年齢は幅があるだろうが普通は10〜14歳だから、
その年齢でそれだけのプログラミングをする女って
すげぇ優秀だな
0399デフォルトの名無しさん
2010/04/10(土) 22:54:050400デフォルトの名無しさん
2010/04/10(土) 22:57:47ところまではあっているだろうが。。。
0401デフォルトの名無しさん
2010/04/11(日) 10:25:37原因分かる人がいたら教えて下さい。
#include <cstdio>
#include <windows.h>
int main()
{
return 0;
}
0402デフォルトの名無しさん
2010/04/11(日) 11:14:410403401
2010/04/11(日) 11:20:36エラーメッセージです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10567.txt
0404デフォルトの名無しさん
2010/04/11(日) 11:46:47#include <windows.h>
#include <cstdio>
int main()
{
return 0;
}
0405デフォルトの名無しさん
2010/04/11(日) 11:50:17ああそれBCC5.5.1が古すぎてインクルードの前後関係で
エラーが出てしまう奴だね
他にもRogueWaveのiostreamなどを使っていてバグはいくつか
知られているよ
0407デフォルトの名無しさん
2010/04/11(日) 13:07:33これはひどいなBCC
0408デフォルトの名無しさん
2010/04/11(日) 13:11:59Boostにも部分的にではありますが対応してます
吐くコードの質もかなり向上してます
でもVC9には全然叶いませんが
それからコンパイル速度が遅くなりましたね
0409デフォルトの名無しさん
2010/04/11(日) 13:46:00> 今BCCはEmbarcadero CC 6.2.1になってバグはほとんど取れ、
> Boostにも部分的にではありますが対応してます
ECC6.2.1とか無償で使えないんだよね?
BCC大好きっ子でもない限り、ECCに金を払ってみる気にならんし・・・。
はやくBCC5.5.1に取って代わってくれ。
0410デフォルトの名無しさん
2010/04/11(日) 13:47:220411デフォルトの名無しさん
2010/04/11(日) 14:12:26そんなことはない。
プロファイル使った最適化は使えないが、/O1、/O2くらいは使える。
0412デフォルトの名無しさん
2010/04/11(日) 14:29:16一体なんでそう思ったんだ
0413デフォルトの名無しさん
2010/04/11(日) 15:02:250414デフォルトの名無しさん
2010/04/11(日) 15:37:370415デフォルトの名無しさん
2010/04/11(日) 19:36:14いつも M-x fundamental-mode してる
0416デフォルトの名無しさん
2010/04/12(月) 13:36:17Directx+ライブラリ
http://homepage2.nifty.com/natupaji/DxLib/index.html
を使うか、
ODE
http://www.koj-m.sakura.ne.jp/ode/
を使うかどちらの方が楽でしょうか
ジャンプ等の移動関係は後者が有利そうで、描画に関しては前者が優れてそうなかんじなのですが
0417デフォルトの名無しさん
2010/04/12(月) 13:44:20そのODEって知らないけど、サイトの説明見た限りで言えば、
多分初心者が手を抜いて簡単にゲーム作る為の物じゃないと思うぜ。 そのライブラリの方言をどっさり覚えないといけないと思う。
単にシミュレーションなどのデモ作るには良さそうだけどね。 リアルタイムゲーム的な物向けじゃない気がする。
あと、質問内容から察してなんとなくDirectX自体良くわかってなさそうなんだけど(失礼)、
多分3Dアクションってあたりから、最終的にやらねばならないコーディング内容は、
DxLib でも DirectX直接でもあまり変わらないと思うので、どちらかと言えば DirectX 直接の方が
いろんな意味で楽で作業も早いかもしれない。
よく、初期化処理とか面倒で、みたいな事言う人もいるけど、あんなの定型処理なので意味さえわかってれば簡単だし、
メッシュモデルを移動や回転などさせる処理も単に行列用意してかけるだけ、みたいな簡易な関数も用意されてるので、
やってみれば意外にすんなりいけると思う。 そんな感じ
0418デフォルトの名無しさん
2010/04/12(月) 13:57:01ありがとうございます
実際よくdirectxは分かってないです・・
directxを直で書いてみます
0419デフォルトの名無しさん
2010/04/12(月) 14:10:550420デフォルトの名無しさん
2010/04/12(月) 15:14:530421デフォルトの名無しさん
2010/04/12(月) 15:47:42■ このスレッドは過去ログ倉庫に格納されています