【初心者歓迎】C/C++室 Ver.67【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/07/19(日) 02:25:58ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.66【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1243440528/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2009/07/19(日) 02:37:281.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
0003デフォルトの名無しさん
2009/07/19(日) 09:24:230004デフォルトの名無しさん
2009/07/19(日) 09:30:120005デフォルトの名無しさん
2009/07/19(日) 09:31:19ERROR:長すぎる行があります!
0006デフォルトの名無しさん
2009/07/19(日) 09:32:45ERROR:>>1-5>>7-1000はゴミです!!
0007デフォルトの名無しさん
2009/07/19(日) 11:01:080008デフォルトの名無しさん
2009/07/19(日) 11:15:120009デフォルトの名無しさん
2009/07/19(日) 17:56:120010デフォルトの名無しさん
2009/07/19(日) 21:51:16速さ:std < tr1
メモリ節約:tr1 < std
でおk?
0011デフォルトの名無しさん
2009/07/19(日) 22:08:40あー、一般論としてはそんな感じになると思う
0012デフォルトの名無しさん
2009/07/20(月) 23:31:44public:
CardSet() {make();};
//CardSet() {};
void make() {};
};
class Player {
public:
Player(){};
~Player();
};
class SubPlayer : public Player {
public:
CardSet a;
SubPlayer() {};
};
main(){
Player * a = new SubPlayer();
}
このプログラムをg++ 3.4.3 32bit Linuxでコンパイルすると、
In function `SubPlayer::SubPlayer()':
undefined reference to `Player::~Player()'
というエラーになります。しかし、CardSetのコンストラクタを
コメントアウトしている方に切り替えると、エラーなくコンパイルできます。
~Player()を定義すれば済む話ですが、なぜこのような違いが起こるのでしょうか?
0013デフォルトの名無しさん
2009/07/20(月) 23:45:15掛けたらオーバーフローになってしまうのでどうしたらいいのかわかりません
今は片方を普通の小数にしてやっちゃってますが意味がない気がするし
整数と小数をわけて乗算するしかないのでしょうか
それだとあまり意味がないのでしょうか
0014デフォルトの名無しさん
2009/07/21(火) 00:18:4632bit×32bitは64bitになる。これあたりまえの話ね。
だからアセンブリ言語では大抵、整数乗算命令は上半分と下半分を別々に取得することが出来るようになっている。
C言語の枠内では(__asmとかintrinisic関数とか使わない限り)効率的な方法は存在しない。
シフトしながら足し算していこうかな、とか
32bitを16bit+16bitに分割して4回掛け算をやろうかな、程度。
0015デフォルトの名無しさん
2009/07/21(火) 00:39:21もう1つある。最適化を期待するんだ。
int32_t x, y;
int64_t z;
という状況で、VCは最適化ありにすればz = (int64_t)x * y;をimul(32 bit * 32 bitの結果を64 bitで返す)1つにしてくれる。
よそのコンパイラもこれくらいやってくれるだろう。
ところで、>>13は固定小数点数同士を掛けた後、右シフトしていないだけのような気がする。
小数部Nビットの固定小数点数同士を掛けると、小数部が2Nビットの固定小数点数になるから、
小数部Nビットで結果が欲しいなら、Nビット右シフトが必要だぞ。
0016デフォルトの名無しさん
2009/07/21(火) 01:04:17そういえばアセンブラとかだと二つのレジスタに入ったりしましたね
シフトは忘れていなかったんですが
掛けた時点で内部では32bitのままなのかなって思ったりしました
vc使ってるんですが64bit整数の型名知らないですが
((int64)a * b)>>16 こんな感じに出来るのでしょうか
0017デフォルトの名無しさん
2009/07/21(火) 01:13:54long longも使えた気がする。
0018デフォルトの名無しさん
2009/07/21(火) 01:25:52ありがとうございました!
0019デフォルトの名無しさん
2009/07/21(火) 02:42:29SubPlayer の生成中に、まず基底クラスである Player の構築が完了する、その後
メンバ変数である CardSet の構築が行われるが、この中の make() から例外が発生した場合、
すでに構築が完了した基底クラスを解体するため Player のデストラクタが呼ばれる。
CardSet のコンストラクタが空であれば、この途中で例外が発生しないことがコンパイラに
わかるので、 SubPlayer のコンストラクタで Player のデストラクタが必要になるフローがなくなる。
0020デフォルトの名無しさん
2009/07/21(火) 20:03:05ありがとうございます。
そのような理由があったのですね。すっきりしました。
0021デフォルトの名無しさん
2009/07/21(火) 21:12:24完全に今から始める初心者なんですが、USB機器の例えばゲームパッド等からの入力を
例えば1のボタンを押したらキーボードのAに対応させるみたいに外部機器をキーボードの代わりにする
みたいなことをしたいんですけどこういったのがこう言うのを作るのは難しいですか?
それとこう言う物を作れるようになるための勉強の方法って猫でも分かる〜や、ゲームの作り方関係の本でも大丈夫でしょうか
0022デフォルトの名無しさん
2009/07/21(火) 21:45:10OS上の動作全般に渡ってキーボード代わりとして使いたいのなら、
デバイスドライバを作成する必要がある。
Windowsの場合は、WDKでググれ。ただしほぼ断言していいが、初心者には無理。
自分のアプリだけでそうしたいのなら、ゲームパッドの入力ができればあとは簡単でしょ。
0023デフォルトの名無しさん
2009/07/21(火) 21:54:44自分のアプリだけでって言うのは例えば自分の作ったゲーム内でのみ対応できる 見たいな感じでしょうか?
普通のキーボードじゃなくて別のものをキーボードにしたいんですよ
となるとデバイスドライバ云々って言う難しいほうになるのかな
そう言うのを作るにはどういった勉強したらいいか何か教本的な物ってありますか?
0024デフォルトの名無しさん
2009/07/21(火) 22:03:050025デフォルトの名無しさん
2009/07/21(火) 22:36:52> 自分のアプリだけでって言うのは例えば自分の作ったゲーム内でのみ対応できる 見たいな感じでしょうか?
そのとおり。それでいいのなら別に難しいことではない。
キーボードだろうがキーボードじゃないものだろうが、そこはあまり関係ない。
0026デフォルトの名無しさん
2009/07/21(火) 22:37:310027デフォルトの名無しさん
2009/07/22(水) 01:39:03それはつまり
>九九が分からないんですけど大学入試数学のいい参考書はありますか?
みたいなことを言ってるってことをとりあえず理解してね。
その上で九九から始める覚悟があるなら、
とりあえず「C言語の入門書」でも探してみればいいんじゃないかな
0028デフォルトの名無しさん
2009/07/22(水) 14:20:26なんてことありますか?
0029デフォルトの名無しさん
2009/07/22(水) 14:21:330030デフォルトの名無しさん
2009/07/22(水) 14:23:250031デフォルトの名無しさん
2009/07/22(水) 14:23:43確実に呼ばせるにはmainでcatch(...)するしかない?
0032デフォルトの名無しさん
2009/07/22(水) 14:26:080033デフォルトの名無しさん
2009/07/22(水) 14:26:420034デフォルトの名無しさん
2009/07/22(水) 14:34:36さすがにそれは保証外で
>>29
なんかソースあったら教えて下さい
デストラクタは例外投げられたときも呼ばれるという話ばかり見てきた気がする
0035デフォルトの名無しさん
2009/07/22(水) 14:36:45throw -1;
0036デフォルトの名無しさん
2009/07/22(水) 14:41:450037デフォルトの名無しさん
2009/07/22(水) 14:46:420038デフォルトの名無しさん
2009/07/22(水) 16:37:58int a(0), b(1);
int& r(a);
r=b; // aにbを代入ではなく、rにbの参照を渡したい
0039デフォルトの名無しさん
2009/07/22(水) 16:57:03無理
0040デフォルトの名無しさん
2009/07/22(水) 17:00:140041デフォルトの名無しさん
2009/07/22(水) 17:02:49専属の教師じゃねーんだぞ
0042デフォルトの名無しさん
2009/07/22(水) 21:01:150043デフォルトの名無しさん
2009/07/22(水) 22:14:37templateでもその利点はあると思う。
0044デフォルトの名無しさん
2009/07/23(木) 15:47:36連結リストでしょ?
0045デフォルトの名無しさん
2009/07/23(木) 15:54:57両端を連結した循環リストは、線形リストでないっぽい
0046デフォルトの名無しさん
2009/07/23(木) 15:58:59これに一方向だけでなく戻りもOKにしたのが双方向リスト
ループするのが循環リスト
これらの総称が連結リストでいいんでないの?
0047デフォルトの名無しさん
2009/07/23(木) 18:44:55一定間隔で処理する方法で困っています。
無限ループを作ってtimeGetTime()を使って時間待ちをして行っていますが、
GUIからのボタン操作を受け付けることができなくなってしまいました。
GUIのボタンを押して無限ループから抜けるためにはどうすればよいでしょうか?
よろしくお願いします。
もしくは、もっとよい方法がありますか?
0048デフォルトの名無しさん
2009/07/23(木) 18:47:160049デフォルトの名無しさん
2009/07/23(木) 18:50:17PeekMessage+GetMessage
005047
2009/07/23(木) 19:24:04>>48
タイマを使ってみたのですけど、
たとえば50ms周期で処理しようとすると60ms近辺が周期になって
しかも、40msとか70msとかばらつきも大きくてこれは使えないなぁと。
タイマの精度は1msだとwebで見たことありますが実際どうなんでしょう?
>>49
GetMessageを使えないかと思って、WINAPI関数の中の
GetMessageのところでブレークポイント設定したのですけど
ブレークできなくて、なぜなのかよく分かりませんでした。
ブレークできないなんてことあるんでしょうか?
while (GetMessage(&msg, NULL, 0, 0)) {
→ TranslateMessage(&msg);
DispatchMessage(&msg);
}
上の→のところでブレークしようとしたのですが・・・。
47の内容とは直接関係ないですけど、なぜなのだろうと思いまして。
0051デフォルトの名無しさん
2009/07/23(木) 19:29:080052デフォルトの名無しさん
2009/07/23(木) 19:36:14ソート、検索、削除方法
0053デフォルトの名無しさん
2009/07/23(木) 20:31:38作成方法、木同士のマージ
0054デフォルトの名無しさん
2009/07/23(木) 20:35:50平衡化
0055デフォルトの名無しさん
2009/07/24(金) 00:36:230056デフォルトの名無しさん
2009/07/24(金) 00:43:55平衡木なら回転は普通に出るだろ
005747
2009/07/24(金) 11:50:59GUIのボタン処理を受け取ろうと思ってやってみましたが、
GUIが固まってしまってボタンを押すことができませんでした。
どうすればよいでしょうか?
0058デフォルトの名無しさん
2009/07/24(金) 11:52:280059デフォルトの名無しさん
2009/07/24(金) 11:56:120060デフォルトの名無しさん
2009/07/24(金) 12:00:07・メッセージループでPeekMessageを使って、メッセージがない時に処理を実行して、適度に眠らせる
のどちらか
006147
2009/07/24(金) 12:05:37BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDOK: // 「OK」ボタンが選択された
g_hDlg2 = CreateDialog( g_hInst2, _T("IDD_DIALOG2"), hDlg, DlgProc2 );
ShowWindow( g_hDlg2, SW_SHOW );
loop_flg = 1;
while(loop_flg){
if (PeekMessage (&msg_roop,g_hDlg2,0,0,PM_NOREMOVE)) {
ret =GetMessage (&msg_roop,g_hDlg2,0,0);
if(msg_roop.message == WM_COMMAND ){
if(msg_roop.wParam ==IDCANCEL) {
TranslateMessage(&msg_roop);
DispatchMessage(&msg_roop);
}}}
counter++;
}
case IDCANCEL: // 「キャンセル」ボタンが選択された
EndDialog( hDlg, 0 );
break;
}}}
0062デフォルトの名無しさん
2009/07/24(金) 12:06:51006347
2009/07/24(金) 12:16:15BOOL CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDCANCEL: // 「キャンセル」ボタンが選択された
// ダイアログボックスを消す
loop_flg = 0;
EndDialog( hDlg2, 0 );
fclose(fp);
break;
}}}
006447
2009/07/24(金) 12:23:55ありがとうございます。
具体的にはどうすればよいのでしょう?
0065デフォルトの名無しさん
2009/07/24(金) 12:26:59・メッセージループでPeekMessageを使って、メッセージがない時に処理を実行して、適度に眠らせる
の亜種
MegWaitForMultipleObjectsEx で シグナルにならないダミーのハンドルを引数に渡す
# array が NULL で 個数0 の場合意図した動き(timeout付き GetMessage もどき)になるんだっけ?
0066デフォルトの名無しさん
2009/07/24(金) 12:27:55TranslateMessageやDispatchMessageするメッセージをWM_COMMAND/IDCANCELだけにするのをやめればよい
0067デフォルトの名無しさん
2009/07/24(金) 12:28:03○ MsgWaitForMultipleObjectsEx
006847
2009/07/24(金) 18:23:51きちんと動作するようになりました。ありがとうございます。
どうして条件を指定すると動かなくなるのでしょう?
0069デフォルトの名無しさん
2009/07/24(金) 18:33:360070デフォルトの名無しさん
2009/07/24(金) 18:59:22ウィンドウズのメッセージキューはスレッドに結びついてるんだ。
ある1つのスレッドが作ったウィンドウのメッセージは皆同じメッセージキューに入るんだ。
だからそのスレッドがほんの一部だけのメッセージしか処理しない状態だと、
その処理するメッセージ以外のGUI動作をしなくなる。
てのはC/C++でのウィンドウズプログラミングの基本なんだ。
猫でも〜辺りを一通りやった方がいい。
0071hey
2009/07/24(金) 19:03:31007247
2009/07/24(金) 21:17:11キューの中にあるなら取り出さないとたまるばかりだということですか。
猫でものプログラムをvisual studio 2008 expressでコンパイルしようとしたら
よく分からないエラーが出て、挫折しました。
今は下のをやってますが、GUIを作るのに他のソフトを使いながらなので面倒です。
ttp://www.geocities.jp/ky_webid/win32c/index.html
0073デフォルトの名無しさん
2009/07/24(金) 22:51:350074デフォルトの名無しさん
2009/07/24(金) 23:00:020075デフォルトの名無しさん
2009/07/24(金) 23:41:06CLI やマネージドメモリ周りは独特だけど、それ以外は普通の C++。
この記事を見ると感触が掴みやすいかも。
C++/CLIによるCライブラリの.NET化
http://codezine.jp/article/detail/1382?p=1
C/C++ の学習用途としては、あまりお勧めできない。
0076デフォルトの名無しさん
2009/07/24(金) 23:44:34学習用途としては向かないんですね
ありがとうございました
0077デフォルトの名無しさん
2009/07/25(土) 11:23:14この版に単独スレのあるGUIフレームワークは、Qt、wxWidgets、WideStudioかな。
0078デフォルトの名無しさん
2009/07/25(土) 11:33:550079デフォルトの名無しさん
2009/07/25(土) 11:42:20フレームワークにはレイアウトを管理するクラスがあるからRADツール使わなくても慣れると簡単。
逆に画面デザイナを使うのが面倒になる。
0080デフォルトの名無しさん
2009/07/25(土) 12:24:03なんでこんな構文にしたんだろう。
0081デフォルトの名無しさん
2009/07/25(土) 12:25:21たとえば?
0082デフォルトの名無しさん
2009/07/25(土) 12:44:09とかぱっと見ようわからん
typedefなしでもきれいに書ける仕様にすればよかったのに
0083デフォルトの名無しさん
2009/07/25(土) 13:30:290084デフォルトの名無しさん
2009/07/25(土) 13:32:170085デフォルトの名無しさん
2009/07/25(土) 14:44:58でもそんなに複雑かね
int foo(int x, int y, int z) {
return x + y + z;
}
int (*p)(int, int, int) = foo;
こんだけだが
0086デフォルトの名無しさん
2009/07/25(土) 14:48:210087デフォルトの名無しさん
2009/07/25(土) 14:49:22これなら型が前に全部来てるからわかりやすいな
この間もこっちで同じような感じのがあった
C言語なら俺に聞け(入門篇) Part 50
http://pc12.2ch.net/test/read.cgi/tech/1246342847/
最初の疑問はこれで
http://pc12.2ch.net/test/read.cgi/tech/1246342847/895
いろいろあったけど結論というかこうだとよかったねというので
http://pc12.2ch.net/test/read.cgi/tech/1246342847/903
0088デフォルトの名無しさん
2009/07/25(土) 14:52:14型の一部が分離しちゃうんだよね
0089デフォルトの名無しさん
2009/07/25(土) 14:57:250090デフォルトの名無しさん
2009/07/25(土) 15:08:24foo(*(*bar)(baz, hoge))(fuga)(piyo);
baz型、hoge型の2引数をとり、(fuga型を引数をとり、foo型を返す関数ポインタ型)を返す関数ポインタ型の変数barを定義して同じ型のpiyoで初期化する
わかりにくいな
foo(fuga)(baz, hoge) bar = piyo;
とか書ければ楽なんだけど・・・なんでこんな複雑な構文にしたのかわからん
0091デフォルトの名無しさん
2009/07/25(土) 15:27:45はずの言語でこんななの?と思ったのが? :の式
0092デフォルトの名無しさん
2009/07/25(土) 15:33:06?:を使わずに書いてください。
0093デフォルトの名無しさん
2009/07/25(土) 15:37:21boost::function を使うと簡単になるよ。
#include <boost/function.hpp>
using boost::function;
class foo{};
class baz{};
class hoge{};
class fuga{};
foo piyopiyo(fuga a)
{
return foo();
}
function<foo(fuga)> piyo(baz a,hoge b)
{
return &piyopiyo;
}
int _tmain(int argc, _TCHAR* argv[])
{
function<function<foo(fuga)>(baz,hoge)> bar=&piyo;
function<foo(fuga)> k=bar(baz(),hoge());
k(fuga());
return 0;
}
0094デフォルトの名無しさん
2009/07/25(土) 15:38:150095デフォルトの名無しさん
2009/07/25(土) 15:39:23C/C++が混在してるなw
0096デフォルトの名無しさん
2009/07/25(土) 15:42:070097デフォルトの名無しさん
2009/07/25(土) 19:17:370098デフォルトの名無しさん
2009/07/25(土) 19:41:55どうすればいいか教えてください。
(ヘッダファイル内)
class String;
class A {
//...
private:
String* m_Name;
}
Aというクラスがあり、メンバーとしてString*を持たせるときは、上記のように
class String;と書けばコンパイルが通ります。
もし、Stringが名前空間MyLibの中で定義されているときは、どのようにすればいいのでしょうか。
#include "String.h"
とヘッダをインクルードするしかないのでしょうか。
0099デフォルトの名無しさん
2009/07/25(土) 19:45:52class String;
}
0100デフォルトの名無しさん
2009/07/25(土) 19:47:12//...
private:
MyLib::String* m_Name;
}
0101デフォルトの名無しさん
2009/07/25(土) 19:51:40010298
2009/07/25(土) 20:51:57ありがとうございます。
コンパイルが通りました。
0103デフォルトの名無しさん
2009/07/25(土) 21:57:53http://namidame.2ch.net/test/read.cgi/hidari/1225537555/
0104デフォルトの名無しさん
2009/07/26(日) 02:48:52スライドを画像にして読み込むにはVBAと連携させるしかないんでしょうか?
0105デフォルトの名無しさん
2009/07/26(日) 03:01:31http://www.google.co.jp/search?q=ppt+c%2B%2B+com
0106104
2009/07/26(日) 17:00:08今検索結果と同じようにVBAと連携させています。
pptのスライド画像はpowerpoint起動時に組み立てているようなので
やはりVBAと連携が必須でしょうか?
後office2003,2007どちかが入っていれば動作するという動きにできるのでしょうか?
0107デフォルトの名無しさん
2009/07/26(日) 17:10:310108デフォルトの名無しさん
2009/07/26(日) 17:48:42#include <windows.h>
int main(void)
{
FILE *fp;
char str[128];
fp = fopen("data.txt","r");
if (fp == NULL)
{
printf("data.txtが読み込めませんでした");
exit(1);
}
fclose(fp);
fscanf(fp, "%s", str);
printf("%s\n", str);
return 0;
}
このように記述したのですがdata.txtの中身を正常に読み取れず、文字化けして出力されます。
data.txtの中身に何が書かれていようが、どうやら同じ意味不明な文字列が表示されるようです。
原因が掴めないのですが、どなたかご教示ください。
0109デフォルトの名無しさん
2009/07/26(日) 17:55:06そのままだとファイルを正常にオープンできたとしてもすぐに閉じちゃってるよ
0110109
2009/07/26(日) 17:55:48#include <stdio.h>
#include <windows.h>
int main(void)
{
FILE *fp;
char str[128];
fp = fopen("data.txt","r");
if (fp == NULL)
{
printf("data.txtが読み込めませんでした");
exit(1);
}
fscanf(fp, "%s", str);
fclose(fp);
printf("%s\n", str);
return 0;
}
0111デフォルトの名無しさん
2009/07/26(日) 18:13:58fopenした直後にfclose書いた方が忘れずに済むと思ったのですが、それではまずかったようですね…
正常に動作させることができました。
どうもありがとうございました。
0112デフォルトの名無しさん
2009/07/26(日) 20:36:130113デフォルトの名無しさん
2009/07/26(日) 20:50:58おもしろい。
最初から開かなければ、絶対に忘れずに済むんだけど
そこまでは行かなかったのね。
で、一応まともなアドバイスだけど
fscanf(に限らずscanf系全て)は、必ず戻り値を確認するようにすべきだぞ。
そうしないと、入力が正常じゃなかった時にゴミが入っている。>>108のように。
0114104
2009/07/26(日) 22:21:29公開はされているようですがスライドを画像にすることはできないかと・・・
officeどちらかがインストールされていれば動くようにはできないのでしょうか?
0115デフォルトの名無しさん
2009/07/26(日) 22:28:22まぁ手間だろうからあんまりやりたくないんだろうけど。
0116デフォルトの名無しさん
2009/07/26(日) 22:41:35あなたに出来るかどうかは別として。
0117デフォルトの名無しさん
2009/07/26(日) 22:44:52だったらそれをC++に書き換えるだけ。
#importなりなんなりすれば、VBAで使われるオブジェクトモデル
(メソッド・プロパティ・型名・定数など)はほぼそのままC++でも使用可能。
g++とかのタイプライブラリ読み込みの#importが使えない処理系なら話はもう少し面倒だけど。
0118104
2009/07/26(日) 22:58:30C++から呼び出して出力できるようにはなっています
officeのバージョンが違っても同じように動作してほしかったんです
OLEオートメーションでもう少し調べてみます
ありがとうございました
0119デフォルトの名無しさん
2009/07/26(日) 23:09:11ヘッダ+2次元配列だから
0120デフォルトの名無しさん
2009/07/26(日) 23:16:58画像にするのは簡単だよ。名前を付けて保存をすればいい。
PowerPointではBMPやEMF、あるいはJPEG、PNGなんかで保存できる。
それをVBAやC++で呼び出すだけ。
バージョンを問わず動くようにするには、オブジェクト作成時にバージョン指定せず、
その後も遅延バインドにする。
VBAではObject型、C++ではIDispatchPtr (IDispatch)を使う。2つは同じ。
IDispatchを直接叩くのはやや面倒だろうが、
これくらいなら適当にラップすればなんとかなるだろう。
0121デフォルトの名無しさん
2009/07/27(月) 05:20:220122デフォルトの名無しさん
2009/07/27(月) 05:31:160123デフォルトの名無しさん
2009/07/27(月) 06:26:52そいつは無理だ
知っての通り条件式は短絡評価をしているが
XOR条件を実現するには短絡評価を捨てなければならない
0124デフォルトの名無しさん
2009/07/27(月) 06:32:19i = cond1;
j = cond2;
i ^ j;
この例を見てもわかるようにXOR条件は短絡評価ではなく
両者のブール値を必ず評価しなければならない
0125デフォルトの名無しさん
2009/07/27(月) 07:44:490126デフォルトの名無しさん
2009/07/27(月) 09:47:520127デフォルトの名無しさん
2009/07/27(月) 13:44:55それだとcond1が二回評価されてしまうから>124とは違ってしまう。
0128デフォルトの名無しさん
2009/07/27(月) 14:47:080129デフォルトの名無しさん
2009/07/27(月) 21:56:16レスありがとうございます。
わからない単語だらけですがぐぐってがんばります
0130デフォルトの名無しさん
2009/07/28(火) 22:13:000131デフォルトの名無しさん
2009/07/28(火) 22:20:280132デフォルトの名無しさん
2009/07/28(火) 22:34:40ここのサンプリングのところに書いてあることは本当ですか?
シャノンの定理では20kHzを再現するのには倍の40kHzのサンプリングで
足りることになっています。 しかし、これが可能なのはごく限られた場合であって、
「20kHzを再現できる」場合もあると理解したほうが自然です。
という記述です
0133デフォルトの名無しさん
2009/07/28(火) 22:40:040134デフォルトの名無しさん
2009/07/28(火) 22:48:45最大で1/(40000*2)秒ずれうるから、元の音が再現できてるとは言えないって言ってるのかなぁ
0135デフォルトの名無しさん
2009/07/28(火) 22:50:41単純に倍だとタイミングがあってればいいけど合わない場合は元の音にはならないね
倍より大目のサンプリングが無いと
0136デフォルトの名無しさん
2009/07/28(火) 23:51:52振幅が一定の永遠に続く20KHzのサイン波なら40kHzのサンプリングで再現できる。
20KHzの信号でも、ひずんでいたり振幅が変わったり変動する場合は20KHz以上の
成分が含まれているから、40KHzのサンプリングでは再現できない。
例えば大まかにでも波形を再現するには3倍以上の周波数成分が欲しいかな。
すると120KHz以上でサンプリングする必要がある。
もっと正確に再現するにはもっと高いサンプリング周波数が必要になる。
0137デフォルトの名無しさん
2009/07/29(水) 00:49:33と言っているのであって、サンプリングできるなんて一言も言ってない。
0138デフォルトの名無しさん
2009/07/29(水) 00:53:560139デフォルトの名無しさん
2009/07/29(水) 00:58:110140デフォルトの名無しさん
2009/07/29(水) 01:00:30この辺とか
0141デフォルトの名無しさん
2009/07/29(水) 02:06:040のところでサンプリングしたら無音になっちゃったりするの?
0142デフォルトの名無しさん
2009/07/29(水) 02:12:10だからサンプリングする場合はオーバーサンプリング気味にして丁度いいくらい
0143デフォルトの名無しさん
2009/07/29(水) 02:13:010144デフォルトの名無しさん
2009/07/29(水) 02:16:37そりゃ量子化の段階でカクカクになってるしねw
しかもサンプリングレート次第ではさらに飛び飛びだし
0145デフォルトの名無しさん
2009/07/29(水) 02:19:090146デフォルトの名無しさん
2009/07/29(水) 02:20:21大変すなぁ
0147デフォルトの名無しさん
2009/07/29(水) 04:51:47大丈夫、大抵の人はそのモアレを聞き取れない。
0148デフォルトの名無しさん
2009/07/29(水) 10:05:53聞き取れないはずの高調波がサンプリングによって
可聴範囲のノイズとして現れることはあるんじゃね?
非常に高い周波数だけど、サンプリング点を繋げるとゆ
るやかなサインカーブ、という嘘データは作れそうだし。
0149デフォルトの名無しさん
2009/07/29(水) 12:17:52まてや。
20kHzの振幅が変動する波は20kHzより高い周波数成分を含んどるやんけ。
サンプリング定理は、その含んでいる最高の周波数成分の2倍でサンプリングしろということじゃ
0150デフォルトの名無しさん
2009/07/29(水) 13:47:18それいっちゃったらカクカクについても聞き取れないから大丈夫ってことになっちゃうし
0151デフォルトの名無しさん
2009/07/29(水) 14:32:55public
typedef bool Bool;
public:
Bool fuga();
};
Bool hoge::fuga() {return true;}
これって普通コンパイルできないと思うんですが
なんかできてしまうことがある・・・これはvc++が変だからでしょうかね?
バグなのかな・・・?
0152デフォルトの名無しさん
2009/07/29(水) 14:40:34それでコンパイル通るんだったら根本的に壊れてるんだと思うが?
0153デフォルトの名無しさん
2009/07/29(水) 14:46:43#include <iostream>
namespace hoge {
    class hoge {
    public:
        typedef bool Bool;
    public:
        Bool foo();
        Bool bar();
    };
}
namespace hoge {
    hoge::Bool hoge::foo() try {return true;} catch(...) {}
    Bool hoge::bar() {return true;} // <- !
}
int main() {
    hoge::hoge h;
    if(h.foo()) std::cout << "foo" << std::endl;
    if(h.bar()) std::cout << "bar" << std::endl;
    return 0;
}
0154デフォルトの名無しさん
2009/07/29(水) 17:41:30そりゃ通るんじゃね。
>>151がなぜ通らないか理解できてますか。
0155デフォルトの名無しさん
2009/07/29(水) 17:46:26::hoge::hoge::Boolではなくて
0156デフォルトの名無しさん
2009/07/29(水) 22:02:36ちなみにこれをコメントアウトするとコンパイルできなくなります
>>154
Boolはhogeの中限定なのでhoge::Boolにしないと外からは見えないからですよね?
>>155
そうです
hoge::Boolは外からは見ると存在しないはずなのに・・・
0157デフォルトの名無しさん
2009/07/29(水) 22:41:22手段が考えられますが、どちらの方が一般的なのでしょうか。
あるいはどちらの方が負担の軽い処理となるのでしょうか。
0158デフォルトの名無しさん
2009/07/29(水) 22:45:02サブクラス化してオーナードローすればいいんじゃね?
0159デフォルトの名無しさん
2009/07/29(水) 22:48:570160デフォルトの名無しさん
2009/07/29(水) 23:13:43hoge内の他にグローバルでtypedef bool Bool;されてたり
0161デフォルトの名無しさん
2009/07/29(水) 23:33:10こちらでもVC++EE2008で試して、通ることを確認した。
function-try-blockの直後は、まだclass hogeのスコープが残ってしまっている雰囲気だね。
他にも、コンストラクタのfunction-try-blockのcatch内でreturnしてもコンパイルエラーにならないし…。
この辺、VCは何かおかしい。
>>160
それは無かった。
0162デフォルトの名無しさん
2009/07/30(木) 01:08:44きらめく光俺〜を〜うつ♪
か。 ちょっと一瞬判らなかったよ。
0163デフォルトの名無しさん
2009/07/30(木) 02:21:490164デフォルトの名無しさん
2009/07/30(木) 15:00:20ダンバインか
0165デフォルトの名無しさん
2009/07/30(木) 20:55:09waitを呼び出したとき、for文で無限ループになります。
現状自分で確認できたのは次の通りです。
1.timer_procは1秒毎に呼び出されている(LEDの点灯/消灯コードをいれて確認)
2.wait内のfor文の前でLED点灯のコードを入れ、LEDが点灯できた
3.wait内のfor文の後でLED点灯のコードを入れ、LEDが点灯されない
変数の宣言と定義などで何か勘違いしていてtimer値がおかしい結果になってると
思うのですが、どう修正すればいいか教えてください。
ソースはこんな感じです。
----- a.c -----
#include "a.h"
int timer;
/* 1秒に1回割り込みで呼び出される */
void timer_proc(void)
{
if (timer > 0) timer--;
}
----- a.h -----
extern int timer;
----- b.c -----
#include "a.h"
void wait(void)
{
for (timer = 10; timer; ) ;
}
0166デフォルトの名無しさん
2009/07/30(木) 21:01:270167デフォルトの名無しさん
2009/07/30(木) 21:01:32処理系がわからんからエスパーするけど
forのなかのtimerが最適化されて定数に置き換えられてるんじゃないの?
volatileつけてみるとかいうのはどうだろう
0168デフォルトの名無しさん
2009/07/30(木) 21:59:200170デフォルトの名無しさん
2009/07/31(金) 14:46:340171デフォルトの名無しさん
2009/07/31(金) 14:47:210172デフォルトの名無しさん
2009/07/31(金) 14:51:55private→実装がほしいだけの時に使う。でも実装がほしい場合は普通メンバ変数として持たせる
0173デフォルトの名無しさん
2009/07/31(金) 17:09:35switch(state){
case STATE_1: state_1(); break;
case STATE_2: state_2(); break;
}
これが、
switch(state){
case STATE_1: obj = state_1; break;
case STATE_2: obj = state_2; break;
}
obj.func();
になるだけでstateパターンを適用することでif~else()かswitchを使った
状態遷移処理は消えなくないですか
0174デフォルトの名無しさん
2009/07/31(金) 17:21:09obj = state_1;
とかで、後は
obj->func();
を回すだけ
遷移はstate_1の中で
obj = state_2;
とかやる
switchなど不要
0175デフォルトの名無しさん
2009/07/31(金) 17:24:18obj = state_1; // 初期ステート
obj = obj.func(); // ステート変遷
0176デフォルトの名無しさん
2009/07/31(金) 17:30:420177デフォルトの名無しさん
2009/07/31(金) 17:34:29obj = new state_2;
delete this;
とかでもいいし
何も考えず全部グローバルでもいいし
お好きにどうぞ
0178デフォルトの名無しさん
2009/07/31(金) 18:21:44初期化で
IState* state = STATE_1::getObj();
ループで
state = state->func();
にしてfunc()内で、
return thisとか
return STATE_2::getObj();
とかしてスッキリになりました状態遷移処理だけでなく状態管理変数も不要になるんですねありがとうございました。
0179デフォルトの名無しさん
2009/07/31(金) 18:24:47あまりその辺を突っ込むとタスクシステム大好きおじさんが来るから気をつけてねw
0180デフォルトの名無しさん
2009/08/01(土) 15:19:16知識0の全く最初からVC++の機能をフルに使って勉強してると環境が変わったら何もできなくなりそうで怖い
分かりやすいけど・・・
0181デフォルトの名無しさん
2009/08/01(土) 15:39:360182デフォルトの名無しさん
2009/08/01(土) 15:44:160183デフォルトの名無しさん
2009/08/01(土) 18:53:36VSの機能をフルにつかえてるなら、makeやらをちょろっと書けるレベルよりはるかに上。
0184デフォルトの名無しさん
2009/08/01(土) 22:00:14そりゃそうだけどw
趣味でやるならwindows環境だけでやれるけど、もしも仕事にするなら多分win以外の環境も多いんだろうなあと思ってさ
>>183
本当にフルに使えてるなら結構凄いのか
0185デフォルトの名無しさん
2009/08/01(土) 22:05:32そりゃ凄いことができると思うよ
やりにくい処理は他の処理系に投げることもできるしね
0186デフォルトの名無しさん
2009/08/01(土) 22:17:480187デフォルトの名無しさん
2009/08/02(日) 13:37:570188デフォルトの名無しさん
2009/08/02(日) 13:38:410189デフォルトの名無しさん
2009/08/02(日) 18:07:37私に対するレスです・・・よね?
その本はC++から学ぶ事を目的とした本なんですか?
0190デフォルトの名無しさん
2009/08/02(日) 18:25:22C++"だけ"を学ぶってのは無理じゃないの?
C++とCから一部省いたものを同時に学ぶだけで。
0191デフォルトの名無しさん
2009/08/02(日) 18:30:33でCの入門書の場合、その類の事に対する説明の割合が大きい
そういうのをすっとばしてC++流のやり方がてっとり早く学べる本の定番が>>188
0192デフォルトの名無しさん
2009/08/02(日) 19:03:59Accelerated C++は名著。超高密度。
0193デフォルトの名無しさん
2009/08/02(日) 19:28:210194デフォルトの名無しさん
2009/08/02(日) 21:29:22---------------
boostのpoolを使いたいのですが。class内のメンバ変数に指定する方法がわかりません。
boost::pool<> p(sizeof(int));
この行を、グローバルやローカル変数にすると問題がないのですが。
class AA
{
boost::pool<> p(sizeof(int));
}
クラス内に入れるとコンパイルエラーになってしまいます。対処方法がないでしょうか
---------------
「C++の基礎からやり直せ 」の回答が来ました。どうも初心者の質問のようでした。
なので、初心者スレでお聞きいたします。よろしければ何かアドバイスをください。
注)代理で書き込みをお願いしているので、返事が遅くなる可能性があります。
0195デフォルトの名無しさん
2009/08/02(日) 21:35:28クラス定義で初期化はできないよ
0196デフォルトの名無しさん
2009/08/02(日) 21:53:140197デフォルトの名無しさん
2009/08/02(日) 22:55:44コンストラクタ初期化子でググれ。
0198デフォルトの名無しさん
2009/08/03(月) 00:06:520199デフォルトの名無しさん
2009/08/03(月) 00:22:30VC6ではできなかった。
0200デフォルトの名無しさん
2009/08/05(水) 20:00:040202デフォルトの名無しさん
2009/08/05(水) 23:56:220203デフォルトの名無しさん
2009/08/06(木) 00:19:43半角文字に変換する関数で変換できなければ漢字として扱えばいいだけ。
この程度を瞬時に思いつかないようなら仕事はない。
0204デフォルトの名無しさん
2009/08/06(木) 00:29:500205デフォルトの名無しさん
2009/08/06(木) 00:46:200206デフォルトの名無しさん
2009/08/06(木) 00:58:20半角に変換できない文字⊂漢字だが、
半角に変換できない文字=漢字ではない。
0207デフォルトの名無しさん
2009/08/06(木) 01:00:37つ http://site.icu-project.org/
>>203みたいなのが地雷を埋め込んでくれるんだなー、と溜息が出た。
0208デフォルトの名無しさん
2009/08/06(木) 01:10:320209デフォルトの名無しさん
2009/08/06(木) 02:27:23そっか。。だからうちの会社仕事減ってきてるんだな。。。
はやいやすいまずいは中国の専売特許だからやりたくないけど不況を乗り切るためには仕方ないのかなぁ
0210デフォルトの名無しさん
2009/08/06(木) 02:30:350211デフォルトの名無しさん
2009/08/06(木) 02:38:410212デフォルトの名無しさん
2009/08/06(木) 11:46:49半角ハングルというのがあってだな・・・
0213212
2009/08/06(木) 11:47:47無視してくれ。
0214デフォルトの名無しさん
2009/08/07(金) 01:29:070215デフォルトの名無しさん
2009/08/07(金) 04:40:11class CVec
{
std::vector<int> vInt ;
public:
void Get(int *pInt)
{
vInt.push_back(5) ;
pInt = &vInt[0] ;
}
}vec;
int _tmain(int argc, _TCHAR* argv[])
{
int* pInt = NULL ;
vec.Get( pInt ) ;
return 0;
}
mainのとこでpIntにアドレスを戻す事が出来ません
こういうことは出来ないんでしょうか?
0216デフォルトの名無しさん
2009/08/07(金) 04:42:240217デフォルトの名無しさん
2009/08/07(金) 05:02:150218デフォルトの名無しさん
2009/08/07(金) 09:50:44その戻したポインタはクラス内部でvectorに対して変更を掛けたら無効になるから要注意。
つーか、const_iteratorを返す方がよかないか?
0219デフォルトの名無しさん
2009/08/07(金) 23:21:540220デフォルトの名無しさん
2009/08/07(金) 23:26:36体験版でプレイヤー作ったけど期限切れでそのまま放置してるの思い出した
0221デフォルトの名無しさん
2009/08/08(土) 01:12:12FFmpeg というツールがある。
C 言語からの使用方法については、この記事が参考になる。
http://codezine.jp/article/detail/2444
0223デフォルトの名無しさん
2009/08/08(土) 15:49:51int foo( int ); と int bar( int ) への共通のポインタは
int (*)( int ) で得られますが、
関数としての型は等しいが異なるクラスのメンバである関数、例えば
int Widget::foo( int ) と int gadget::bar( int ) への共通のポインタは
得られないものなんでしょうか。
普通に考えると前者は int ( Widget::* )( int )型、
後者は int ( gadget::* )( int ) 型で型が違うので無理なような気もしますが
普通でなくなりたいのです。
例えば class Gadget : public Widget; のようにして
ポリモーフィズムを利用してなんとかできないかなとか思ったんですが
Visual C++は許してくれませんでした。
0224デフォルトの名無しさん
2009/08/08(土) 17:32:18いや、継承関係にあれば問題ないはず。
エラーメッセージと、できれば実際のコードを貼ってみることだね。
0225デフォルトの名無しさん
2009/08/08(土) 22:55:440226デフォルトの名無しさん
2009/08/09(日) 00:43:25BCBで__closureという独自拡張がなされた理由の一つ。
継承関係があっても、別クラスのメンバ関数のポインタは、異なる型。
0227デフォルトの名無しさん
2009/08/09(日) 01:17:16GadgetがWidgetの派生クラスなら、Widget::*なメンバへのポインタはGadget::*なメンバへのポインタに変換できる。
なぜなら、Gadgetのインスタンスは当然Widgetのメンバを持っているため。
#include <iostream>
struct Widget
{
int foo(int) {return 1;}
};
struct Gadget : Widget
{
int bar(int) {return 2;}
};
int main()
{
int (Gadget::*p)(int) = &Widget::foo;
Gadget g;
std::cout << (g.*p)(0) << std::endl; // 1
}
もちろん、上のpはint (Gadget::*)(int)型なので、Widget w;があったとして、(w.*p)(0)のような使用はエラーになる。
0228デフォルトの名無しさん
2009/08/09(日) 01:20:58Gadget g;
boost::function<int (int)> f(boost::bind(&Widget::foo, g, _1));
std::cout << f(0) << std::endl;
こっちの方法では、もう継承関係とか不要。
0229デフォルトの名無しさん
2009/08/10(月) 21:37:28xに代入した乱数を配列aに一文字ずつコピーしたくて、
int x,y,z;
int a[5];
srand(time(NULL));
x = 1000 + rand() % 9999;
y = x;
z = 5;
do{
--z;
a[z] = y % 10;
y = y / 10;
}while(z >= 0);
printf("乱数の数:%d\n",x)
printf("配列の数:%d\n",a)
などと書いたんですが、配列の方の数がどうしても合いません。
というか乱数を代入してるのに同じ数字しか表示されません。何がいけないんでしょうか?
0230デフォルトの名無しさん
2009/08/10(月) 21:44:07ここで添え字を使えているのに、なぜprintfのほうではできてないのだ
0231デフォルトの名無しさん
2009/08/10(月) 21:47:01これをみてtime関数の使い方を勉強してください
0232デフォルトの名無しさん
2009/08/10(月) 21:48:31一秒以内に複数回実行した場合は同じ乱数が生成されるだけ
0233デフォルトの名無しさん
2009/08/10(月) 21:50:53パッと見、これにはそんなに違和感は感じない。
printf("配列の数:%d\n",a)
ここは明らかにおかしいが。
0234デフォルトの名無しさん
2009/08/10(月) 22:10:12int i = 0;
do{
printf("d%",a[i]);
i++;
}while(a[i] > 0);
としてみたら、正常に表示されました。ありがとうございました。
0236デフォルトの名無しさん
2009/08/10(月) 22:12:160237デフォルトの名無しさん
2009/08/11(火) 16:50:36> }while(a[i] > 0);
これ配列の最後を超えてa[5]にアクセスしてるだろ
0238デフォルトの名無しさん
2009/08/11(火) 17:52:310239デフォルトの名無しさん
2009/08/11(火) 17:54:43こういう意図だと思うが… やはり何故 for を使わないのか疑問だ
0240デフォルトの名無しさん
2009/08/12(水) 01:47:330241デフォルトの名無しさん
2009/08/12(水) 13:45:36%演算子の結果は
正の数%正の数
以外は処理系定義でしょうか?
0242241
2009/08/12(水) 14:17:52ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00134.html
こんなところを見つけました。
ということは、
int hoge = 何とか;
が
... -6, -4, -2, 0, 2, 4, 6, ...
といった偶数であるかどうかは
<方法A>
std::abs(hoge)%2 == 0
<方法B>
hoge%2 == 0
のどちらでも大丈夫と言うことでしょうか?
それとも<方法B>は余りが2になって返る可能性がありますか?
0243デフォルトの名無しさん
2009/08/12(水) 14:20:51剰余の符号は処理系定義だけれど、剰余であることが保障されるので2になることはない。
0244デフォルトの名無しさん
2009/08/12(水) 14:23:55余りが2になることはないです
その余りを考えた場合(2 % 2 == 0)になるからです
0245242
2009/08/12(水) 14:25:03ありがとうございました。
0246デフォルトの名無しさん
2009/08/12(水) 14:26:07偶数であることの判定は一番速い方法は何があるだろう?
bit演算かな?
0247デフォルトの名無しさん
2009/08/12(水) 14:53:09処理系、実行系依存。条件を限定しない限り、速度比較は無意味。
0249デフォルトの名無しさん
2009/08/13(木) 00:54:30%2はコンパイラが何か最適化するかもしれんけど。
0250ちょっと予測を裏切られたw
2009/08/13(木) 09:49:03{ // mod 2 チェック w/ gcc -S -O3 foo.c @gcc 3.4.4
#if 1
printf("%d\n", argc % 2);
// movl 8(%ebp), %ebx
// movl %ebx, %edx
// shrl $31, %edx
// leal (%ebx,%edx), %eax
// andl $-2, %eax
// subl %eax, %ebx
// movl %ebx, 4(%esp)
#elif 0
printf("%d\n", argc & 1);
// movl 8(%ebp), %ebx
// andl $1, %ebx
// movl %ebx, 4(%esp)
#elif 0
printf("%d\n", argc - (argc / 2) * 2);
// argc % 2と同じなので割愛
#else
printf("%d\n", (argc % 2) != 0);
// xorl %eax, %eax
// testb $1, 8(%ebp)
// setne %al
// movl %eax, 4(%esp)
#endif
return 0;
}
0251デフォルトの名無しさん
2009/08/13(木) 09:51:35// subl %eax, %ebx
これか
久々のアセンブラなんで外れかも
eaxってことはx86 32bitかね?
0252250
2009/08/13(木) 09:58:03int main(unsigned argc, char ** argv)
{ // mod 2 チェック w/ gcc -S -O3 foo.c @gcc 3.4.4
#if 0
printf("%d\n", argc % 2);
// movl 8(%ebp), %ebx
// andl $1, %ebx
// movl %ebx, 4(%esp)
#elif 0
printf("%d\n", argc & 1);
// argc % 2と同じなので割愛
#elif 0
printf("%d\n", argc - (argc / 2) * 2);
// argc % 2と同じなので割愛
#else
printf("%d\n", (argc % 2) != 0);
// xorl %eax, %eax
// testb $1, 8(%ebp)
// setne %al
// movl %eax, 4(%esp)
#endif
return 0;
}
#if 0
結論。
・符号付整数型の場合、2で割った余りが0, 1, -1の3値になりうるので% 2では最適化しにくい。
・必要なのは0かそれ以外なので% 2した結果を0と比較することで、& 1にまで最適化される。
・符号なし整数型の場合は、% 2でも& 1にまで最適化される。
#endif
0253250
2009/08/13(木) 10:02:23>>251
x86ですよ。それもcygwin。
整数型として評価させているのでこういう結果ですが、条件分岐に使うと又違うかもしれませんね。
まぁ私は% 2派ですが。
0254デフォルトの名無しさん
2009/08/13(木) 20:38:46DLLを作成し、exeでビルドするとLNK2019でリンクエラーになります。
対処方法を教えてください。
以下、詳細です。
プロジェクト作成ウィザードで「WCE MFC AppWizard(dll)」をデフォルトのまま作成し、そのままビルド。
次に「WCE MFC AppWizard (exe)」もデフォルトで作成し、
DLLの.hをexeの.cppにincludeし、プロジェクト設定でdllの.libをリンクしました。
これだけの状態ですが、exeでLNK2019が発生します。
exe側の処理はDLLのクラスを宣言しているだけで、コンストラクタだけの状態です。
MFCなしのDLLでは問題なくexeがリンクできます。
作りたいのはMFCが利用可能なクラスDLLです。
設定の問題か、WCE MFC AppWizard (dll)で別の記述が必要なのかが判断つきません。
以上です。
0255デフォルトの名無しさん
2009/08/14(金) 11:22:21テキスト文字列で
(5 + 8) * 3
のようなものの答えを計算するライブラリというもので、何かスタンダードなものはあるでしょうか?
自作もいいのですが、正規表現ライブラリのBoost Regexのように何かしら既存のものがあればと思いまして。
0256デフォルトの名無しさん
2009/08/14(金) 11:29:03結果を回収したいならpopen("awk 'BEGIN {print (5+8)*3}'", "r")してfgets()で。
0257デフォルトの名無しさん
2009/08/14(金) 11:33:07使い方としては、
ゲームのパラメータを外部のtxtに持たせてまして、今はそこに数値のみかけるのですが、
これを計算式までかけるといいなと思いまして。
level = 10
sytem = 20
power = level * 5
とかできるといいなと思っています。
プログラム中からは、文字列の"level"などをキーにして、設定されている数値を取得しています。
(余談ですが、map<string, int>を使っています)
0258デフォルトの名無しさん
2009/08/14(金) 12:10:36Boost.Regex のようにって言うなら、 Boost.Spirit の出番じゃないか?
0259デフォルトの名無しさん
2009/08/14(金) 12:32:19それならSpiritがいいだろうな。
0260まぁ、boost.spiritだろうね
2009/08/14(金) 12:41:18えー、外部の方が楽できるよw
awk 'BEGIN {level = 10; system = 20; power = level * 5; printf("level:%d\nsystem:%d\npower:%d\n", level, system, power);}'
とかw
0261デフォルトの名無しさん
2009/08/14(金) 12:42:360262デフォルトの名無しさん
2009/08/14(金) 12:42:46面白いですね。
ちょっと解説ページみながらこねくり回してみたいと思います。
ありがとうございました。
0263デフォルトの名無しさん
2009/08/14(金) 12:59:11wじゃねーよ。
スレ違い。
0264デフォルトの名無しさん
2009/08/14(金) 13:00:42Spiritで数式を解釈させるなら
boost::spiritっちゃえ!
ttp://tamachan.club.kyutech.ac.jp/%7Egridbug/spirit/
C++ Labyrinth
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-boost-spirit.html
Spirit v1.6
ttp://boost.cppll.jp/BDTJ_1_30/libs/spirit/
これらが有名で質も高いと評判です。
0265デフォルトの名無しさん
2009/08/14(金) 13:10:20でぐぐれよ
0266デフォルトの名無しさん
2009/08/14(金) 15:03:58ロードが成功したものをvector<HANDLE>にpush_backで入れると、
HANDLEのアドレスが被ってうまくいかないようです。
for(・・・){
HANDLE hd = LoadLibrary(・・・);
v.push_back(hd);
}
v[0]とv[3]が同じ値になったりします。どうしたら良いですか
0267266
2009/08/14(金) 15:07:07newは一貫して使いたくないのですが、回避する方法ありますか?
0268デフォルトの名無しさん
2009/08/14(金) 15:32:11クラスの中でクラスを使ったりするのが失敗の基の気はします。
HANDLEのコピーをしていくうちに、メモリリークと同じような事が起こっている気はします。
確定ではないですが。
vector<HANDLE> hd;
for(・・・) {
n=hd.size();
hd.resize(n+1);
hd[n] = LoadLibrary( ・・・);
}
0269デフォルトの名無しさん
2009/08/14(金) 15:45:54DLLdataは HANDLEと関数のクラスです。
原因わかりますか? 268とほとんど変わらないと思いますが
vector<DLLdata> x;
for(・・・) {
n=x.size();
x.resize(n+1);
x[n].hd = LoadLibrary( ・・・);
}
0270デフォルトの名無しさん
2009/08/14(金) 15:46:290271デフォルトの名無しさん
2009/08/14(金) 15:50:27push_backと ・・・ = LoadLibrary( ・・・)では値の入れられ方に違いがあるのでは?
と思いました。 でも原因は別にあるようです。 特定できていません。
0272デフォルトの名無しさん
2009/08/14(金) 15:56:180273デフォルトの名無しさん
2009/08/14(金) 15:56:22vectorのresize時にデストラクタが呼ばれるのは知ってる?
DLLdataのデストラクタで何かやってないかい?
0274デフォルトの名無しさん
2009/08/14(金) 16:07:01使い終わったら解放するのが普通ですが。
0275デフォルトの名無しさん
2009/08/14(金) 16:09:41その場合vectorはコピーコンストラクタを呼んで新しい位置にオブジェクトをコピーし
古いオブジェクトをデストラクタで消す
0276デフォルトの名無しさん
2009/08/14(金) 16:14:45DLLdataのデストラクタを外すのは、他所への影響もあるので
そこだけ、 vector<HANDLE> vector<関数1> vector<関数2>・・・と分けて定義する事にしました。
0277デフォルトの名無しさん
2009/08/14(金) 16:15:33だとすればただの値のコピーであるものが>>266で重複するというのは
同じパスのDLLを二回以上ロードしてるだけって気がするんだけど
HANDLEもユーザ定義の型だったりするのだろうか
0278デフォルトの名無しさん
2009/08/14(金) 16:15:52push_backに渡した引数は、vectorのメモリ領域にコピーコンストラクタでコピーされて、
渡した引数自体はデストラクタで破棄される
要するに、適切なコピーコンストラクタを書かなきゃだめということ
0279デフォルトの名無しさん
2009/08/14(金) 16:17:48メイヤーズ先生もサッター先生もマッサー先生も
あれほど口をすっぱくしていってたじゃないか。
忘れちゃったのかい?^^
0280デフォルトの名無しさん
2009/08/14(金) 16:19:26>>266は確かめて無くて。
たとえのような物でした・
重複してないかもしれません
0281デフォルトの名無しさん
2009/08/14(金) 16:29:03お前こそぐぐれよ
それでぐぐってもspritはでてこねーよ
何ページもめくれば別かもしれんが
0282デフォルトの名無しさん
2009/08/14(金) 16:33:59たとえのような物ってどういう意味だよ。
>>266は明らかに質問の前提となる現象として書いてるじゃないか。
0283デフォルトの名無しさん
2009/08/14(金) 16:37:14>>266のコードでまったく問題なく動くよ。
重複も起こらない。今試したから間違いない。
だからエラーは>>266のコードが原因じゃない。
0284デフォルトの名無しさん
2009/08/14(金) 16:47:26Susieライブラリで多種画像を読み込めるようにしたかったんです。
0285デフォルトの名無しさん
2009/08/15(土) 20:30:330286デフォルトの名無しさん
2009/08/15(土) 20:35:050287デフォルトの名無しさん
2009/08/15(土) 20:41:420288デフォルトの名無しさん
2009/08/15(土) 20:48:29代入じゃない。初期化リストで初期化するんだ。
0289デフォルトの名無しさん
2009/08/15(土) 22:53:54上記URLの練習5でモンスターの攻撃する関数について教えてください
0290デフォルトの名無しさん
2009/08/15(土) 23:00:500291デフォルトの名無しさん
2009/08/15(土) 23:51:240292デフォルトの名無しさん
2009/08/16(日) 01:50:54VC++使ってます。
0293デフォルトの名無しさん
2009/08/16(日) 02:05:410294デフォルトの名無しさん
2009/08/16(日) 06:24:01速度は実測が基本。
比べてみればいい。
0295デフォルトの名無しさん
2009/08/16(日) 06:31:41ループ云々以前の問題で小突き回されるだろうからイイ勉強になるぜ
0296デフォルトの名無しさん
2009/08/16(日) 08:06:13俺はほとんど使ったこと無いんだけど。
0297デフォルトの名無しさん
2009/08/16(日) 10:32:43prepare();
do {
work();
} while (cond);
}
0298デフォルトの名無しさん
2009/08/16(日) 11:07:13ミスって無限ループされたら嫌なんで基本的に使ってない。
メッセージループとかは別だけど。無限ループって怖くね?
0299デフォルトの名無しさん
2009/08/16(日) 12:01:380301デフォルトの名無しさん
2009/08/16(日) 12:26:510302デフォルトの名無しさん
2009/08/16(日) 15:22:35doとwhileの個数数えると問題箇所がすぐ分かるからよく使ってる俺は異端ですか?
0303300
2009/08/16(日) 16:42:26そんな工夫初めて知ったわ。
ちゃんとインデントしていればだいたい分かるじゃん。
あるいはIDE/エディタの機能でも対応するカッコくらいわかるじゃん。
まあいいけど。
0304デフォルトの名無しさん
2009/08/16(日) 16:45:230305デフォルトの名無しさん
2009/08/16(日) 16:48:30なるべくforeachで済ませたい
0306デフォルトの名無しさん
2009/08/16(日) 16:49:41foreachなくね?
boostの実装を使うって事?
0307デフォルトの名無しさん
2009/08/16(日) 16:53:090308デフォルトの名無しさん
2009/08/16(日) 16:54:210309デフォルトの名無しさん
2009/08/16(日) 17:44:300310デフォルトの名無しさん
2009/08/16(日) 17:57:36void* Hoge::operator new(size_t size){
return reinterpret_cast<Hoge*>(new char[sizeof(Hoge)]);
}
みたいなnewの仕方があったのですが、
普通のnewと比べても速度があまり変わりません。
こういう書き方は何のためにやってるのでしょうか?
0311デフォルトの名無しさん
2009/08/16(日) 18:08:220312デフォルトの名無しさん
2009/08/16(日) 18:13:23charの配列を作りたいんじゃないんだからね!
あくまでHogeのために領域確保したんだから
そんなココロ
0313デフォルトの名無しさん
2009/08/16(日) 20:01:20いや、インデントしてんだけど、mainの}、ifの}とかで挟まれて階層が複雑化していくと、
while文やfor文だと全部同じ } だから分かりにくく・・・。
対応する { } は、その間の背景色を変更してくれる色分け機能とかあったらいいなぁ。
Visual Studio 2008 Professional Edition使ってるんだけど、まだ始めたばかりだから機能なんて全然分からないぜ・・・。
0314デフォルトの名無しさん
2009/08/16(日) 20:21:09そのコードじゃ意味ないんで、たぶんその人は何か勘違いしてる。
最近知った C++ の機能をちょっと使ってみたかっただけとか、あると思います。
0315デフォルトの名無しさん
2009/08/16(日) 20:45:490316デフォルトの名無しさん
2009/08/16(日) 21:07:02オーバーロードしてあっても、
newを使って確保すれば、やっぱりコンストラクタは呼ばれます。
newを使わずスタックに確保しても、当然呼ばれます。
別途確保した領域にplacement newを使えば呼ばずに済みますが
operator newをオーバーロードしたこととは全く無関係です。
0318303
2009/08/16(日) 21:16:42むしろ
const unsigned int MAX = ...//0かもしれない
for(i=0; i<MAX; ++i)
{MyArray[i]=...}
こんなソースをdo-whileでどうやって書いているのだい?
書き換えられる物なの?
0319デフォルトの名無しさん
2009/08/16(日) 21:31:27if(i>=MAX) break;
} while(1);
0321デフォルトの名無しさん
2009/08/16(日) 23:02:37見た目の問題で do-while 使用するぐらいなら、複雑性を取り除く
努力をした方が建設的だと思うのだが。
多重ループの内周を関数化するとか、適度な意味や長さで関数を分
割していけば、そうそう複雑な階層を持つ事はないだろう。
また、do-while の「一度は実行される」という特性は、想定外の問
題に繋がりやすいので、登場したら危険視している。
0322デフォルトの名無しさん
2009/08/16(日) 23:22:440323デフォルトの名無しさん
2009/08/16(日) 23:24:17誰に対するレスですか?
0324デフォルトの名無しさん
2009/08/16(日) 23:29:470325デフォルトの名無しさん
2009/08/16(日) 23:34:38C++に詳しい人に対してです。
なんかinlineはコンパイルされるときに短くしてくれる時があるんらしいんですよ。(本を読む限り)
だからとりあえず付けるのかなぁと。 それとも付けたらマズイ事が起きるときあるの?
0326322
2009/08/16(日) 23:37:15> なんかinlineはコンパイルされるときに短くしてくれる
> 時があるんらしいんですよ。(本を読む限り)
その本は窓から投げ捨てるために生まれてきた物です。
> とりあえずinline付けときゃOKなの?
> だからとりあえず付けるのかなぁと。
もしそうだったら言語仕様として無指定の時は全部
inlineになっているはずでしょ?
> それとも付けたらマズイ事が起きるときあるの?
バイナリが肥大化する可能性がある。
後はまあリンク時にどうするとか関数のアドレスがとれなくなるから
どうするとか説明がめんどくさいので、
詳細は次の人どうぞ!↓↓↓
0327デフォルトの名無しさん
2009/08/16(日) 23:37:430328デフォルトの名無しさん
2009/08/16(日) 23:39:28関数アドレスを取ったら、inlineが無視されるんじゃないかなと。
適当なことをいってみる。
0330326
2009/08/16(日) 23:44:59無視されるかもね。
あるいは関数アドレスが必要じゃないところは
一部だけinline展開されるかもしれない。
その辺はコンパイラの自由だからなぁ。
0331デフォルトの名無しさん
2009/08/16(日) 23:47:42だからそんな下らない事気にするのは止めとけ。
0332326
2009/08/16(日) 23:54:19inlineは俺は関数定義をヘッダーに書きたいときに
リンカエラーがでなくて便利だから使わせてもらっているぐらいかな。
0333デフォルトの名無しさん
2009/08/16(日) 23:55:220334デフォルトの名無しさん
2009/08/17(月) 01:30:37実際に行われるかどうかはわからない。
0335デフォルトの名無しさん
2009/08/17(月) 04:17:52if(i == x)
{
do{
/*.........*/
}while(i == x);
}
とかなら・・・いや、複雑だな。
0336デフォルトの名無しさん
2009/08/17(月) 09:35:04いまさら過ぎる
0337デフォルトの名無しさん
2009/08/17(月) 09:46:540338デフォルトの名無しさん
2009/08/17(月) 10:14:56関数ポインタが必要だったり外部リンクが必要な場合に備えて関数の実体も作る。
関数内の静的変数については、どっちみち関数の実体に関係なく作られる。
0339デフォルトの名無しさん
2009/08/17(月) 11:20:27switch(INT)
{
case 1 :
return 1;
case 2 :
return 2;
case 3 :
return 3;
}
これと
switch(INT)
{
case 1 :
return 1;
case 2 :
return 2;
default :
return 3;
}
これと
switch(INT)
{
case 1 :
return 1;
case 2 :
return 2;
}
return 3;
これはどれが最速でしょうか?
0340デフォルトの名無しさん
2009/08/17(月) 11:23:15return INT;
じゃね?
0341デフォルトの名無しさん
2009/08/17(月) 11:23:34http://codepad.org/axUzOb82
仕組みはよくわからんがこれで継承を制限できるらしい
だれか解説してくれ
0342339
2009/08/17(月) 11:25:10そうですよね。
では
switch(INT)
{
case 1 :
return val_1;
case 2 :
return val_2;
case 3 :
return val_3;
}
これと
switch(INT)
{
case 1 :
return val_1;
case 2 :
return val_2;
default :
return val_3;
}
これと
switch(INT)
{
case 1 :
return val_1;
case 2 :
return val_2;
}
return val_3;
これはどれが最速でしょうか?
0343デフォルトの名無しさん
2009/08/17(月) 11:27:260344デフォルトの名無しさん
2009/08/17(月) 11:31:20全て同じ asm コードになる可能性もあるな
0345342
2009/08/17(月) 11:38:48gccの最適化はこういったものは期待していいですかね?
0346デフォルトの名無しさん
2009/08/17(月) 12:00:10実測するのが一番だと思うよ?
最速云々って そのコード部が一番遅い(or 速度に支配的) って断定できてるの?
目先にとらわれすぎているような気がしないでもない
0347デフォルトの名無しさん
2009/08/17(月) 12:02:07目先にとらわれています。
ですがこの様な状況が過去にも将来にも多発するので、
どちらが速いかとかがあれば是非教えていただけますでしょうか
0348337
2009/08/17(月) 12:23:02switchも結局asmでは==の比較とアドレスジャンプで出力されるはず
よって命令数で言えば下<上=中
が、いくら時間のかかる比較命令でも、1命令差を評価するのは難しい/あまり意味がないかと
OSの割り込みにもシビアに影響受けるし
>>341
virtualでhogeを継承して、コンストラクタを定義せずそれを継承するから
hogeコンストラクタにアクセスできないとか、そんな仕組みなのかな?調査してみる。thx
0349デフォルトの名無しさん
2009/08/17(月) 12:24:07INTが例えば引き数なのか演算結果なのかでも事情が異なるので、そのswitchだけでは判断できない。
val_1, val_2, val_3が定数か変数かでも結果は変わるだろうし、定数の場合は法則性の有無でも変わるだろう。
あー、コンパイラにINTが1〜3以外の値を取らないと言うヒントを与えることができていないので、
一番上とそれ以外とでは質的な違いが生じている。
案外、
if (INT == 1) return val_1;
if (INT == 2) return val_2;
return val_3;
の方が速いかもしれない。
0350デフォルトの名無しさん
2009/08/17(月) 12:26:20最適化なしでの議論は全く無意味だと思うし、中と下は結局のところ同じロジックだと思うぞ。
少なくとも、上と中で同じ出力になるとは思えない。
# その理由は>349の4行目
0351デフォルトの名無しさん
2009/08/17(月) 12:54:53変換されて、cmpが消えるという話は聞いたことがある。
しかしVC2008expressで自分でやってみてデバッガでASM表示しても
消えてなかったんだよなぁ。
実測しても自前で関数アドレステーブル使った方が速かった。
0352337
2009/08/17(月) 13:16:13ああ本当だ、上のほうが判定命令+1だった。スマソ
0353デフォルトの名無しさん
2009/08/17(月) 13:34:08仮にジャンプテーブルに変換したとすると、より遅くなるから敢えて避けているんだろ。
関数テーブルを使う方が速いと言う話も、今回のケースには当て嵌まらない。
0354デフォルトの名無しさん
2009/08/17(月) 13:50:49読み込んだ波形データをどの様に操作すればいいのかが分かりませんorz
内容としては正にこんなことをしてみたいのです
ttp://www.spacesoft.co.jp/Products/Freeware/Sound/04alphaBlend/readme.html
スレ違いでしたら申し訳ありませんが、よろしくお願いします。
0355デフォルトの名無しさん
2009/08/17(月) 13:58:20生波形の形に変換して、好きなように加工すればいいと思います。
例えばWindows特有の所謂wavファイルをそのまま扱っているのなら、
それのフォーマットについて知る必要がありますが。
0356デフォルトの名無しさん
2009/08/17(月) 14:03:29ttp://www.kk.iij4u.or.jp/~kondo/wave/
0357デフォルトの名無しさん
2009/08/17(月) 14:04:40テスト用にWindowsXPの起動音を読み込んで、再生出来ることを確認した後
データチャンク以降に格納されたデータをBYTE型の配列に格納するまでは進めたのですが
その配列に格納したデータを直接操作(演算?)する、といった感じで良いのでしょうか?
いまいち説明が上手くできないです、申し訳ないorz
0358デフォルトの名無しさん
2009/08/17(月) 14:08:48実際にやってみればいいじゃん。
0359デフォルトの名無しさん
2009/08/17(月) 14:14:19オーバーフローしないように足してけば良いと思うよ。
0360デフォルトの名無しさん
2009/08/17(月) 14:15:17アルファブレンドってなってるからやろうとしてることは画像のピクセルの色合成と理屈は一緒だよね
画像の方はVRAM上の2次元配列のピクセルなんかとテクスチャのピクセルの色合成
音の方は時間軸方向の1次元配列(ステレオならx2)の波形の合成だろうし
0361デフォルトの名無しさん
2009/08/17(月) 14:41:11ありがとうございます。
少しずつ確認しながら実装してみようと思います。
0362デフォルトの名無しさん
2009/08/17(月) 14:51:15「参照は初期設定した後は変えられない」と禿本やEffective C++
には記載されているのですが、以下のコードはコンパイルできてしまいます。
なぜでしょうか?VC++2008、Comeauでも成功します。
int main()
{
int i = 1;
int& r = i;
int j = 2;
int& s = j;
r = s; //なぜerrorにならない? 参照 r は i を参照し続けるのではないのか?
}
0363デフォルトの名無しさん
2009/08/17(月) 14:56:18int& r = i; は r を i で初期化しますが、
r = s; では、rの参照していうオブジェクト、すなわち i に s の値(= 2) を代入します。
0364デフォルトの名無しさん
2009/08/17(月) 15:07:21レスどうも。
そこは理解できました。
ただEffetive C++の第5項では以下のようなコードは
代入演算子をコンパイラは自動生成しないとあり、実際
コンパイルできません。>>362 がOKなら、こちらも
w1 = w2 はコンパイルできてもよさそうなんですが、
そうはなりません。なぜでしょうか?
int gi = 123;
class Widget {
int& r;
public:
Widget():r(gi){}
};
int main()
{
Widget w1, w2;
w1 = w2; //エラー
int x;
cin >> x;
}
0365デフォルトの名無しさん
2009/08/17(月) 20:23:01>代入演算子をコンパイラは自動生成しない
自分で答え書いてるじゃない。w
自力でoperator = を記述すればちゃんと機能するよ。
0366デフォルトの名無しさん
2009/08/18(火) 01:44:22現状の言語仕様については >365 の言うとおりなんだが、
確かに w1.r = w2.r としてコンパイルできてもよさそうな気もしてきた。
なんか危険なケースがあるのかな?
0367デフォルトの名無しさん
2009/08/18(火) 02:52:34int&をint*に置き換えた場合を考えてみるといい。
0368デフォルトの名無しさん
2009/08/18(火) 03:05:22「中身を代入する仕様になぜしなかったのか?」という話だよ。
int &r = x;
r = a;
では、再割り当てなんかされずに「aの持つ値が代入される」のだから。
お前の大好きなポインタの形で書き直すならば
*p = a; という形での代入が、
通常の式においては行われるのに
構造体の代入においては何故行われないないのか、ということだ。
0369デフォルトの名無しさん
2009/08/18(火) 03:12:190370デフォルトの名無しさん
2009/08/18(火) 03:26:34値セマンティクスにならないからだろ
0371デフォルトの名無しさん
2009/08/18(火) 03:35:48int a, b;
int& x = a;
int& y = b;
x = y;
これが値の代入になるのは当然だよな。
でも、構造体のメンバ同士の代入になると違うって?
C++において、「構造体の代入」とは「全メンバを個々に代入すること」と定められている。
(代入演算子をオーバーロードしない限りは、ね)
ならば、参照メンバであっても代入は代入とされてもおかしくは無かったんじゃないかね。
まあ個人的には、「デフォルトコンストラクタが作られない」のに「代入演算子はデフォルトで定義される」という仕様になるのが
受け入れにくかったんじゃないか、とは思ってるんだけどね。
0372デフォルトの名無しさん
2009/08/18(火) 08:21:55みなさんレスありがとうございます。
疑問だったのが>>366さん、>>368や>>371
さんの書かれてるとおりです。
言語仕様ということで理解しました。
0373デフォルトの名無しさん
2009/08/18(火) 09:37:07おいおい。値の代入してどうするんだよw
x=yは、つまりa=bのことだろ。
相変わらずxはaを指し、yはbを指している。
だが、本当に参照の代入を作ってしまった場合、意味的には
xはbを指すように変更されないといかん。
参照の意味わかってんのか?
0374デフォルトの名無しさん
2009/08/18(火) 10:09:36>>371さんが言ってる代入とは、a = b のことだと思いますよ。
要は、何故そのセマンティクスがクラス内の参照データメンバにも
適用されないのか?ということです。
0375デフォルトの名無しさん
2009/08/18(火) 10:23:59とある変数Xを参照しているメンバーint&を持っているクラス同士をコピーしたら、なぜかXの値が書き変わるとか拷問かよw
0376デフォルトの名無しさん
2009/08/18(火) 10:27:57結局みんな何が言いたいのだい?
0377デフォルトの名無しさん
2009/08/18(火) 10:52:41参照先が変わらなくても、ユーザー定義型も>>362のように参照先の値
が代入されてもいいんではないかと思ったわけです。
0378デフォルトの名無しさん
2009/08/18(火) 11:11:09class A
{
public:
int &a_;
A(int &a):a_(a){}
};
void main()
{
int x = 0;
int y = 1;
A m(x);
A n(y);
m = n;
//↑何故かm=nで、xの中身が1に書き変わる
}
こんなのが通ったら、どんだけバグの温床になると思ってんだ。
0379デフォルトの名無しさん
2009/08/18(火) 11:16:22↓が OK なのにメンバだけ禁止するのはなんで?って話だよ。
int x = 0;
int y = 1;
int& m = x;
int& n = y;
m = n;
//↑何故かm=nで、xの中身が1に書き変わる
まぁ、クラス内に参照型が潜んでるのに気づきにくいだろうとは思う。
そういう代入を認めるように operator = () を定義するのは簡単だけど、
逆にそういう代入をデフォルトで認めた場合に禁止するための直接的な
記法( C++0x の = delete )も無かったわけだし。
0380デフォルトの名無しさん
2009/08/18(火) 11:18:18なるほど、そうですね。
いっそ>>362もエラーにしてくれたら一貫性
があって悩むことはなかったのですが。
0381デフォルトの名無しさん
2009/08/18(火) 11:18:33お前なぁ・・・
ほんとに「参照」「初期化」「代入」の意味が分かってねーんじゃねーのか?
どのプログラムの何が「何故か」なんだよ
もろにそうなるようにプログラムを自分で書いてるじゃねーか
だが、クラスの代入まわりは「自分で書かない」からバグの温床になるような仕様を避けてるんだよ!
0382デフォルトの名無しさん
2009/08/18(火) 11:19:15>>362がエラーになったら、参照の存在自体全否定じゃねーか
アホか!
0383デフォルトの名無しさん
2009/08/18(火) 11:21:39C++の奥深さを感じました。
0384デフォルトの名無しさん
2009/08/18(火) 11:23:390385デフォルトの名無しさん
2009/08/18(火) 11:24:20C++つーかアセンブラ的に考えると別に不思議でもなんでもない話
0386デフォルトの名無しさん
2009/08/18(火) 11:25:56結論に異論はないんだけど、この内容に「参照」「初期化」「代入」の意味は
関係ないでしょ。現行の規格を前提としない話なんで、どちらの動作でも
「そういう意味」として定義可能だし。
0387デフォルトの名無しさん
2009/08/18(火) 11:30:28>になるような仕様を避けてるんだよ!
デフォルトでこんな代入演算子を書かれたら困りますね。
P30を読み返したところ納得できました。
0388デフォルトの名無しさん
2009/08/18(火) 11:38:26>>385
アセンブラは未勉強なので、これから調べてみます。
>>386
自分も結論に異論はないです。危険を避けるための
仕様だとして納得しました。
0389デフォルトの名無しさん
2009/08/18(火) 12:02:030390デフォルトの名無しさん
2009/08/18(火) 12:30:42どうみても、わかってなくて頭悪いのはおまえだろ
一人だけ話を理解できてないのだから
0391デフォルトの名無しさん
2009/08/18(火) 12:34:57一人だけ初期化と代入の区別がどうのと言っているしね。
0392デフォルトの名無しさん
2009/08/18(火) 12:42:550393デフォルトの名無しさん
2009/08/18(火) 13:06:49>こんなのが通ったら、どんだけバグの温床になると思ってんだ。
参照ってのを理解しているとは到底思えない。
0394デフォルトの名無しさん
2009/08/18(火) 13:09:09別名になる
つまりcだとtypedefしたような感じなんだよね
なので代入すればそうなる
0395デフォルトの名無しさん
2009/08/18(火) 13:52:20低学歴は、いったん言い方に対してファビョると、
肝心の言ってること自体をまったく見なくなるからね。
そういうのが大勢いる場所では、損をするというか、中身のある会話が終わる。
0396デフォルトの名無しさん
2009/08/18(火) 15:37:38int &a = b;
a = b;
上2つが全然違うものだと知らなかったからもめたんだろ
0397デフォルトの名無しさん
2009/08/18(火) 15:42:030398デフォルトの名無しさん
2009/08/18(火) 15:46:47実質、実装方式がポインタなのだから、ポインタだけで良かったのに
0399デフォルトの名無しさん
2009/08/18(火) 15:52:20Effective C++を読んでいて、ユーザー定義型と基本型での動作が異なる
ということが疑問だったのです。
0400デフォルトの名無しさん
2009/08/18(火) 15:58:48異なってねーよ
0401デフォルトの名無しさん
2009/08/18(火) 16:01:53みなさんありがとうございました。
0402デフォルトの名無しさん
2009/08/18(火) 16:06:53参照に限っては参照先の内容をコピーするような実装を要求するのはおかしくね?
そうしたければ自分で書きなよ、というのは素直な流れじゃないかなあ
0403デフォルトの名無しさん
2009/08/18(火) 16:08:25なんでそんなに上から目線なんだ?
そして、>>363のレスで「理解できた」と言っているのに、なぜ今度は「初期化」だの「代入」だのは関係ないとか騒いでるんだ?
0404デフォルトの名無しさん
2009/08/18(火) 16:14:10>378の説明が全てだろ
参照先がコピーされるのならともかく、参照先の内容がコピーされるとか勘弁してくれ
0405デフォルトの名無しさん
2009/08/18(火) 16:17:37オブジェクトの寿命管理がすごく面倒そうだけど。
0406デフォルトの名無しさん
2009/08/18(火) 16:20:49元の質問はつまり、下の例でなんでFooは代入演算子が自動生成されるのにBarは違うんだ?ってことだろ
struct Foo {
int n;
Foo(int i) : n(i) {}
};
struct Bar {
int& n;
Bar(int& i) : n(i) {}
};
int main()
{
int i = 123, j = 456;
Foo foo1(i), foo2(j);
Bar bar1(i), bar2(j);
foo1 = foo2; /* operator=が自動生成されるので代入できる */
bar1 = bar2; /* operator=が自動生成されないので代入できない */
}
それで>>387でなっとくしてんだろが。
0407デフォルトの名無しさん
2009/08/18(火) 16:23:22だれが質問者でだれが回答者なのかわからねえよw
0408デフォルトの名無しさん
2009/08/18(火) 16:26:37それに対する答えが、何度も書かれてるじゃないか
そして
foo1.n = foo1.n;
bar1.n = bar2.n;
この二つの意味する内容がまったく違うのに、何度も同一視しようとするから「参照を理解してないだろお前」と言われるんだ
「参照先がコピーされればいいのに」ならまだ分かるが、なんで「参照先の内容がコピーされる」なんて馬鹿な考え持つんだ。
インスタンスの「代入」の意味がわかってないと疑われる理由がそれだ。
0409デフォルトの名無しさん
2009/08/18(火) 16:32:02P30みても何の解決にもならないんだけどどうしましょう
0411デフォルトの名無しさん
2009/08/18(火) 16:41:09俺もおんなじこと考えてたw
45項の間違いじゃねーかなw
0412デフォルトの名無しさん
2009/08/18(火) 16:48:35物わかりが異常に悪いのも含めて、釣りだったのかと。
0413デフォルトの名無しさん
2009/08/18(火) 17:01:57すっきりしたwww
ありがとう〜〜
0414デフォルトの名無しさん
2009/08/18(火) 17:09:13第2版と第3版で書いてある場所が違うのだ。
第3版はテンプレートの話がかなり増えたので
全体の構成がかなり変わっている。
で、2版の45項は3版の5項に移行した。
0415別人です
2009/08/18(火) 17:13:11でもまあ要らないか。
0416415
2009/08/18(火) 17:14:22○でもまあもう解決したようなので開く必要はないか。
Scott Meyers大先生に恐れ多いことを言ってしまった。
0417デフォルトの名無しさん
2009/08/18(火) 22:03:53HogeがFugaへの参照を持っています
Hogeの持つ参照にメンバの所有者の参照を渡して初期化したいのですが
コンストラクタ初期化子にthisを渡すと警句が出てきます
これを安全に初期化する方法はありますか?
0418デフォルトの名無しさん
2009/08/18(火) 22:43:17これを守った上で、警告を明示的に抑制し、その旨をコメントに残しておく。
警告の抑制が気に食わない場合は、あきらめてポインタを使う。
0419デフォルトの名無しさん
2009/08/18(火) 23:12:18含んだ DLL って、どうすればコマンドラインから作れますか?
X:\> cl -c -EHsc hoge.cpp
X:\> cl /LD /DLL -o hoge.dll hoge.obj
として作ってみたのですが、dumpbin /exports hoge.dll では
まったくシンボルがエクスポートされておらず、現在クラス内の
メソッドに一つ一つ __declspec(dllexport) を付けて回ってようやく
エクスポートされている状態です。
しかし可視性はC++なのでpublic/privateで制御できてる訳で、
せめてクラスに対して1つだけ指定すればクラス内シンボルは
public/privateの指定に従って制御できないかと思うんですが、
何か方法があるでしょうか?
0420デフォルトの名無しさん
2009/08/18(火) 23:21:35class __declspec(dllexport) MyClass {...
でできへん?
0421デフォルトの名無しさん
2009/08/18(火) 23:42:59うぉ、でけた!
__declspec(dllexport) void hogefunc(...) { ...
と付けていた流れで
__declspec(dllexport) class MyClass { ...
とやって怒られてorzしてた所だった。豚々トンクス。
0422デフォルトの名無しさん
2009/08/19(水) 00:14:30今更だけど……。
http://msdn.microsoft.com/en-us/library/ms693342(VS.85).aspx
0423デフォルトの名無しさん
2009/08/19(水) 00:15:240424デフォルトの名無しさん
2009/08/19(水) 00:19:11速度を計測してみると、
1000回実施
アロケータ : 0.453sec
newとdelete : 0.484sec
1000回で31ミリ秒って速いのでしょうか?
比べるものがないのでよくわかりません。
0425デフォルトの名無しさん
2009/08/19(水) 00:21:320426デフォルトの名無しさん
2009/08/19(水) 00:22:230427デフォルトの名無しさん
2009/08/19(水) 00:23:17ありうるよ
0428デフォルトの名無しさん
2009/08/19(水) 00:27:010429デフォルトの名無しさん
2009/08/19(水) 02:56:51コンパイラやIDEによっても違ってくると思うけど、それぞれに一般的な方法ってある?
0430デフォルトの名無しさん
2009/08/19(水) 03:03:00わざわざ逆アセンブルしたのを見なくても、普通はコンパイラからアセンブリの段階の
リストを出力できるようになっている。
0431デフォルトの名無しさん
2009/08/19(水) 03:47:14言われてコンパイルオプションを探してみたら確かにあった。
VCの一覧だとリスティングファイルとしか書かれてないから気付かなかったよ…
ともあれサンクス。
0432デフォルトの名無しさん
2009/08/19(水) 14:48:30staticなCRITICAL_SECTIONをメンバに持たせているわけですが
こんどクラスAとは全く関係ないクラスBも同時に排他する可能性が出てきたため
これまでの方法だと不都合になってきました。
こういう場合はどうCRITICAL_SECTIONを利用するのが良いでしょうか・・・
0433デフォルトの名無しさん
2009/08/19(水) 14:58:20・A、Bとは別にCSのみのクラスを作り、ABインスタンス生成時に渡す
・AかB片方にCSを持たせ、持たないほうの生成時に持つほうを引数で渡す
0434デフォルトの名無しさん
2009/08/19(水) 16:01:58ただこの方法だとAとBでCRITICAL_SECTIONが同一とは保証されないからバグのもとになるかも?
0435デフォルトの名無しさん
2009/08/19(水) 16:12:17Aのみ利用の排他群
Bのみ利用の排他群
A,B 両方とも利用の排他群
0436デフォルトの名無しさん
2009/08/19(水) 16:35:560437デフォルトの名無しさん
2009/08/19(水) 17:01:46A,Bのインスタンスのコピーを返してくれて
それをclientで操作した後にfacadeに渡すとそのデータを用いて更新してくれる
丁度RCSのclone, commit操作みたいなやつがいいと思う
こういうのって何パターンって言うんだっけ…
0438デフォルトの名無しさん
2009/08/19(水) 18:41:58for(i=0;i<10;i++){
{//block 1
}//end of block1
}//end of for (i)
とかしてるけど。
0439デフォルトの名無しさん
2009/08/19(水) 19:13:20…なぁ、begin〜end とか if〜endif とかいう文化があ
る中で、何故 C は {} を採用したか考えたことある?
0440438とは別人だけど
2009/08/19(水) 19:26:50何で?
字下げスタイル - Wikipedia
ttp://ja.wikipedia.org/wiki/%E5%AD%97%E4%B8%8B%E3%81%92%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB
0441デフォルトの名無しさん
2009/08/19(水) 19:31:59別画面で確認したり光らせたりするエディタマクロ書けばいい話
0442デフォルトの名無しさん
2009/08/19(水) 19:54:11エディタを使わない方がもっと良い。
0443デフォルトの名無しさん
2009/08/19(水) 20:28:520444デフォルトの名無しさん
2009/08/19(水) 20:34:16そんな自分でマクロを書かなきゃいけないような…(ry
0445デフォルトの名無しさん
2009/08/19(水) 20:38:19何でって、そのwikiのページにも書いてるじゃない。
>しかし、この方法では同じコードをソース内の2ヶ所に記述しているため、修正を行う際に問題となる。
0447デフォルトの名無しさん
2009/08/20(木) 17:10:59class Hoge : public Base
{
virtual void test()
{
Base::test();
}
};
と書くことで、親のtest()を呼び出すことが可能なのは良いのですが、
「自分の1つ親」を表すキーワードなどはないでしょうか?
時々継承元を、派生形のものに変えた際、
class Hoge : public BaseEx
{
virtual void test()
{
Base::test();
}
};
と変え忘れてしまい、バグの元になってしまっているのです。
0448デフォルトの名無しさん
2009/08/20(木) 17:18:19C++規格策定の段階ではderivedというキーワードが実は存在したらしい。
が、「typedef Base derivedでいーじゃん」の一言により撤廃されたらしい。
0449デフォルトの名無しさん
2009/08/20(木) 17:30:32仕方ないのでマクロでも使うことにします
#define ParentClass Base
class Hoge : public ParentClass{
virtual void test()
{
ParentClass::test();
}
}
美しくないですねー。
undefしてやらないと、他に影響を与えてしまいますし。
0450デフォルトの名無しさん
2009/08/20(木) 17:31:04ことが多いようですが、そう考えると予約語のinlineはどんな時
に書くのが有効なんでしょうか。
0451デフォルトの名無しさん
2009/08/20(木) 17:42:49それを読んだ人間に伝えたいとき
0452デフォルトの名無しさん
2009/08/20(木) 17:42:56その理解レベルなら、全く書く必要はありません。
0453デフォルトの名無しさん
2009/08/20(木) 17:43:24>ことが多いようですが、
「ヘッダファイルに実体を書いた」からインライン展開されるのではなくて、
クラス定義の内側に関数の実体を書くと暗黙にinlineがついているかのようにコンパイルされる。
したがって、クラス定義の外側に書いた関数については、必要ならば明示的にinlineを書く必要がある。
0454デフォルトの名無しさん
2009/08/20(木) 17:45:270455デフォルトの名無しさん
2009/08/20(木) 17:46:34その気持ちの悪いマクロって、typedefと何が違うの?
0456デフォルトの名無しさん
2009/08/20(木) 17:55:40inlineを書かないとリンクエラーになるとき。
0457デフォルトの名無しさん
2009/08/20(木) 18:04:33俺もそう思った。
むしろtypedefの方が良くないか?
0458デフォルトの名無しさん
2009/08/20(木) 18:06:47class Base {
public:
virtual void test() { printf("Base"); }
};
class Hoge : public Base {
typedef Base derived;
public:
virtual void test() { printf("Hoge"); derived::test(); }
};
class Huga : public Hoge {
typedef Hoge derived;
public:
virtual void test() { printf("Huga"); derived::test(); }
};
main() { Huga huga; huga.test(); }
0459デフォルトの名無しさん
2009/08/20(木) 18:09:480460デフォルトの名無しさん
2009/08/20(木) 18:14:10多重継承の時はどうなるんだろうね
0461デフォルトの名無しさん
2009/08/20(木) 18:36:18気持ち悪さに加え、悪影響を増やしたものだよな
0462デフォルトの名無しさん
2009/08/20(木) 19:00:360463デフォルトの名無しさん
2009/08/20(木) 19:15:24ttp://msdn.microsoft.com/ja-jp/library/94dw1w7x.aspx
同じ文意で区別がつかないときはエラーっぽいけど
0464デフォルトの名無しさん
2009/08/20(木) 21:08:050465デフォルトの名無しさん
2009/08/20(木) 21:42:51コンストラクタにderivedを明記しておくと、派生元を変えてtypedefを直さなかったらエラーになるから便利だよ
class Hoge : public fuga
{
typedef fuga derived;
public:
Hoge()
:derived()
{
}
virtual void test()
{
derived::test();
}
}
0466デフォルトの名無しさん
2009/08/21(金) 02:32:36クラス内の typedef だと、基底クラス変えたいときに2箇所いじることになるじゃないか。
0467デフォルトの名無しさん
2009/08/21(金) 08:52:31main(){
while(1){
printf("my-shell $ ");
if (fgets(input, sizeof(input), stdin) == NULL) { //コマンドの読み込み。
exit(0);
}
(コマンドの解析。長いので略)
(fork実行)
if ( pid == 0){
(子プロセス、コマンドのexec。)
}
else{
(親プロセス)
sigaction(SIGTTOU, &all_act, NULL); //シグナルハンドラは何もしない。実質無視。
sigaction(SIGTTIN, &all_act, NULL); //これも。
setpgid(pid, pid); //子プロセスのpgidを変えて、
tcsetpgrp(STDOUT_FILENO, pid); //それをフォアグラウンドに。
waitpid(-1, &status, 0);
}
}
}
おおよそ上のようなコードを書いたのですが、一回目のコマンド実行はうまくいくのですが、
ループの先頭に戻って2回目にfgetsが呼ばれると、なぜか何も入力していないのにEOFを読み込み、exit(0)でシェルが終了してしまいます。なぜこのような動作をするのでしょうか?
シェル自身がバックグラウンドプロセスになっているせいなのでしょうか?
0468デフォルトの名無しさん
2009/08/21(金) 09:19:26#undefを末尾に書くのも良いのですが、漏れなどが怖いので
0469デフォルトの名無しさん
2009/08/21(金) 09:21:47パイプ通すのに stdin を dup した場合って
dup元の stdin は、それ以降無効になったような気が…
0470デフォルトの名無しさん
2009/08/21(金) 09:22:141) そのソースの先頭に書く
2) #ifdefで制御する
0471467
2009/08/21(金) 09:37:01返信ありがとうございます。でもパイプを使わない簡単なコマンドでもダメなんですよね・・・
0472デフォルトの名無しさん
2009/08/21(金) 10:27:41複数のソースファイルで得たい場合でも、
どれかひとつのソースのみに
記述すればいいのでしょうか。
0473デフォルトの名無しさん
2009/08/21(金) 11:07:01ソースに書いたとしても、そのソースでヘッダをincludeしていた場合、そっちのヘッダにも適用されてしまいますよね。
ifdefで制御というのはよくわかりませんでした。どんな感じでしょうか。
また、ヘッダで使いたいと考えています
0474デフォルトの名無しさん
2009/08/21(金) 11:11:48ヘッダー名はhoge.hと仮定
有効にしたいマクロを下記の感じで囲う
#ifdef MAC_ON
#define hogehoge 10000000
#endif
で有効にしたいソースで下記のように記述
#define MAC_ON
#include "hoge.h"
有効にしたくないソースだと
//#define MAC_ON これを入れない
#include "hoge.h"
0475デフォルトの名無しさん
2009/08/21(金) 11:15:01すいません。こちらが利用意図を正しく伝えられていないみたいです。
改めて説明させていただきます
hoge.h---------
#define POWER 1
class Hoge
{
};
--------------
こんな感じでやる時、このヘッダファイルの中でのみPOWERマクロを有効にしたいのです。
他ヘッダや、hoge.hをincludeするCPPなどには影響を与えたくないのです。
全て末尾でundefする方法もあるのですが、数が多い時に困りそうです。
0476デフォルトの名無しさん
2009/08/21(金) 11:18:20#undef 忘れを警戒するぐらいなら、そもそもマクロを使わないで済まないか
よく考えたほうがいいんじゃないかなぁ。
0477デフォルトの名無しさん
2009/08/21(金) 12:27:55VC++とかの#pragma comment(lib, ...)のこと?
これに関しては、リンク時に働くものなので、
1つのソースにしか書かなくても一緒にリンクするものすべてに影響が及ぶよ。
0478デフォルトの名無しさん
2009/08/21(金) 12:34:21class 内で static const int とか
0480デフォルトの名無しさん
2009/08/21(金) 12:51:38#define enable_macro (
#define POWER enable_macro 1)
#undef enable_macro
#undef POWER
0481デフォルトの名無しさん
2009/08/21(金) 13:20:09継承元が変わった場合
やっぱり最低限2か所書き変えるしかないんですかね?
0482デフォルトの名無しさん
2009/08/21(金) 16:02:40class Base {
protected:
typedef Base base_type;
void f() { cout << "Base" << endl; }
};
class BaseEx: public Base {
protected:
typedef Base base_type;
void f() { cout << "BaseEx" << endl; }
};
class Derived: public BaseEx {
public:
void f() { base_type::f(); }
};
0483デフォルトの名無しさん
2009/08/21(金) 16:17:07BaseExの中のtypedef、さっそくタイプミスしてません?
0484デフォルトの名無しさん
2009/08/21(金) 17:51:300485467
2009/08/21(金) 22:01:540486デフォルトの名無しさん
2009/08/21(金) 22:16:220487デフォルトの名無しさん
2009/08/21(金) 22:18:40_exit()にしてるか?
0488デフォルトの名無しさん
2009/08/21(金) 22:20:32http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC6
つーか、俺、Windows以外はほとんど知らないからあてずっぽだけどな。
0489467
2009/08/21(金) 22:36:31_exit()にしてみましたが状況は変わらないみたいです・・・
fgetsの前にstdinをfflushしてみたりしてもダメでした。
0490デフォルトの名無しさん
2009/08/22(土) 00:58:59クラスみたいに使い回しができるんですか?
0491デフォルトの名無しさん
2009/08/22(土) 02:03:23そうです。いろんなプログラムから使い回しができます。
0492デフォルトの名無しさん
2009/08/22(土) 02:24:50文字列同士のマッチング処理を行う必要があるとします。
その際、検索に引っ掛かりやすいよう、両方の文字列を正規化したいと考えています。
また、条件として
・マッチングする文字列は両者ともShift_JIS。半角英数から記号、漢字まで様々な種類の文字が入力される。
・ここでいう正規化とは、一部記号の消去や、全角/半角、ひらがな/カタカナ、大文字/小文字の統一などを指す。
・言語はC++。自分の習熟度は低め。(ちょうどEffectiveC++が面白いくらい)
・環境はWindows2000以降を想定。最終的にはDLLファイルとして出力する。
とします。
Unicode(のどれか)に変換しつつ、Boostの正規表現で置換できるかなー、と
初心者ながらに考えてみたのですが、いざ実装しようとすると思ったよりもコード量が多くて驚きました。
(Perlの文字列処理能力ってすげぇんだなあと改めて実感)
もし「こうやるのが定番」とか「遠回りしすぎ!」というのがありましたら、よろしくお願いします。
0493デフォルトの名無しさん
2009/08/22(土) 15:12:07これってどういう意味ですか?
コロンとC++でググっても見つからなくて・・・
0494デフォルトの名無しさん
2009/08/22(土) 15:15:080495デフォルトの名無しさん
2009/08/22(土) 15:41:56ありがとうございます
なんというど忘れ…
0496デフォルトの名無しさん
2009/08/22(土) 15:52:520497デフォルトの名無しさん
2009/08/22(土) 16:34:44ど忘れ・・・?
プライド高いな
0498デフォルトの名無しさん
2009/08/22(土) 16:56:31昔見た事あるはずなのに、完全に忘れていた自分への失望も込めて書いたつもりでしたが。
何かお気に障ったのなら申し訳ないです。
0499デフォルトの名無しさん
2009/08/22(土) 17:05:24別に気にするな。
そんなの気にしてたら2chなんてやってらんない。
0500デフォルトの名無しさん
2009/08/22(土) 17:20:07( ^ω^)え?なになに?あーそれ知ってたお
>>501-1000
( ^ω^)あー、アレねアレ。確かアレだよね
0501デフォルトの名無しさん
2009/08/22(土) 20:04:55あるオブジェクトAがあって、Aのオブジェクトの内部ではメインスレッドかどうかで処理をわけたいのですが、メインスレッドかどうかを判定する方法がなく困っています。
フレームワークのようなものを作っていて、WinMain到達後にGetCurrentThreadIdをしてメインスレッドのIDをキャッシュしておく、という方法は取れるのですが
このオブジェクトが、グローバル変数などのWinMainより先にコンストラクトされて走ったコンストラクタのコード上でCreateThreadされ、そのスレッド中で使われてしまうと、もはや判定しようがありません。
なにか、ダイレクトにメインスレッドかどうかを判定する方法はないのでしょうか?
たすけて・・・
0502デフォルトの名無しさん
2009/08/22(土) 21:54:20ここらへん?
0503492
2009/08/22(土) 22:28:33移植性などを考えるとあまり良い方法では無いのかもしれませんが、LCMapString で何とかなりました。
0504デフォルトの名無しさん
2009/08/22(土) 23:51:20ありがとうございます。
そこにも書いてあるのですが、Thread32Firstを用いたときに、最初に取得できるスレッドがメインスレッドなのかどうかということがMSDNのドキュメントで確約されているものを見つけることができませんでした。
たぶん、平気だろう、ではできそうなものですが、安全性を考えると正直、つらいかなと思っています。
また、システム中すべてのスレッドを列挙するとなると、コスト的にも少々見過ごせないという思いもあり、だったらしょうがないですが、ユーザになんらかの制約を求めるほうがいいかなと思いました。
ということで、うまい解決方法がさっきからいくら探してもでてこないので、あきらめようかと思っています。
情報、ありがとうございました。
0505デフォルトの名無しさん
2009/08/23(日) 00:04:13クラスの中で渡すと下記のエラーが発生してしまいます。
"演算子 '%' は、値型または ref クラスのインスタンスにのみ適用できます"
このエラーを回避するためにはどのようにすればいいでしょうか?
おk:
main(){
A^ a;
B^ b;
b->(%a);
}
マズー:
ref class Z{
A^ a;
B^ b;
b->(%a);
}
0506デフォルトの名無しさん
2009/08/23(日) 00:10:38C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/
0507デフォルトの名無しさん
2009/08/23(日) 00:13:33thank you for your kind advice :-)
0508デフォルトの名無しさん
2009/08/23(日) 02:22:41自分なら、ユーザにこのスレッドをメインスレッドとするとフレームワークに登録させる仕組みにするかな。
そもそもWindowsにはメインスレッドという概念は存在しない。
GetMessageするスレッド?ウィンドウを作るスレッド?
どっちもただ1つのスレッドでやるなんて決まりはないよ。
必要とあれば、複数のスレッドで行って全然問題ないし、実際そうすることもある。
0509デフォルトの名無しさん
2009/08/23(日) 02:39:490510デフォルトの名無しさん
2009/08/23(日) 07:40:20どうかどうかツールを作っていただけないでしょうか。
もはや風前の灯状態のスレを救ってやってください。
yahooきっずで先生1位にして教育委員泣かそうぜwww
http://yutori7.2ch.net/test/read.cgi/news4vip/1250954051/
0511デフォルトの名無しさん
2009/08/23(日) 13:55:59Coding Standards
Effective STL
Modern C++ Design
あたりで迷ってるんだけど
0512デフォルトの名無しさん
2009/08/23(日) 13:59:490513デフォルトの名無しさん
2009/08/23(日) 17:04:15旧型PS3:
Linuxインストール機能内蔵でPS3をPCとして使うことができる。
また、Cellの開発ツールも無料で入手できるので自分でCellのプログラムを作ってみることができる。
ビットストリーム出力はドルビーデジタルPlus、dts-HDのみ対応。
HDD80G
薄型PS3:
Linuxインストール機能は提供されない。
ブラビアリンク機能でブラビアと連動した電源のON OFFができる。
ドルビーTrueHDのビットストリーム出力対応。
HDD120G
比較して低騒音低発熱
0514デフォルトの名無しさん
2009/08/23(日) 17:39:54何?
誤爆?
0515デフォルトの名無しさん
2009/08/23(日) 20:05:350516デフォルトの名無しさん
2009/08/23(日) 20:07:390517デフォルトの名無しさん
2009/08/23(日) 20:21:43Boost.Bimapみたいなの?
0518デフォルトの名無しさん
2009/08/23(日) 20:22:570519デフォルトの名無しさん
2009/08/23(日) 21:08:01簡単にいうとkeyに重複無し、valueにも重複無しなマップです
0520デフォルトの名無しさん
2009/08/23(日) 23:11:40無闇に英単語を織り交ぜて、俺ってかっこいー精神とかわらんな
0521デフォルトの名無しさん
2009/08/23(日) 23:14:00std::map を二つ使えばいいよ
0522デフォルトの名無しさん
2009/08/23(日) 23:24:260523デフォルトの名無しさん
2009/08/23(日) 23:27:58普通に大学で勉強していれば全単射くらい知ってるだろう
全単写はしらんが
0524デフォルトの名無しさん
2009/08/24(月) 00:00:100525デフォルトの名無しさん
2009/08/24(月) 00:17:36これ常識
0526デフォルトの名無しさん
2009/08/24(月) 00:26:25あぁ。
0527デフォルトの名無しさん
2009/08/24(月) 00:34:010528デフォルトの名無しさん
2009/08/24(月) 01:33:320529デフォルトの名無しさん
2009/08/24(月) 01:51:580530デフォルトの名無しさん
2009/08/24(月) 02:16:59まさかkeyとvalueを交換したのを2つ作って2回代入するのか?
0531デフォルトの名無しさん
2009/08/24(月) 02:33:15全単射という言葉くらいは常識かと。知らない方がはずかしい、とは感じないのですか?
0532デフォルトの名無しさん
2009/08/24(月) 04:06:49結局、自分はその言葉しか知らない無知ですって言ってる様なもんだろ。
0533デフォルトの名無しさん
2009/08/24(月) 04:12:04× 俺様に合わせて
0534デフォルトの名無しさん
2009/08/24(月) 04:21:32そんな常識的な事も分からないなんて恥ずかしいと思わないんですか?
はい、解決。
0535デフォルトの名無しさん
2009/08/24(月) 05:12:230536デフォルトの名無しさん
2009/08/24(月) 07:02:360537デフォルトの名無しさん
2009/08/24(月) 07:26:13これは知らなかった
0538デフォルトの名無しさん
2009/08/24(月) 07:33:39ないない
グーグル先生ですら全単写をしらないからw
全単写と書いちゃうってことはまともに聞いてなかったんだろ
0539デフォルトの名無しさん
2009/08/24(月) 09:11:21逆写像が必要なら、それが一番楽な方法だと思うが。
0540デフォルトの名無しさん
2009/08/24(月) 09:28:09mapとset使えば良いのじゃないか。
map<key,val> m;
set<val> s;
//値の重複チェック
if( (s.insert( v )).second ) {
//無ければmapに追加
m.insert( piar<key,val>(k, v) );
}
値のサイズがでかくて2重に持つのが勿体無いなら、
値は別なコンテナに入れて、set<val*>とか
set<値コンテナのインデックス>とかで
それら用のコンパレータ使うとか。
0541デフォルトの名無しさん
2009/08/24(月) 10:08:280542デフォルトの名無しさん
2009/08/25(火) 05:49:11コンソールアプリケーション勉強してどんなことまで出来ますか?
ブロック崩しとかシューティングとか2Dのゲーム作れますか?
エロい人教えて><
0543デフォルトの名無しさん
2009/08/25(火) 05:58:54でもグラフィック使うならdirectxなんか使うべきだろうね。複雑さやグラフィック性能考えればね。
コンソールアプリの修行をしたいって言うんならそれでもいいと思うけど
0544デフォルトの名無しさん
2009/08/25(火) 06:46:38柴田望洋って人の明解C言語シリーズを読んだ後に明解C++を読んでるんですが、
重複する内容が多くて挫折しそうです。それとも重複を覚悟で最後まで読んだ方がいいんですかね?
0545デフォルトの名無しさん
2009/08/25(火) 09:32:05この手の本はただ読めばいいもんじゃないんだから、重複する分は復習になるだろう。
まぁ、読んだだけで理解した気になりたいってのなら挫折するのも判らんではないが。
0546デフォルトの名無しさん
2009/08/25(火) 09:43:28あとAccelerated C++はCの知識のあるなしに関わらず使えるだろう
0547名無し学生
2009/08/25(火) 10:48:54誰かお答えください。本当に助けてください。
1.Visual Basicの関数で数値を文字に直すCStr()とStr()の違いについて
2.戻り値の違いが確認できる方法を考え、戻り値の違いについて実際に確認し、
その確認方法と違いを具体的に述べよ。
注意:実際にやったことと、確認した違いを簡潔かつ具体的に書くこと。
3.下記の計算結果などから、Visual Basicで計算できる数値の桁数について考察をまとめ、
何故そのような制限があるかについて理由を答えよ
1) 48 x 100 - 81
2) 12 ÷ 9.3 x 247
3) 0.2 - 12 ÷ 69
4) -12 ÷ 100 + 100
0548デフォルトの名無しさん
2009/08/25(火) 10:51:27スレチ
0549デフォルトの名無しさん
2009/08/25(火) 11:37:18linuxのファイル操作について質問です。
例えばlinuxコマンドのCPであるファイルを別のディレクトリ
にコピーしたとして、fopenでコピー最中のファイルを開け
てしまいますよね?ここでコピーが終わるまでfopenが失敗
するようなロックをかける事は可能でしょうか。
ご教授お願いします。
0550デフォルトの名無しさん
2009/08/25(火) 11:56:000551デフォルトの名無しさん
2009/08/25(火) 12:06:050552デフォルトの名無しさん
2009/08/25(火) 12:30:42cpはflock()なんて感知していないから無理。
そもそも、コピー中のコピー元ファイルを開いて何の問題があるのだろうか。
0553デフォルトの名無しさん
2009/08/25(火) 12:39:15w
0554デフォルトの名無しさん
2009/08/25(火) 19:06:59以下のようにUTF-16の4バイト文字を描画しようとすると文字化けしてしまいます。
TextOutW(hdc,x,y,_T("𡚴"),2);
DrawTextW(hdc,_T("𡚴"), 2, &rect, 0);
なにかいい解決方法はないでしょうか。
よろしくお願いします。
0555554
2009/08/25(火) 19:09:13すみません。
0556デフォルトの名無しさん
2009/08/25(火) 20:42:120557デフォルトの名無しさん
2009/08/25(火) 21:03:26試してみた
Vista32bitなので若干環境違うけど、TextOutW で表示はできてるっぽい
APIの問題じゃなくて、フォントが対応してないってことはないかな?
Vistaならメイリオのフォントを明に指定して描画してみたらどうなる?
0558554
2009/08/25(火) 23:00:39文字コードのせいだと思い込んで、フォントのことを忘れていましたorz
0559デフォルトの名無しさん
2009/08/26(水) 05:55:12Visual C++と普通のC++って別物ですか?
Visual Studioで作ったものをNetBeansにコピペしても動くものなのですか?
0560デフォルトの名無しさん
2009/08/26(水) 06:10:48それらを使わなければコピペで動く。
0561デフォルトの名無しさん
2009/08/26(水) 07:59:01ググっても入門レベルじゃわかんなかったので助かります。
VC++だとWindows上でしか動かないんじゃないかと心配してました。
(万能求めるならJavaとかかもしれませんが…^^;)
0562デフォルトの名無しさん
2009/08/26(水) 09:09:25yes
0563デフォルトの名無しさん
2009/08/26(水) 09:14:05VC++のVに依存するコードを書かなければ、他の開発環境のツールとしても使える
ハックできるゲーム機の非公式開発のツールとしても使われてるね
0564デフォルトの名無しさん
2009/08/26(水) 09:19:21半端な回答乙。
>>561
基本的に、GUIはWindows依存。
問題は、それ以前にNetBeansはC++開発環境*ではない*と思うのだが。
NetBeansで開発するとすると、大抵はJavaで最近ではRubyやPython辺りってとこじゃないかと。
0565デフォルトの名無しさん
2009/08/26(水) 09:22:580566デフォルトの名無しさん
2009/08/26(水) 10:32:45最初はNetBeansでJavaやってみようと思ったのですが、
エラーがゲリベンのごとく出てくるので断念しました。
とりあえずVisual Studio C++やってる感じッス。
今の自分にはLinuxやらMacやらに対応させるなんてのは無縁だと思うんで、
しばらくVC++やっておきます。
0567デフォルトの名無しさん
2009/08/26(水) 10:34:02> 基本的に、GUIはWindows依存。
ここがもう分からない
0568デフォルトの名無しさん
2009/08/26(水) 10:39:140569デフォルトの名無しさん
2009/08/26(水) 10:39:44エスパーじゃないので、何が分からないのかを書け
0570デフォルトの名無しさん
2009/08/26(水) 10:53:020571デフォルトの名無しさん
2009/08/26(水) 10:56:20鬱陶しいからNetBeansでJavaやっとけ。二度とくんな。
0572デフォルトの名無しさん
2009/08/26(水) 11:26:49(・з・)キニスルナ!
VC++ に含まれるコンパイラは GUI がどうとか以前に
・プロセッサは IA-32/64。
・CランタイムおよびCスタートアップは Windows 用。
・そもそも .exe 形式。
なので、作った実行形式ファイルは 非 Windows 環境では動かない。
0573デフォルトの名無しさん
2009/08/26(水) 13:05:24脇道:
MSDOS で起動すると this program cannot be run in DOS mode. って出るんじゃなかったっけ?
(ま、アプリケーションがメモリにロードしきれるかどうか微妙だけど)
0574デフォルトの名無しさん
2009/08/26(水) 13:12:02出力できるようになってるのかね?
0575デフォルトの名無しさん
2009/08/26(水) 13:19:44EXEファイルの仕様でWindows実行ファイルの先頭部分はDOS実行ファイルになっている。
そして、その中身は標準だと>>573の言うようなプログラムというわけ。
もちろん、予めバイナリを用意しているだけなので、今のVCが16ビットコンパイラなどを持っているわけではない。
0576デフォルトの名無しさん
2009/08/26(水) 13:22:380577デフォルトの名無しさん
2009/08/26(水) 13:24:55intだってレジスタの拡大で昔とは違うんだし
0578デフォルトの名無しさん
2009/08/26(水) 13:36:290579デフォルトの名無しさん
2009/08/26(水) 13:40:12質問させてください
Visual C++ 2008 Express EditionでC言語の勉強をしているのですが、
strcmpという関数がうまく動きません。
原因を調べると、確保した配列が確保した以上のアドレスを参照しているようです。
char ary[5]で確保した配列2つを比較したいのですが、
例えば両方にappleという文字を代入してやってブレークで止めると、
1個目が"appleフフフフフフapple"
2個目が"appleフフフフフフフフフフ"
みたいな感じになってます
原因知ってるからがおられましたらよろしくお願いします
0580デフォルトの名無しさん
2009/08/26(水) 13:42:29ary[6]
でないと文字列終端の '\0' が入らないから
0581デフォルトの名無しさん
2009/08/26(水) 13:42:56ゼロ終端になっていない。
char ary[6];
ary[5] = 0;
にしないといけない。
0582デフォルトの名無しさん
2009/08/26(水) 13:43:110583デフォルトの名無しさん
2009/08/26(水) 13:47:45あぁ!
すっかり忘れてました。
ありがとうございます!
0584デフォルトの名無しさん
2009/08/26(水) 13:49:23そのままShiftJIISとして文字列表示すると"フフフフフ..."と笑われるのです
0585デフォルトの名無しさん
2009/08/26(水) 13:52:490586デフォルトの名無しさん
2009/08/26(水) 13:54:38てっきり元総理が入ってるのかと思った
0587デフォルトの名無しさん
2009/08/26(水) 14:03:55未初期化のメモリに実行が飛び込んでも止まるという安全弁
0588デフォルトの名無しさん
2009/08/26(水) 14:37:16デフォルト引数を上手く使えばなんとかなるかもしれない。
根本的な解決は次期C++かな。
0589デフォルトの名無しさん
2009/08/26(水) 14:41:260590デフォルトの名無しさん
2009/08/26(水) 16:19:23あの0xCCはそんな意味があったのか・・・
適当に選んだ値だと思ってた
そうするとx86以外のCPUじゃ意味ないんだな
ARMとか何がいいんだろう
0591デフォルトの名無しさん
2009/08/26(水) 16:22:33そんな危なっかしいソース書かなければいいだけだろw
x86じゃないCPUは1バイトコードじゃないのはガチだろうな
0592デフォルトの名無しさん
2009/08/26(水) 17:11:200593デフォルトの名無しさん
2009/08/26(水) 20:37:320594デフォルトの名無しさん
2009/08/26(水) 21:29:12バグで未初期化の領域を見てると、ゴミが入ってると
毎回挙動が違ったりしてデバグがしにくいんで、決まった値で
埋めておくって説も聞いたことがあるんで、もしそうなら、
ブレークポイントにならない適当な値でも意味はあるな。
0595デフォルトの名無しさん
2009/08/26(水) 23:22:411,000とかカンマを入れてくれる関数とかって存在しますか?
0596デフォルトの名無しさん
2009/08/26(水) 23:32:32intないし文字列で表された整数に,を入れて
文字列として返してくれる関数ってこと?
よく知らんが、まあ作っちゃえよ。
0597デフォルトの名無しさん
2009/08/26(水) 23:35:070598596
2009/08/26(水) 23:37:38C++で金額を3桁ずつコンマで区切る方法 - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1017537890
こんなところにコード片が。
中身は見てないから実装についてはしらんけどな。
0599デフォルトの名無しさん
2009/08/26(水) 23:58:01http://www.freeml.com/cppll_novice/1550/latest
0600デフォルトの名無しさん
2009/08/27(木) 07:37:360601デフォルトの名無しさん
2009/08/27(木) 12:01:460、1、2、3がそれぞれ上右下左に対応しています。斜めはありません。
これを時計回りに回転させた時に、0、1、2、3、0、1、2・・とすることはできますか?
bit演算をうまく使うとできそうなのですが、よくわかりません
それとも深く考えずに素直にifで3の時に右を向くと0、
0の時に左を向くと3、それ以外は時計回りで1加算、逆は減算・・としたほうが良いでしょうか
0602デフォルトの名無しさん
2009/08/27(木) 12:13:54angle = ( angle + x ) % 4;
多分こんな感じ
0603デフォルトの名無しさん
2009/08/27(木) 12:14:18左回りなら4を足した後、1を引いて、それを4で割ったあまり
0604デフォルトの名無しさん
2009/08/27(木) 12:22:48byte dir, hoge;
dir = 0;
hoge = dir & 3; //hoge = 0
++dir;
hoge = dir & 3;//hoge = 1
dir += 3;
hoge = dir & 3;//hoge = 0 dir = 4
0605デフォルトの名無しさん
2009/08/27(木) 12:37:230606デフォルトの名無しさん
2009/08/27(木) 12:43:47あまりを使うのでしたか、ありがとうございます。
bit演算も勉強になりました。ありがとうございました。
0607デフォルトの名無しさん
2009/08/27(木) 12:45:230608デフォルトの名無しさん
2009/08/27(木) 13:16:51なんだこの数字の塊わあああああああああああああああ
0609606
2009/08/27(木) 18:23:59しかし別の問題が浮上してきました。
現在MAPを二次配列で用意しています。
int map[3][4]={{2,12,0,4},
{0,5,4,13},
{0,3,11,9},
};
自分を表す位置は自分.xと自分.yで管理しています。
このようにある時、map[3]は縦、[4]は横幅になります
ですが一般的には縦はy、横はxが多いです。どちらにあわせるべきでしょうか?
とりあえずは自分が移動するときに、横に行きたいなら自分のy座標をずらし、
縦に動きたいならx座標をずらしています
>>601だと0の時にx--、1でy++・・となります
もしくはそうせずに、map情報を取得するときに
map[自分.y][自分.x]としたほうがよいでしょうか?
開発は趣味で一人でやっているので、他人が読むことはまずないと思います
できればミスが発生しにくいほうにあわせたいと思っています。よろしくお願いします。
0610デフォルトの名無しさん
2009/08/27(木) 18:33:42private: int data[3][4] = { ... };
public: int DataAt(int x, int y) { return data[x][y]; }// or return data[y][x];
};
と書いておいて、外からは常に同じように見えるようにする
0611デフォルトの名無しさん
2009/08/27(木) 19:52:16そんな方法があるのですね
ありがとうございます、やってみます
0612デフォルトの名無しさん
2009/08/27(木) 22:40:02範囲外アクセスでabortするようにして
参照にしたほうがよくね?
0613609
2009/08/27(木) 22:45:04mapクラスを作り、map型のF1を作り、メンバ関数DataAtの戻り値をcout・・と思ったのですが上手く動いてくれません
エラーは
1>d:\program files\vc\project\no\a.cpp(8) : error C2059: 構文エラー : '{'
1>d:\program files\vc\project\no\a.cpp(8) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます
1>d:\program files\vc\project\no\a.cpp(15) : error C2065: 'data' : 定義されていない識別子です。
で、コードは↓です。どこが違うのか本気で分かりません、助けてください!
#include <iostream>
using namespace std;
int main()
{
class map {
private:
int data[3][4]=
{
{2,12,0,4},
{0,5,4,13},
{0,3,11,9},
};
public:
int DataAt(int x, int y) {
return data[x][y];
}// or return data[y][x];
};
map F1;
cout <<F1.DataAt(2,3);
return 0;
}
0614デフォルトの名無しさん
2009/08/27(木) 22:48:420615デフォルトの名無しさん
2009/08/27(木) 22:49:320616デフォルトの名無しさん
2009/08/27(木) 22:50:49とりあえずクラスについて書いてあるところもう一回読んでみろ
0617609
2009/08/27(木) 23:01:26タブでインデントつけたら投稿するときに消えてしまいました
ttp://www1.axfc.net/uploader/Img/so/57296.jpg
>>615
環境はVC2008のC++です。
>>616
もう二時間ぐらい悩んでるんです・・何かヒントだけでもいただけると有難いです
もう一回読んできます・・
0618デフォルトの名無しさん
2009/08/27(木) 23:02:28そこで初期化をすることはできないとだけ…
0619デフォルトの名無しさん
2009/08/27(木) 23:10:30#include <iostream>
class map {
private:
enum { COLUMN = 3, ROW = 4 };
int data[COLUMN][ROW];
public:
map() {
int z[] = {
2,12,0,4,
0,5,4,13,
0,3,11,9 };
int* src = &z[0];
for (int i = 0; i < COLUMN; ++i) {
for (int j = 0; j < ROW; ++j) {
data[i][j] = *src++;
} } }
int DataAt(int x, int y) {
return data[x][y]; } };
int main() {
using namespace std;
map F1;
cout <<F1.DataAt(2,3);
return 0; }
0620デフォルトの名無しさん
2009/08/27(木) 23:11:36ありがとうございます!
やっぱり出来なかったので諦めます!
>>619
ありがとうございます!それいただきます!
0621デフォルトの名無しさん
2009/08/27(木) 23:12:47へぇ
0622デフォルトの名無しさん
2009/08/27(木) 23:15:05>>613専ブラでポップアップすりゃインデントが付くんだぜ
0623デフォルトの名無しさん
2009/08/27(木) 23:24:390624デフォルトの名無しさん
2009/08/27(木) 23:26:19 だな。
0625デフォルトの名無しさん
2009/08/27(木) 23:27:170626デフォルトの名無しさん
2009/08/27(木) 23:32:39見た目もインデントされるし、コピペしてもふつーの使えるコードになるし。
サイズの制限がきついけど。
よそにうpして、アドレス貼り付けとか情報が消えるし。
まあ、ログなんて誰もみないからそれは考えなくていいかな。
0627デフォルトの名無しさん
2009/08/27(木) 23:34:57切れんなよw
0628デフォルトの名無しさん
2009/08/27(木) 23:44:26相手が切れて見えるのは、自分の心理の投影だろう。
意味不明なことで切れる人っているな。
0629デフォルトの名無しさん
2009/08/27(木) 23:47:060630デフォルトの名無しさん
2009/08/27(木) 23:56:16なぜHogeならよくてPiyoだと駄目なんでしょうか
メンバー関数ポインタのアクセスレベルの問題だと思うのですが
具体的にどういうルールがあるのか教えてください
0631デフォルトの名無しさん
2009/08/27(木) 23:57:32すいませんアドレスこっちでした
0632デフォルトの名無しさん
2009/08/28(金) 00:16:41なんかあるのかと思ったけど、意味不明に煽ってるだけか。。。
まあ、>>623-624 の件に関しては今までそれ不便とかよくないとか言われたなかったし、そうだろうな。
0633デフォルトの名無しさん
2009/08/28(金) 00:34:58プログラムのコンストラクタ内でファイルオープンし、メイン内でファイルから一行読み出したいのですが、うまくいきません。
.isopenで調べてみると、コンストラクタ内ではOPENできてますがメインのほうだとCLOSEしてます。
ifstreamとはそういうものなのでしょうか。強制的にOPENしっぱなしには出来ないのですが?
0634デフォルトの名無しさん
2009/08/28(金) 00:39:10どこか他の関数で読もうとしてるだろ
ifstreamの参照を渡さないとcloseされるぞ
0635デフォルトの名無しさん
2009/08/28(金) 00:41:48どうやってifstreamインスタンスを渡してるの?
0636デフォルトの名無しさん
2009/08/28(金) 02:12:44他人のコードを見るときは常に俺スタイルにコンバートしてから読みますので何でもいいです(キリッ
0637デフォルトの名無しさん
2009/08/28(金) 02:22:46FILE構造体へのポインタを使うCの手法を使えばいいのだ。
これなら、一度開いたら、明示的に閉じない限り、
ファイル終了までずっと、プログラムのすべての場所からアクセス可能になる。
0638デフォルトの名無しさん
2009/08/28(金) 03:46:06リンク先に表示されてるエラーさえ取ればどっちでも通ったよ。
0639デフォルトの名無しさん
2009/08/28(金) 04:12:150640デフォルトの名無しさん
2009/08/28(金) 05:54:380641デフォルトの名無しさん
2009/08/28(金) 07:32:180642デフォルトの名無しさん
2009/08/28(金) 09:17:57void Test
{
int a = 0;
}
こんな関数があるとして、この関数内で動く別関数を定義したいと思います。
その際、int aにアクセスする方法はあるでしょうか?
ぱっと思いつくのはインラインクラスで
void Test
{
int a = 0;
struct Func
{
static void hoge()
{
//色々処理
}
}
}
なのですが、そとの a にアクセスすることができません。
hogeの引数に参照として渡すのも良いのですが、数が多いと厄介です。
何か良い方法はありますでしょうか?
可能ならマクロでは無い方法が良いのですが…
0643デフォルトの名無しさん
2009/08/28(金) 09:29:01具体的にはprintfをラップしてmy_printfを作りたいのです。
void myprintf (const char* s, ...)
{
printf (s, ...);
}
↑こういう事がやりたいです
0644デフォルトの名無しさん
2009/08/28(金) 09:44:39void Test {
struct Func {
int a;
};
}
0645デフォルトの名無しさん
2009/08/28(金) 09:46:51vprintf使う
0646デフォルトの名無しさん
2009/08/28(金) 11:34:53亀レスで申し訳ないが、すごく癒された。
ありがとう。
0647デフォルトの名無しさん
2009/08/28(金) 11:56:15外のaにアクセスする方法
と書いてあるが
0648デフォルトの名無しさん
2009/08/28(金) 13:01:05すいません、具体的にはどう修正すればいいんでしょうか
とりあえずtypenameを消したらコードパットのほうではコンパイルできました
しかし依然VC++EE2008ではエラーのままですFuga::f : private メンバにアクセスできません。と言われます
http://codepad.org/t9Ujbfeg
0649638
2009/08/28(金) 13:42:24試したのは gcc ね。 codepad でも gcc でも通るし、エラーも意味不明だから
VC++EE2008 のバグなんじゃないかと思う。
↓こっちで試して、まだエラーになるようならフィードバック出しとくといいかもね。
http://www.microsoft.com/japan/msdn/vstudio/2010/
0650デフォルトの名無しさん
2009/08/29(土) 01:19:07同等な機能を実現する方法ありませんか?
各パラメータを、静的メンバ変数でスイッチングすることを考えています
0651デフォルトの名無しさん
2009/08/29(土) 01:25:50というか、C++のclass-static変数は、名前空間とアクセス制御のあるグローバル変数みたいなものだし。
0652デフォルトの名無しさん
2009/08/29(土) 03:53:21と言う条件式を書いた場合
a > 0 は確実に b == 0 よりも先に判定されるんでしょうか?
最適化などで順序が変わったりしませんか?
0653デフォルトの名無しさん
2009/08/29(土) 04:10:07&& の両辺の式評価の間にはシーケンスポイントがあるので、左辺が先に判定される
ような結果になることが保証されている。
ただし最適化後のマシンコードレベルでは、結果に影響の無い範囲で実際の判定の
順序が入れ替わってたりすることはあるかもしれない。
0654デフォルトの名無しさん
2009/08/29(土) 04:18:13確実に評価順の規定通りだろうけどね。
0655デフォルトの名無しさん
2009/08/29(土) 07:59:08関数内で static な変数を宣言する。
この方法の場合、参照範囲が狭い点もメリットになる。
デメリットは、変数の参照に関数呼び出しが必要な点。
0656デフォルトの名無しさん
2009/08/29(土) 11:12:420657デフォルトの名無しさん
2009/08/29(土) 20:24:38ありがとうございました!
0658名無しさん@そうだ選挙に行こう
2009/08/30(日) 13:49:19const char * const str = "foo";
const size_t len = strlen(str);
とすると、len はコンパイル時に 3 として扱われるんじゃなくて、
(最初に1回だけか、もしかしたらlenが宣言されてる関数/スコープに入るたびか分かりませんが)
実行時に長さを計算するかもしれませんよね。
別にそのくらいいいじゃんって感じかもしれませんが、文字列とその長さをうまく定数で表現する方法はありますか。
0659名無しさん@そうだ選挙に行こう
2009/08/30(日) 13:54:56const size_t len = sizeof(str) / sizeof(str[0]) - 1;
0660名無しさん@そうだ選挙に行こう
2009/08/30(日) 13:56:29COMの初期化をすべてのグローバル変数に先立って(つまりWinMainよりも先に実行されうるコードよりもさらに先立って)行うために、
ヘッダファイルにconstグローバルオブジェクトを作成し、このオブジェクトのコンストラクタで行うのはどうかと考えました。
constグローバル変数は内部リンケージなので、このヘッダをインクルードしているコンパイル単位では、
毎回このオブジェクトがヘッダのインクルード時点で作成され、そのオブジェクトのコンストラクタが走ると考えたからです。
(多重に初期化されることについては、初期化状態を調べることで対応しました)
なので、コンパイル単位をまたいでいて初期化順序が不定でも、とにかくヘッダさえインクルードされれば、最初に初期化処理が走ってくれると思い、実際そのとおりに動いているのですが
プリコンパイル済ヘッダを通したときになにか挙動が妙なことに気がつきました。
プリコンパイル済ヘッダに、作成した初期化用ヘッダファイルを入れれば、各cppファイルでは先頭で必ずインクルードされるので、
ファイル毎に初期化オブジェクトが生成されるだろうと思いきや1度だけしかされません。(たぶんstdafx.cppに対応している)
僕はcppの個数分、呼ばれることを期待していたのですが、そうではないようでした。
ためしに、初期化用のconstグローバルオブジェクトにダミーのメソッドを持たせて、それをcppファイルからコールするようにしてみたところ、今度は初期化コードが使っているファイル数ぶん、走っているようでした。
このことから察するに、プリコンパイル済ヘッダというのは、#includeという「プリプロセスの動作そのもの」も、通常とは別物になる、ということなのでしょうか。
またこの場合、stdafx.cppに対応するコードが複数のコンパイル単位の中で最初に初期化されることが保障されるのでしょうか?
(つまり、初期化用オブジェクトが最初に呼ばれることを保障したい)
0661名無しさん@そうだ選挙に行こう
2009/08/30(日) 15:31:290662名無しさん@そうだ選挙に行こう
2009/08/30(日) 15:34:52けど660のせいで気になり始めた
0663660
2009/08/30(日) 17:39:51もっとも単純には
class Foo
{
public:
Foo(){ ::MessageBox(NULL, L"test", NULL, MB_OK); }
};
const Foo foo;
というコードを、通常のヘッダに書いたときは、それをインクルードするcppのファイル数分のtestというメッセージボックスが表示される
たとえば2つのcppがこのヘッダをインクルードしていたら2回メッセージボックスが表示される
この動作は、C++のデフォルトではconstグローバル変数は内部リンケージなので、コンパイル単位毎に生成されるという納得のいく動作
しかし、上記のコードをプリコンパイル済みヘッダ、ようはstdafx.hに書いたときは1度しか呼び出されない
この違いはいったいなに?
ということです。
0664名無しさん@そうだ選挙に行こう
2009/08/30(日) 17:44:050665660
2009/08/30(日) 18:05:00僕が何かとんでもない勘違いをしているのでなければ、プリコンパイルというのは
毎回ヘッダを読み込んで解析したりしてるとはんぱねえ時間がかかってしまうから
プリコンパイル済ヘッダを利用してコンパイル時間を短くするもん、だと思っていました
そう仮定すると、pchには解析後の結果が入っていて、stdafx.hのinclude時に使う。
だから、コンパイルにかける時間が少なくなってコーヒー飲む時間が減る。
動作としては普通のヘッダだけど、先に解析しておいて保存しておいただけだよ
と、そういうものを期待していました(今までは)
しかし、今回のような内部リンケージのオブジェクトになるはずのものが、まるでなかったかのようになってしまうのはなぜなのか
かといって外部リンケージになっているわけでもない。1度でもそのオブジェクトを(コンパイル単位で)利用するようなコードが入っていると、そのオブジェクトはコンパイル単位で初期化される
意図的に、触られないオブジェクトは排除されている、つまり単なるヘッダのincludeとは明らかに挙動が違う
しかし、今回のような件、COMの初期化にコンストラクタを利用したいような場合においては、直接は触ってないけど実行してくれなくては困る。
普通にincludeするとOKだけどプリコンパイル済ヘッダとしてincludeするとだめだよ、なんて酷い……
普通に考えると意図しない挙動だと思うのですが、これって、そういうもの?って納得するしかないんでしょうか。
(あとはstdafx.cppに対応するコードの初期化タイミングが必ず最初であるのか、そうでないのか、つまり普通のcppの規則と同じコンパイル単位をまたいだ時は不定、なのか、というのが気になります)
0666名無しさん@そうだ選挙に行こう
2009/08/30(日) 19:11:12コンストラクタの走るような型の定数をヘッダで定義するのは稀なケースだろうから、
VC++ のバグなんじゃないかと思う。
↓こっちで試して、まだ不可解な動作になるようならフィードバック出しとくといいかもね。
http://www.microsoft.com/japan/msdn/vstudio/2010/
0667デフォルトの名無しさん
2009/08/30(日) 22:44:21これはアマチュアレベルを超えてるな
0668デフォルトの名無しさん
2009/08/30(日) 22:50:07実行速度にして3倍以上の差が出ると占い師も言ってるからね。
0669デフォルトの名無しさん
2009/08/30(日) 23:11:45_begintheadExがある。スレッドプールの実装も簡単にできる。
既存のライブラリを使いたければboostにスレッドプールがある。
0670デフォルトの名無しさん
2009/08/30(日) 23:13:11Win32システムプログラミングの本を買えばいくらでも
マルチスレッドの例が載ってる
割と簡単だ
0671デフォルトの名無しさん
2009/08/30(日) 23:13:25メンバ関数ポインタのサイズはコンパイラ依存だとロベールに書いてあったのでもしかしたらと思い・・・
もし不可能なら、sizeofでサイズが取れるのだからそのサイズ分メモリを確保して
そこにメンバ関数ポインタをコピー、確保したメモリのポインタを返すというようにしようかと思いますが
他になにか手法があればご教授くださいませ
0672デフォルトの名無しさん
2009/08/30(日) 23:28:160673デフォルトの名無しさん
2009/08/30(日) 23:44:00コンパイラに依存しなくするためにはstdcall関数ポインタを使うしかないだろう。
0674デフォルトの名無しさん
2009/08/30(日) 23:53:16非仮想のメンバ関数へのポインタは、普通の関数と同じサイズと思われる(thisを引数にもつだけ)
仮想関数だと、vtbl内のインデックスになると思う。オフセットなのか番号なのかはわからないが。
メンバ変数だとほぼ確実にオフセットだしね。
0675671
2009/08/31(月) 00:01:361)DLL関数Aを呼び出して実行側はメンバ関数ポインタを取得
2)メンバ関数ポインタを引数にもつDLL関数Bを↑で取得した値で呼び出す
という流れです。
>>671だと実行側でメンバ関数ポインタを呼び出すととれてしまいますね。すみません
>>672
>__stdcall を使えば同じサイズになるんじゃないのかい?
同じサイズとはメンバ関数ポインタのサイズでしょうか?
>>673
上述のようにとられてしまったみたいですね。すみません。
メンバ関数ポインタを用いて関数呼び出しをするのはDLL側なので、その部分の問題は(たぶん)大丈夫です。
最終的に何が聞きたいのかというと
1)メンバ関数ポインタはサイズが8とか12とかになるので、それを戻り値にできるの?
2)メンバ関数ポインタの値をコピー(2回)した後でその値から関数呼び出しって問題ないの?
ってことです。( 2)は大丈夫だと思ってますが。)
0676デフォルトの名無しさん
2009/08/31(月) 00:08:36このHPでスマートポインタの配列対応について少し触れているのですが、
スマートポインタの配列対応ってどういう風に実装すればいいんですか?
0677デフォルトの名無しさん
2009/08/31(月) 00:11:28仮装関数(virtual修飾)ではありませんが、下のような構成になっています。
class Base{
class OperatorItem{ 〜 } operator_obj; //←インスタンス生成
}
class Maker: public Base{
OperatorItemクラスのメンバ関数ポインタを戻り値にもつ関数A
OperatorItemクラスのメンバ関数ポインタを引数にもつ関数B
} // 関数A、Bはstdcall関数でラッパーしてあり、実行側はそれを呼び出す
0678デフォルトの名無しさん
2009/08/31(月) 01:43:41やるとすれば operator [] を定義したりするんだろうけど、
単一オブジェクトと配列がごっちゃになってるのは C のポインタの特徴であって
自然なものではないのだから、そこは明確に分けておくのが正解。
0679デフォルトの名無しさん
2009/08/31(月) 11:34:33> 1)メンバ関数ポインタはサイズが8とか12とかになるので、それを戻り値にできるの?
> 2)メンバ関数ポインタの値をコピー(2回)した後でその値から関数呼び出しって問題ないの?
なんでサイズによって戻り値にできたりできなかったりすると思うのかわからん。
2つ目の疑問も同様。
0680デフォルトの名無しさん
2009/08/31(月) 12:59:470681デフォルトの名無しさん
2009/08/31(月) 13:22:30聞きたいのはむしろdelete[]の方です。
実装方法がわからん。boostを使った方法ならググって見つかったんですが。
0682デフォルトの名無しさん
2009/08/31(月) 13:26:380683デフォルトの名無しさん
2009/08/31(月) 13:31:06「delete[]の方」と言われても何のことかわからん。何か聞きたいならちゃんと書け。
そもそも、配列と単一オブジェクトをごっちゃにできるようなスマートポインタなんて
実装して、だれが喜んでそんなもん使うの?
0684デフォルトの名無しさん
2009/08/31(月) 13:34:41DLL内で そのハンドル値 と (メンバ?)関数のポインタ との map を作っておき
DLL呼び出し側に戻すのは ユニークなハンドル値
DLL呼び出し利用側は そのハンドルを渡して処理
→ map から関数のポインタを手繰って実体化させる
こんな管理はどうだ?
0685デフォルトの名無しさん
2009/08/31(月) 16:47:03ひどいもなにも、stdafx.hの実体化はstdafx.cppで行われるのだから、実体は1つしか作られないのが普通では?
普通のヘッダにして、各CPPに読ませた分実体ができるという挙動は、
各CPPの無名ネームスペース毎に実体化しているという挙動だよね。
0686デフォルトの名無しさん
2009/08/31(月) 16:59:19>>663のコードをstdafx.hに書いて、
オプションのプリコンパイルヘッダーファイルを使用する/Yu と
使用しない、でそれぞれビルドして実行してみ。
0687デフォルトの名無しさん
2009/08/31(月) 17:10:38ちゃんと実験したか?
そのfooが実際に(stdafx.h以外の)cppでも使われていれば、ちゃんとコンストラクタが呼ばれる。
利用されてないから、実体化されてないだけ。
一応こっちでも実験したが、ちゃんと各cppでfooを利用したら、個別に生成されてたぞ
例:
Foo *p = &foo; を各cppの関数内に書く。
コンストラクタはインスタンスの初期化処理なのだから、インスタンスが不要ならそりゃ最適化で消されても不思議じゃないわ
0688デフォルトの名無しさん
2009/08/31(月) 17:16:04「書き方がちがったら、順番が違う」なんて文句つけるなよw
書き方がちがった結果、コンパイラが最適化を働かせて、順序が変わることだってあるんだから
実際利用前には翻訳単位毎に実体化するんだろ?
ならそれはC++の正しい挙動だ
グローバル空間のインスタンスの初期化が、WinMainより前に全て済ませてあるなんて規則は無い
0689デフォルトの名無しさん
2009/08/31(月) 17:23:500690デフォルトの名無しさん
2009/08/31(月) 17:26:38君がよくわかってないということはわかった。
まあめんどくさいから>>665にまかすわ、ほっといてもいいしw
0691デフォルトの名無しさん
2009/08/31(月) 17:30:47コンストラクタ内で標準出力命令したのに、勝手にそれが削除されるのは間違った最適化だろ。
0692デフォルトの名無しさん
2009/08/31(月) 17:38:060693デフォルトの名無しさん
2009/08/31(月) 17:39:080694デフォルトの名無しさん
2009/08/31(月) 17:43:08ざっと調べた感じだと、全てのグローバル変数を1箇所に書いて制御しろって
のが見つかったんだが、それはちょっと辛い気が・・・
0695デフォルトの名無しさん
2009/08/31(月) 17:46:200696デフォルトの名無しさん
2009/08/31(月) 17:46:210697デフォルトの名無しさん
2009/08/31(月) 17:48:39インスタンスを初要求された時とそれ以外で区別つくしね…
『エラー処理を伴うとややこしい』のは、グローバルオブジェクトでやっても変らんしね
0698デフォルトの名無しさん
2009/08/31(月) 17:53:51ckass AAA
{
AAA() { }
~AAA() { }
以外に
int init();
void final();
}
の初期化と終了関数を書くのは普通
0699デフォルトの名無しさん
2009/08/31(月) 18:45:13グローバル空間のインスタンスの初期化が、mainより前に全て済ませてあるという規則はある。
0700デフォルトの名無しさん
2009/08/31(月) 19:17:06int a = (数値0〜99);
int b = (数値0〜99999);
int c = (数値0〜99);
int d = (数値100〜199);
printf("int d=%d; char *str=\"%d%d%d\";", d, a*d, b*d, c*d);
と言うプログラムがあって、dとstrを別のプログラムで取得しました。
このdとstrからa、b、cを求めるにはどう言うロジックを書けばいいでしょうか?
a*d、b*d、c*dの3数値の間にスプリット文字があれば楽なんですが……
0701408
2009/08/31(月) 19:39:410702デフォルトの名無しさん
2009/08/31(月) 19:49:110703デフォルトの名無しさん
2009/08/31(月) 19:52:22RTTIでぐぐってみると良いかもしれない。
0704デフォルトの名無しさん
2009/08/31(月) 19:53:030705デフォルトの名無しさん
2009/08/31(月) 20:06:040706デフォルトの名無しさん
2009/08/31(月) 20:07:45専用malloc作るか
判別用メンバ入れるか
0708デフォルトの名無しさん
2009/08/31(月) 20:24:140709デフォルトの名無しさん
2009/08/31(月) 20:49:30initを忘れないようするための安全策とか、initが呼ばれなかったときの処理とか
余計な仕事が増えまくった割りに効果がなかったりする。
0710デフォルトの名無しさん
2009/08/31(月) 20:54:190711デフォルトの名無しさん
2009/08/31(月) 20:57:46フェイルセーフとかフールプルーフって知ってるか?
0712デフォルトの名無しさん
2009/08/31(月) 21:03:380713デフォルトの名無しさん
2009/08/31(月) 21:24:16コンパイル時に識別子が見つからないというエラーが出ます。
これらの関数はstdio.hにあると書いてあり、stdio.hはインクルードしているのですが、
どうすれば使えるようになるのでしょうか?
環境はWindows、VC++です。
0714デフォルトの名無しさん
2009/08/31(月) 21:30:17>これらの関数はstdio.hにあると書いてあり
どこに書いてあった?
VCじゃない別のコンパイラのマニュアルの見ていないか
0715デフォルトの名無しさん
2009/08/31(月) 21:40:08manページです。manページはWindowsでは必ず使えるとは限らないようですね。。
MSDNでflockfileで検索してみても0件だったので、もしかしてWindowsでは使えないという事でしょうか?
0716デフォルトの名無しさん
2009/08/31(月) 21:54:470717デフォルトの名無しさん
2009/08/31(月) 21:58:18何を...>>715君、君が何を言っているのか分かんないよ...>>715君...
0718デフォルトの名無しさん
2009/09/01(火) 00:02:41windowsでは使えなさそうですね。。。
0719671
2009/09/01(火) 00:45:04>>679
コンパイラによってサイズが変わるかもしれない値を戻り値にしてしまうと
他のコンパイラや言語から呼び出し時に困らないかと思いまして
>>680
そのとおりです。
>>682
コンパイラに依存しないDLL関数の戻り値として
サイズがコンパイラ依存のメンバ関数ポインタを使えるのだろうかという疑問です。
>>684
とりあえず、現状ではそんな感じで考えています。
>>671のメモリ確保したポインタ値をハンドル値として使う場合は確保したメモリをコレクション型などに記録して
引数で受け取った時にコレクションに入っているかどうかを確認してから使用したほうがいいですよね?
0720デフォルトの名無しさん
2009/09/01(火) 00:50:330721デフォルトの名無しさん
2009/09/01(火) 01:06:000722デフォルトの名無しさん
2009/09/01(火) 01:12:270723デフォルトの名無しさん
2009/09/01(火) 01:44:08COM使ったら同じようにできないのかな。
0724デフォルトの名無しさん
2009/09/01(火) 02:17:440725デフォルトの名無しさん
2009/09/01(火) 04:10:07> コンストラクタはインスタンスの初期化処理なのだから、インスタンスが不要ならそりゃ最適化で消されても不思議じゃないわ
俺もこう思ったんだけど、調べてみるとどうも >>663 のケースでは
プリコンパイル済みヘッダ無しほうの動作が標準規格で要求されているみたい。
3.7.1 [basic.stc.static] p2 より
> If an object of static storage duration has initialization or a destructor with side effects,
> it shall not be eliminated even if it appears to be unused, ...
それでもプリコンパイル済みヘッダ自体がコンパイラの拡張なんだから、
ここらへんの動作も独自仕様になってるのかと思って MSDN をちょっとあさって
みたんだけど、特に動作の変更について書いてあるところは見当たらなかった。
ってことでやっぱりバグで以下 >>666
0726660
2009/09/01(火) 12:38:38みなさん、いろいろ調べていただけたようで、本当にありがとうございます
あれからいろいろ調べたり会社の人とも話し合ったりしてみたのですが、プリコンパイル済ヘッダの件については、結局解決できませんでした
結局 >>725 >>666 さんが真実なのかなとあきらめております。
しかし、今回のようなケース、アプリケーション単位で一度だけ初期化されればいいよ、というような場合においては
#pragma init_segを使うとコンパイル単位の初期化順序を制御できるっぽいものがあることを知りました
今回のパターンだと、これ使えばいけるんじゃね?と思います
プリコンパイル済ヘッダについては、よい解決方法は探せませんでしたが、よりスマートな方法が(VC++限定ですが)あったので
こちらを使ってみようと思います。
0727660
2009/09/01(火) 12:45:50>>696 >>697
シングルトンにしろ、というのはCOMの初期化をするようなシングルトンをつくってそれを経由して各オブジェクトを生成するなり(シングルトンのファクトリ)、
各オブジェクト内でシングルトンのCOM初期化関数を呼べということでしょうか?
シングルトン限らず、COMみたいなもんを使われる寸前になったら初期化、みたいなことはひとつの解決法だと思うのですが
CoUninitializeのような終了処理について問題がある気がします。
普通、この場合だったらシングルトンオブジェクトのコンストラクタで初期化(CoInitialize)、デストラクタで開放(CoUninitialize)、またはatexitに登録しておく、などのことを
をするかと思うのですが、これだとboost::shared_ptrのようなものを使っていたときに問題がおこるんじゃないでしょうか?
boost::shared_ptr<SomeObject> obj;
WinMain()
{
obj.reset(new SomeObject());
....
}
SomeObjectのコンストラクタ中で初めて初期化用シングルトンが実体化されたとすると、その時点で初期化が走るのでSomeObjectの中でCOMを使う分には問題ありません。
しかし、objそのものがデストラクトされるのは、アプリケーションの最後です。
シングルトンのオブジェクトもアプリケーションの最後にデストラクトされますが、これだとobjというboost::shared_ptrのほうが先にコンストラクトされているので
シングルトンのデストラクトより後に、デストラクトされることになります。
つまり、SomeObjectのデストラクタは、CoUninitializeが呼び出された後に走ってしまうことになります。
SomeObjectのデストラクタでCOMのオブジェクトのReleaseを呼ぶなりCComPtrのオブジェクトを持っているなりしていた場合は、すでにCoUninitializeが呼び出されてるからエラー!
となってしまいます。
解決するためには、シングルトンがデストラクト時にコールバックするような仕組みをつくっておいて、シングルトン死亡を各オブジェクトが受け取ってそのタイミングで後処理をする
みたいな構造が考えられますが、ここまでいくと、なんか別にもっといい解決方法、そうだなすべてに先立って初期化されるオブジェクトがあったらいいんじゃない?
という方向に考えてしまいます。
0728デフォルトの名無しさん
2009/09/01(火) 13:02:46<大前提> グローバルオブジェクトは全面廃止
シングルトンそのものは1個
ただし、メンバには COM みたいの や boost::shared_ptr のような
グローバル的に使いまわしたいもの
各メンバは 実態ではなくポインタとし new してけば、生成/消滅はコントロール効く
シングルトンのコンストラクタで メンバの本体生成
シングルトンのデストラクタで メンバの本体消滅
0729デフォルトの名無しさん
2009/09/01(火) 13:20:370730デフォルトの名無しさん
2009/09/01(火) 13:43:530731デフォルトの名無しさん
2009/09/01(火) 14:36:260732デフォルトの名無しさん
2009/09/01(火) 15:58:40基本的に、解放順序を気にするなら、その順序はプログラマが書かざるをえないでしょ?
mainの最初の行にCoInitialize
mainの最後の行にCoUninitialize
これじゃダメなん?
昔Direct3Dでstaticなメッシュを作っちゃって、どうしてもCoUninitializeの後にメッシュが解体されるという、実害はないがお行儀の悪いプログラム書いちゃったことあるよ。
でも、これってstaticなんて使った上で、さらに解放順序をうまくやってほしいってわがままじゃん?
なので素直に、staticじゃなくて、シングルトンかつ解放可能なクラスにしたよ。
んでCoUninitializeの前に開放メソッド呼んだ・;(`ε()゙
0733デフォルトの名無しさん
2009/09/02(水) 13:47:37ANSI文字コードの時は読み込めるのですが
Unicode形式で保存した時は、最初の読み込みで失敗判定が出てしまいます・・・・
0734デフォルトの名無しさん
2009/09/02(水) 15:21:41wfstream
ロケール設定忘れんな
0735デフォルトの名無しさん
2009/09/02(水) 16:05:45#include <locale>
#include <string>
#include <iostream>
#include <fstream>
int wmain(int argc, wchar_t *argv[])
{
std::locale::global(std::locale("japanese"));
if (argc < 2) { return 1; }
std::wifstream file(argv[1]);
if (!file) { return 1; }
std::wstring buf;
wchar_t w = 0;
while (file.get(w)) { buf += w; }
file.close();
std::wcout << buf << std::endl;
return 0;
}
0736デフォルトの名無しさん
2009/09/02(水) 16:44:32while ( !(file.get(w)).eof() ) { buf += w; }
これでどうだろう
0737デフォルトの名無しさん
2009/09/02(水) 16:56:470738デフォルトの名無しさん
2009/09/03(木) 07:15:30関数みたいなキャスト int i = int(123.45); があると思いますが、
unsigned char uc = unsigned char(); とか、2単語以上使う型だとエラーになりました。
こういう型の場合はtypedefして使うしかないですか。
(そもそもあまり使われない書き方なのかな。
0739デフォルトの名無しさん
2009/09/03(木) 08:13:17コンパイラやOSのバージョンくらい書こうよ。
0740デフォルトの名無しさん
2009/09/03(木) 11:48:22「C++には」から始まってるんだからまずは規格上どうかじゃないか?
>738
規格(14882:2003)の 5.2.3 Explicit type conversion (functional notation) では simple-type-specifier って
書いてあるのでそのままだと多分無理。
0741デフォルトの名無しさん
2009/09/03(木) 12:46:510742デフォルトの名無しさん
2009/09/03(木) 18:12:53人間がそういうコードを書くためのもんじゃあんめえ。
キャストのほうは、むしろstatic_cast使えと。
0743デフォルトの名無しさん
2009/09/03(木) 18:31:38文字列処理がうざいのでPerlで答え書いとく。勝手にCへ脳内変換してくれ。
sub hoge{
my $d = shift;
my $str = shift;
for(my $i = 3; $i <= 5; $i++){
my $a = substr($str, 0, $i);
if($i < 5 && substr($str, $i, 1) == 0){ $a = substr($str, 0, $i + 1); }
if($a % $d == 0){
for(my $j = 3; $j <= $i; $j++){
my $c = substr($str, $len - $j);
if($c % $d == 0){
my $b = substr($str, $i, $len - $i - $j);
if($b % $d == 0){ return ($a, $b, $c); }
}
}
}
}
return undef;
}
0744デフォルトの名無しさん
2009/09/04(金) 12:30:49a->b こういうのとかa.aa.aaaみたいなのをを大量ループの中で使う場合は
いったんループの外で c = a->b とかしてループ中で使った方が速くなりますか?
別に気にしなくてもいいのでしょうか
0745デフォルトの名無しさん
2009/09/04(金) 12:36:28その程度のことは大抵コンパイラがやってくれる
でもまぁ毎回 a.aa.aaa みたいに書くとウザイから、可読性の改善のためにやるのは良いかもしれない
0746デフォルトの名無しさん
2009/09/04(金) 12:39:17なるほどありがとうございました!
0747デフォルトの名無しさん
2009/09/04(金) 13:31:56class A
{
public:
void operator = (int)
{
std::cout << __FUNCTION__ << std::endl;
}
};
class B : public A
{
};
int main(void)
{
B b;
b = 0;
return 0;
}
コンパイルエラーになったんですがoperator=は継承されない仕様なんでしょうか?
0748デフォルトの名無しさん
2009/09/04(金) 13:35:23B では暗黙のうちにコピー代入演算子 B& operator=(const B&) が宣言されるんで、
A の operator= が隠されてしまう。
B のほうで using A::operator=; としておけば両方使えるはず。
0749デフォルトの名無しさん
2009/09/04(金) 13:52:31operator= 〜{A::operator =〜}とかやりそうになってました
レスありがとうございます
0750デフォルトの名無しさん
2009/09/04(金) 14:09:32なんと!usingにそんな使い方があったのか。
protectedのメンバ関数を、派生クラスでpublic化するのに使えそうなんですけど、一般的ですか?
0751デフォルトの名無しさん
2009/09/04(金) 14:34:04アクセス指定を変えるのに使えるのは確かなんだけど、
基底で protected とされているのを public にしてアクセス制限を
緩めるような使い方はたぶん一般的じゃない、っていうか普通に
考えればタブーの部類。 #define private public みたいな。
もしその操作が許されるなら、そもそも基底クラスの時点で public と
されているべき。
0752デフォルトの名無しさん
2009/09/05(土) 00:23:54電卓とカレンダー作りができる程度の初心者です。
基礎学習になるようなプログラムを組みたいのですが、何かおすすめの題材はありますか?
また、ゲーム作りに興味があるのですが、少し調べてみたところ基礎的な学習とは方向性が違うように感じ、
基礎が身に付くまでは汎用的な学習がしたいと考えているのでチャレンジするかどうか迷っています。
ゲーム作りはC言語の基礎学習になるのでしょうか?この点についてもアドバイスをもらえたら嬉しく思います。
よろしくお願いします。
0753デフォルトの名無しさん
2009/09/05(土) 00:29:32↓宿題スレで武者修行するとか。
C/C++の宿題片付けます 130代目
http://pc12.2ch.net/test/read.cgi/tech/1250204272/
とはいっても、ゲーム作りに興味があるならまずゲームを作るべきだとも思う。
基礎といっても、それがどう役に立つのかわからないようでは意味が無いしね。
0754デフォルトの名無しさん
2009/09/05(土) 00:40:300755デフォルトの名無しさん
2009/09/05(土) 00:43:320756デフォルトの名無しさん
2009/09/05(土) 00:49:37どうもありがとうございます。宿題手伝いは思いつきませんでしたが、とても良い案に思えます。
手伝いとゲーム、検討してみようと思います。
>>754
はい、学んだ知識を使うことによって身につけていきたいのですが、
学んだものから何を作れるのかも分かっていないという情けない状況で、質問させていただきました。
>>755
非常に簡素な仕上がりの電卓だったので・・・。
自分が作ったのは、scanf関数で2つ数値を入力させ、switch文で演算子を選ばせて結果を出すという
簡易的なものでした。
0757デフォルトの名無しさん
2009/09/05(土) 00:56:120758デフォルトの名無しさん
2009/09/05(土) 01:35:13ゲームプログラミングなら
何らかのゲーム製作用のライブラリを手に入れて
それを#includeすりゃ始まるさ。
ゲーム製作板だっけな、あの辺に行けば
そういうライブラリを紹介してるサイトも見つかるかも知れないな。
0759デフォルトの名無しさん
2009/09/05(土) 02:01:540760デフォルトの名無しさん
2009/09/05(土) 02:20:570761デフォルトの名無しさん
2009/09/05(土) 04:17:36数式を入力できる、関数電卓のようなものを作るとする。
ちゃんと小数周りの計算とかもできるようにするなら
計算中はそれぞれの演算を分数の形で持っておいて、一番最後(出力時)に小数として出すのがいいのかな。
0762デフォルトの名無しさん
2009/09/05(土) 04:19:45それぞれの演算 → 演算項それぞれを
0763デフォルトの名無しさん
2009/09/05(土) 04:26:34数式を組み立て直しておいて、パースから演算までを
外部プロセス(例えばawkのようなスクリプト処理系)に委ねるのも手。
0764デフォルトの名無しさん
2009/09/05(土) 04:28:100765デフォルトの名無しさん
2009/09/05(土) 08:16:42そういうのが使える状況ならいいんだけどなー。
0766デフォルトの名無しさん
2009/09/05(土) 09:13:070767デフォルトの名無しさん
2009/09/05(土) 09:30:450768デフォルトの名無しさん
2009/09/05(土) 11:42:52前者はGUIを巧く工夫すればJavaScriptでも手軽にできる代物だけど、
後者は二分木データ構造の典型的な課題になってるくらいだからね。
0769デフォルトの名無しさん
2009/09/05(土) 15:31:230770デフォルトの名無しさん
2009/09/05(土) 15:33:12ブロック崩し
テトリス
シューティングゲーム
が簡単だと言われているが
作れる気がしないw
0771デフォルトの名無しさん
2009/09/05(土) 16:13:04テトリスに限らず、落ちモノ系は結構きつい気がする。
STGは、最近流行りの弾幕ゲーとかじゃなくて、インベーダーくらいの認識。
あとは倉庫番とかアリじゃないかな。
0772デフォルトの名無しさん
2009/09/05(土) 16:18:12敵が1体しか出ないターンベースのインベーダーとか練習にどうだろう。
0773デフォルトの名無しさん
2009/09/05(土) 16:20:170774デフォルトの名無しさん
2009/09/05(土) 16:48:230775デフォルトの名無しさん
2009/09/05(土) 17:20:35手を出すべきじゃねーかなぁ。
モチベーションを保てるのがでかい。
0776デフォルトの名無しさん
2009/09/06(日) 00:01:46Visual Studio 2005 と、g++ (GCC) 4.2.4 のコンパイルスイッチ を付加したいのですがVC++ のコンパイルスイッチの設定方法は分かるのですが、
(ソリューションのプロパティページ→プリプロセッサ→プリプロセッサの定義で _USE_GCC などと定義する)
foo.cpp とfoo.h があり、スイッチが_USE_GCC とした場合下記の方法だと、通りません?
g++ -c _USE_GCC foo.cpp
0777デフォルトの名無しさん
2009/09/06(日) 00:02:350778デフォルトの名無しさん
2009/09/06(日) 00:17:09どうしたらよいでしょうか。割れとかじゃありません。やばい。宇宙やばいです。
0779デフォルトの名無しさん
2009/09/06(日) 00:18:080780デフォルトの名無しさん
2009/09/06(日) 00:18:51MSDN読めばいいじゃん
0781デフォルトの名無しさん
2009/09/06(日) 00:26:40意味がわからん。
VC に USE_GCC を指定する方法はわかるんだよな?
今わからないのは gcc に指定する方法だろ?
だったら gcc のマニュアル嫁よ。
0782デフォルトの名無しさん
2009/09/06(日) 01:03:58「VC++をコマンドラインで使う」なんて、絶対やったこと無いと思う。
だから当然、gccにオプションを渡す方法も知らないのだろう。
gccも、なんかIDEでも使ってるんじゃないかね。eclipseとか。
0783デフォルトの名無しさん
2009/09/06(日) 01:49:22/D "_USE_GCC"と表示されてた
>>782
コマンドラインで使わなくとも、今の設定をそのままに、
コマンドラインからコンパイルするためのスイッチ一覧が表示されてたりするよ
msbuild使うならこれもいらないけどw
0784735
2009/09/06(日) 13:11:14やはり、一度目のfile.getでループがwhileから抜けてしまいました。
単にメモ帳で、ANSI⇔Unicodeを切り替えてるだけなんですが・・・
0785デフォルトの名無しさん
2009/09/06(日) 16:15:390786デフォルトの名無しさん
2009/09/06(日) 20:38:12VC++9 xp です。
CEditに横長の文字列が入っていて、無理矢理複数行に改行されて表示するスタイルになっている場合、
横幅が先に決まっている状態で、高さをいくつにすれば全部表示しきれるのかが知りたいのですが、
これは可能でしょうか?
よろしくおねがいします。
0787デフォルトの名無しさん
2009/09/06(日) 20:50:270788デフォルトの名無しさん
2009/09/06(日) 21:01:27そのtxtファイルをupして見せたほうが良いかもしれない
0789デフォルトの名無しさん
2009/09/06(日) 21:11:570790デフォルトの名無しさん
2009/09/06(日) 21:13:12どこら辺が同じなのw
0791デフォルトの名無しさん
2009/09/06(日) 21:28:46フォントとかテーマとか、関係するパラメータが多くて複雑なので、
(動的な)実測が一番楽だと思う。
実際に文字列を入れて行数を取得するか、
高さを変更しつつスクロールバーの有無を見るとか。
実測過程が表示されるのが嫌なら、別に用意した非表示のCEditでできないかな。
0792デフォルトの名無しさん
2009/09/06(日) 21:32:34ttp://7ujm.net/C++/extern.html
こういうページを見ているのですが
「■上のプログラムの改良版」という部分では、
グローバル変数にしても同じではないですか?
0793デフォルトの名無しさん
2009/09/06(日) 21:37:10externは
「どこかにある(グローバルな)変数を俺使うよ先生(実体はどこにあるか知らね)」
と宣言するためにある
0794デフォルトの名無しさん
2009/09/06(日) 21:39:48「グローバル変数にしても」って言ってるところがすでにグローバル変数なわけだが。
あと、そこのページにあるインクルードガードは予約識別子を使っちゃってるから、
真似すんなよ。
0795デフォルトの名無しさん
2009/09/06(日) 21:44:15ありがとうございます
>>794
すいません思いっきり勘違いしてました
0796デフォルトの名無しさん
2009/09/07(月) 01:11:500797デフォルトの名無しさん
2009/09/07(月) 01:40:15ほう
int i;
これがexternの意味になるって?
0798デフォルトの名無しさん
2009/09/07(月) 01:45:52そこらへん C か C++ かによる違いとか、いろいろもう少し複雑だから、
中途半端に言い切らないほうがいいよ。
0799デフォルトの名無しさん
2009/09/07(月) 21:49:37俺はググった事ないけど
0800デフォルトの名無しさん
2009/09/08(火) 00:07:48http://pc12.2ch.net/test/read.cgi/tech/1245382769/
で誘導されてここへ来ました
ある関数内で宣言、定義、代入した配列を他の関数内で使いたいときはどうするのがよいでしょうか
グローバル変数にしてしまうのが良いですか?
0801デフォルトの名無しさん
2009/09/08(火) 00:13:29子関数でなければ、それようのクラスでも作って、カプセル化してアクセスしろ
0802デフォルトの名無しさん
2009/09/08(火) 00:14:51いらっしゃい。答えだけ言うなら引数で先頭アドレス渡せばよろしい。
#include <stdio.h>
int main(){
int a[5]={0,1,2,3,0}; f(a);
}
void f(int *ary){
printf("ary[4]=%d",ary[4]);
}
0803デフォルトの名無しさん
2009/09/08(火) 00:19:45ありがとうございました!!
0804デフォルトの名無しさん
2009/09/08(火) 06:38:09Windows付属のメモ帳だよな?
あれでUnicodeに変換するとファイルの先頭にBOMっていうデータが付加されるから
バイナリエディタとかで3byte削ってごらん。
以前sqliteの.readコマンドで1行目がエラーになった原因はそれだったから。
0805デフォルトの名無しさん
2009/09/08(火) 06:57:140806デフォルトの名無しさん
2009/09/08(火) 09:43:110807デフォルトの名無しさん
2009/09/08(火) 09:49:260808デフォルトの名無しさん
2009/09/08(火) 09:53:240809デフォルトの名無しさん
2009/09/08(火) 09:53:27UTF-16はFEFFの2byte
UTF-32はFFFE0000の4byte
0810デフォルトの名無しさん
2009/09/08(火) 09:59:46UTF-8はwchar_tとは別物。多分メモ帳で変換したUnicode形式はUTF-8。wchar_tの
内部形式は処理系依存だが、UTF-8は可変長だから普通に考えると絶対使われない。
つまりI/O時に変換しないと駄目。
0811デフォルトの名無しさん
2009/09/08(火) 11:33:41Visual C++ の locale("Japanese") における wchar_t の挙動はキモかわいくて
wchar_t をテクサコモードでファイルに書き出すと、Shift JIS に変換されちまうのだ。
そして Shift JIS を同じくテキサスモードで wchar_t に呼び出すと unicode に戻される。
結論から言うと、なんとラコステモードでは unicode ファイルは扱えないんだな。
ビッゲスト大弱り。
0812デフォルトの名無しさん
2009/09/08(火) 11:45:55少なくとも「変換の要らない夢のコード体系」なんてのとは程遠いから、外人が考えた
アホらしい糞仕様をまずはちゃんと勉強汁
0813デフォルトの名無しさん
2009/09/08(火) 11:54:460814デフォルトの名無しさん
2009/09/08(火) 12:24:05面白いつもり? 自分をひけらかしているつもり?
0815811
2009/09/08(火) 12:29:10unicodeをWindows上で扱うのはやたら面倒なのだ。
ま、永遠に困ってろ。
0816デフォルトの名無しさん
2009/09/08(火) 13:21:49"UTF-8"も選べるけど
0817デフォルトの名無しさん
2009/09/08(火) 13:24:050818デフォルトの名無しさん
2009/09/08(火) 13:51:34いつの間にかutf-8に対応してたんだ?
やっぱメモ帳侮れないな。(euc-jpはイツデスカ。。。)
0819デフォルトの名無しさん
2009/09/08(火) 13:52:32public:
IntAttay2D(int size0,int size1):
mArray(0),
mSize0(size0),
msize1(size1){
mArray=new int[size0*size1];
}
・
・
・
本に書いてあったコードなのですが
このような書き方になじみが無く何をしているのかよくわかりません
mArray(0),
mSize0(size0),
msize1(size1)
は何をしているのでしょうか?
0820デフォルトの名無しさん
2009/09/08(火) 13:53:46のこりも同様
0821デフォルトの名無しさん
2009/09/08(火) 14:05:230822デフォルトの名無しさん
2009/09/08(火) 14:20:57ありがとうございました
0823デフォルトの名無しさん
2009/09/08(火) 14:38:420824デフォルトの名無しさん
2009/09/08(火) 15:25:32>euc-jpはイツデスカ。。。
永遠にお待ちください。
0825デフォルトの名無しさん
2009/09/08(火) 17:50:46Windows以外なら簡単というわけでもないだろ。
0826デフォルトの名無しさん
2009/09/08(火) 18:13:18そのくらいUnicodeの扱いは難しい。
0827デフォルトの名無しさん
2009/09/08(火) 21:04:40うまくうごいてくれません。どこが間違っているのでしょうか?
一次元の配列では上手く動きました
数値を配列aに代入し、f関数で配列aの4番目の要素を表示させるというコードです
#include <stdio.h>
void f(int *ary);
int main(){
int a[5]=
{0,1,2,3,99};
f(a); }
void f(int *ary){
printf("%d",ary[4]);
return ;}
ですが二次元配列にするとダメです。どこが間違っているのでしょうか?
#include <stdio.h>
void f(int *ary);
int main(){
int a[2][5]=
{
{0,1,2,3,99},
{5,62,6,3,99}
};
f(a);}
void f(int *ary){
printf("%d",ary[4]);
return ;}
0828デフォルトの名無しさん
2009/09/08(火) 21:25:430829デフォルトの名無しさん
2009/09/08(火) 21:26:49int main()
{ int a[2][5] = {...}; f(a[0]); }
0830デフォルトの名無しさん
2009/09/08(火) 21:29:39精進します。ありがとうございました。
0831デフォルトの名無しさん
2009/09/08(火) 23:05:480832デフォルトの名無しさん
2009/09/08(火) 23:08:520833デフォルトの名無しさん
2009/09/08(火) 23:09:42printf("%s", b?"true":"false");
0834デフォルトの名無しさん
2009/09/08(火) 23:14:11%sの部分でbool型を指定するようなことは文法的にできないのかな。
0835デフォルトの名無しさん
2009/09/08(火) 23:22:47ライブラリの仕様的にない。
まぁ自分でprintf的なものを作り直せばあるいは、程度かな。
0836デフォルトの名無しさん
2009/09/08(火) 23:45:550837デフォルトの名無しさん
2009/09/10(木) 11:41:140838デフォルトの名無しさん
2009/09/10(木) 13:10:47どちらも「デリファレンス」 "dereference" の訳語のようで、同じかもしれないけど、
文脈によっては違うかもしれない。
0839デフォルトの名無しさん
2009/09/10(木) 14:13:56ありがとうございます。おっしゃるとおり、両方共翻訳された本にでてきた表現です。
0840デフォルトの名無しさん
2009/09/10(木) 16:15:16↓は構造体の型"hito"を定義し、hito型の変数"hitorime"をnormal関数で使いたいのですが使えない状態です。
宜しくお願いします。
//main.cpp
#include "kozo.h"
int main(){
normal ();
return 0;}
//normal.cpp
int normal () {
extern int aaa;
extern hito hitorime;
}
//kozo.h
void normal(void);
int aaa;
struct hito {
int x;
int y;};
hito hitorime;
0841デフォルトの名無しさん
2009/09/10(木) 16:19:01「逆参照」って、ほんとにわかりにくい言葉だよな。
何が「逆」なんだか。
ポインタの指している先を扱うのにもっとわかりやすい言葉はないもんかね?
0842デフォルトの名無しさん
2009/09/10(木) 16:29:42externの使い方が分かってない
適当にぐぐって解説してるとこ拾ってきたから嫁
ttp://www.geocities.jp/ky_webid/c/032.html
0843デフォルトの名無しさん
2009/09/10(木) 16:47:29ポインタ先
0844デフォルトの名無しさん
2009/09/10(木) 16:49:030845デフォルトの名無しさん
2009/09/10(木) 16:53:54//normal.cpp
struct hito {
int x;
int y;};
void normal () {
int aaa;
hito hitorime;
}
//kozo.h
void normal(void);
int aaa;
struct hito {
int x;
int y;};
//main.cpp
#include "kozo.h"
int main(){
normal ();
return 0;}
0846845
2009/09/10(木) 16:56:45とりあえずstructの宣言は同じファイルに無いと×
kozo.hインクルードしとけ
0847デフォルトの名無しさん
2009/09/11(金) 16:57:32FreeBSDだと通っていた下のコードがコンパイルエラーになります。
#include <iostream>
#include <vector>
using namespace std;
struct Zoo
{
std::vector<std::vector<int> > animals;
};
int main (int argc, char** argv)
{
Zoo ueno;
return 0;
}
誰か助けて><
0848デフォルトの名無しさん
2009/09/11(金) 17:03:310849デフォルトの名無しさん
2009/09/11(金) 17:08:35あとはresize()メンバ関数で拡げる
0850847
2009/09/11(金) 17:14:09きちんと型を指定したら通りました。それぐらいコンパイラが察してくれてもいいと思います。
0851デフォルトの名無しさん
2009/09/11(金) 17:54:55C++標準化委員会が決定した初期化オプションだ
0852デフォルトの名無しさん
2009/09/11(金) 17:56:19はどうやって初期化すればいいか書いてみろ
0853デフォルトの名無しさん
2009/09/11(金) 18:03:53今までの流れに全然関係ない者ですが、
初期化の記法について今までなあなあにして来ました。
ここいらで勉強しようと思っているのですが、
どのあたり(サイト等)を参考にするのが良いでしょうか?
0854デフォルトの名無しさん
2009/09/11(金) 18:08:05仕方ないな古本屋で探すか規格票買え
0855デフォルトの名無しさん
2009/09/11(金) 18:12:240856デフォルトの名無しさん
2009/09/11(金) 19:31:43そりゃ規格違反のコンストラクタを備えているな
それともC++0xの機能でも取り入れてるのか?
0857デフォルトの名無しさん
2009/09/11(金) 19:54:22ttp://codepad.org/cr6QoYuG
このコード、gccはもとより
Test Drive Comeau C/C++ Online
ttp://www.comeaucomputing.com/tryitout/
ここでも通ったんだが。
規格どおりなんじゃないか?
0858857
2009/09/11(金) 19:56:13の方では、もちろん
Compile in strict C++03 mode
Disable C++0x extensions
のモードでやったよ。
0859デフォルトの名無しさん
2009/09/11(金) 20:46:59std::vector<int>はデフォルトコンストラクト可能だから847はどこも問題ないように自分は思う。
エラーになる理由を教えて欲しい。
0860デフォルトの名無しさん
2009/09/11(金) 21:19:44>>852は後からresizeを使う回数を減らすために
行方向に個数を指定する時に使う
0861デフォルトの名無しさん
2009/09/11(金) 21:20:25○>>849
0862デフォルトの名無しさん
2009/09/11(金) 21:41:00vec2d.assign(size1, vector< T >(size2, init));
と
vector< vector< T > > vec2d(size1, vector< T >(size2, init));
って大差ないよね?
0863デフォルトの名無しさん
2009/09/11(金) 23:28:25何の話してんのかわからねー。 849 はエスパーなのか?
0864デフォルトの名無しさん
2009/09/11(金) 23:29:10ただの間違いだろう。
・・・いやあってるのかな。
0865デフォルトの名無しさん
2009/09/11(金) 23:29:56それだけ見ると、前者は間抜けで後者は普通。
0866デフォルトの名無しさん
2009/09/12(土) 00:21:07自分もわからん。
>>847は Zoo 構造体のオブジェクトを宣言したくて
でもなぜか データメンバとして std::vector<std::vector<int> > のような型(vectorのvector)があると
Linuxではエラーが起きるといってるようだけど
ここにはコンパイラがなんなのか、どんなエラーが出たのかも書いていないから、
本当に、データメンバの型が原因でエラーなのか特定できない。
大体、
std::vector<std::vector<int> > animals(1, std::vector<int>());
は Zoo 構造体のオブジェクトじゃないから、>>847の意図することはまったくできてない。
0867デフォルトの名無しさん
2009/09/12(土) 00:22:26std::vector<std::vector<int> > animals(1, std::vector<int>());
を ueno と勘違いしていた。
最後の3行は忘れてくれw
0868デフォルトの名無しさん
2009/09/12(土) 00:32:190869デフォルトの名無しさん
2009/09/12(土) 04:53:180870デフォルトの名無しさん
2009/09/12(土) 06:49:510871デフォルトの名無しさん
2009/09/12(土) 07:21:440872デフォルトの名無しさん
2009/09/12(土) 12:10:22で
sprintfがグローバルスコープに宣言されるようですが、
std::名前空間にも宣言されているようです。
両方に宣言されるものなのでしょうか?
0873デフォルトの名無しさん
2009/09/12(土) 12:38:44コンパイラによる。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456
http://www.google.co.jp/search?hl=ja&q=%22lwg-defects.html%23456%22&lr=lang_ja
0874デフォルトの名無しさん
2009/09/12(土) 12:42:27ありがとうございます。
0875デフォルトの名無しさん
2009/09/12(土) 13:27:24なんらかの関数で!
質問1
1.txtから10.txtまで一気に開きたいとします!
だけど、例えばそのパスを指定するときが文字列である場合、
""で囲んでしまうので、変数で指定できないと思いました!
この場合はどうやって一気にしていすればいいの!
質問2
a.txtからf.txtまで一気に開きたいとします!
この場合も上記と同様な問題が発生します!
どうすればいいの?!!!
教えて!!!!!!!!!!!!!!!
0876デフォルトの名無しさん
2009/09/12(土) 13:31:34とりあえず自分で書いて、何が不満なのか明らかにしろ。
0877デフォルトの名無しさん
2009/09/12(土) 13:40:03sprintf でおk
0878デフォルトの名無しさん
2009/09/12(土) 13:46:29やったけどわかりません!!!!!!!
わからないから教えて!!!!!!!!!
>>877
それ以外!!!!!!!!
それ以外で!!!!!!!!
0879デフォルトの名無しさん
2009/09/12(土) 13:48:020880デフォルトの名無しさん
2009/09/12(土) 13:55:53for (i = 0; i < 10; i++) {
sprintf(path, "%d.txt", i + 1);
fp[i] = fopen(path, "r");
}
0881デフォルトの名無しさん
2009/09/12(土) 13:58:47その方法以外で!!!!!
だってその方法じゃ今後Win32APIでプログラムするときに結局またぶちあたる!!!!!!
それやっぱ根本的解決ちゃうで!!!!!
0882デフォルトの名無しさん
2009/09/12(土) 14:03:50意味がわからねえ。
Win32apiと標準関数は併用できないって思ってるのか。
0883デフォルトの名無しさん
2009/09/12(土) 14:04:02Win32でもこの方法で行けるんだよ
0884デフォルトの名無しさん
2009/09/12(土) 14:34:200885デフォルトの名無しさん
2009/09/12(土) 14:37:280886デフォルトの名無しさん
2009/09/12(土) 14:41:22標準C/C++では使えないけど
0887デフォルトの名無しさん
2009/09/12(土) 15:22:01ぶちあたらないから大丈夫やで!!!!!
0888デフォルトの名無しさん
2009/09/12(土) 18:19:58頻繁に起こるようになってしまいました
ファイルを分割したときの注意点をまとめたようなサイトとかありますか?
0889デフォルトの名無しさん
2009/09/12(土) 19:35:530890デフォルトの名無しさん
2009/09/12(土) 19:59:030891デフォルトの名無しさん
2009/09/12(土) 20:18:45ありがとう!!
0892デフォルトの名無しさん
2009/09/12(土) 21:04:440893デフォルトの名無しさん
2009/09/12(土) 21:11:300894デフォルトの名無しさん
2009/09/12(土) 21:16:420895デフォルトの名無しさん
2009/09/12(土) 23:01:00アロケータに食わせると微妙に速度が異なる
大抵遅くなるw
0896デフォルトの名無しさん
2009/09/12(土) 23:07:31再定義する仕様になっているので
ライブラリ標準のアロケータは大概アセンブラで書かれて
0897デフォルトの名無しさん
2009/09/13(日) 00:06:47stringstreamとかsnprintfとか使えばいいんじゃないの?
0898デフォルトの名無しさん
2009/09/13(日) 00:28:330899デフォルトの名無しさん
2009/09/13(日) 23:42:24開発環境はWindowsXPでBorlandのC++コンパイラを使っています。
作りたいソフトの勉強の為、簡易なヴォイスレコーダを作ってみたいのですが
参考になる様な本やサイトがググっても見つからず、途方にくれています。
どなたか音声処理(?)のプログラミングの参考になる様な本やサイトをご存知の方
いらっしゃいましたら、どうか教えてください。よろしくお願いします。
0900デフォルトの名無しさん
2009/09/14(月) 00:19:53winmm.lib系のAPIでいいならWebで使い方が見つかると思う。MSDNとか。
waveInOpenあたりで検索すれば出てくるんでないか。
0901デフォルトの名無しさん
2009/09/14(月) 00:25:23char* ch;
std::string str;
ch = str;
環境vc8
0902デフォルトの名無しさん
2009/09/14(月) 00:50:36無理。これくらいで我慢しろ。
const char* ch;
ch = str.c_str();
0903デフォルトの名無しさん
2009/09/14(月) 00:57:24左辺の型に代入演算子を定義できないか → (char*)は自作クラスじゃないのでいじれない
右辺の型に変換演算子を定義できないか → std::stringは自作クラスじゃないのでいじれない
演算子をstatic関数として定義できないか → 代入演算子や変換演算子は、static関数にできない
なので答は>>902だな
0904デフォルトの名無しさん
2009/09/14(月) 01:05:07class basic_stringex : public std::basic_string<CharT, Traits, Allocator> {
public:
operator CharT*() const { return const_cast<CharT*>(c_str()); }
};
typedef basic_stringex<char> stringex;
char *ch;
stringex str;
ch = str;
0905デフォルトの名無しさん
2009/09/14(月) 04:07:20よほどの理由が無いならBCCを捨ててVCEEにした方がいい。
BCC推奨してたとこを見たなら多分情報が古い。
>>901
まぁ、単にコーディングの練習がしたいのかもしれんが、そういう設計は危険。
型変換じゃなく、標準ライブラリのようにc_str()みたいな変換用のメンバ関数を作れ。
=だのキャストだのは、意識してない場面で勝手にコンパイラが他の用途に使うことが
あるから、その辺をガチで把握してないと迂闊に使えないし、把握してくると下手に
使うもんじゃないことも分かってくる。
0906デフォルトの名無しさん
2009/09/14(月) 07:01:40次の段階に進むならBCCはそろそろ力不足になってくるよ。
TDM's GCC/mingw32 Builds
ttp://www.tdragon.net/recentgcc/
ここで公開されているGCC/mingw32をインストールするといい。
最新版はバグありだけど、まあ大丈夫だよ、うん。。。
すぐ修正されるだろ。
0907デフォルトの名無しさん
2009/09/14(月) 07:18:22それ以前にconst付いてないんだぜ。
つまりstd::stringの中身をそのままいじらせろってことだ。
0908デフォルトの名無しさん
2009/09/14(月) 07:30:03そうとは限らんぞ、コピーを貰うのでも満足するのかもしれん
まぁどっちにしろ、operator=で書くべきではないことに変わりはないが
0909デフォルトの名無しさん
2009/09/14(月) 07:34:19皆さんありがとうございます。template <class X, class X2, class X3, class X4, class X5>
struct some {
X x;
X2 x2;
X3 x3;
X4 x4;
X5 x5;
};
some<char*, char*, char*, char*, char*> s;
s.x = 色々な型の変数;
s.x2 = 色々な型の変数;
省略〜
そもそも、このような型に依存しない構造体を定義して、あらゆる型が
= 演算子をオーバーロードできないかと思った次第でしたが無理なようですね、ありがとうございました。
char* 型の場合とかはtemplate の特殊化するとかで、できないもんだろうか・・・・今の自分では力不足ですorz
0910デフォルトの名無しさん
2009/09/14(月) 07:56:19何がしたいのかさっぱりわからねぇ
0911デフォルトの名無しさん
2009/09/14(月) 07:56:42http://www.kmonos.net/alang/boost/classes/any.html
http://www.kmonos.net/alang/boost/classes/variant.html
メタプログラミングと共用体を駆使して型を消去する手法もある
union var
{
private:
int int_;
float float_;
public:
template<typename T>
void set(enable_if<is_floating_point<T>,T>::type x){float_=x;}
template<typename T>
void set(enable_if<is_integral<T>,T>::type x){int_=x;}
template<typename T>
void get(enable_if<is_floating_point<T>,T&>::type x){x=float_;}
template<typename T>
void get(enable_if<is_integral<T>,T&>::type x){x=int_;}
};
こんな感じに
0912デフォルトの名無しさん
2009/09/14(月) 07:59:38void set(enable_if<is_floating_point<T>,T>::type x){float_=x;}
↓
void set(typename enable_if<is_floating_point<T>,T>::type x){float_=x;}
こんな感じに直せ
0913デフォルトの名無しさん
2009/09/14(月) 08:21:23>>911の手法は、入れた時の型で取り出さないと正しい情報じゃなくなることが
あるから注意。stringを入れてchar*で取り出せる、なんて夢を見ちゃ駄目。
というか、素でそういうことのできる言語じゃない。そういうことを手軽に書ける
ようにしたければ、手間と知識が要る。
逆に、そういうことを気にしないでいい言語というのは、最初からそういう重たい
安全装置がガチに装着されてるってこと。だから、重さを気にしない、すぐに仕事
を済ませればいいというような用途なら、そういった言語を使う方がいい。
もし「stringとchar*をある程度同じように扱える場面を作ろう」としているなら、
それは典型的なアンチパターン。初心者が自分でわざわざ作っては踏む地雷。
0914デフォルトの名無しさん
2009/09/14(月) 13:25:45マルチスレッドDLLにすると例外が発生します。
マルチスレッドデバッグDLLにすると発生しません。
リリースビルドは最適化等は全て無効でプレーンな設定です。
調べてみると、std::setのコンストラクタ内で例外が発生しており、
ファイル名:xtree 行数:1325
return (_Parent(_Myhead));
↓逆アセンブル結果
1020EE1C 8B 45 FC mov eax,dword ptr [this]
1020EE1F 8B 48 18 mov ecx,dword ptr [eax+18h]
_Myheadはメンバ変数で、アドレスはthis+0x04なんですが、
ここでオフセットとして0x18を足してるのが原因みたいです。
マルチスレッドデバッグDLLだと、アドレスはthis+0x14になり、
オフセットとして0x14を足すので、正しく動作します。
なぜこうなりますか?どうすれば直るでしょうか?
0915デフォルトの名無しさん
2009/09/14(月) 13:34:10まぁバグには関係ないだろうけど
0916デフォルトの名無しさん
2009/09/14(月) 13:47:51いずれにしても、リリースビルドで最適化を切るなんてのは狂気の沙汰にしか思えないけれど。
0917914
2009/09/14(月) 13:49:320918デフォルトの名無しさん
2009/09/14(月) 13:52:09まさかとは思うけど、フルリビルド位しているよね?
0919デフォルトの名無しさん
2009/09/14(月) 14:06:07フルリビルドはしています。名前は変えていますが、これがソースです。
このXのコンストラクタ起動 -> m_recordsのコンストラクタ起動で落ちます。
m_recordsの初期化にまつわるコードは何もありません。(暗黙のコンストラクタ呼び出し)
class X {
public:
typedef boost::variant<
boost::shared_ptr< A >, boost::shared_ptr< B >, boost::shared_ptr< C >, boost::shared_ptr< D >,
boost::shared_ptr< E >, boost::shared_ptr< F >, boost::shared_ptr< G >, boost::shared_ptr< H >
> Record;
typedef std::set< Record > RecordSet;
private:
RecordSet m_records;
0920デフォルトの名無しさん
2009/09/14(月) 14:16:330921デフォルトの名無しさん
2009/09/14(月) 14:46:48C++0xならunionにしちゃえって話になるのかもしれないけど。
とりあえずその八つのshared_ptrの指す型を消したいように見えるけど、結局は
boost::variantも中で仮想関数を持つようだし、自前でその八つのクラスを多態
にしてみる手はあるんじゃね?
0922デフォルトの名無しさん
2009/09/14(月) 15:37:10STLが受け付けないような作りになってるのかな?
0923デフォルトの名無しさん
2009/09/14(月) 15:42:36ttp://d.hatena.ne.jp/melpon/20090831/1251698873
仕様書上は一応大丈夫っぽく見えたけど、複雑ならバグが出る可能性は否定しにくい
(それがコードかコンパイラかは分からんが)
0924914
2009/09/14(月) 15:47:06やはりオフセットを0x04にしなければならないところが
0x18になっていました。んー謎です。
0925デフォルトの名無しさん
2009/09/14(月) 15:53:10メンバの再配置起きてるのかもしれんけど
RTTI 有り/無し が関係してたりするのかな?
0926デフォルトの名無しさん
2009/09/14(月) 16:03:380927デフォルトの名無しさん
2009/09/14(月) 16:13:38ttp://www.microsoft.com/downloads/details.aspx?FamilyID=239A9A68-211B-4CEB-9C2C-392B5BA5F617&displaylang=ja
0928デフォルトの名無しさん
2009/09/14(月) 16:20:40いや、というか、無し版のソースもくれ
0929914
2009/09/14(月) 16:50:54あんまり自信がないので、これからもっと調べてみます。
試しに同じクラスに置いたstd::set< int >は、ずれないようでした。
>>927
入っていないようです。入れてみます。ありがとうございます。
>>928
出すのはちょっと難しい、、、
やっていることは構造体に、boost::shared_ptr< n >を並べているだけの
単純なものです。
0930914
2009/09/14(月) 18:22:21Aの種類によって現象が起きたり、起きなかったりするようです。
起きるものどうしの共通点は特に見当たりませんし、
何か特別変な構造にしている訳でもありません。
set< boost::shared_ptr< A > >では問題が起こるものの、
set< A >では起きなかったりと、よくわからない感じです。
それで、諦めました。VC++2010で直る事を期待します。
お付き合い頂いてありがとうございました。
0931デフォルトの名無しさん
2009/09/14(月) 19:39:14setやvariantにshared_ptrはさんざん使ってるけど問題なんか起きないけどね。
リリースされて時間が経ち多くの人に使われているコンパイラとライブラリと、
今作ったばっかりの自分のプログラムをどっちを疑うかかって言うと、やっぱり
自分が作ったばっかりのプログラムを疑うけどな。俺は
0932デフォルトの名無しさん
2009/09/14(月) 19:49:44型を示すインデックスと、インスタンスを保存する領域からできていて、placement newしてる。
STLでも問題なく使える。
0933デフォルトの名無しさん
2009/09/14(月) 20:21:04俺もいくつかvcのバグみつけてるから、>>930のソースが悪いとは言い切れないんだけど
追試できるものをくれないとその結論になっちゃうよねぇ
0934デフォルトの名無しさん
2009/09/14(月) 22:47:27std::string
に格納した文字列(恐らくSJIS)を、
CString
などのUNICODEを格納する型に変換したいです。
何か変換関数があるのか、それともキャストでどうにかなるのか知りたいです。
よろしくお願いします。
※開発環境はVS2005です。
※UNICODEを使用する環境にしています。
0935デフォルトの名無しさん
2009/09/14(月) 22:48:40c_str()メンバ関数にしてchar文字列拾って代入したらだめなん?
0936デフォルトの名無しさん
2009/09/14(月) 23:03:03迅速な回答、ありがとうございます。
教えて頂いた内容を試してみます。
0937デフォルトの名無しさん
2009/09/14(月) 23:42:17MultiByteToWideChar
>>935 マルチバイト文字はそれでは無理。
0938デフォルトの名無しさん
2009/09/14(月) 23:48:390939デフォルトの名無しさん
2009/09/14(月) 23:50:080940デフォルトの名無しさん
2009/09/14(月) 23:57:260941デフォルトの名無しさん
2009/09/15(火) 15:05:50GameInfo()
:m_gameType(0)
,m_id(-1)
{}
こういうタイプの初期化を行う場合、メンバー配列変数の中身を初期化する方法はありますでしょうか?
0942デフォルトの名無しさん
2009/09/15(火) 15:22:25デフォルトコンストラクタの初期化でよければ、引数なしにすればオーケー
GameInfo() : m_array() {}
0943デフォルトの名無しさん
2009/09/15(火) 15:24:26この辺参照するとか
ttp://ml.tietew.jp/cppll/cppll/thread_articles/12918
ちなみにC++0xでは専用の構文が追加される
0944デフォルトの名無しさん
2009/09/15(火) 16:20:30WaitForMultipleObjectで待機中に、別スレッドで
イベントハンドルをCloseしてしまうと問題があるでしょうか?
HANDLE h[2];
h[0] = event_1; //イベントは初期化済み
h[1] = event_2;
WaitForMultipleObject(2, h, FALSE, INFINITE);
//この待機中に別スレッドでイベントの一つをCloseHandle(片方だけ)
0945デフォルトの名無しさん
2009/09/15(火) 17:12:05>lpHandles
> いずれかのハンドルが待機状態で未処理になっているときに、そのハンドルを閉じた場合、この関数の動作は未定義です。
0946デフォルトの名無しさん
2009/09/15(火) 17:13:59ありがとうございます。
復帰必須なんですね。
0947デフォルトの名無しさん
2009/09/15(火) 22:50:26具体的な症状は文字列が一段落上の位置に表示されてしまうんです。
VistaやWindosw98スタイルでは正常な位置に表示されるのですがXPだけおかしくなっちゃいます。
どなたか原因が分かる方はいませんか?
0948デフォルトの名無しさん
2009/09/15(火) 22:54:200949デフォルトの名無しさん
2009/09/16(水) 02:28:28ぽりしー?ほすと?
スレ違いじゃないかな?
↓こっちのスレで聞いたほうがよさそう。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0950デフォルトの名無しさん
2009/09/16(水) 02:33:260951デフォルトの名無しさん
2009/09/16(水) 02:39:410952デフォルトの名無しさん
2009/09/16(水) 03:48:33ポリシークラスは、ホストクラスからアクセスされるクラスであって、
ポリシークラスからホストクラスにアクセスするのは設計が良くないと思う。
ポリシークラスで必要になるデータは、ポリシークラスのメンバ関数の引数で受け取るようにするのが無難。
どうしてもホストクラスにアクセスしたいというなら、仮想関数しかないね。
以下個人的に思う事。
Policy設計は、ポリモフィズムが必要なケースには向いてないと思う。
STLやboostのような汎用的なライブラリを作るのに向いてると思う(趣味グラマではそういうケースがほとんどない)。
0953デフォルトの名無しさん
2009/09/16(水) 14:50:20{
  list<int> data_;
};
struct Writer
{
  void Write(); // どうにかしてdata_を取得して出力
};
Hoge<Writer> h; h.Write();
こういうのは悪手ということですかぁ�dです
本読んだときはなんかすごいと思ったんだけど実際やってみようとすると
難しい割りにうまくいかなくてしょんぼり・・・
0954デフォルトの名無しさん
2009/09/16(水) 14:58:10struct Writer
{ void Write(const DataType &data); };
typedef Writer<std::list<int> > Writer_IntList;
template<class Writer_IntList>
class Hoge : public Writer_IntList
{ std::list<int> data_; };
こんな感じかなあ
0955デフォルトの名無しさん
2009/09/16(水) 14:58:37template <typename T>
class base {
public:
T foobar();
}
class derivedA : public base<derivedA>;
こういう構成な気がするが…
0956デフォルトの名無しさん
2009/09/16(水) 14:59:200957デフォルトの名無しさん
2009/09/16(水) 17:18:05C言語に移植するんてことを考えない限り、構造体や関数を定義するより
なんでもかんでもクラスにしてしまったほうがいいんでしょうか?
0958デフォルトの名無しさん
2009/09/16(水) 17:19:350959デフォルトの名無しさん
2009/09/16(水) 17:55:300960デフォルトの名無しさん
2009/09/16(水) 17:58:380961デフォルトの名無しさん
2009/09/16(水) 18:23:130962デフォルトの名無しさん
2009/09/16(水) 18:40:59大抵失敗しない気がする。
0963デフォルトの名無しさん
2009/09/16(水) 18:47:22初期のC+オブジェクトな考え方を大声で吹聴するジジイどもは早く引退してくれ
0964デフォルトの名無しさん
2009/09/16(水) 18:56:22template<class DataType, template<class> class Writer>
class Hoge : public Writer<DataType>
{ DataType data_; };
こうじゃないかな。
>>957
構造化プログラミングもOOPもその他のパラダイムもできてしまうのがC++の柔軟さであり、罠でもあるところ。
柔軟に使いこなせればベストなんだろうけど、OOPだけを考えて作った方が失敗が少ないかもしれない。
0965デフォルトの名無しさん
2009/09/16(水) 19:31:260966デフォルトの名無しさん
2009/09/16(水) 19:36:41メソッドや継承だけでどうにかしようとは思わないな
0967デフォルトの名無しさん
2009/09/16(水) 21:23:16STLとboostは使うべきだと思う。
OOPで作るのが難しい物ってそうもない気がする。
まあ、ゲームなんかは物によってはOOPで作るのが難しいかもしれないが。
0968デフォルトの名無しさん
2009/09/16(水) 21:42:540969デフォルトの名無しさん
2009/09/16(水) 22:04:39ある。
前者は、構造化くらいで十分適切なところを無理にOOP化しても、という考え方で、
これに対しては「別に全部OOPでいいよね」って話になる。(Applicationクラスを
作ったりObjectクラスを作ったりするのはやりすぎだけど)
後者は逆に、ジェネリックプログラミングとかメタプログラミングとか便利じゃん、
という考え方で、こっちは「OOP縛りじゃ時々困るよ」って話になる。
この二つの話が混乱してる気がする。
0970デフォルトの名無しさん
2009/09/16(水) 22:08:51> 「OOPじゃオーバーキルだ」という場面と「OOPじゃ機能不足だ」という場面が
「OOPじゃ役不足だ」という場面と「OOPじゃ力不足だ」という場面が
でいいのに、オーバーキルとかゲームする人じゃないと通用しなくね?
0971デフォルトの名無しさん
2009/09/16(水) 22:16:06IT関係の記事とかにも使われてるじゃん
0972964==967
2009/09/16(水) 22:34:32前者も後者も開発効率を問題にしているという意味では同じでしょ。
C言語が手続き型しかできないからといって、作れないプログラムがあるわけじゃない。
俺が言いたいのは、適切にパラダイムを選んで柔軟に書く能力があればベストだけど、
経験の浅いPGにとって、選択肢の多さは良くない設計を選ぶリスクの増加になってるんじゃないかという事。
0973デフォルトの名無しさん
2009/09/16(水) 22:40:45boostと出会ったおかげでSTLを使う気になった。STL単独では使う気にならないな。
0974デフォルトの名無しさん
2009/09/16(水) 22:45:30後者はランタイム効率も変わるぞ
0975デフォルトの名無しさん
2009/09/16(水) 22:48:14前者もランタイム効率は変わるぞ
というか、基本は手続き型、必要ならクラス、必要ならジェネリック、必要ならメタ、
ってそんなリスキーかね?
全部クラスにする方がリスキーだと思うけど
0976デフォルトの名無しさん
2009/09/16(水) 22:53:20自作listだと、わざわざnextポインタから開いていかないといけないからメンドイ
0977デフォルトの名無しさん
2009/09/16(水) 22:57:16実際、一人で開発するならそれもいいかもしれない
もう少しプログラムを作りまくれば、ケースバイケースが見えてくるだろう。
あえて言うなら趣味でも、時間的な区切りをつけてみるといい。プログラムの効率をもっともっと考えれるようになる・・かもしれない
0978デフォルトの名無しさん
2009/09/16(水) 23:42:49パラダイムの違いによって出るランタイム効率の差なんて問題にならないレベルでしょ。
>>975
これを言ってはおしまいだが、C++がリスキーだと思う。
いろいろできるC++より、制限の多い言語の方が初学者向きという意味で「OOPだけ〜」と言った。
熟練したPGがC++をどう使うべきか、は宗教論争にしかならないんじゃない?
0979デフォルトの名無しさん
2009/09/17(木) 02:37:27OOP縛りの言語に乗り換えろって意味だったのか。
初心者だろうが熟練者だろうが、C++を使うなら最初から最後まで、必要なところだけ
OOPという使い方で十分だろ。
C++以外の「制限の多い初学者向き言語」の話はどうでもいい。
0980デフォルトの名無しさん
2009/09/17(木) 02:48:36できることが多くて混乱してしまう可能性があるから、使い方を制限して慣れてみたらどう?と言ってるんだろうと思うよ。
制限するくらいなら制限された言語を使えばよろしい、というのはもっともだけれど、ここはC/C++スレ。
0981デフォルトの名無しさん
2009/09/17(木) 02:58:37たいていのプログラムはデータをどうにかするものなんだから、
基本はクラス、必要なら手続き型、ジェネリック、メタ、
でよくない?
0982デフォルトの名無しさん
2009/09/17(木) 03:13:12OOP縛りの方がいいと主張してる。
なぜOOP縛りの方がいいと思ったか、理由を説明するために他の言語の話を出した。
> 初心者だろうが熟練者だろうが、C++を使うなら最初から最後まで、必要なところだけ
> OOPという使い方で十分だろ。
「必要なところだけ」とは言うが、全部Cライクで書くこともできるし、全部OOPで書くこともできる。
必要不必要の判断基準なんて人それぞれで、議論しても宗教論争になるだけだと思うんだが。
他人がどういう判断基準持っていようがケチつけるつもりはないよ。
>>957の質問に対して自分の考えを述べたまで。
0983デフォルトの名無しさん
2009/09/17(木) 03:24:56不可能であるという、一つの結論が出てたような
0984デフォルトの名無しさん
2009/09/17(木) 03:30:000985デフォルトの名無しさん
2009/09/17(木) 03:30:050986デフォルトの名無しさん
2009/09/17(木) 03:38:44俺はこれがもうわからんのだが、>>984はどう
0987デフォルトの名無しさん
2009/09/17(木) 03:45:510988デフォルトの名無しさん
2009/09/17(木) 06:56:30具体例をどぞ
0989デフォルトの名無しさん
2009/09/17(木) 07:42:380990デフォルトの名無しさん
2009/09/17(木) 07:58:29「OOPより簡単な物じゃ駄目だよ」と「OOPより複雑な物は初心者には要らないよ」を
同時に主張しているが、OOPは銀の弾丸じゃない。
昔よく見たような「OOPは難しいから初心者は全て手続き型でいいよ、でも構造化は
絶対に習得しようね」というOOP知らずな連中の甘言をそっくりそのまま一段進めた
だけにも見える。
大体、初心者を馬鹿にしすぎ。
0991デフォルトの名無しさん
2009/09/17(木) 08:14:32どうせここでは結論なんか出ない
0992デフォルトの名無しさん
2009/09/17(木) 11:54:520993デフォルトの名無しさん
2009/09/17(木) 12:43:06と言うのであれば、俺の主観だと OOP3 : 手続き7 くらいの割合を選ぶ。
4:6くらいでも良い。
OOP主体だと汎用性を高めようとして記述量が増えるか、インターフェースが
ゴタゴタで使い手側が気をつけないと危険な物になる印象。
それらを乗り越えるためにあえてOOPの練習するのも良いかもしれないが。
0994デフォルトの名無しさん
2009/09/17(木) 13:32:520995デフォルトの名無しさん
2009/09/17(木) 13:55:390996デフォルトの名無しさん
2009/09/17(木) 13:57:590997デフォルトの名無しさん
2009/09/17(木) 14:04:220998デフォルトの名無しさん
2009/09/17(木) 14:28:020999デフォルトの名無しさん
2009/09/17(木) 14:31:361000デフォルトの名無しさん
2009/09/17(木) 14:33:2310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。