【初心者歓迎】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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
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:420422デフォルトの名無しさん
2010/04/12(月) 15:53:36Windows環境で winver により 使える/使えない API を分岐して使いたい
→ (LoadLibrary) 〜 GetProcAddress の戻りで分岐
0423デフォルトの名無しさん
2010/04/12(月) 17:12:21そこまでいかないとわからないか・・・そりゃそうか
ある関数が定義されてなければ俺が定義する というコードを
書きたかったんだけど
0424デフォルトの名無しさん
2010/04/12(月) 17:16:35(.lib 中 と .obj中 に同じシンボル → .obj側優先でリンク: MSのリンカ)
0425デフォルトの名無しさん
2010/04/12(月) 17:23:23ちょっと難しいかも?
0426デフォルトの名無しさん
2010/04/12(月) 21:22:320427デフォルトの名無しさん
2010/04/13(火) 00:58:260428デフォルトの名無しさん
2010/04/13(火) 06:51:05と
noskipws
じゃダメなん?
0429デフォルトの名無しさん
2010/04/13(火) 11:13:13ios::binaryはどうやって設定するんでしょうか?
noskipwsなどはsetf()で設定できるけど、ios::binaryは書式フラグではないですよね。
0430デフォルトの名無しさん
2010/04/13(火) 15:25:31weakか。使えそうかも。
0431デフォルトの名無しさん
2010/04/13(火) 22:05:51環境はwindowsXPSP3 VC++2008です
const_castをうまく扱えません、助けてください
まずMeCabという形態素解析エンジンのライブラリを使おうと思いました。
ttp://mecab.sourceforge.net/libmecab.html
のC++ サンプルと言うものを使おうと思ったのですが、エラーが出ます
ライブラリ自体は
ttp://jaist.dl.sourceforge.net/project/mecab/mecab-win32/0.98/mecab-0.98.exe
で解凍したMeCab\sdkの中にあります
とりあえず
#include <mecab.h> を
#include "mecab.h" に直しました
すると別のエラーがでまして
1>d:\mecab\main.cpp(30) : error C2440: '初期化中' : 'const MeCab::Node *' から 'MeCab::Node *' に変換できません。
1> 変換で修飾子が失われます。
1>d:\mecab\main.cpp(36) : error C2440: '=' : 'const MeCab::Node *' から 'MeCab::Node *' に変換できません。
とでまして、const_castと言うものを使えば解決出来そうな感じなのですが、使い方がよくわかりません
どうすればいいんでしょうか
30行目は以下のようになっています。よろしくお願いします
MeCab::Node* node = tagger->parseToNode(input);
0432デフォルトの名無しさん
2010/04/13(火) 23:07:53open時
0433デフォルトの名無しさん
2010/04/13(火) 23:18:46そのドキュメントを信じるならMeCab::parseToNode()はMeCab::Node*を返すのでそんなエラーは出ない
場当たり的1
MeCab::Node const * node = tagger->parseToNode(input);
場当たり的2
MeCab::Node* node = const_cast<MeCab::Node*>(tagger->parseToNode(input));
もしかして:
MeCab::Tagger *tagger = MeCab::createTagger (argc, argv);
の行にconstをつけてしまっている
または
サンプルがそもそも間違っている
0434デフォルトの名無しさん
2010/04/14(水) 01:37:17cin, coutは既にオープンされてると思うんですが
オープンし直す方法があるんですか?
0435デフォルトの名無しさん
2010/04/14(水) 01:43:220436デフォルトの名無しさん
2010/04/14(水) 01:47:370437デフォルトの名無しさん
2010/04/14(水) 02:31:33ありがとうございます。処理系依存になっちゃうんですね。
Windowsだと_setmode()を使えばバイナリモードにできるみたいでした。
0438デフォルトの名無しさん
2010/04/14(水) 07:54:09やっぱりエラーでてしまいます><
もう作者に聞いてみます。ありがとうございました!
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) char const * __cdecl MeCab::getTaggerError(void)" (__imp_?getTaggerError@MeCab@@YAPBDXZ) が関数 _main で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) class MeCab::Tagger * __cdecl MeCab::createTagger(int,char * *)" (__imp_?createTagger@MeCab@@YAPAVTagger@1@HPAPAD@Z) が関数 _main で参照されました。
1>D:\mecab\Debug\mecab.exe : fatal error LNK1120: 外部参照 2 が未解決です。
■ このスレッドは過去ログ倉庫に格納されています