【初心者歓迎】C/C++室 Ver.66【環境依存OK】
複数の半角スペース→ ×個数 TAB→ の置き換えを お勧めする。
3 :
デフォルトの名無しさん :2009/05/28(木) 11:41:07
VisualC++2008EEですが、 浮動小数点型として、別の型を定義して使っています。 typdef float float_t; これは、後でdoubleにしても対応できるようにする為です。 しかし、実際にdoubleに変えると、コンパイルが通らないことがわかりました。 std::pow( f, 2.0f ); このように、実数定数をf付きで書いている為、オーバーロードが解決出来ない為です。 しかし、2.0fを2.0に変えると、逆のケースでコンパイルが通らなくなります。 何かよい解決法はありませんか?
間に自前の関数かましては
リテラルを引数に取らずに const float_t k = 2.0; とかおいといて そいつを渡したらだめ?
>>4 自前の関数とは、
自前のpowを作るということですか?
それとも、2.0fをfloat_t(2.0f)とすることでしょうか?
前者は、組み合わせを網羅するとなると、結構厳しいです。
後者も、既に書いてしまったコードが大量にあるので
これも厳しいです。
キャストすりゃいいんだろうけど、大量にあるなら自前のやつ作れば数個で済むし テンプレートでやっちゃうのもいいんじゃない?
>>7 すみません、ちょっと意図が伝わりません。
数個とは、何が数個になりますか?
例えば、pow()にしても
pow(float,float);
pow(float,double);
pow(double,float);
pow(double,double);
の4つ必要になります。
そして、こういった関数は
引数を2つ以上とるもの全てだから
無数にあります。
さらに、実際はfloatとdoubleだけではなく
halfとlong doubleも含まれます。
この方法は現実的ではないように思えます。
それとも、複数の引数を、それぞれのサイズから最大サイズの型を作って
再代入するようなテンプレートをかます・・?
なるほど、これはいけそうな気がします。
最善策としては、今は大変ですけど
今後の為にも、定数はマクロなりで括るってのがいいでしょうか?
F(2.0f)みたいに。
エラーはオーバーロードの解決だろ、これの意味わかってる?
>>9 はい。今回の問題は、実数定数とfloat_tの組み合わせに
対するオーバーロードが解決できない為に起こっています。
なぜ型がアンマッチするか、それは実数定数がfloat_t型でない為です。
ゆえに、解決手段として正しいものは、実数定数をfloat_t型で書くことになります。
しかし、実数型は小さい型から大きい型にキャストしても
情報が欠損しないことは明らかです。
だったら、オーバーロードの候補が複数あった場合、
小さい型を大きくする方向でマッチングして、
最小の変更で済むものにするというルールでいいはずです。
そのルールが適用出来れば、ソースの改修を最小限に留め
問題を解決出来ます。
そういった方法がないか、確認した次第です。
実際ないですよね、F(2.0f)のマクロにします。
ありがとうございました。
11 :
デフォルトの名無しさん :2009/05/28(木) 17:40:11
f*f が早いしエラーでない。
unsigned 同士の演算の最小値はどんな場合でも 0 でいいの?
printfで出力した文字を全部消すのはsyrtem("CLS")でできたのですが 一部だけ消す方法はありませんか? 例えば最新の1行だけとか。。。 よろしくお願いします。
>>11 それって何ですか?
さっぱりわかりません。
15 :
デフォルトの名無しさん :2009/05/28(木) 21:10:58
boost::scoped_ptrを使ってるのですが、なぜ boost::scoped_ptr<hoge> phoge = new hoge(); は駄目で、 boost::scoped_ptr<hoge> phoge(new hoge()); はいいのでしょうか。両方とも普通にコンストラクタが呼ばれるだけじゃないかと思ったのですが。 hoge* h0(new hoge()); hoge* h1 = new hoge(); は両方とも通るし。
>>15 暗黙の変換を避けるため、コンストラクタがexplicitになっている。
こんなとき
void f(scoped_ptr<hoge> const&, int);
int g();
f(new f, g());の評価順序は決まっていないのだが、
もしnew hoge→g呼出→scoped_ptr一時オブジェクト生成→f呼出の順だったら、
g()が例外を投げると、new hogeに対するdeleteが呼ばれなくなる。
そこでf(new f, g());がエラーになるようexplicitが使われている。
=で初期化できなくなる弊害より安全性が優先されたということ。
なお、f(scoped_ptr<hoge>(new f), g());とすればコンパイルできるが、だめぜったい。
種類のわからない構造体へのポインタって宣言できますか?
void*??
で、どうやって構造体のメンバにアクセスするつもり?
便利だけど強力すぎて丁寧に使わないと大域変数みたいに混乱の元になったり
>>15 phogeはboost::scoped_ptr<hoge>型、new hoge()はhoge*型。
別の型のため、
> hoge* h1 = new hoge();
これとは比べられない。
暗黙の型変換で、型変換してコンストラクタを呼ぶ仕組みがC++にはあるが
>>16 の通り。
>>17 void*はポインタの先にアクセスする時に、元の型に型変換する事になるが型を間違えないように注意。
23 :
デフォルトの名無しさん :2009/05/29(金) 07:51:31
VS2008だと以下のコードをコンパイルできるのですが、これってコンパイルできない はずではないでしょうか?constでない参照に一時オブジェクトを渡してもよいので しょうか? class A{ public: void method()const{} }; void test(A& a){a.method();} int main(){ test(A()); return 0; }
>>23 A.method() の内部では A を書き換えないことを保証しているだけ
だから
void test(A& a) { a.method(); } は許される。
逆パターンの
class B {
public:
void method() {}
};
void test2(const B& b) { b.method(); }
これは test2 中の b は const であるにも関わらず
method 呼び出しで b内部変る呼び出しだぜ と判断するからコンパイルエラー
>>23 test(A()); のことを言ってる?
{ A tmp; test(tmp); }
と等価だから全然問題ないぞ。
別件で
class A {
int* p;
public:
A() : p(new int) {}
~A() { delete p; }
int* get() const { return p; }
};
int* test(A& a) { return a.get(); }
----
int* ptr;
ptr = test(A());
は問題が発生するけど
Aの一時オブジェクトのデストラクタが呼ばれた後に ptr を使おうとするから
>>23 そう。それはコンパイルエラーになるのが正しい。
Visual C++の独自拡張でコンパイルが通ってしまうだけ。
/W4で警告になる。あるいは、/Za(独自拡張なし)でエラーになる。
/Zaが嫌なら/we2664を使えばこれだけエラーにすることも可能。
27 :
デフォルトの名無しさん :2009/05/29(金) 22:08:03
#include <iostream> class test{ public: test(double x=0, double y=0) : m_x(x), m_y(y) {} double m_x, m_y; }; void main(){ test t = (100.0, 0.0); std::cout << t.m_x << " " << t.m_y << std::endl; } こうすると、 0 0 と表示されます。本当は 100 0 と表示されてほしいのですが、なぜこうなってしまうのでしょうか?
>>27 test t(100.0, 0.0);と書くんだ。
test t = (100.0, 0.0);だと、まず(100.0, 0.0)が順次演算子を使った式として評価されて、test t = test(0.0);と同じ意味になる。
えーとだな まずtest t = (100.0, 0.0);だが、(100.0, 0.0)は「100.0と0.0をカンマ演算子で繋いだもの」だ つまり100.0が捨てられて0.0が残るから、この式は結局「test t = 0.0;」と同じ事だ =での初期化だから、コピー初期化をするために右辺はtest型への変換が試みられる この時、デフォルト引数のせいでdouble1個でも呼び出せるためにtest(double x=0, double y=0)が 変換コンストラクタとして働く つまりdoubleの0.0がtest(0.0,0)によってtest型に変換され、tにコピーされる だからtのm_xもm_yも0になるというわけだ 要するに「test t(100.0, 0.0);」と書け
30 :
デフォルトの名無しさん :2009/05/29(金) 22:27:41
>>28 なるほど、分かりました。実は
test t = (100.0, 0.0, 99999);
と書いたら
99999 0
と表示されたので、クラスの中身を破壊でもしてるのかと思ってました。
最後に右側が評価されるので、
test t = 99999
と評価され、コンストラクタにデフォルト値を設定してたのでコンパイルも
通ってたみたいです。
言われたとおりに初期化を書き換えました。
ありがとうございます。
31 :
デフォルトの名無しさん :2009/05/30(土) 02:03:47
ビルド→デバッグ 0 0 0 0 0 デバッグ 0 0 0 0 1 デバッグ 1 0 0 0 1 といった様に配列に追加書き込みをする方法を教えていただけませんでしょうか?
項目名とその値の組み合わせを複数渡す必要があるとき 構造体のlistを渡すのとmapを利用するのはどっちが無難でしょうか?
あるポインタが指してるアドレスを別のポインタとか変数に入力する事って出来ますか?
はい
来年就職に備えて、行き当たりばったりな開発の仕方から しっかりと設計してから開発の流れにもっていきたいんだけど、 デザインパターンとかUML学べばおk? ためになる資格とかお薦めの参考書あれば教えてくほしい
struct Hoge { int hoge; ... }; class Hoge { Hoge():hoge(0){} public: int hoge; ... }; 上みたいにclassにメンバ関数加えても、継承や仮想関数を使わない限り同じメモリ配列になるのは決まってるんでしょうか それとも、そう思い込んではいけませんか
NULLポインタをdeleteしても何も起こらないらしいですが、配列のポインタの場合がNULLポインタだった場合にdelete[]をしても何も起こりませんよね???
起こりませんよ!!!
まあ、NULLのポンタをdeleteする時点で 何か間違ってる可能性は否定しない
ポンタか なるほどね
ぬるぽんた
43 :
38 :2009/05/30(土) 14:15:34
デストラクタでわざわざif (pArray) delete[] pArray;って書くのもナンセンスなのかなって思っただけです。 普通のポインタはdelete p;で済ませますよね? で、配列もやっぱり同じことができるのかな、と。 "delete[]"で検索してみても、[]はキーワードにならないみたいで、マッチしたページが出てこないのでここで質問してみました。
>>43 うん,ナンセンス。
NULLをdelete[]しても何も起こりませんからご安心ください!!!
>>40 行田市でタヌキの赤ちゃんが見つかったニュースですね
46 :
デフォルトの名無しさん :2009/05/30(土) 16:22:53
VC2008で関数にカーソル合わせると、ヘッダファイルに書いた宣言とコメントが表示されたような気がするのですが、コメントが表示されません。 コメントはヘッダのどこに書けば表示されるのでしょうか。 それともなにか設定があるのでしょうか?
>>37 コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子以外なら大丈夫
これらを一つでも作った場合は規格上は保証されない
48 :
デフォルトの名無しさん :2009/05/30(土) 19:39:16
>>38 そんなのやる時間があったら、なにかソフトを1つ自分で書いてみろ。
50 :
デフォルトの名無しさん :2009/05/31(日) 12:34:34
std::vector<T>の最後尾の要素を移動したいとき、 std::vector<T> vec; T tmp = vec.back(); vec.pop_back(); という感じで、二段階でやるしかないでしょうか?
51 :
デフォルトの名無しさん :2009/05/31(日) 13:57:17
C++の参照渡しについての質問です。 以下のようなメンバ関数があったとします。 SStruct GetReturnStruct() const; INT32 GetReturnINT() const; これらの関数を以下のように使用します。 1. SStruct sStruct = GetReturnStruct(); 2. INT32 nINT = GetReturnINT(); 3. SStruct& sTestStruct = GetReturnStruct(); 4. INT32& nTestINT = GetReturnINT(); 5. const SStruct& c_nTestStruct = GetReturnStruct(); 6. const INT32& c_nTestINT = GetReturnINT(); 実行環境はVisualStudio2005です。 1と2は普通にコンパイルして実行できるのですが、 3と4の場合、3はコンパイルが通り、4はエラーメッセージ 「'INT32' から 'INT32 &' に変換できません。」 が出てしまいました。 また、5と6ではコンパイルが通りました。 1から6までは内容的には同じ値が入ると思うのですが、 内部的な処理はそれぞれどのようになされているのでしょうか? 構造体などを使うときはなるべく参照かポインタを引数にしたほうがよい と聞いたのですが、参照の使い方がまだ今ひとつ理解できていません。 どのような場合に参照渡しをしたほうがよいのでしょうか?
>>51 参照渡しと言えば普通は引数についての議論だけど、
1〜6は戻り値の受け取り方だろ。噛み合ってない。
まあ、戻り値について言えば、3〜6は参照先の実体が失われるような受け取り方なので、
危険であり、ありえない。
内部的な処理で言えば、参照はポインタと同じで、どこかにある実体を指しているだけ。
実体は他でちゃんと保持されなければならない。
>>50 例外安全のために二段階に分けられている。
そのやり方しかない。
54 :
デフォルトの名無しさん :2009/05/31(日) 15:28:12
>>52 ごめんなさい、参照での戻り値についての質問でした。
3〜6は参照先の実体が失われるとのことですが、
具体的にはどのようなケースで危険が発生するのでしょうか
SStruct& sTestStruct = GetReturnStruct(); は
1.GetReturnStruct()で返り値の変数が作られる
2.それを参照する。
SStruct sTest1Struct = GetReturnStruct();は
1.GetReturnStruct()で返り値の変数が作られる
2.宣言SStruct sTest1Structで変数が作られる
3.返り値の変数をsTest1Structに代入
と思っていたため、変数が作られるのが一つ少ない分
SStruct& sTestStruct = GetReturnStruct();
の方が良いと思っていたのですが・・・
>>54 > SStruct& sTestStruct = GetReturnStruct(); は
> 1.GetReturnStruct()で返り値の変数が作られる
> 2.それを参照する。
つづきは
3. 1で作った返り値の変数が破棄される。(参照は破棄済みのデータを指すことになり、使えない)
> SStruct sTest1Struct = GetReturnStruct();は
> 1.GetReturnStruct()で返り値の変数が作られる
> 2.宣言SStruct sTest1Structで変数が作られる
> 3.返り値の変数をsTest1Structに代入
つづきは
4. 1で作った返り値の変数が破棄される。(コピー済みのsTest1Structは残るので、使える)
56 :
デフォルトの名無しさん :2009/05/31(日) 16:32:15
>>55 Thanks
ですが、
SStruct& sTestStruct = GetReturnStruct();
では、その後も普通に取得した値の参照が使えてしまいます・・
なぜこのような事態が発生するのかわかりますでしょうか?
58 :
デフォルトの名無しさん :2009/05/31(日) 17:28:49
const参照は一時オブジェクトを束縛する ということで了解しました。回答ありがとうございます。 ところで、クラスのメンバ関数の作り方で再び質問で、 以下のようなクラスがあるとします。 class CTest { private: SStruct m_sTestStruct; public inline VOID GetStruct(SStruct& sGetStruct) { sGetStruct = m_sTestStruct; } inline SStruct GetStruct() { return m_sTestStruct; } } メンバ変数のm_sTestStructを取得する関数の書き方としては、 1. VOID GetStruct(SStruct& sGetStruct); 2. SStruct GetStruct(); のどちらが処理的には良いのでしょうか? 直感的な見た目としては戻り値がSStructの方がわかりやすいと思うので 自分は大体2の方を使っております。
59 :
デフォルトの名無しさん :2009/05/31(日) 17:30:10
あと、構造体の質問で以下のような構造体があるとします、 struct SList { SStraightCardList(); ~SStraightCardList(); E_TYPE eType; INT32 anArray[3]; }; このとき、以下のような初期化をしようとすると static const SList SLIST_DEFAULT = { eN_DEFTYPE, 1, 2, 3 }; error C2552: 初期化子リストによる個別の識別子の初期化に誤りがあります。 ユーザー定義のコンストラクタを含む型はアグリゲートではありません。 とのエラーメッセージで構造体の初期化がうまくいきません・・・ 構造体ではデフォルトコンストラクタを自分で定義してしまったら 初期化 = {..., ..., ...}; の書き方は使えないということなのでしょうか?
すいませんプリコンパイル済みヘッダーというのが使い方がよく分からないのですが、 pch.hファイルに使用する全てのヘッダーファイルのincludeを書いて、 他のcppファイルはpch.hのみincludeするというのが正しい使い方なんでしょうか
61 :
デフォルトの名無しさん :2009/05/31(日) 17:32:40
すいません。コンストラクタ部分をこぴぺミスしました。 SStraightCardList()→SList()です。 よろしくお願いします
>>58 今はVOIDだが、他に戻り値が必要なら1。
SStructがコンストラクタを持つなら、コピーコンストラクタ一発で値を返すことができるので2。
SStructがただの構造体なら1も2も同じだけど、呼び出しが楽なので2。
それより良い手は const SStruct& GetStruct() const { return m_sTestStruct; }
>>59 ttp://msdn.microsoft.com/ja-jp/library/0s6730bb (VS.80).aspx
>>60 プリコンパイル済みヘッダには、各cppで共通のヘッダで、変更の少ないものを書くのが普通かと。
変更があると、全cppを再コンパイルする羽目になるので。
各cppはプリコンパイル済みヘッダと、不足分のヘッダをincludeする。
int data_1[100][200] int* p_data; p_data = &(data_1[0][0]); として、 p_data[50][70]; などとしてデータを取り出したいのですが、うまくいきません。 *(p_data + 50*200 + 70)とすれば取り出せることは分かったのですが、 2次元配列形式でデータを取り出すのは不可能なのでしょうかデータのコピーはしたくありません
int* p_data[][]; もしくは int* p_data[100][200];
int* p_data[][]; と記述するとコンパイルエラーになります。 あと、p_dataの参照先はdata_1だけでなく、 条件によってサイズの異なる別の配列を参照する場合があるので、 サイズを固定することはできないです。
先頭を渡すなら p_data = &(data_1[0][0]); じゃなくて p_data = data_1;
>>65 サイズが違うなら多次元配列を1次元配列とみなして
*(p_data + 50*200 + 70)
のような感じでアクセスするしかないんじゃない?
typedef int (*data200)[200]; data200 p_data = data_1[50]; return p_data[70];
>>65 ポインタの配列を使えば可
でも、受け取った関数側でサイズを知る方法が無いから
追加の引数でサイズを渡すとか構造体にまとめてから渡すとかしないとダメぽ
struct tag_matrix_t
{
int width, height;
int **data;
};
みたいに
71 :
デフォルトの名無しさん :2009/06/01(月) 11:30:21
std::vector<T> vec; std::deque<T> deq; があるとき、中の要素を適当に並べ替える関数を定義したいのですが、オーバーロードを使って、 mysort(std::vector<T> &v); mysort(std::deque<T> &d); とやっていたのですが、イテレータ引数の関数を定義して1つにまとめてしまいたいです。 どうやればいいですか? テンプレートを使って書くのは、結局自分ではイテレータを定義してないというか、 dequeやvectorのテンプレート機能を呼び出しているだけという感じがするのですが。
72 :
デフォルトの名無しさん :2009/06/01(月) 12:18:40
ファイルからの入力の場合、vectorのソートと、setのソートはどっちが速いですか? メモリに一気に格納してソートか、一つずつソートする違いです。
>>72 テストソース書いて実測してみればいいよ。
ファイルの置き場所によって変わる可能性もあるだろうけど
メモリに一回あげたほうが早いと思う
74 :
デフォルトの名無しさん :2009/06/01(月) 12:23:51
ありがトン 実測してみます
75 :
デフォルトの名無しさん :2009/06/01(月) 13:20:15
最小2乗法によるm次の多項式近似を行うプログラムを教えてください 教えて xがー2の時yが3.02 −1の時0.98 0の時1.22 1の時2.16 2の時2.61 の時のです 出来ればソース全文書いてください
いいえ
77 :
デフォルトの名無しさん :2009/06/01(月) 14:33:33
VS2008でC++でコンソールプログラムを書いてます。 std::cout << "" << std::endl; とかで出力を出しているのですが、それをテキストファイルに書き込みたいのですが、 プログラム内でファイルを開いてそこに書き込んで、、、渡河やらないと駄目でしょうか?
> でリダイレクトすれば標準出力をファイルに落とせる
79 :
デフォルトの名無しさん :2009/06/01(月) 15:54:04
Windows & C++の質問です。 例えばCのqsort()関数のように、中身を直接弄らなくても、 ユーザが処理の一部を書けるようにする……という手法がありますよね。 とあるフレームワーク(ライブラリ群)を作成するにあたり、 エントリポイント(main関数)を隠蔽した状態で、一部の処理をユーザに記述させるにはどうやるのがスマートでしょうか? 現在こちらが想定しているイメージとしては、フレームワーク開発側が以下のようなコードを書いておき、 その中の setting.init() をユーザに用意してもらう……といった感じです。 int main ( 〜 ) { Setting setting; //適当なシングルトンクラス setting.init ( ); //ユーザが記述する初期化処理 /*メイン処理*/ return 0; } Setting::init()は、中身が空っぽでも大丈夫とします。 その際、もし可能であれば、わざわざユーザがinit()部分を書かなくても良いようにしたいなあと考えています。 Settingクラスには、init()以外のメンバ関数があり、それらはユーザがタッチしなくてもよい部分です。 そのため、それらはフレームワークの中に隠蔽しなければなりません。 ですが、そのままやると、1つのクラスがフレームワークの内外に散ってしまうので、なんとなく気持ち悪いです。 継承や関数ポインタも考えましたが、main()内を弄らずに指定する方法が分かりません。 また、DLLを用意して読み込む方法はナシとします。
Cの初心者本でオススメってなんかない? 基本情報の午後にむけて勉強したいもんで
81 :
デフォルトの名無しさん :2009/06/01(月) 19:54:20
VC++ 2008 にて、コントロールのサブクラス化を行っているのですが、 ボタンのクリックイベントで詰まりました。 ウィンドウプロシージャ内で、 マウスの左ボタンクリックのイベントを拾いたいのですが、 WM_LBUTTONDOWN、WM_LBUTTONUP や ダブルクリックの WM_LBUTTONDBLCLK はあるものの、 シングルクリック(マウスを押して離す)の定義が見つかりませんでした。 WM_COMMAND だと親コントロール依存になってしまうので避けたいです。 .NETクラスライブラリの Control.WndProc を覗いてみると、 WM_LBUTTONDOWN の際に、押された事を示すフラグを内部的に立て、 フラグが立っている状態(そのコントロール外でマウスボタンを離さない)で、 WM_LBUTTONUP が来たら クリックイベント発動。 という、けっこう面倒な処理をしていました。 どうしようもなければ、.NETと同じようなコードにしようと思うのですが、 もっと簡単な実装などありますでしょうか? よろしくお願い致します。
>>81 多分無い
ボタンに対して マウスLB押下
そのまま ドラッグしていって ボタンの範囲外に抜けた後に
マウスLB開放
した場合とかを考え出すとね…
83 :
デフォルトの名無しさん :2009/06/01(月) 20:48:19
メモリマップ度ファイル便利と思って多用していたが、 巨大なファイルのシーケンシャルリードするとメモリ解放しないままで 次々に読むから不安定になるな。
84 :
83 :2009/06/01(月) 20:51:35
自分の予定では、次に読むだろうところだけ先読みして あとは開放しているもんだと思っていた。 しかしためられるだけためてた。
>>82 ありがとうございます。やっぱ厳しそうですね。。。
.NETのクラスライブラリを参考に作ることにします。
86 :
デフォルトの名無しさん :2009/06/01(月) 21:13:30
>>83 ,84
もしよかったら、どういうシチュエーションで便利に使ってたか教えてよ。
87 :
83 :2009/06/01(月) 21:28:40
メモリにロードせずに、そのまま操作できるところ。 ケースによっては、自前でバッファを管理して入出力するより高速に動く。 OSやディスクのキャッシュが適切に効いた場合、入出力バッファ処理を気にする必要がなくなる。
>71 template<typename RandomAccessIterator> void mysort(RandomAccessIterator first, RandomAccessIterator last); の何が不満なの? 他人が書いた Iterator を使って望みの事ができるならわざわざ自分で書く必要ないだろ? そもそもコンテナ用の Iterator 書くならコンテナの実装を知ってる方がいいわけで、 その意味でも自分で書く必要がない。 >84 物理メモリ上に載ったままって話?
89 :
デフォルトの名無しさん :2009/06/01(月) 21:49:42
物理メモリにはのったままではないけど、ギリギリまで使い切ってる。 あとは仮想メモリに入っているよう。この仮想メモリはOSのものとは別物の気がする。 メモリマップドファイルすると、した分は仮想メモリとしてOSは認識しているようにおもう。
90 :
デフォルトの名無しさん :2009/06/01(月) 21:53:09
予想では、次々に同一ファイルのロードが起こると、 OSは大事なファイルと認識しメモリに蓄えておこうとするのだと思う。 もっとも最近に参照されたファイルが優先されて、そのファイルだけが残ると思う。
>>90 OSじゃなくメモリマップドファイルを実現してるクラスとかがメモリを確保してるだけでしょ
windowsだと確か設定を変えなければ一つのアプリが最大使えるメモリって
2GBだっけ?
そのくらい物理メモリ詰んでなければそりゃ使い続ければいずれ物理メモリを超えるので
スワップ発生するだろうし
92 :
デフォルトの名無しさん :2009/06/01(月) 22:21:16
メモリマップドファイルは、windowsが用意している関数でそのメモリ使用量を自前で制御できない。 まったくメモリにキャッシュしないようにするオプションはあるけど。 OSの制御にあって、使用中は全く手出しできない。
WindowsXP VisualC++2008EEです。 クラスの中のメンバクラスに関する質問です。 ---------------------------- class ClassA{ ClassA( int a, int b ) { }; //コンストラクタ ^ClassA( void ) { }; //デストラクタ }; ---------------------------- 上記のように引数付きのコンストラクタを持つクラスがあるとき ---------------------------- class ClassB{ private: ClassA mClassA( 1, 2 ); }; ---------------------------- といった形で、メンバクラスを宣言しようとすると、 「error C2059: 構文エラー : '定数'」 といったエラーが出てきてしまいます。 引数付きのコンストラクタがあるクラスをメンバとして持つには、 どのようにすればよいのでしょうか?
>>92 そういう作りなのか
まあ気に入らなければ自分で作ればいいだけだしな。
>>93 class ClassB {
ClassA mClassA;
ClassB() : mClassA( 1, 2 ) {}
};
classB のコンストラクタで メンバの初期化
>>79 Settingクラス(フレームワーク提供)を継承したクラスをユーザが定義し、
そのファクトリ関数もユーザが定義するようにすればできない?
Setting::init()は空の仮想関数。
ファクトリ関数はグローバルで、関数名とプロトタイプはフレームワーク仕様により規定。
98 :
デフォルトの名無しさん :2009/06/01(月) 23:42:28
jpgファイルをWindowsのアプリから表示したい時、boost::gilを使ってる人いますか? 使う言語はC++なのですが(Win32APIは出来る限り使ってません)、 WindowsのAPI使った方がいいのか、わざわざboost::gil使う意味あるのか。
99 :
79 :2009/06/01(月) 23:42:39
>97 ありがとう。 ファクトリ関数が何なのか調べるところから始めてみる。 ……要は、継承先のクラスを指定する部分だけを フレームワークの外に出してしまえばいいんじゃね?ってこと?
>>95 ありがとうございます!
動きました・・・・が、見たこと無い形なので、なぜ動いたかが分からない・・・。
「コンストラクタ初期化子」というのがあるそうですね。
そういうものだと割り切って覚えるのが早いでしょうか。
コンストラクタの初期化リストは大事だから 知らなかったならちゃんと勉強し直した方がいい
初期化リスト使えないとconstなメンバを初期化できないから注意な
コンストラクタの後ろにコロンで繋げて 初期値を指定するのって、地味にめんどい
104 :
砂ぐま :2009/06/02(火) 00:28:02
教えてください。 [1]C++ [2]締切:6/3 [3]問題文 以下の問題はprintf scanfを用いらず、cin coutを使用しなさい @2つの4行4列の行列が与えられたとき、 その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。 (※ヒント whileループは行列をキーボードから入力するためにも用いる) A3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。 (1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム (2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム Bwhileループと複合代入演算子を用いて、等差数列 1+3+5+7+・・・・・・+9999を計算するプログラムを作成しなさい。 CBのプログラムを実行した結果はいくらになるか? D型変換として、算術演算子のオペランドの一つがdoubleで、片方がintであれば、 int型のオペランドはdouble型に変換されて、計算される。 下記は例である。 int a; float b; a=(int)b また、下記のようにすると、 int a=5,b=3; float c,d; c=a/b; d=a/(float)b で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。
>>101 まだまだ勉強中の身なのです。
>>102 なるほど! 確かにconst指定したメンバが
コンストラクタで初期化できないから、
どうするんだ?、と悩んでたことがありました。
>>103 そうですね。自分も30個くらいメンバが必要なので
同じことを考えていました。
>>104 具体的に何が分からないのか答えなさい。(5点)
107 :
砂ぐま :2009/06/02(火) 01:20:43
110 :
デフォルトの名無しさん :2009/06/02(火) 03:57:02
boost::gilの使い心地の方もお願いしま〜す。
112 :
デフォルトの名無しさん :2009/06/02(火) 05:41:26
int i =100; float* pf = (float*) &i pf = pf * 2 このコーディング、どこだダメなんでしょうか
>>112 intとfloatの内部表現が一致している保証はどこにもないから
それとポインタに対する演算はアドレスを取る事と定数を足す引く
しか認められていないからポインタを2倍するとか全く無意味
114 :
デフォルトの名無しさん :2009/06/02(火) 05:53:16
ありがとうございます。 内部表現が一致するとは、具体的にどういうことでしょうか? これであればアドレスの中身(100?)を2倍することになるのでしょうか *pf = *pf * 2
>114 内部表現が一致するとはiと*pfの値が等しい時に常にiと*pfのビット列 が等しい事が保証されている事を意味する しかし実際には大部分の計算機では浮動小数点はIEEE754、整数は 2の補数表現を取っている事が大部分で内部表現にお互いの互換性 はない >*pf = *pf * 2; *pfが元々floatの変数のアドレスを取っている時はその通り 今のように元々intの変数のアドレスを取ってそれを2倍したら浮動小数点例外 が起きるかもしれない
116 :
デフォルトの名無しさん :2009/06/02(火) 06:36:32
高精度の文字エンコード判定・自動変換ライブラリ で一番いいのはなんでしょうか?
117 :
デフォルトの名無しさん :2009/06/02(火) 06:43:49
秀丸とかEmとかは判定どうやっているのかわかりませんか? (世界各国で通用するのは)モジラかIEくらいしかしりません。 エディタの作者は自分で作っているんですか?
118 :
デフォルトの名無しさん :2009/06/02(火) 07:06:57
ありがとうございます。
>>117 ちょっと文字コード調べればわかると思うけど、
それぞれの文字コードで仮定して矛盾が生じたら違うと判断すればいいんだよ。
どこまで調べるか、どうやって調べるかはそのアプリの性質で決めたらいい。
判定不能な場合どうするかもね
120 :
デフォルトの名無しさん :2009/06/02(火) 10:07:44
理屈はわかりますが、実際にやると大変です。 これはエディタの本体(GUI)を作るほど手間がかかりそうです。 世界各国語に対応させる場合。
>>120 文字コード扱うプログラマとしては常識の範囲ですが・・・
テキストごときでwwwとかいうゆとり多いけどテキストほど面倒な物は無い。
文字コードを限定すればなんとかなるけど
たかがテキストごときで
文字コードの自動判別は不可能なんだから実装する必要なし ユーザに選択させればいいだけ ブラウザはhttpヘッダのcharsetで判定してるだけだろ
ICUライブラリを使う(キリッ
125 :
デフォルトの名無しさん :2009/06/02(火) 13:12:49
判別、自動変換はできるのですか
とりあえず入力コードと出力コードを指定して一発で変換することはできるし、 CharsetDetectorっていう判別専用のクラスもある 世界中の業務用アプリで使われている実績もあるしライセンスも緩くて使い勝手もいい 問題は添付するdll(so)が糞大きいことだけ
127 :
デフォルトの名無しさん :2009/06/02(火) 13:43:37
トンクス
float の NAN ってどういう値なんですか?
ありがとうございます
131 :
デフォルトの名無しさん :2009/06/02(火) 20:50:15
質問です。 CLSはクラスで、int charなどの変数で構成されます。 CLSの変数と同じ順番で記録されているファイルがあり これを vector< CLS > x; にロードしたいのですが Read( &x[0] ) のようにしてもうまくいきません。 データが壊れています。 一括でロードする方法はありませんか?
ないと思うべき。 順番が同じでも、アラインメントが入ってどうせファイル上のデータの並びと同じではないだろう。
133 :
131 :2009/06/02(火) 20:54:25
vectorのソートを使いたいんです。 構造体に読み込めば出来そうですが それをvectorにコピーしたらいいでしょうか? 無駄なことをしている気がしますが。
134 :
131 :2009/06/02(火) 20:56:51
サンクス 一度にロードして、vectorに正しく挿入することにします。
135 :
デフォルトの名無しさん :2009/06/02(火) 21:01:25
すみません。 変更して構造体に入れてqsortにします。
int a = 10; この変数aを関数の引数として渡す場合、 void FuncA(const int n){ int test = n; } void FuncB(const int& n){ int test = n; } の関数があるとして FuncA( a ); FuncB( a ); 結果としては2つとも各ローカルのtestに10が入りますが後者(FuncB)はなぜこれで大丈夫なのでしょうか。 aのアドレスをFuncBに渡している…となると Func( &a ); でないとエラーが出そうなのに・・。 むしろ後者は前者とどういう処理の違いがあるのか気になります。
138 :
デフォルトの名無しさん :2009/06/03(水) 00:50:33
>>136 いちいち&aと書かずに済むポインタだと思っても3割くらい当たっていると思ってもいい。
140 :
デフォルトの名無しさん :2009/06/03(水) 01:22:26
Player.cppの中の bool Player::SelectCard(const Card ¤t, int DrawObligation, Card *playcard) という関数を書き換えれば新しい戦略が書けます。 この関数は前のプレイヤが出したカードがcurrent、何枚か引かないと駄目な状態になって る場合には、DrawObligationが2以上になってます。出すべきカードが見つかればtrueを 返して、*playcardに出すべきカードを入れます。 以上です。失礼しました。
141 :
デフォルトの名無しさん :2009/06/03(水) 07:55:24
hashmapは存在してますが、hashsetは効いたことがありません。 stlのsetは効率がいいので開発されてないんでしょうか?
142 :
131 :2009/06/03(水) 10:28:10
構造体になんとかしてロードしたかったのですが、これも値がずれてしまいました。 値がずれずに一括でロード出来る方法はないんでしょうか? 一括で読み込んで、クラスや構造体に格納していくしかありませんか。
>>142 そもそも保存するときにズレてるんじゃない?
パディングとかオープンモードとかあるから
144 :
131 :2009/06/03(水) 10:35:05
アライメントに注意してデータ作成時に隙間を作っておく必要があるんですね。 自己解決しました。
145 :
デフォルトの名無しさん :2009/06/03(水) 11:01:21
隙間を作る (構造体、クラスをそのまま出力する) 方法で一括ロードできました。 ありがとうございます。
146 :
デフォルトの名無しさん :2009/06/03(水) 17:50:27
C言語の学習を始めたばかりですが、 char型配列の要素を、int型の数値に出来なく困っています。 (Borland C++ 5.5.1 for Win32) char s[3],a; scanf("%s",&s); の時、*6 と入力すると s[0] → * s[1] → 文字としての 6 s[2] → \0 となっていると思うのですが、s[1]の6を数値として 取り出すにはどうすればよいのでしょうか? 以下やってうまくいかなかった事です。 1)printf("int=%d\n",(int)s[1]);→int=54 2)a = s[1]; printf("int=%d\n",(int)a);→int=54 3)printf("int=%d\n",atoi(s[1])); 4)printf("int=%d\n",atoi(a)); 3,4ともに「パラメータ '__s' は const signed char * 型とし て定義されているので int は渡せない(関数 main )」とエラー。 悩んでしまってここから全く前に進めなくて弱っています。 ご存知の方ご教示ください。よろしくお願いします。
途中になった printf("int=%d\n",atoi((int)s[1])); としてキャストしないと
>>141 あるよ。DinkumwareとかSGIとかは、hash_mapと共にhash_setも作っている。
そして、unordered_mapとunordered_setという名前でC++標準にも入るし、VCやg++でももう使える。
>>146 どんな教科書使って勉強してる?
C言語はBASICみたいに文字列をひとまとまりの変数として扱えないし
数値との相互変換も簡単にはできないので、
一通り教科書を読み終わってから
そういう(Cの初心者には)むつかしいことにはチャレンジしたほうがいいよ。
151 :
146 :2009/06/03(水) 20:09:49
>>147-148 早速のレスありがとうございます。
>>150 雑誌の初心者向けの連載を参考にしています。
サンプルを改造しようとしても型変換のようなところで躓いてしまいます。
仰る様にいくら考えても分からない部分は後回しにして進めてみたいと思います。
>>147-148 文末のコードでコンパイルしてみましたが、
エラー E2342 パラメータ '__s' は const signed char * 型と
して定義されているので int は渡せない(関数 main )
と出てしまいました。
本当に学びはじめなので、考えられない間違いがあるかもしれません…。
ご指摘いただければ助かります。よろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
int main() {
char s[3];
scanf("%s",&s);
printf("int=%d\n",atoi((int)s[1]));
return 0;
}
>>147-148 馬鹿はわざわざ書き込まなくてもいいのですよ。
>>151 取り敢えず、printf("%d\n", atoi(& s[1]))とでもして味噌。
153 :
146 :2009/06/03(水) 20:45:12
>>152 ありがとうございました!できました。
エラーの意味が少し分かった気がしました(これから勉強します)。
>>147-148 即レス感謝しております。色々とキッカケになりました。
ありがとうございました。
154 :
デフォルトの名無しさん :2009/06/03(水) 23:02:04
155 :
デフォルトの名無しさん :2009/06/04(木) 01:41:16
http://www.setsunan.ac.jp/~center/kyositu/freec/dl2008.html このページを参考にコンパイラをインストールしました。
このページの最後にある、使い方を見るってやつのことで質問なのですが、
僕のbcc32は奥の方にあって(C:\Borland\...)、最終的にbcc32があるところにたどりつくのですが、
ここでしかコンパイラできないじゃないですか?
それが面倒なのでどうにか簡単にできないかってことと、
bcc32があるディレクトリの中には他にもいろんなプログラムがあるんですが、作成したCファイルも
同じところに保存しないとコンパイル&実行できないですよね?
つまりこのディレクトリの中がいろんな形式のファイルがあってめちゃくちゃ汚くなっちゃうわけです。。
これってなんとかキレイにまとめる方法ってあるでしょうか?
もしあるなら、申し訳ありませんが教えてください(>_<)
156 :
155 :2009/06/04(木) 01:46:27
すみません補足です。。 一部コンパイラ→コンパイルですね ↑のは自分で見なおしてみるとちょっと日本語がアレなので簡潔に質問しますと、 1.cdの回数を最小限にする方法(bcc32を含むディレクトリをC:の直下に持ってきていいのでしょうか?) 2.CファイルはCファイルだけでどこかにまとめて、そのうえでコンパイル&実行はできるのか ということです。 よろしくお願いします。。
使い方を見るじゃなくて、先に >インストール(WindowsVista)に進む >インストール(WindowsXP,2000)に進む >インストール(Windows98,95)に進む のどれかを見ろ。 環境変数を設定する解説がある。 それを設定すれば、どこからでもbcc32が呼び出せるようになる。 あとは好きなところにディレクトリを作って、その中でコンパイルすればいい。
そこの説明どおりにやればどこでもコンパイルできるはずだけど?
159 :
156 :2009/06/04(木) 11:46:59
>>157 ,158
ありがとうございます。
OSはVistaで、ここに書いてある通り環境変数も設定したつもりなのですが
できないんです。。
;c:\borland\bcc55\bin
ですよね?
これだとここで指定したディレクトリじゃないとできないってことでしょうか?
ローカルディスク(C)の中ならどこでもコンパイルできるようにするには、設定を
c:\
にすればいいということでしょうか?
>>159 コマンドラインで、path と打って出てくる文字列に c:\borland\bcc55\bin はあるか?
ちなみにシステム変数の設定をしたあとで開いたコマンドプロンプトじゃないと
有効じゃないぞ
161 :
デフォルトの名無しさん :2009/06/04(木) 12:06:53
>>160 コマンドプロンプトでpathを打つとちゃんと出てきます。
それで、確認用ファイルを
c:\Emacs\C\test.c
という風に作ったディレクトリに保存して、Cディレクトリ内で
c:\Emacs\C\>bcc32 test.c
というようにコマンドしても操作可能なプログラムとして…
というメッセージが返ってきます。。。
bcc32 test.c これを、 c:\borland\bcc55\bin\bcc32 test.c と打つとどうなるよ。
あと環境変数の最後に書いてある? 最初と最後以外は ; で区切ってないと前後とくっつくぞ
164 :
デフォルトの名無しさん :2009/06/04(木) 13:16:59
WindowsでWinSockのプログラムを書くとき、C++ではなくCを使うのでしょうか? どうしてもC++で書きたかったら、 struct sockaddr_in とかそういうのは、上手く自作のクラスにまとめてしまえばいいのでしょうか?
別にC++でもstruct sockaddr_in とかそういうのは書けるだろ
166 :
デフォルトの名無しさん :2009/06/04(木) 13:38:12
でもネットワーク関係の例題プログラムを見てると、参照は使わないし、クラスもなし、マクロ使いまくり、 とかそういう感じのプログラムばかりだったので、みんなそんな感じなのかなと。
167 :
デフォルトの名無しさん :2009/06/04(木) 14:03:34
>>162 そうコマンドすればコンパイルできます。
ただし、"コマンド'ilink32.exe'を実行できない"とエラーが出ます。
やはりbinディレクトリの中でやりくりするしかないのでしょうか?
>>163 そこは大丈夫です。ちゃんと; ;で挟んであります。
>>167 リンカがパス通ってないからな。
それでコンパイルできるなら、PATHがおかしいんだよ。
どこかタイプミスがあるはず。その部分コピペして貼り付けてみ。
コマンドプロンプトのコピーのしかたはわかるよな?
169 :
デフォルトの名無しさん :2009/06/04(木) 14:30:41
>>168 %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\usr\local\bin;D:\MinGW\bin;c\borland\bcc55\bin;C:\Program Files\QuickTime\QTSystem\
これがパスの設定です。これのことですか?
コマンドプロンプトのコピーの仕方はわかりませんが(笑)、
ちょっと打ってからTabで出してるのでタイプミスはないと思います。。
>>169 >c\borland\bcc55\bin
コロンが抜けてる
c:\borland\bcc55\bin
で
このすれ優しい人が多いね。 感動した!
172 :
169 :2009/06/04(木) 15:36:42
>>170 おぉ!!できました!
親切にありがとうございます!!
171じゃないですが、本当に優しい人が多くて助かりました!
あと、ついでと言ってはなんですがコマンドプロンプトについて質問です。
コマンドプロンプトを開いたときの最初の位置が
C:\Users\kei
になってます。(keiは僕の名前です)
開いたとき一番最初は C:\ になってると一番都合がいいのですが、そのように設定できますか?
プロパティとかいろんなトコからやろうとしても見当たらないので…。
\usr\local\bin 何に使うんだろう
ショートカット作っとけばいいべ。 プログラムはcmdで、作業フォルダはC:|
175 :
174 :2009/06/04(木) 15:40:16
C:\だった、、、シフト押しっぱなしだった
176 :
デフォルトの名無しさん :2009/06/04(木) 16:21:59
作業フォルダの設定はどうするんですか? どう開いても変なディレクトリから入っちゃいます。。 cd ../../ を毎回やるのは億劫なので。。。
右クリックでプロパティ出せばいいだろう。 cd \ でいいじゃない
そろそろスレ違いだな
179 :
デフォルトの名無しさん :2009/06/05(金) 08:08:41
クラスをグローバルにしたいんだけど、 extern AClass a; でいいの?
バッチファイル書けば楽にならないか? cd ..\...\ bcc32 %1 とか。
ルートで作業するのは論外。
182 :
デフォルトの名無しさん :2009/06/05(金) 11:16:18
ネットワークのプログラムを書いてると、「Windowsのファイヤーウォールがブロックしました」 みたいなメッセージが最初の動作時に一回だけ出るときがありますが、出ても最初の一回だけで その後は出ません。これってプロパティのどこかにアンブロックしたという記録が残っている のでしょうか?
板違い
>>182 レジストリのどこかは知らないが、設定の閲覧・変更は
コントロールパネルのWindowsファイアウォールのところを見ればいい。
185 :
デフォルトの名無しさん :2009/06/05(金) 20:44:54
>>183-184 ありがとうございます。コントロールパネルに見つかりました。
あともう1つだけ。(板違いといわれそうなのですが…一応C++で書いているので)
TCPで複数のコネクションを同時に保持するサーバーを書きたいのですが、サーバ側から
みた通信先はどうやって区別すればよいですか?適当にIDとかを割り振ってそこをみるように
すればいいんでしょうか?
××のソースをみろとかでもいいです。どうかお願いします。
>>185 ソケットなら接続してきたクライアントの情報を得られる。
ネットワークプログラミング相談室なんてスレがなかったかな?
187 :
デフォルトの名無しさん :2009/06/05(金) 21:10:01
>>186 ありがとうございます。
ということは、accept()で得られたクライアント情報のIPアドレス+ポート番号
の組でクライアントを識別するということですか?
>ネットワークプログラミング相談室なんてスレがなかったかな?
次からはそっちで聞いてみます。
188 :
質問 :2009/06/05(金) 23:03:36
VC++2008です textBox1に自由に入力させ、「眼鏡」という文字列が入力された瞬間に メッセージボックスを表示するにはどうしたらいいでしょうか TextChangedイベントの中でif(textBox1->Text=="眼鏡")としたんですが、 前後に文章があるときもメッセージボックスを表示させたいです よろしくお願いします
strstr
VisualC++2008EEです 引数としてクラスのポインタを受け取り、そのポインタにnewでクラスのインスタンスを作る関数は作れますか? また、どのように作るのでしょうか? そうして作ったインスタンスを関数の外でdeleteしたいのです よろしくお願いします
>>190 void f(int*& rp)
{
rp = new int;
}
int main()
{
int *p;
f(p);
delete p;
}
キモイ設計だな
メリット皆無だし
194 :
デフォルトの名無しさん :2009/06/06(土) 03:34:30
普通のメンバ変数を初期化するときって、 コンストラクタの後ろに付加、コンストラクタの中で代入、初期化用メンバ関数を用意してコンストラクタの中で呼び出し ……とかいろいろ考えられると思うけど、使い分けってある? あと、特に理由がない限り、コピーコンストラクタに初期化処理ってしなくても大丈夫よね?
なるべく初期化リストで全部済ませる 初期化で済む物を代入にするメリットは全くない
使い分けというか、言語やプログラムの仕様から制約されるってかんじジャね? const なメンバ変数 => 初期化リストでしか初期化できない。 初期化のために手続きが必要 => 初期化リストでは無理 初期化のタイミングがコンストラクション時以外にもある => じゃ、別関数にしておくか
意地でも例外を送出したくない場合。
const以外でも初期化リスト結構みんな使ってるのかー。 途中でリセットする場合以外でも、お婆ロードでコンストラクタが複数あるときは 別関数の方が楽そう……かな?
199 :
デフォルトの名無しさん :2009/06/06(土) 04:53:35
Visual C++ eeのWin32APIでやってます。 ユニコードONの状態で wchar_t type[255] = _T("うんこ"); MessageBox(NULL, (PCTSTR)typeid(type).name(), NULL, MB_OK); とすると文字化けしてしまうのですが、なんでですか? 文字列リテラルにLをつけないといけないのと関係あります? うまく表示する方法ってどうやるのですか? まだ始めたばっかだしマルチバイトでやればいいのでしょうけど 気になるので、よかったら教えてください お願いします
>>198 Effective C++は読んだかい?
まだなら定額給付金を片手に今すぐ本屋に行くんだ。
typeid(type).name()はLPCTSTRじゃないから MessageBoxA(NULL, typeid(type).name(), NULL, MB_OK)
>200 おや なぜか めのまえの ほんだなに おいてあるぞ!
203 :
199 :2009/06/06(土) 15:31:21
>>201 MessageBoxAとMessageBoxWがあって
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
こんなんなってるんですね
だからMessageBoxAを強制的に呼び出してやると
氷解しました。ありがとうございます。
>>199 TCHAR type[255] = _T("ちんこ");
MessageBox(NULL, type, NULL, MB_OK);
205 :
デフォルトの名無しさん :2009/06/07(日) 13:03:16
dummy
206 :
デフォルトの名無しさん :2009/06/07(日) 14:01:55
int org_i = 1000; void *p = &org_i; int i = *reinterpret_cast<int*>(p); voidへのポインタからINTの値を取り出そうとして上のようにしたのですが、 reinterpret_castの前に*があったりしてなんとなくいやです。 ほかに方法はないでしょうか?
それが正しい方法だからそれでいい
voidのポインタをやめる
こんなテンプレートを用意して template <class T> T pointer_value(const void* p) { return *static_cast<const T*>(p); } こうする int i = pointer_value<int>(p);
テンプレートは分からないので禁止
212 :
デフォルトの名無しさん :2009/06/07(日) 18:35:31
テンプレートはわからないので禁止
ポインタはわからないので禁止
C++はわからないので禁止
クラスAがクラスBに所持されてる関係になってるとして インスタンスAがB1に参照されてる状態から B2がインスタンスAを参照したらB1からAの参照が切れる 常にAが1個のBから参照されるような関係を作るにはどうしたら良いでしょうか?
所有を譲渡するメソッドをBに作る
逆にAがBを参照するように変更できないか検討する
>>216 B同士で所有の移動をするメソッドを、ということでしょうか?
>>217 BがAに更新通知してAがBの値を読みに行くので
Aへの更新通知を別の方法で実現できればそれでもいいのですが・・
Aを触れないし値も引き出せない状態になったB1・B2の挙動をどうするつもりかに因るな
AからBにコールバックでも登録させればいいんでない。
AがB1に参照されたり、B2に参照されたりってのを決めるのはだれだ?
> BがAに更新通知してAがBの値を読みに行くので Aに"今からお前の相手するBインスタンスはわしじゃ"通知メソッドを作れば? その際に元彼Bに"もう私のことは放っておいて"通知メソッドをAから呼んでもらう
223 :
デフォルトの名無しさん :2009/06/08(月) 11:43:40
C++では、戻り値だけが違う関数は同じものとされますが、 戻り値だけが違う関数を複数作りたい場合どうするべきでしょうか? class C1; class C2; というのがあって、 C1 create(); C2 create(); という感じにやりたいときです。 お願いします。
>>223 無理です。だいたい呼び出せません。
名前空間を使いましょう。
ファイルの開け方、閉じ方はわかったのですが読み取って処理するところがよくわかりません ,で区切られて1行に並んでるファイル内の行列から数値を配列に入れる方法を教えてください!
やりかたはいろいろありすぎて、、、 とりあえず手始めに、fgets()とsscanf()使ってみるのはどうか? まあ配列に入れるならループで回してstrtokとatoi使う手もあるけど、 最後はstrtok+atoiみたいな関数を自分で作るのがいいかもね。
今回初めてマルチスレッドな処理を行う必要があるのですが 注意点、スレッドセーフな処理にするための方法などを詳しく扱った書籍やサイトはないでしょうか?
>>226 ありがとうございます
,の除き方を詳しく教えてください
>>228 csvデータの読み込みでぐぐった方がいいかも
>>228 sscanf()もstrtok()も , の処理はやってくれるだろ。
自前でやるならstrchr()で場所調べて切り出していけばいいと思うよ。
そうなんですが 全然知りませんでした ありがとうございました
>>223 dmyC{};
class C1{C1 operator=(dmyC&){*this=createC1();return *this;}};
class C2{C2 operator=(dmyC&){*this=createC2();return *this;}};
dmyC create(){return dmyC();}
C1 C1create(){〜return c1;}
C2 C2create(){〜return c2;}
なんのメリットがあるか知らんが使用側で偽多態受けなら出来ん事はない
前参照やスコープは適当に修正要
233 :
デフォルトの名無しさん :2009/06/08(月) 14:14:40
C99より前の規格では、nanやinfを検出することってできないのでしょうか?
修正 dmyC で弄った方が潰しが利くね dmyC{operator C1(){〜return c1;}operator C2(){〜return c2;}};
floatで数字をいろいろ処理して,でつないでcharに直してfputsで書き出したいんですけど方法を教えてください!
fscantfとかsscanfとかそういうことか わかったぽ
.netはC++では扱えないんですか
はい
C#でしかやれないということですか? GUIアプリを楽につくりたいならC#ですかね?
その通り!
テンプレートの話は禁止だって言ってんだろ
242 :
デフォルトの名無しさん :2009/06/09(火) 01:07:44
int array[x][y]; があるとき、 array[10] == &array[10][0] でしょうか?
よく考えたら分かると思うが頭痛が悪くなるようなコードは書くな
配列は分からないので禁止
>>242 気になるならポインタがさしてるアドレスを比べてみなよ
>>245 型は配列なので注意が必要、多分等しいだとは思うんだが。(両方とも配列)
配列はポインタに自動変換だが、逆はそうではない、やっぱ頭痛い。
ああ違う、右はポインタ、左は配列、そして左が自動変換だ うぜぇぇ
int a[10]; は、int10個の配列aで分かりやすいのに。 int a[10][20]; は、int10この配列が20個、ではないところがややこしい。
>>248 Cの規則ですから
int func()[10]
{
return 配列;
}
おらよ、これでも喰らえってなもんだ
ポインタ本を読むと出てくる(K&Rでもかかれてる)けど 配列や関数の型は、外側からはがしていく感じで解釈するんだよね。
>>251 ANSIでは使えない事になっているが、返せる処理系もっあってだな、
アホな開発者がそれを返している糞ライブラリがあるんだ
どこのかって?S○Eとか○CEとかSC○とか、まあそんなところ、死ねます。
>>251 ポインターは返せるからできなくはないんじゃね?
ただサイズの問題とかあるけど
254 :
デフォルトの名無しさん :2009/06/09(火) 02:27:31
CのコードをC++に書き直してます。 Cのコードの中に大量の構造体を使ってるところがあって、malloc()でメモリを 取らずに、自分でメモリプールを管理する割り当て関数を使ってます。これを生かすため placement_new()というのを使おうと思っているのですが、この場合delete()が使えない (使う必要がない)と聞いたのですが、placement_new()の使い心地はどうでしょうか? 使いやすいですか?
構造体に配列突っ込めば、ポインタじゃなくても直接返せるよ! よ!
placement newを使いにくいとは思わないけど、むやみに使うものでもない。
>>256 の言うように、クラス・構造体にnew/deleteを定義するとか
アロケータとコンテナを組み合わせるのがいいと思う。
c++で複数のクラスからの継承ってできますか? たとえば 数値Aと class NoA{ //ここに関数A } class NoB{ //ここに関数B } ここでNoAもNoBも引き継いだclass NoC (NoC.関数AとNoC.関数Bの両方ができ) みたいなことってできるの?
260 :
デフォルトの名無しさん :2009/06/09(火) 09:41:04
C++に動的にクラスを生成する方法がないって本当ですか? 文字列としてクラス名があったとして、それでオブジェクトを作ることができないって読んだんですけど。 自由度高そうなのに。 ごにょごにょしてやる方法あります?
>>260 Smalltalkみたいな使い物にならないインタープリタと一緒にすんな
>>260 こういう話か?
std::map<std::string, boost::shared_ptr>
インタプリタ村の村民らしい要望だな だな
クラスの動的生成ではないがC++にリフレクション機能は あってもよかったと思う
オーバーヘッドが好きな奴が多いな。
>>260 やろうと思えばなんだってできるよ、コンパイラ呼び出しDLLにコンパイル、出来上がったDLL動的にリンク、そして呼び出す。
面倒くさくてやらないけど。
.NETを見ていると、標準ライブラリにコンパイラコレクションが入っていると便利なのだがと思う事はあるな・・・ ターゲットの環境にコンパイラをインストールなんて余りやりたくないからね
fscanfの引数の場合分けがうまくいかないんだけどどうして? 引数がfloatとcharで20こあって"%d%f・・・・・",hairetu,&suuji・・・・とあるんだけど返り値=1にした時しかうまくいかない switchにしてcase20はおkだけどcase 2とかdefaultにはcaseが正しくありませんってなる
swichの方はswith{}←のカッコを忘れてただけでした
fscanfの感じがわからん fscanfした時点で一行バッファに入ってそこから指定した型の順で前から取っていく感じでしょ? 3つ目で型が合わないことがわかったらどうなるの?
>>271 行は関係ないよ
合う型を探して改行関係なしにファイルの最後まで行ったら終わり
3個目が見つからなかったら戻り値で2を返すだけ
サンクス 行関係無いのか どっかのページ1行読み込むって書いてあったのに
scanfのほうの使用を思い出すんだ
caseってcase(1||2||3||4):って使えますか? なんか使ってないのに違う行のcaseの所でcaseの値"1"は既に使用されていますって出るんだけど
1〜4 までの整数を1箇所で引っ掛ける時は case 1: case 2: case 3: case 4: /* 本体 */ break; こう書く case (1||2||3||4): は 定数式 1 || 2 || 3 || 4 →結果は真で 1 として整数化されるから 結局 case 1: と書いてるのと同じ意味になってしまう
ありがとうございました! あんまり載って無いですね、初心者ならやってしまいがちだとおもうのですが
習得順的には if { } 〜 else if { } 〜 else { } の羅列のほうが先にじゃねーかな? break しない case を持つ switch 文って個人的にはあまり好きじゃない。 見直したときに 「あれ? break 忘れてるんじゃね?」 って勘違いしちゃう可能性があるもの
むしろcase で || 使うというのをはじめてみた
他言語から来た人とか?
普通の初心者でつ
>>280 勉強中でROMしてます
>>276 の
>case (1||2||3||4): は
>定数式 1 || 2 || 3 || 4 →結果は真で 1 として整数化されるから
>結局 case 1: と書いてるのと同じ意味になってしまう
として処理されるならそもそも書く必要すらないですしこういう記述を知ってる必要もない気が・・・
つまり
>case 1:
>case 2:
>case 3:
>case 4:
> /* 本体 */
> break;
こっちを知ってればいいかと。
それかジャンプテーブルとかで処理しちゃうか
>>282 知るべきことは "case の後ろは定数式" であること だ。
・定数式のうち 論理演算式だけは 演算結果が所詮 0/1 にしかならないのでおいしくない
・四則演算な定数式や ビット毎の論理演算定数式 記述が簡単になったり可読性が上がるかもしれない
四則演算の例:
#define TOP (100)
case TOP+1:
ビット毎の論理演算の例
#define A (1<<0)
#define B (1<<1)
case A|B:
string が色変わらないんだけどなんで?ちゃんとインクルードしてるのに
他の関数でもポップアップが出なくなった なんでだろう
caseに式を使えたらいいのにぁ else ifの梯子なんてダサすぎる…
制限は多いけど、その条件を満たす場合はパフォーマンスを発揮できると考えるべき。
switch case のコンパイルコードに期待を持つなんてオールドタイプのバッドノウハウ
>>289 条件演算子を使えば似たような書き方で好きな式を条件に出来る。
C++だけだったかも知れんが。
else if するくらいなら (x==0||x==1||x==2||x==3)&&(func0(),true) ||x==4&&(func4(),true) ||x==5&&(func5(),true) ||(func_default(),false);
あ、カッコ不足だった
AクラスのaにBクラスからアクセスしたいのですが、うまくいきません。 どうしたらいいでしょうか。。 #include <stdio.h> class A { public: A(int); private: int a; private: class B { public: B() { printf("constructer B\n"); } void some_func(void){ printf("a: %d\n", a); } }; }; A::A(int x) { a = x; B* b = new B(); b->some_func(); } int main(void) { A a(10); return 0; }
>291 でもブレイクスルーとdefaultの機能って、状況さえ許せば凄く便利じゃね?
>>295 class A{
public:
A(int);
private:
int a;
class B
{
public:
B(A&a) : a(a) { printf("constructer B¥n"); }
void some_func(void){ printf("a: %d¥n", a.a); }
private:
A&a;
};
friend class B;
};
A::A(int x){
a = x;
B* b = new B(*this);
b->some_func();
}
>>296 Duff's Deviceくらいしか使い道なくね?
>>296 ブレイクスルーちゃう
fall through
ブレイクするんちゃう?
302 :
デフォルトの名無しさん :2009/06/10(水) 01:23:48
std::coutとかstd::endl;って スレッドセーフですか?
コンパイラごとに違うので、コンパイラの仕様書を読んでください。 っていうか、C++の規約にはスレッドセーフに関する記述はないんじゃなかったっけ?
ライブラリによるしな
>300 失礼、別のと混ざった
class A{ public: void A( void ); virtual void ~A( void ); }; と書きたい今日この頃 なぜこの書き方でエラーがでるのかがわからない
気持ちは分かるけどさ。 「もともと戻り値は存在しないもの」と、「戻り値は使わないことを宣言する」の違いじゃない?
void
309 :
デフォルトの名無しさん :2009/06/10(水) 14:47:46
sprintf関数について質問です。 strcatとかstrcpyを使うよりも、便利だと教えられたのですが、いまいちどこが便利なのかわかりません。 教えてください。
具体的にstrcatとかstrcpyを使ったコード書いてみて それをsprintfに置き換えてみりゃわかるだろ。 もちろん、strcatとかstrcpy一発で済むような例はstrcatとかstrcpy使えばいいのはわかるよな。
HOGE_01、HOGE_02 …… みたいな文字列を生成するときは、sprintfじゃないとやってらんないと思う
sprintfなんてキケンな物使っちゃいけません
sprintf_sがあるから無問題
>>312 #pragma warning (disable : 4996)
ltoaで小数点以下の数値を文字にするにはどうするの?
sprintf_sにしろsnprintfにしろ標準じゃないし、こいつらはこいつらで危なかったりするし(ヌル終端しないとか) いずれにせよsprintf一族はロクなもんじゃないから書き捨てコード以外には使うべきでない
sprintf系を使って本当に安全なコードを書こうとすると#ifdef地獄だぞ 挙動バラバラだし、本当にクソみたいなsnprintfとかがいるから ヌル終端しないくらいならカワイイもんで、例えば 一昔前のLinuxはnをガン無視してsprintfにブン投げるようになってることがある 本当に死ねばいいと思う
C/C++にしろJavaにしろ安全は保障されないし、こいつらはこいつらで危なかったりするし(すぐに暴走するし) いずれにせよプログラミング言語一族はロクなもんじゃないから書き捨てコード以外には使うべきでない
snprintfはC99標準……。 ま、糞実装なsnprintfの存在以前にC99自体アレだが。
C99の仕様以前に、C99の対応率が。。。
C99の方が便利なのに、どうしてC99に移行しないんだろうね? 異なるプラットフォーム間で利用されるソフトを開発しているならともかく そうでない、小さなプロジェクト(おそらく世のプロジェクトの大部分)は C89よりC99で開発したほうが(わずかだろうけど)コスト削減になりそうなものだが。
世の中Cじゃ無くてC++方向に走ったからね。いまさら感があるよ
便利な物だけつまみ食いしとけばいいんだよ __func__とか__VA_ARGS__とか_Pragmaとか<stdint.h>とか restrictやら可変長配列やらはいりません
僕は複合リテラルだけ居てくれればそれでいい。
326 :
デフォルトの名無しさん :2009/06/11(木) 01:48:37
C++でクラスの配列を作ったのですが、配列の要素数をどうやって求めればいいでしょうか。 class hoge { public: int a,b,c,d,e; void func1(); void func2(); }; hoge h[]={ {1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}, }; このとき sizeof(h)/sizeof(hoge) とやっても正しく出てくれません。
template<X>unsigned is(hoge[X]&){return X;} kazu=is(h);
class Hoge { int a } というクラスがあったとき Hogeのインスタンス同士の比較をメンバ変数aの大小で行う場合 演算子をオーバーロードしたほうが良いのか int GetA()という関数を比較するのが良いでしょうか? またHogeインスタンスとintを比較することも考えてますがこういう場合はどうでしょうか?
>>326 いやそれであっている。
うまくいかないならほかに原因がある。
>>328 Hoge同士の比較方法がそれ以外にあり得ないなら演算子オーバーロードでいいんじゃね?
331 :
デフォルトの名無しさん :2009/06/11(木) 02:50:23
>>329 すいません。
クラス配列を作るとき、
hoge h[]={
hoge{1,2,3,4,5},
hoge{1,2,3,4,5},
hoge{1,2,3,4,5},
hoge{1,2,3,4,5},
};
と書くようにしたら先のやり方で配列の要素数が取れました。
環境はVS2008なのですが、最初の書き方ではだめだったでしょうか?
コンパイラ何使ってる? あと、どんな結果が出たのかも書いて欲しいかなかな。
hoge{1,2,3,4,5} ←なにこれ?
新しいコンストラクタの呼び方
デタラメ書くなカス
>>331 自分もVS2008だけど、これはエラーなくコンパイルできて4と出力される。むしろ
>>331 がコンパイルエラーになる。
#include <iostream>
class hoge
{
public:
int a,b,c,d,e;
void func1();
void func2();
};
hoge h[]={
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
};
int main()
{
std::cout << sizeof(h)/sizeof(hoge) << std::endl;
}
gcc4.3以上なら通るな initializer_listだろ
C99の機能をC++に持ち込むなクズ
C++0xではC99の一部機能が採用されるよ。 委員会の人たちにクズと言わないと意味ない。
restrictとか_Complexとか可変長配列みたいな 本当にしょうもない物は入らないから大丈夫だと思うけどね
>>340 特に、restrictはC++89のときに否決された過去があるから、
今回も入れられるわけないw
restrictは入れると一つだけ利点があるんだよなあ FORTRAN並みに配列演算が高速化できる可能性がある 科学技術計算にはFORTRANを、と言わなくて済むようになるんだがな それ以外には取り立てて利点はない
いいえ。
いいえ。
iccでもオプション指定さえすればrestrictが使えるんだよね。 メモリのアクセスパターンががらっと変わる可能性があるから入れて欲しいけどねぇ。
ケフィアです。
ファイルから読み込んで{から次の}までを取得したい場合はどのような方法になりますか?
ファイルを開く 読む {を探す }を探す 範囲内の文字列を取得する お前は真面目に質問する気あるのか
system("grep -o "{.*}" <ファイル名>);
ありがとうございます 正規表現が使えないって聞いたような気がしたから 文字列をくっつけたり長さを測ったりそういうとこからしかできないのかと思ってた
>>353 お前の書いた文章を読む分には、{から次の}までということだから正規表現で余裕だ。
{から次の対応する}までだと正規表現では無理だが。
"a { b { c } d } e" -> "{ b { c }"
ソースコードでも処理したいのかね。
ネストがあるならカウントしていくしかないよな
まあそんなところですね 計算処理込みの置き換えを主にしたいです ベクターでそんなフリーソフトあるかもしれないけど
>>350 >>352 のおかげで何となく質問の意味が分かった
#include<stdio.h>
int main(void){
FILE *fp;
char brace[2][2], buf[2000+1];
fp=fopen(__FILE__, "r");
if(fp==NULL) return 0;
while(!feof(fp)){
fscanf(fp, "%*[^{]");
if(fscanf(fp, "%1[{]%2000[^}]%1[}]", brace[0], buf, brace[1])==3){
printf("\n=====ここから=====\n%s\n-----ここまで-----\n", buf);
}
}
fclose(fp);
return 0;
}
というか正規表現使えないんじゃないの? このboostとかいう奴標準で入れとくべきなの?
>>361 ああ、禁止されてる会社で使うコードとかでもない限りほぼ標準と思って間違いない。
ついでに補足だけど正規表現はC++標準規格の追加仕様(tr1)でライブラリに追加される予定。
そうなのか じゃあそれを入れることにします、ありがとうございました
TR1は最近のg++やVC++ 9 SP1とかで使えるけど、 BoostのXpressiveも捨て難い。
SP1なんて出てたんだ。 教えてくれてありがと。
CreateFileMappingでプロセス間の共有メモリを用意したんだが、 排他制御にMutex使ったら想定していたより処理が重くなった。 (頻度が多すぎなのでNGっぽい。アクセスが、がっちんこするのは 相当低い頻度なので、スピンロックの実装を検討したいです。 Windows系で、プロセス間排他制御で、スピンロックを使う方法って、 何か用意されているものはありますでしょうか?よろしくお願いします。
>>367 情報サンクスです ちゅー まいどw
表からするとCreateMeteredSectionを使えって事らしい。
なんとかなりそう。何か関数名が、Wait、Releaseが、
Enter,Leaveになったり、知らない関数ばっかで、少し怠い。
まあ、前者はハンドル(イベントやその他)によって
動きが変わるものもあるから、その辺で条件処理で遅いのかな。
とりあえずテストします。
>>366 です。
// Spin and get access to the metered section lock
while (InterlockedExchange(&;(lpMetSect->lpSharedInfo-> _
lSpinLock), 1) != 0)
Sleep(0);
CreateMeteredSectionと同様の方法にします。
既存の共有メモリー上にスピンロック用の変数を作って、
InterlockedExchangeで、ロックできるまでループ。
アンロックは、同関数で0に戻して戻り値は捨て、
これでOKのような気がする。
Bootsスレが落ちたみたいなんですが、どうしたらいいですか?
ぶーつ。
372 :
デフォルトの名無しさん :2009/06/14(日) 00:13:56
C++で class A { public: A *next; void hoge(); }; class B: public A { public: void hoge(); }; というクラスの構造で A *p = new B(); p->hoge(); ←ここ とやるとAクラスのhoge()が実行されるのですが、 どうすればBクラスのhoge()が実行されるようにできるでしょうか。 ここではAとBだけですが、実際のクラスはもっと複雑な木構造になる予定です。
関数の引数で、ただの値渡しかconst参照どちらにするか、決める基準ってあるんですか
p->B::hoge();
class A { ・・・ virtual void hoge(); };
376 :
372 :2009/06/14(日) 00:39:29
すみません。説明が不足していました。 いろんなAの子のクラス型の入ったリスト構造で順次にhoge()を呼び出したいので、 同じ命令で汎用的に使える必要があります。
377 :
372 :2009/06/14(日) 00:48:13
解決しました。 ありがとうございます。 オーバーライドに識別子が必要なのを忘れてました。
init(){ test *ts = new test(); } main(){ ts->draw(); } みたいな事をしたいのですがtsが宣言されていないと怒られます 別の関数でクラスを使うにはどうすればよいのですか?
何がしたいのかわからないけど、関数間でポインタを持ちまわらないと。 もしくはそのポインタをグローバルスコープにするとか。 test *init() { test *ts = new test(); return *ts; } int main() { test *p = init(); p->draw(); }
あ、ごめん、return *ts じゃなくて return ts ね^^
メインループをクラスに含めたプログラムを作ったのですが 何か問題がありますか?
いいんじゃないの ループを納めるためだけのクラスだとしたらあまりお勧めはしないが
問題なし。 WTL::CMessageLoopとかboost::asio::io_serviceとか、 言わばループを提供することが主目的のクラスだっておかしくない。
384 :
デフォルトの名無しさん :2009/06/14(日) 09:29:42
「★初心者にVisual C++を教えるスレ★」 で質問したのですが返答をいただけなかったのでこちらで。 練習でブラウザを作っています。 JavaScriptを無効にしてページを開けるようにしたいと考えています。 Windowsフォームアプリケーションの関数だけで可能でしょうか。 それともCOMなどの知識が必要でしょうか。 環境はVC++2008EEです。
コンストラクタからvirtualメンバ関数を呼び出すと危ないらしいですが、CHoge::Method class CHoge {
まちがって送信してしまいました コンストラクタからvirtualメンバ関数を呼び出すと危ないらしいですが class CHoge { public: CHoge() {CHoge::Method();}; virtual void Method() {...;}; }; のようにスコープを限定すれば完全に安全でいいんでしょうか?
何でもかんでもクラス化するのは良くない?
えっ
なんでもかんでもクラス(オブジェクト)として扱うフレームワークを作れば問題ない。
>>386 そんなことしなくてもコンストラクタ内では virtual 関係なく
いつでも CHoge::Method() が呼ばれる
関数とクラスの良い部分が打ち消しあっているような気がする デストラクタで自動的に解放するコードを書くと、そのクラスを使用する関数以外で クラスオブジェクトの作成ができなくなる 何故なら関数終了後に自動的に解放され、別関数でクラス使用時にはオブジェクトの 実体がないから デストラクタで自動解放コードを書かなきゃいいとか言われそうだが
開放する対象データによるだろ。 オブジェクトのライフタイムを考えてちゃんと設計しろ。
>>391 >関数とクラスの良い部分が打ち消しあっているような気がする
それは認識不足、判断するのが早すぎ。
・・・こうして、オブジェクト指向排斥派が生まれていくのか・・・
ただの勉強不足。 わかってるつもりでわかってない。
>>384 Windowsフォームアプリケーションプロジェクトを作成し、フォームにWebBrowserコンポーネントを配置。
ビルドして適当なURLをドラッグ&ドロップ。
呼び出される側がHogeで、呼び出す側がHogeのような、コールバック関数がある場合ですが その場合、どのようなデザインパターン(クラス間の関係)を持たせれば効果的でしょうか、 それとも、別にコールバック専用クラスを作りFoo、Hogeの基底クラスとするのがよい設計なのでしょうか?
↑間違えました ×呼び出される側がHogeで、呼び出す側がHogeのような、コールバック関数がある場合ですが ○呼び出される側がFooで、呼び出す側がHogeのような、コールバック関数がある場合ですが
C++ではなく ただのC言語にはテンプレートみたいなのない? たとえば(x^2+y^2)をreturn返す関数を作りたいとき func(int x,int y){ } func2(double x,double y){ } みたいにいっぱいつくらにゃならんの?
>>398 その例だったら全部 double でおk
400 :
デフォルトの名無しさん :2009/06/14(日) 15:30:50
シングルトンでprivateにするべき項目ってどれ? 1.(デフォルト)コンストラクタ 2.コピーコンストラクタ 3.代入演算子 4.デストラクタ 1と2は別として、3と4については解説書/サイトによってバラバラなのが気になる。 解説用に、シンプルなコードにするため書いてないだけなのか、 目的やシングルトンの実装方法によって変わるというだけなのか。
402 :
400 :2009/06/14(日) 15:40:48
最近は代入演算子じゃなくコピー代入演算子って言うのね。
参考にした本が古かったのかしら?
>>398 ・全部書く
・簡単な処理であればマクロ(#define)で書く
・>399のように、互換性のあるもので誤魔化す。共用体とか。
この辺でどうだろう?
resource.rcで大量のリソースを読み込んで実行ファイルに埋め込むと言うことをしているのですが、 デバッグ時のリンク処理に時間がかかるので、 #if DEBUG SOME_BMP "BITMAP" "./BMP/some_bmp.bmp" #else ... #endif というようにしてデバッグに必要なリソースのみ読み込むようにしたのですが *.rcファイルにはプリプロセッサの命令は使えないようでうまくいきません。 一行ずつコメントアウトするしかないのでしょうか
>>403 普通にプリプロセッサ使えるよ。
#ifじゃなくて#ifdefとか、rc.exeの/dオプションで渡してないとか
>>400 コピー代入演算子が呼び出し可能なら singleton = singleton の代入を許すことになる。
インスタンスをひとつにするシングルトンとしては基本的に想定してない動作だろうから
private にしといたほうがいいかもしれない。
デストラクタが呼び出し可能なら singleton.~singleton() を許すことになる。
シングルトンが勝手に破棄されちゃ困るだろうから private にしとくべきだろう。
>406 さんくす。 デストラクタって明示的に呼び出せるんですね。知りませんでした。
D3Dでフォントクラスを作ろうと思ったのですが、 グローバルでオブジェクトを作成するとDXの初期化が済んでいないので エラーになります。 いろんな関数で使いたいのですがどうすればいいでしょうか? クラス化をあきらめた方が良いでしょうか?
410 :
407 :2009/06/14(日) 22:18:03
ここは俺が答えるべきだよな。 >408 DirectXは詳しくないんだけど、シングルトンパターンはどうだろうか。
いろんな自作関数を作り、それぞれの関数で使いたいのです。
>>408 クラス化あきらめると何とかなるの?
なるならやればいいじゃない
シングルトンを試してみましたが結局はそれぞれの関数でgetinstanceして フォントを生成しなおさなければなりませんでした。 ひょっとしたらやり方が間違ってるかもしれませんが。 おとなしくクラス化をあきらめます。
>フォントを生成しなおさなければなりませんでした。 >ひょっとしたらやり方が間違ってるかもしれませんが。 おそらく間違ってる。 実装方法は正しくとも、使い方を間違えてるかもしれない。
415 :
デフォルトの名無しさん :2009/06/14(日) 23:51:21
メンバー変数にstructがある時コンストラクタ初期化子で初期化ってできます? ちらっとしらべたら代入しかできなというような書き込みを射たのですが。 class Window { private: WNDCLASS wc; ・ ・ ・ Window(HINSTANCE hInstance, WNDPROC windowProc, PTSTR appName) : wc??? ???で初期化です。 お願いします。
VS2008EEのC++を使っています。 ソースが長く見づらいので複数に分割しようと思っているのですが 作った関数をどのファイルからでも呼べるようにするには 分割した一つ一つにexternを書かないとだめですか? 何か共通のヘッダファイルとかを作って どこからでも呼べるようにとかは出来ないんでしょうか?
色々ためしたらシングルトンで行けました。 でも結局、 グローバルでポインタ宣言 初期化部でフォントセット 描画 と3つの手順を踏む必要があり、関数ベースと手間が変わらないので なんだかなぁって感じ コンストラクタでフォントセットしたかったけど、それだとDXの初期化前でNGだし DX絡みはいろいろと面倒やね 多分、テクスチャとかその他諸々も全てこのタイプになるんだろうな
関数のスコープは常にグローバル空間だよ。 何もいらない。ただ使いたい場所の直前で、 関数のプロトタイプ宣言すればいいだけ。 え?無名の名前空間に入れちゃった?
「分割コンパイル」でググって定石を勉強しろとしか言いたくない自分がいる
>417 フォントクラスのインスタンスをグローバルに置けば、 そりゃグローバル変数と同じようなタイミングで初期化されるさ。 それを防ぐためには、DirectXの初期化を行ったあとに インスタンスが生成されるようにすればいい。
421 :
420 :2009/06/15(月) 00:12:57
ごめん、ちょっとミスリーディングしてた。 >グローバルでポインタ宣言 ポインタをグローバルに置く必要ないと思うよ。
C言語ってここでいいんですかね? 学校の問題で分からないところがあったので質問をしたいんですが
シングルトンパターンを使えてない気がする
シングルトンパターンを使わないのが正しい解ではないのかな? よく見かける、名前につられて正解を見失う または、目的と手段が講じて 手段が目的になる。
講じません
>>426 すいません、板を検索したらありました。
ご迷惑をおかけしました
学から入ると、えてしてこの時はこうでなければならないと思いがちになる。 一難面白い発言に。 >と3つの手順を踏む必要があり、関数ベースと手間が変わらないので >なんだかなぁって感じ そうなったからと言って、クラスの最大の利点であるカプセル化が無くなる訳 ではない。それに、コンストラクタやディストラクタ以外に初期化や終了メソッド が必要になるのは、ごく普通にある。
プログラムが分かりやすくなるのが一番の目的で、そのためならグローバル変数もgoto文も非オブジェクト指向プログラミングでもなんでもおk
よく状況わからないけどDirectX+C++なんてザラにありそうだから どこかのソースコードで勉強すれば定石わかるんじゃないの?
>>418 は416に対してでしょうか
今簡単なプログラムで試してみたら思い通りに出来ました。
以前は呼ばれる先と元で両方宣言しないといけないと勘違いしていて
おかしい書き方をしていました
仰るとおり素直に書いたら出来ました
ありがとうございます
ん。まぁ一度何かの教科書でヘッダファイルの書き方を学ぶと良いかも。 同一翻訳単位内で複数回インクルードした場合の処理など、 C++のファイル分割は学ばなければならないことが多い。大弱り。
全部のヘッダーインクルードして、ヘッダの方にはインクルードガードつけときゃいいんだよ
>>421 どの関数からも使えるようにするにはグローバルに置くしかないっしょ
435 :
デフォルトの名無しさん :2009/06/15(月) 03:09:35
以下のコードのmakeが通りません。 アドバイスをお願いします。 gcc version 4.3.3 --------------------------------------- エラー > make g++ Class1.o main.o -o class.exe main.o: In function `Class0': Class0.hpp:9: multiple definition of `Class0::Class0()' Class0.hpp:9: first defined here --------------------------------------- // main.cpp #include "./Class1.h" int main(int argc, char* argv[]) { Class1 c1; } --------------------------------------------- // Class1.h #ifndef CLASS1_H #define CLASS1_H #include "./Class0.hpp" class Class1 { public: Class1( ); }; #endif
436 :
435 :2009/06/15(月) 03:10:33
// Class1.cpp #include "./Class1.h" Class1::Class1( ){ } --------------------------------------------- // Class0.hpp #ifndef CLASS0_HPP #define CLASS0_HPP class Class0 { public: Class0( ); }; Class0::Class0( ){ } #endif --------------------------------------------- # Makefile CC = g++ OBJS = Class1.o main.o OPTION = PROGRAM = class.exe .cpp.o : $(CC) -Wall -g -c $< -o $@ $(OPTION) $(PROGRAM) : $(OBJS) $(CC) $(OBJS) -o $(PROGRAM) $(OPTION) clean : rm -f $(OBJS)
>>434 つまり、どの関数からも使う、わけではないという話だったわけですね
シングルトンだって、インスタンス生成は「はじめにインスタンスが要求されるとき」まで 遅らせると思うんだが。 シングルトンが使えてないほうに、俺も一票いれておく。
コンストラクタに何も書かないなら Class0::Class0( ){ } をコメントにしてみれば?
Class0::Class0( ){ } これどこかcppファイルに移すか、inlineにしろ。
>>435-436 Class0.hpp9行目のClass0::Class0( ){ }がmain.cppとClass1.cppの両方で実体化されるので、
リンカはどっちを使えばいいのか分からなくてエラーを吐いてる。
解決方法は
>>439-440
オブジェクト指向の特殊な利点ってなんでしょ クラスとかの初歩的な利点というか特徴はわかるんですが・・・
>>442 大規模なプログラムでもプログラムを細かな「粒」に分ける事が
できるので管理しやすくなる。つまりバグが取れやすくなり、一人で
開発したとしても扱える行数が増える
オブジェクト指向の欠点はその丁度裏返しでプログラムが細かな 粒に分解されるので手間が増えてパッと見直感的にプログラムの 動きが理解しにくくなる
分業しやすくなる
446 :
435 :2009/06/15(月) 08:50:40
447 :
デフォルトの名無しさん :2009/06/15(月) 11:43:05
C/C++エディタでperlを一緒に使って変数などを渡したりできますか? できるなら解説or詳しく書かれたサイトなどお願いします
>434 んなことない。 もちろん、C++の正確な仕様とかを持ち出したら異なるかもしれないが、 少なくとも>434が意識してるような意味で「グローバル」ではないと思う。 >447 >C/C++エディタでperlを一緒に使って変数などを渡したり すまん、知識不足で俺には質問の意味が分からなかった。
組み込みの話なのかなあ
450 :
448 :2009/06/15(月) 13:31:24
>449 かなあ? ExcelにおけるVBAマクロ、xyzzyにおけるLisp拡張みたいな感じで、 エディタにperl(実行環境)を組み込む……という風に読んだんだが。
>>447 > C/C++エディタ
って具体的にどういう物?
452 :
447 :2009/06/15(月) 13:36:17
すみませんよくわからないこと言ってたみたいですね Cファイル内でperlの関数を使ったり両言語をごちゃ混ぜに使ったりということだったんですが PHPの関数は呼び出すことができそうなのでそっちをやってみるつもりです
え? PHPだと出来るの?
454 :
デフォルトの名無しさん :2009/06/15(月) 13:44:52
つ[system("perl foo")]
luaでいいんじゃないの?
なんならtclでもいいのよ〜ん
tr1とboostってどっちがいいの? やっぱ標準っぽいtr1のほうが使うこと多いですか?
460 :
デフォルトの名無しさん :2009/06/15(月) 18:21:43
質問です windows xp sp3 gcc 4.40 (g++) C++ コンパイルオプション特になし char buffer[1024]; while (fgets(buffer, 1024, fp)) { printf(buffer); } こんな感じで単純にテキストファイルから読み込んで行単位で表示させようとしているのですが、 テキスト内に”%20”がある行に達すると、「アプリケーションエラー ○×のメモリーがread〜」で終了してしまいます。 buffer[1024]を大きくしてみたりしましたがだめでした。どのように対処すればよろしいでしょうか?
printf("%s", buffer); と、正しく書く。
>>460 buffer内に%があるので、フォーマット文字列として解釈しようとしています。
fputs(buffer, stdout)とすればOK。
WindowsAPIのReadFileまたはfreadはテキストファイルを読み込むのには不向きでしょうか? fgetsでやれればいいのですが速度が欲しいので一気に読みたいのです
fread()でもfgets()でも大差ない。APIなら速いかもしれない。
fgets()の中はfread()でブロック読みしてるぞ、なぜfgetsが遅いと思う?
fgetsは一気に読まないから遅いですよ
まあたしかに内部は数百だった記憶があるな。一気読みしたらそれは早いな
.hppってなんなの、こいつ?
こいつじゃなくてあいつだよ
cppのえっち!
class Aのメソッドの中で~A()と自身のデストラクタを呼んで自身を破壊するようなことをしてよいのでしょうか?
うん
thisを殺すのはやめたほうがいいかなと思うけど。 staticなメソッドなら大丈夫かしら?
delete *this; は合法だよ
ただしクラスの中で動的確保をしているような場所があったら まずそちらを解放してからでないとメモリリークが起きるけどな
477 :
デフォルトの名無しさん :2009/06/16(火) 02:27:49
_beginthreadex()の戻り値を(HANDLE)とキャストしてHANDLE構造体を得るのは 普通のやり方でしょうか? あと、DWORDとunsigned intは違う型でしょうか
>_beginthreadex()の戻り値を(HANDLE) 普通 >DWORDとunsigned int typedef unsigned long DWORD; だから違う
>>472 細心の注意を払って、限定された状況で、十分なコメントをつけたのなら、
してもよい。
引数の多い構造体を一度にマイクロソフト指定の初期設定みたいな感じに初期化できる方法ってありませんか?
初期設定された構造体データを作っておいて memcpy
>>481 馬鹿?
初期データの構造体が既にあるなら単に代入でいいじゃん。
それとも、そんなことさえできなかったC89以前のCしか知らないロートル?
>>482 MS風の構造体は型が一致しないことも結構ある
memcpy でおk
>>483 "MS風の構造体" って何?
型が一致しないって何?
memcpy でおkとか言うのはおかしいな。
そんな特殊な状況じゃないなら、 memcpy は不要。
代入でいい。
型が一致しないのにmemcpyというのがよくわからん
>>484 MS風っていうのは上書きするための構造体みたいな…
ビットマップとか互換性のために同名の構造体でも
サイズが違うとかそういう奴のつもり
>>486 「上書き」って何?しかも「みたいな」って。
サイズが違うって何のサイズのこと言ってんの? sizeof 〜 のこと?
違うっていうからには何か2つ以上のものを比べて言ってるんだよね?
「ビットマップ」?構造体じゃないし。
エスパーと話してるんじゃないんだ。普通にしゃべってくれ。
なんでいきなり「バカ?」とか、煽りモードなんだろ。
つまりだ、「MS風邪」に吹かれた奴はまともな議論さえできなくなってしまうと言うことだな。 まぁ、あんまり虐めてやるな。
うん。煽りは良くないな。ことの真偽は別として。
>>480 というわけで、
初期設定された構造体を作っておいて代入、
でいいよ。
C++ ならコンストラクタ使う、って手もあるな。
492 :
デフォルトの名無しさん :2009/06/16(火) 10:58:06
mapにinsertするときpairを作るのに map<型, 型>::value_type(値,値) piar<型, 型>(値,値) ともう一個、型をまったく指定しないで挿入するのありましたよね? 見たはずなんですけど検索で見つけられなくなっちゃった。 お願いします
493 :
480 :2009/06/16(火) 11:04:43
ありがとうございました
>>492 「見つけられなくなっちゃった。お願いします」と言われても、
どうやって検索していたのかも判らないのに対処できませんが。
取り敢えず、「頑張って探してください」とだけ。
497 :
デフォルトの名無しさん :2009/06/16(火) 11:52:04
>>494 >>495 ありがとうございます!
応援してもらったおかげで直ぐ見つかりました!
ちなみに
make_pairでした。
>>496 WinAPIスレへどうぞ。
つーか、最初からMultiLineで作って自前で1行に制限しちゃいかんのかな。
>>496 そこ見てみたけどスタイルの変更でできるんじゃないの
できるね。これを設定すればよさそうだ。 ES_MULTILINE まさかとは思うが、MALTIで検索して見つからなかったとか?w
502 :
501 :2009/06/16(火) 16:33:26
事故解決d
http://sip.sci.shizuoka.ac.jp/ >C:/Program Files/Microsoft Visual Studio/VC98/Include
C:\Program Files\Microsoft Visual Studio 9.0\VC\include
壱から九まで早八年
あまり世界は変わってはいなかったのでした…
自分で作ったヘッダを置く場所設定してそこに入れ、 オプション-ツールからそのディレクトリを設定。 というやりかた覚えておけば、その設定するところを見ればすでに登録されてるディレクトリがわかるぜ。
504 :
デフォルトの名無しさん :2009/06/16(火) 18:37:46
C言語でDES暗号化をやりたいんですが手取り足取りおしえてくださいも良いですか?
おしえてくださいもダメです。
教えてあげたいですがDES暗号について詳しく知りません。 一緒に勉強しましょう。とりあえず、何か良い本ないですかねぇ。
理論と実装とを分けるなら、理論は自分で勉強してください
これだからインテリはお高く留まってて嫌いなんだ;_;
509 :
504 :2009/06/16(火) 18:49:30
ああ日本語がおかしくなってたw 最初OpennSSLでやろうとしたが上手くいかず、ライブラリもみんなリンク切れになってて、 他言語の関数を使おうとしてもXS?とかいうのがうまくいかずLinux用の関数があると知ったがVC++に移植は難しいというところで詰まってます
デザパタのfactoryについてなんですが 実装パターンが多く、なおかつコンストラクタの引数のとり方も様々となった場合 下のようにcreateメソッドをサブクラスと引数別に追加していくしかないんでしょうか? class IChara {...}; class CCharaA : public IChara {CCharaA(); CCharaA(int, int);...}; 〜 class CCharaZ : public IChara {CCharaZ(); CCharaZ(const CharaX&);...}; class CharaFactory { IChara* createCharaA(); IChara* createCharaA(int, int); 〜 IChara* createCharaZ(); IChara* createCharaZ(const CharaX&); };
シングルトンって実体が一つしかなくて使うときは void hoge() { test* ts = test::getinstance(); } void aho() { test* ts = test::getinstance(); } void baka() { test* ts = test::getinstance(); } みたいに使う関数内でいちいちこう書かないといけないんだろ? めんどくさ。
>>508 それは単にあなたが、インテリそうな人間を見つけるたびに
ムシの良い乞食みたいなお願いばっかしてるからでしょう。
>>512 ノブレスオブリージュでインテリはこじきに奉仕しろよ^^
>>509 とりあえず暗号化したいだけ → Win32 CryptoAPI
俺俺コード詐欺 → Crypto++
>>498-500 レスどうもです。
そもそも CreateWindow 以降で
ES_xxx を使ってスタイルを変えれることを知りませんでした。
ありがとうございました。
516 :
デフォルトの名無しさん :2009/06/16(火) 20:04:55
やあ、僕だよ。ひろみつだよ(´・ω・`)。 画面キャプチャをして、.jpgファイルで保存するソフトを作ったんだよ。 GDI+は初めて使ったから苦労したよ。 で、vectorにうpしたいんだけど、やり方がわからないから困っているんだ。 その気のある人は教えてくれるとうれしいよ(´・ω・`)。
517 :
デフォルトの名無しさん :2009/06/16(火) 20:05:47
ちなみにどのスレに聞けばいいのか分からないから、 C++で作ったからこのスレに聞いたんだよ(´・ω・`)。
プリントスクリーン→ペイントおいしいです
>>514 Win32 CryptoAPIってどこでダウンロードできます?
MSDNで日本語のチュートリアルやら何やら全て無いらしいですが
>>516 自己顕示のためにVectorを利用しないでください。
ネット資源の無駄です。
522 :
952 :2009/06/16(火) 21:37:11
>>520 うるせえはげ。vectorに聞いたからいいもんね。
w
問い合わせた時点で失格だろ なんでマニュアル読まないの?そのWinshot的なものはバグまみれだったりしないの?
>>510 仮想関数の引数をサブクラスで変える事ができないのと同じように、
コンストラクタの引数も変えられないと考えるのが普通かな(デフォルトコンストラクタあるいは決まった引数のコンストラクタを使う)。
あえてやるなら、boost::anyを1つ取るコンストラクタに統一すれば、実質サブクラス毎に引数を変える事はできる。
>>520 別人だが、そう言われると俺もネット資源の無駄でしかないのだろうかと…
atan2関数が90度の時エラー的な何かを返してくるのですが何が帰ってきてるかよくわかりません どうやって場合わけすれば良いですか? 何か典型的な場合分けの方法がありますか?
渡す前に判断
何が帰るかわかりますか? −1.#INDなんとかかなんかなのですがググってもよくわかりませんでした
atan2はx側が0だと計算しない if文で判断して0を渡していいんだけ?
数学の教科書を引っ張り出せば 何故エラーになるのか分かると思うよ。
>>515 確か ES_MULTILINE だけは後から変更できなかったんじゃなかったっけ?
スタイルのようで実質は違うコントロールだった気がする
誰か分かる人ツッコミよろ
longからキャストしまくってdoubleに持って行ってるのでlongで場合わけして大丈夫かなと思ったのですが atan2に渡す直前が0と同値かでやったらできそうですね、多分 ありがとうございました
>>532 試したら変わらなかった
ES_CENTERとかは変えられたけど
DestroyWindowしてCreateしなおせばいいのかな
基底クラスのポインタにDLLから派生クラスのインスタンスを渡すようにして DLLだけ差し替えて機能切り替えみたいなことってできますか?
同じ開発環境からできてるDLLならできると思うよ
>>527 悪いのはatan2ではなく、そこに渡す引数がおかしいんじゃないの?
普通は90度でも別に変な値は返さないぞ。
あと、#indはNaNのこと。
>>527 atan2(0, 0) になってるか
片方の数値が NaN になってるか
関数をファイル分割させてコンパイルしたいのですが、その関数の中でcmathの関数を使いたいときに hoge.hとhoge.cppのどちらで#include<cmath>を書いたら良いのでしょうか? 好みの問題かもしれませんが、意見を頂きたいです。
ヘッダファイルでで<cmath>の内容が必要ないなら入れない。ソースファイルでインクルードする。 ヘッダファイルで必要ならインクルードしておく。
>>539 とりあえずヘッダに書くのが基本
あまり見せたくないものは cpp に書く (機能分割してそのcpp内でしか使用されなくて、他の人と同時開発しているとき)
可能な限りcppに書く
CSVファイルのbufferを作るとき vector<vector<string>>で実装するべきでしょうか それともchar buffer[row][col][data]でいくべきでしょうか? stlを使ったほうが変なバグは生みにくいと思うのですが セル数が増えていくと重くなるようなきもしますし・・・
Linux環境で画像ファイルなどのリソースを実行ファイルに埋め込みプログラム内から読むにはどうしたらいいのでしょうか
おそらく、重くなるって言ってもたかが知れてる どうしても遅かったら書き直せばいいじゃん
>>543 vectorがよかろう
読み込む書式が決まっているのなら、各行をstructにするのもいいかも
>>543 速度は実測が基本。
最適化はボトルネックを絞り込んでから。
C言語で10桁の大きな数を扱うときにトラブってます 環境はVista 英語 64bit, 2008 Express editionです 0から4294967295の数を扱うために unsigned long intでnumbersum[40]という配列を指定しました iを0から増やしていくにしたがってnumbersum[i]も増えていくんですが numbersum[34}で突然マイナスになってしまいます numbersum[0]=67547008 numbersum[1]=135094016 numbersum[2]=202641024 略 numbersum[32]=2007582160 numbersum[33]=2090026704 ←ここまではOK numbersum[34]=-2122496048 ←ここでおかしくなる numbersum[35]=-2040051504 numbersum[36]=-1975188960 numbersum[37]=-1910326416 numbersum[38]=-1845463872 numbersum[39]=-1780601328 unsigned int long は0から4294967295までいけるはずなのに なぜかunsignedとして認識されずその半分でマイナスになっているようです 一応ポインターで unsigned long *numbersum; numbersum=(unsigned long int *)malloc(sizeof(unsigned long int)*40); memset( lkkzznum, 0, 40); みたいに指定しても結果は同じでした 原因と対策にお知恵を拝借できれば幸いです
%dで表示してるからかな
環境大事
>>549 レスありがとうございます
確かにprintfは%dで表示してます
10進法で正しく表示するにはどうすればいいのか
今調べてますが良くわかりません
もし教えていただければ助かります
%luですね 解決しました ありがとうございました
using namespace stdは使わない方が良いという意見を聞きますが 参考書などをみてると普通に使ってたりしますしどちらがよいのでしょうか?
誰が使わないほうが良いなどといったのだ。 使い方がわかっていれば使ってよいのだ。 ひとつは using の影響範囲、 もうひとつは using ディレクティブと using 宣言の違い、 この二つを理解していればどんどん使って良いぞ^^
理解したころには使いたくなくなるはずさ。
宿題などに使う場合は using std::cin; using std::cout; using std::endl; この三行で十分
cinって何の意味?
cをinする
あ、c、inしたお。
急に広範囲でnamespaceを変えたくなったらどうするの? foo::bar::CHoge hoge; を foo::CHoge hoge; に変えたい時とか、using使えばできますか?
console in/out
マジレスしちゃうとcharacter in/out(by びよーねすっぽすっぽ)
つ、、、つられないぞ・・・
MFCでファイル毎のちょい重の処理をマルチスレッドで入れたいんですが フォルダ内に大量にファイルがあるとその数だけスレッドが出来るんですが、これなんこまでスレッドって作れるんですか? 5000スレッドとかになっても問題ないですか?
WinAPIのリファレンスには仮想メモリが許す限りいくらでも作成できるとある。 各スレッドのスタックがデフォルトのままだと5000も作成できないだろうけど、 各スレッドのスタックサイズを小さくすれば作成できるかも知れない。
>>560 namespace foo { using bar::CHoge; }
とか
namespace foo { using namespace bar; }
>>564 そんなにスレッドを増やしたら、シングルスレッドの方が間違いなく早い。
言っとくが、スレッドオーバーヘッドでは無く、HDDのシーク時間が鬼のように
C++を使ってCPUの温度を取得するプログラムを書きたいんだが、どういうアルゴリズムで書けばいい? XP borland C++ なんだが誰か教えてくれ。
マルチ氏ね
Linux環境でリソースを実行ファイルに埋め込む方法を教えてくれええええ アイコンやSEを公開しないといけないなんていやだあああああ
objcopy
binary hackに載ってた方法ですね。その方法で埋め込んだとして、どうやって読み込んだらいいんですか。 >const char *start = _binary_foo_jpg_start; // データの先頭のアドレスを取得 このアドレスをどう使えばいいんでしょうか。 例えば画像を読みたい場合、このアドレスをSDLなどのグラフィクライブラリの画像読み込み用APIに食わせれば普通に読めるんでしょうか。
>>573 やり方はいろいろあるけど何を使うかでやり方は違うけどねえ
libpngとかだとメモリに上げたファイルから展開する方法もあるし
libjpegなんかそうじゃないのかな?
ファイルアクセス関数を別に作って実はメモリにあがってるデータにアクセスするようにしちゃうとか
575 :
デフォルトの名無しさん :2009/06/19(金) 13:22:57
どんな型でもディスクに記録できるコードはありませんか? たとえば、vector< vector<int> >型など。 datasave(x,"c:\\d.dat"); dataload(x,"c:\\d.dat"); とできると良いのですが。
>>575 データのシリアライズ問題は結構深遠なテーマだと思うんだけど…
>>575 POD及びその集合くらいなら「時空を越えるオブジェクト」でぐぐれ。
複雑な型は↑が言うように設計時に考えておかないと難しい。
この辺りはJavaでもそうだな。
Boost.Serialize
579 :
デフォルトの名無しさん :2009/06/19(金) 15:48:52
自分で、セーブするのが面倒なので、自動で型を保存してくれるソースはないですか
std::maxを使おうとするとコンパイルエラーになってしまいます(maxなら通る)。 algorithmはインクルードしてあります。 using namespace stdは自分のコードではしてないし、使ってるライブラリは標準とboostだけなので、これが原因とは思えません。 またソースファイルによってはstd::maxで問題なくコンパイルできます。 どんな原因が考えられるでしょうか?
582 :
581 :2009/06/21(日) 04:35:03
書き忘れました。エラメッセージです。 error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
>>581 #undef maxでうまくいかないかな。
Boostの中で<windows.h>がインクルードされているということはないか?
もしそうだったら、先に#define NOMINMAXを定義しておけばいい。
>>583 レスthx
#undef maxでうまくいきました。
#define NOMINMAXは変わらずエラーが出ました(インクルードの前に定義すればいいんですよね?)。
どこかでマクロが定義されたいたということでしょうか。
マクロは嫌ですね・・・。
max min は超最悪だし PURE とか THIS とかなんてもんdefineしてんだって環境があるよね
VC6なんて、標準のmax呼び出すのに__maxとかやらされたんだよ、なんなんだよ、チネヨって感じ。 で、じゃあ、独自拡張のmaxが高性能化っていうと、標準未満の性能なんだ、これが。
他の方法としては (std::max)(a, b) とか (std::numeric_limits<int>::max)() とかする。
メンバや名前空間内で使い捨てにする様な単語を大域で予約するなよって話であって 機能がどうこうってことじゃねぇ
589 :
デフォルトの名無しさん :2009/06/21(日) 12:18:12
#include <iostream> enum { MAX = 1000 }; int main(void) { unsigned long fn = 0, fn1 = 1, fn2 = fn + fn1; std::cout << fn; std::cout << ',' << fn1; while(fn2 < MAX) { std::cout << ',' << fn2; fn = fn1; fn1 = fn2; fn2 = fn + fn1; } std::cout << "..." << std::endl; return 0; }
スパゲッティーすぎるだろ コード長杉フイタ
じゃあお前書いてみろよ
boost::counting_iteratorを使ってfibonacci iterator作ろうぜ!!
今時の新人君はフィボナッチも書けないクズが多くて困る うちは面接でいつもそれを3分与えて紙に書かせてるけど、正答率2%
圧力面接ですね これはパワハラに当たりますので訴えられる覚悟はしておいたほうがいいですよ
>>594 ちなみにどうい業種なんでしょうか?
そのような嫌がらせに見える試験を出すようなところってw
大学で関数型言語を使った奴なら1分で終わるような問題だな そういう篩のための問題なのだろうか?
フィボナッチ数の第N項を求めるコードの演算(足し算と掛け算)の回数が - O(2^N) のアルゴリズム →10点 - O(N) のアルゴリズム → 40点 - O(log N) のアルゴリズム → 100点 ちなみに同じオーダーでもやり方は一通りじゃなかったりして結構おもしろい
一般項の式を使って、「O(1)の解」を出されたらどうすんのさ
優勝
O(logN)というのが思いつかなかった。 一般項の式が先に思いついた。暗記できないけど。
>>600 O(1)の意味がわからない
ちょっとやってみてよ、見てみたい
double sqrt5 = sqrt(5.0); double phi = (1 + sqrt5) * 0.5; fib_n = (long)floor(power(phi, n) / sqrt5 + 0.5);
黄金比を使うのはO(1)じゃないよ あとO log Nも多倍長整数だとO(N)までにしかならんし テストでもO(N)まで知ってれば十分な場合が殆んどだと思う
>>605 そそ。あくまでもカッコ付きの「O(1)の解」ねw
607 :
599 :2009/06/21(日) 14:12:23
うーん、ちょっとわかりにくい書き方だったかな 実行時間のオーダーじゃなくて演算回数のオーダーって書いてあるのがミソね 何か多倍長整数のライブラリがあって、それを使ってよいとするわけ 自分の想定解は、 - O(N): DP、メモ付き再帰 - O(log N): - 行列の掛け算に落として行列のN乗をlog(N)ステップで求める - 一般項から直接計算(a+b√5 の形の数の計算が必要、一般項にN乗が入ってるので演算回数はO(log N)) ちなみに、時間計算量は多倍長整数の演算のオーダーを考えにいれる必要があってめんどい 前者はNビットの数の足し算しか起こらないので O(N^2)-time, 後者は多倍長整数の乗算のオーダーに依存するが O(N^1.585 * log N) ないし O(N^1.465 * log N) くらいにはなる
そこまでを3分はムリ
609 :
599 :2009/06/21(日) 14:22:15
なんかつい反応しちゃったけどスレ違いだね、ごめんね
一回考えたことがあれば思い出すだけだからムリじゃないよ
黄金比を使うところまでならsicpを読んだことがあれば知ってるだろうから 出題者がそこまで考えてるって前提があるのなら、基礎知識の問題としては典型だといえるよ
科学技術計算って出番なくない? 出番があるから使うんじゃなくて、何に使うかわからんけど勉強さえしとけばいつでも出番があるような関数群なの? 一つも使ったことないんだけど・・・ マルチスレッドで中身のないループ書くと、CPU使用率MAXになるのを回避するためにSleep(10)とか入れると0%になるんだけど これ、なんかごまかしてるみたいでやなんだけどSleepのなかで待機してるなら結局ループでCPU使用率上がらなきゃおかしいと思うんだけど、 CPU使用率上がるループと上がらないループって何が違うの?Sleepの中でなにやってるの?
空ループってループ回す回数が半端ないよ
>>607 O(n)は普通に3分で出来るだろうね
一応、フィボナッチの定義ぐらいは問題文に含めてあげて
>>612 sleep中は別の人が別の仕事をしてるんだよ
誰も仕事がなければただ寝てるだけ
「10分経ったら起こしてー」って(OSに)頼んで仮眠するのがsleep 10分後にセットした目覚まし時計とにらめっこして鳴るのを待ち続けるのが空ループ 当然目と耳を澄まして待ち構えてないといけないから気は抜けない(CPU使用率が高くなる)
while(1){} は関数じゃないよね? Sleepは仮眠するために何やってるかを分解するにはアセンブラになるってこと? 仮眠するにも必ず10分経ったかを毎回確認しなきゃいけないと思うんだけど CPU使わないSleepの為の待機命令ってなに? Sleep { wait(10); count--; if(count = 0) return; } みたいなことしてると予想するんだけど結局じゃあwaitの中は何ってなるんだけど
何が知りたいのかというと 最終的に何かOSで統合的に待ちを管理してるのは分かったけど その命令ってなに?
OSの勉強してくれ。
>>616 while(1){}
無限ループ
自分が書いてるプログラムもOSなどから見れば所詮はタスクかスレッドに過ぎないので
OSなどが用意してるAPIを呼び出すと所定時間だけ実行が停止した後、また復旧できる
というか環境書いてよ
なんだろ。割り込みが来るまでHALTさせてんのかな?
>>619 WindowsXPのC++9です
なにか命令があるなら教えてください。詳しくは調べます
おおざっぱに言うと、OSはプロセスを ・実行中状態(CPUが1つなら1つ) ・実行可能状態 ・待ち状態(イベント待ち状態) で管理している。 タイマ割り込みを設定して、待ち状態に放り込むと、 そのプロセスは時間が来るまで停止する。 その間は、他のプロセスやOSがCPUを使っている。
よくわかりました わかりましたが、やっぱりプロセスを回すための時間を管理するループはCPUを使ってないことになるんですが これはタスクマネージャはその計算を除外していて見えないだけということですか?
よくわからん
625 :
622 :2009/06/21(日) 16:01:54
thxごめん完全に勘違いしてた
タスクマネージャはプロセスだけでC++はプロセスしか作れないから
どんな命令があろうと結局CPU時間が見えてしまうから、プログラムで作るソフトはSleepでCPU使用率が少ないように見せる適当な数値で待機
させるのが限界だと気づいた。
>>619 がやっとわかった
ありがとう
>599 馬鹿なこと聞いてると思うんだが、O(2^N) ってどうやるの?
628 :
デフォルトの名無しさん :2009/06/21(日) 19:01:28
Variable Arguments
違う違う vはvariadicだ
variable array だろ。
vaka aho
VAriadic
635 :
628 :2009/06/21(日) 19:11:13
variableのvaだと思ってた
variable+〜dicの造語なんだろう だが〜dicがなにかわからん
ちんぽのこと。
Variすごか(とてもすごい)
class A{ public: B b; } class B{ public: A a; } このようなお互いがお互いの実体を持つクラスは作れませんか? 似たような代替でも良いです
作れます。次の方どうぞ。
>>643 もし、お互いが実体を持ったら、a.b.a.b.a.b.a.b.・・・と無限に実体が存在し、
無限のメモリが必要になるので、そもそも不可能。
代替としては、どちらか一方もしくは両方が、相手をポインタで指すようにすればいいよ。
ポインタで指す方法で試そうとしたのですが、クラスのプロトタイプ宣言がわからず出来ませんでした サンプルをお願いします
class B; class A{ public: B* b; }; class A; class B{ public: A* a; };
>>644 さん、実態を持つクラス作れるんですよね?
降臨回答よろしく
だからポインタか参照を持って置いてコンストラクタで初期化しろや コンポジションは無理だから
644出てこいや 作れるんだろ?wwwwwwwwwwwwwwwwwwwwwwwwww 作ってみろやwwwwwwwww
ちなみにC++に限らずC言語でも
struct A {
struct B b;
};
struct B {
struct A a;
};
というのは
>>646 さんの言う通り無限にメモリを必要とするから無理
C++だからダメというわけじゃない
元々無理なの
>>648 こんなクラスのプロトタイプはどう宣言しますか?
class A{
public:
void test();
}
>>627 int fib(int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n - 1) + fib(n - 2);
}
>654 あー、確かに。 素直にforで回せばいいものを(笑)
コンパイルは出来るんですが、(*vSB).size()でエラーで止まります vector配列の参照が文字数が長いためvector配列のポインタを作ってvSBとして短くして使っていきたいんですが、どうかけばいいんでしょうか vector<CStaticBox*> vStaticBox; vector<CStaticBox*>* vSB = &(((CMainFrame*)AfxGetMainWnd())->m_wndFileView.m_ThumbnailStatic.vStaticBox); for(UINT i=0; i< (*vSB).size(); i++){ if( (*(*vSB)[i]).folderFlag == FALSE ){ } }
うちだと、フィボナッチ関数は初心者研修で使っている。 結果をプールすることに気づけば>654のような再帰版でも及第。
>>657 コンパイルできているなら、エラーが出るのは別の原因じゃないか?
その恐ろしく無様なクラスの詳細が判れば別だが。
先ずは、vStaticBoxなるメンバの型を確認することお勧め。
# つーか、そいつがvectorの実体なら、vector<CStaticBox *> & vSBにでもしろよ。
660 :
644 :2009/06/22(月) 12:45:22
ごめんなさい 嘘つきました 実は何も知らなかったんです いじめないで〜><
template<T> class Hogeがあり、 Tがconstの有無だけしか違わないクラスのprivateメンバを参照したい場合には、 どのような方法を取るのが一般的なのでしょうか? 例えばHoge<const int>のコピーコンストラクタでHoge<int>を受け取りたい場合などです。 friendやreinterpret_castなどしか思い付かないのですが、 もっと良い定石があるのでしょうか?
aruyo
>>661 const_cast
つーか、具体例を出してみてくれ。
>>659 thx。構文はおかしくないんですね。
ポインタを作るより参照にしたほうがいいメリットってなんですか?
>>663 説明下手とタイプミスすみません。こんな感じになります。
簡略化のためTがconstと非constの場合で定義を分けてあります。
template<class T> class Hoge {
T t;
public:
Hoge() {}
Hoge(const Hoge& h) : t(h.t) {}
};
template<class T> class Hoge<const T> {
const T t;
public:
Hoge() {}
Hoge(const Hoge& h) : t(h.t) {}
Hoge(const Hoge<T>& h) : t(reinterpret_cast<const Hoge&>(h).t) {} // こんな感じで*_castするしかないのでしょうか?
};
int main(int, char**) {
Hoge<int> h1;
Hoge<const int> h2(h1);
return 0;
}
>>664 参照にすると、こんだけ読みやすくなる。
vector<CStaticBox*>& vSB = ((CMainFrame*)AfxGetMainWnd())->m_wndFileView.m_ThumbnailStatic.vStaticBox;
for(UINT i=0; i< vSB.size(); i++){
if( vSB[i]->.folderFlag == FALSE ){
また、うっかり vSB + 1 とかする、くだらないバグも防げたりする。
class Aのメンバのvector< vector<string> >array を20行*10列で初期化したいのですが コンストラクタの初期化リストにどう記述すればよいでしょうか?
:array( 20, vector(10) )
670 :
デフォルトの名無しさん :2009/06/22(月) 19:35:04
間違えた :array( 20, vector<string>(10) ) でできない?
vector< vector< string > >( 10, vector< string >( 20, string() ) ); コンパイルして試してないからエラったらすまん。 概念としてはまずvector< string >を20個の空stringで初期化し、 そのオブジェクト10個でもって、vector< vector < string > >を初期化する。
ageてしまった...もうやだ。
674 :
504 :2009/06/23(火) 09:24:15
CryptoAPIでDES暗号化をやっているんですが、いまいちよくわかりません。 平文を暗号化する前に鍵を生成するようなのですが、この鍵は自分で設定することはできないのですか? また、saltというものが何なのかよくわかりません。どうかご教授お願いします。
:array( 20, vector<string>(10,"") ) でいけました、ありがとうございます。 度々質問で申し訳ありませんが 配列の要素外に値をセットしたい場合、 例えば20行確保されてる配列に対して25行目に値を入れる場合は 21-24行目を適当な値で埋めていくしかないのでしょうか?
676 :
504 :2009/06/24(水) 02:51:07
#include <wincrypt.h> HCRYPTPROV hProv; HCRYPTHASH hHash; char *PASS = "hoge"; HCRYPTKEY hKey; BYTE pDate[100] = "12345"; DWORD dwDataLen = strlen((char*)pDate) + 1; CryptAcquireContext( &hProv, NULL, MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, 0); CryptCreateHash( hProv, CALG_SHA1, 0, 0, &hHash ); CryptHashData( hHash, (BYTE*)PASS, strlen(PASS), 0 ); CryptDeriveKey( hProv, CALG_DES, hHash, 0, &hKey); CryptEncrypt( hKey, 0, TRUE, 0, pDate, &dwDataLen, 100 ): これでやっても文字化けしたデータが出てしまいます。(復号はできる) dwDataLenを大きくとって全てのデータを得たいのですが上手くいきません。 saltというものについてもよくわかりません。お願いします。
暗号扱うなら結城本は読んどけ
バイナリ→バイナリの写像だもの 文字化けするのはあたりまえだ PGP、 gnupg は base64 で可視テキスト化してたな
679 :
504 :2009/06/24(水) 10:09:58
便宜上パスワードと鍵をハッシュ化して使うみたいだけど直接平文とキーを入れたいがよくわからない
>>678 なんとなく文字化けはわかりました。この辺は工夫次第でなんとかなりそうだ
vectorとかの配列でpush_backすると 領域を再確保して配列の内容をコピーしなおすのでしょうか? そうならばなんどもpush_backすることがわかってる場合は テンポラリにある程度のサイズの配列を用意して配列の内容をコピー それを元の配列にコピーしなおしたほうが早くなるのでしょうか?
容量が足りなくなった場合だけ、メモリが再確保とコピーが行われる。 reserveで予め容量を増やしておいてpush_backすればよい。
>>680 することもあるししないこともある
細かく言うと、push_backすると確保してあるサイズを超えるときは、
以前のサイズの二倍(倍率は処理系によって違うけど)の領域を新たに確保してから
そこを使う
てゆーかreserve使えばいいじゃん
ありがとうございます 参考にしてたサイトにreserve()がのってなかったorz こういうのは重要だとおもうのに・・・
push_backするたびにtry catch(bad_alloc)するべきなの?
>>684 なに突っ込むかにもよる
長さもそんなに奴にに組み込み型とかだったら
そんな極限状況でcatchして何ができるの?って話になるからやるだけ無駄
自由。目的によるし好きなようにすればいい。 一度ずつ例外を調べたい場合はそうすればいいし、tryの中で繰り返しpush_backしてもいい。 上の続きでreserveした領域にpush_backする、というなら別に例外を補足する必要はない気もするけど、 自分なら、push_backするときのコピーコンストラクタとかで例外投げるかもしれないから補足しておく。
687 :
デフォルトの名無しさん :2009/06/25(木) 07:50:43
char A[15] = "12345abcde"; char B[10]; と配列を作って for(int i = 0; i < 10; i++) B[i] = A[i]; で代入すると strlen(B); が10ではなく30になってしまいます。何でですか?
'\0'がないから
>>687 たまたま30なだけで10かもしれないし11かもしれないし
char A[15] = "12345abcde";
とすると "e"の後ろに自動的に
>>688 の言ってる'\0'が追加される。
なのでC/C++で
char A[15] = "12345abcde";
こういう記述をする場合は'\0'の1文字分余分に考えておかないといけない。
>>687 の場合は
char B[10];
だと正味の文字数は9文字までに絞ってB[9]='\0';とするか
char B[11];
という風にするか
>>687 strlenは0が見つかるまでを文字列の長さと判定する
たまたま31バイト目に0があったので30を返したんだろう
CでSSEとか対応のプログラムって書けないんですか?
>>691 コンパイラの最適化におまかせでもインラインアセンブラでもおk
つ組み込み関数
ヌル文字を教えた上で strncpyなりstrcpy_sなりも教えるべきだと思うんだ
おまいらも昔は、 char *s = "12345"; int i = (int)s; とか書いて期待通りに動かなくて悩んだよな。
ない アセンブラ先にやってるのでCの記述に詳しくなかったけど そんなことはしない
俺もそんなことはしないぜ。 でもatoi()の存在を知らなくて、str2num()とかいう関数を自作して使ってた。
(float) 10 はできて (float) "10" はなんでできないんだろう
>>699 (float)0x0a
ならOKじゃない?
>>695 _variant_t s = "12345";
short i = s;
ならやったことがある。
K&Rはかなり最初のほうで自作atoiが出てくるから
それで勉強した人たちも
>>695 みたいなことはしないだろうと思う。
スレッドセーフなアプリやDLLを作るのに心がけることはどんなことでしょうか? staticな変数やグローバル変数、動的確保を一切使わなければ完全に安全な関数といえるんでしょうか? また、上記のものを使う場合ミューテックスなどを使ってアクセスを一つに絞れば完全に安全でしょうか?
(式)? trueの場合 : falseの場合 この書き方はどういう名称のものなのでしょうか
>staticな変数やグローバル変数、動的確保を一切使わなければ完全に安全な関数といえるんでしょうか? その関数が外部の関数をコールしていない。 見えない、外部関数コールがあるかもしれない。 それが一切無ければ。 >上記のものを使う場合ミューテックスなどを使ってアクセスを一つに絞れば完全に安全でしょうか? ほとんどの場合、この考えだけでは問題を発生させる。
>>703 最も安全なのは、スレッド間で同一データへの参照を共有しない事。
static やグローバル変数が問題になり易いのは、それを参照している
処理が複数のスレッドから実行される場合、結果として複数スレッド
から同一データへの参照 ( 操作 ) が発生してしまう事が原因。
それと、ミューテックスなどによる排他制御は、「仕方なく」データ
を共有する場合の保護手段。使用時は慎重に設計しないとデッドロッ
クなどの要因になり易いので、なるべく使用しない方が良い。
俺もまさに今マルチスレッドなアプリ書いてるんだけど、 「お、これはデッドロック発生しそうなシナリオだ」と かいうのは割とすぐにわかる。 解決策は OS とかの本読めば大別して四通りくらいあっ たと思う(俺はタネンバウム先生ので勉強した)。俺が よく使うのは ・単一の競合対象リソースを管理する独立したスレッド を用意して処理を委譲する(か、手を抜いて mutex)。 ・複数リソースの同時要求はロジックを見直すか、要求 順序を定義出来ないか考える(これは mutex 使うだけ じゃ解決できないからね)。 ・複数リソースを要求する作業は大抵もっと抽象化され た処理単位があるので、read write lock を使ったキュー を用意して同一順序同士はキュー内で read lock、逆順 は write lock とか(これは今考えた)。 といった感じ。でも、その「お、」と思う感覚を後輩に どう教えたら良いのかってーのが全然わからん(w
それは経験則が大きいね〜、経験させるしかないと思われ
参考になる本としては Java Concurrency in Practiceや Synchronization Algorithms and Concurrent Programming Principles of Concurrent and Distributed Programming がある
EffectiveC++とか呼んでみたけどいざ使おうとすると悩むぜ・・・自分の応用力の無さに泣いた
クラスの宣言で class Hoge { public: void set(int x) { _x = x; } private: int _x; } という宣言がコンパイルできてしまうのですが、素人考えでは set関数の中で_xにアクセスする際、まだ_xは定義されていないのでエラーになりそうだと思うのです。 VS2008だと素直にコンパイルが通るのですが、これはC++言語的にも正しい書き方なのでしょうか? それとも2008が気を利かせてOKにしてくれているのでしょうか
正しいです。
言語仕様です
class Hoge { public: void set(int x); private: int _x; } void Hoge::set(int x) { _x = x; } これがOKなのは分かるよね。
・・・classの閉じ括弧に;つけるのを忘れたのでOKじゃないな。
ありがとうございます。 なるほど、関数の中身の解析は最後にされる。みたいな感じなんですね。 安心しました。
718 :
デフォルトの名無しさん :2009/06/28(日) 14:13:02
スコープ外のstatic宣言に関する質問です。 static を関数スコープ外で書くと「そのファイル以外から見れなくなる」といいますが、 ヘッダファイルにstaticで書いた場合、そのヘッダをインクルードするだけでいくらでも外部から参照できてしまいます。 そのため、cppソースファイルではなく、ヘッダファイルの場合、 「そのファイル以外から見れなくなる」という意味がほとんど無い気がします。 ヘッダにstatic を書く意味があれば教えてください。 あと、以下のようにヘッダに書く「static const」と「const」の具体的な違いはどのようなものでしょうか? 「namespace{...}」も同じ効果?ということも聞きますが・・・ // ヘッダファイルの内容 static const int TEST = 10; const int TEST = 10; namespace{ const int TEST = 10; } これら、3つの違いは??? //************************************************** ↓test.hの内容 static const int nTest = 100; test1.cppの内容 #include "test.h" test2.cppの内容 #include "test.h" test3.cppの内容 #include "test.h" ↑いくらでも参照できてしまうのでは・・・? //**************************************************
constは参照だけとか 書き換えは不可ということで
ヘッダでstatic使うな。 入れたら一応そのファイルだけで使える変数になるよ。 インクルードしてるソースごとに同じ名前だけど別モノ。
別々の関数に同じ名前のローカル変数を作れるように、 別々のファイルに同じ名前static変数ができている。 ただし、constの場合はやっても無害。 CとC++で微妙に意味が違う。
C++のconstは曲者だな。メンバ関数に付くやつとかポインタ関係につくやつとか。覚え切れません。
>>722 static と違って全部同じ意味だから、別々で覚える必要はないよ。
文法がめんどいのは確かにそのとおりだけどね。
header fileでstaticはODR violationが怖ひ
725 :
デフォルトの名無しさん :2009/06/28(日) 14:45:10
>>719-723 adviceありがとうございます。
ということは、
test.hの内容
(1)static const int TEST = 10;
(2)const int TEST = 10;
test1.cppの内容
#include "test.h"
test2.cppの内容
#include "test.h"
test3.cppの内容
#include "test.h"
とした場合、
(1)の場合だとインクルードした3回分だけ、同じ名前の変数TESTが作成される
(2)の場合だとTESTはtest.hの一つしか作成されない。
という理解でよいでしょうか。
これが正しいとすると、ヘッダにstatic constで書く理由がほぼ無いと思うのですが・・・
ところが、以下のサイトではヘッダファイルに(2)の方法では書けないとあります。
http://www.paw.hi-ho.ne.jp/takadayouhei/technic/42.html しかし、自分の環境VisualStudio2005では普通に(2)の方法で書くことができました。
なぜ、上記サイトで「ヘッダでconst変数を書けない」ということがでてきたのでしょうか?
static const int TEST = 10; これってcの #define TEST 10 と同じように使いたかったとか
>>725 C++ ならどちらでも同じ。だから static を使わないのが普通。
そのサイトの記述は C の場合と勘違いしてると思って読むとつじつまは合う。
>>724 ODR violationって簡単に言うとなんでしょうか?
>>724 static で ODR 違反はないだろ。
>>728 同じ名前に対しては定義はひとつでなければならない、
というルールに違反すること。
プログラミング初心者です 初心者と言うのを踏まえたうえで、手始めにこんなのを作ってみたらどうだ みたいな感じで何かお題をいただけないでしょうか
>>731 関数電卓
たとえば、
(19+45/8)*45-75
と入力してその計算結果を出力
んーいきなりそれは難しいと思うが・・・
俺も思ったけど bisonなり色々ネットに参考文献がごろごろ転がってるし 実は良問なのかとおもう
738 :
デフォルトの名無しさん :2009/06/29(月) 19:47:34
C++で指定したファイルやディレクトリの存在を調べるプログラムをつくりたいと思っています。 ファイルの有無に関してはC言語ではfopenをつかった判定がよく例として出てくると思うのですが、 C++ではこれらについてはどのような方法があるのでしょうか?
C++でも似たようなもん しかしここは環境依存OKなスレなので、 環境(OS)を書いてくれればその環境特有の別な方法も示せる
ファイルは分かるけど、環境依存しないで分かるの?
741 :
740 :2009/06/29(月) 21:03:06
ミス。 ファイルは環境依存しないでもわかるけど、 ディレクトリは環境依存しない方法あるの?
boost::filesystemしかないな・・・
743 :
デフォルトの名無しさん :2009/06/30(火) 04:44:32
makefileの改行コードって\nですかそれとも$ですか?
744 :
デフォルトの名無しさん :2009/06/30(火) 04:51:01
簡単で良質な乱数の生成方法を教えてください。 boostを使えればいいのですが、使えない環境下でもコンパイルしたいのです。 ゲームならrand()でも良いのですが、科学計算なので、ある程度良質なものを探しています。
>>745 それって質はよいのですが、もう少し単純で高速なものはないですか?
749 :
デフォルトの名無しさん :2009/06/30(火) 08:23:37
>>739-741 想定している環境はMac OS XとLinuxとFreeBSDで
コンパイラはGCC 4.0(かそれ以降)です。
Windowsはまったく想定しておりません。
いわれて気がつきました。
>>749 stat()を使うのが無難かな。access()も使えなくはないけど。
シンボリックリンクをそのままリンク自身として扱いたいならlstat()でないと無理。
>>749 ,750
ちょっと話それるけど、
ファイル一覧の話で、scandir()でリスト取得しても、
windows(mingw32)だと「struct dirent *entry」の d_typeは、
環境依存(ファイルシステム依存)でいい?、DIR/FILEを調べるのに、
再度stat()した記憶がある。
あと、scandir()のfilterコールバック、なんともいやーーーな仕様って
感じるの俺だけ?1つ任意のオブジェクト位渡せるようにしてくれ、
正規化ルーチンを入れる時とか、その都度オブジェクト生成破棄してたら、
しゃれんならん。動的にフィルタールールを変えられねーだろつーーの。
どうぞ!
class Aのメンバにclass Bのインスタンスが20個近く含まれるような状態になってしまいました。 このような場合、Bのインスタンスを含む構造体やコンテナをメンバに加えるような形にしてしまった方が良いでしょうか?
>>752 もうちょっと具体的に・・・
丸々ソースをあげろとまではいわないので名称をhogeとか適当に変えてアップしてくださいな
pImplを使うんだ
20個くらい別にイインジャネ どうしても気になるなら配列にしとけば? class AddressData { std::string data[20]; public: enum Key { FirstName, MiddleName, LastName, Address, PhoneNumber, ........ }; std::string GetData(Key key) { return data[key]; } }; こんな感じで
pImplのわかりやすい説明してるサイトとかないでしょうか? というかC++って便利になったのかね?とホント思ってしまう
pImplちょっと勉強してみた・・・ オブジェクト指向のいいところ殺してね?
pImplはオブジェクト指向によるヘッダの重さを軽減するためのものだしね
>758 みたいですね しかも関数型と違って、メンバ関数などを呼び出したりと構造的に重くなってるはずの オブジェクト志向でさらに分離するためにあれこれかませてるとか・・・
クラスについて質問です。 クラスを、変数と関数の単なる集合体と考えるのはあまり良くない……という話を聞いたことがあります。 さてここに、とある共通点を持った複数の関数があるとします。 これらの関数はすべて独立していて、静的変数なども特に使わないとします。 この関数群をグループ化したいとき、どのような方法を採るのがベストでしょうか? ・普通にクラス化する ・シングルトンパターンを組み込んだクラスにする ・全てのメンバ関数がstaticなクラスにする ・クラス化させずに名前空間 以上の方法を思いついたのですが、どれが相応しいやら。 その他にも、定番のような方法があればお願いします。
クラス化させずに名前空間 「とある共通点」程度ならそれくらいでいいかと
>>761 ありがとうございます。
使う側から見れば、staticな関数で揃えるのと使い勝手は大して変わらないですもんね。
>>753-755 class Aというのがマイコンの状態をモニターするクラスで
class Bというのがシリアルポートを経由してコマンドを送信して
コマンド内容に合わせてADコンバータの値やIOの状態を適切な形に変換して渡すクラスです
class Aが構成ごとに必要なclass Bを内包していく形をとっていますが
構成によってはclass Bの数が15個↑になってしまって
なんか不味いような気がして相談にきた次第です
>>763 マイコンの状態をモニターするクラスがシリアルポート経由でコマンドを送信するってのも変な話じゃね?
モニタするためにシリアル通信が必要ならそうでもないんじゃね?
>>764 マイコンにコマンド(というか文字列)を送信すると
その文字列に対応した目的の値が帰ってくるという仕組みな為
モニター側がリクエストしないといけないのです
ああ、なるほど。 class Bのインスタンスが複数必要な理由もわからないな。 ラッパー関数が大量にできて困るとかの方がまだ想像できるというか。
>>768 class Bのコンストラクタで
コマンド番号と変換ロジック(AD値を電圧やその他の値へ変換)クラスをセットするようになっています
適当に言うけど、それぞれBから派生した別のクラスにしちゃうのはどうなんだろう。
全部のBインスタンスに対してなんか処理してるわけじゃないなら気にしなくていいと思う
STLへpush等して変数を格納するとき 変数は代入されるのかコピーされるのかどちらになるのでしょうか?
コピーコンストラクタが呼ばれる
775 :
デフォルトの名無しさん :2009/07/03(金) 16:56:25
C++@Linuxで ABCDE 78 FGHIJK 601 LMN 5976 とかがあたえられているときに 78 601 5976を整数型のデータとして変数に格納したいのですが C言語のsscanfとか駆使する代わりに C++ではどういうコードの書き方ができるのでしょうか
>>775 sstream
stringstream
#include <iostream> #include <sstream> #include <string> int main() { std::string str[] = {"ABCDE 78", "FGHIJK 601", "LMN 5976"}; int a[3]; for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++) { std::string dummy; std::istringstream os(str[i]); os >> dummy >> a[i]; std::cout << a[i] << std::endl; } }
質問させてください。gcc前提です。 ある既存のライブラリAでaという外部変数が定義されています。 A: int a = 100; (みたいなかんじ) 別の既存のライブラリBでbという外部変数を参照しています。 B: extern int b; AもBもバイナリで提供されていて変更できません。 bがaと同じものをさすようなラッパーというのは作れるでしょうか? アセンブリで書く必要があるとすれば、(i486系では)どう書けばいいでしょう?
>>778 ちゃんと環境を書きましょう。
・OSは?
・「バイナリ」とは .so .a .dll .lib のどれ?
あ、すみません。 ライブラリは.so形式です。 OSはLinux(Fedora11 gcc4.4)と、FreeBSD(7.2 gcc4.2)です。 とりあえず一方だけでもかまいません。 よろしくお願いします。
class Hoge { private: vector<Foo>* pFoo; public: void SetFoo(Foo* foo); } HogeのメンバにFooというクラスの配列を持たせたいとき vector<Foo>の実体のメンバmFooを持たせるか vector<foo>のポインタpFooを持たせて動的生成するのはどちらがよいでしょうか?
>>781 Hogeのコピーを作成しないなら、実体がいい。
Hogeのコピーを作る必要があるなら、ケースバイケース。
Hogeのコピーコンストラクタでvector<Foo>を、どのように処理したいかによって変わるが、
経験的には、ほぼ実体ですませている。
>>781 実体で済むものは大抵実体にしといたほうが面倒が起こらないよ
vectorの内容がコピーされるコストを気にしてなんとなくポインタにしてるとかだったら特に
>>780 その変数 a, b は自分が弄らなくても
書き換わる可能性がある?
無いなら setter を作って両方に
同じ数値を代入する関数を作ればいいと思う
785 :
デフォルトの名無しさん :2009/07/03(金) 20:26:57
Linux(RedHat)のELF形式のバイナリがあるのですが、ソースを見ないでもこれがCで書かれたのかC++で書かれたのか もしくは混合なのか、分かる方法ってあるでしょうか? stripされておらずnmでシンボル名が取れます。 どうかお願いします。
>>785 ldd して、依存ライブラリを見てはどうですか?
コンパイラはC++でもC風に書いてたら分からないだろ
788 :
デフォルトの名無しさん :2009/07/03(金) 21:22:41
ありがとうです。やってみたら、こんなライブラリに依存してました。 libstdc++使ってないし、Cだけで書かれてるのかもしれないですね。 libcrypt libssl libpthread libdl libm libc libgssapi libkrb5 libcom_Err libk5crypt libresolv libz
>>784 ありがとうございます。
たぶん勝手には変化しないはずなので、初期化時に同じ値を入れることにします。
ただやはり同じものを指す方法があれば一番楽なので、
あればよろしくお願いします。
>>790 二箇所に実体がある以上、同じものを指すというのは難しいです
一応はデバッガのように特定のアドレスを監視し続けて、
片方の変数に常に追従させるという手もありますが
どうやって実現するのやら
え?初期値だけでいいの? なら新たなに extern int a; int b = a; っていうライブラリ作ればいいんじゃね? C++のみだけど
>>791 いや、実体はライブラリAにあるa一つだけです。bは単なるexternです。
>>792 とりあえず今すぐは初期値だけで何とかなるのですが、
ちゃんと解決させる必要が出そうです。
794 :
デフォルトの名無しさん :2009/07/04(土) 16:28:24
MFCのCListやCMapなどに出てくるPOSITION型とは "イテレータ"のようなもの、と習ったのですが実体はなんなんでしょうか ソース見ても判然としません。
場合によって違う HANDLE型みたいなもんだ気にするな
質問です。 クラスとして class CHoge { public: virtual int load(const char *filename)const; }; みたいな、文字列を引数にとる仮想関数を持っているクラスを設計するときの質問です。 静的リンクライブラリとして、クラス内の実装はlibの中に隠ぺいされています。 ユーザーはもちろんオーバーライドして使ってもかまいません。 この状況なのですが、UNICODE環境の時に困りました。 MessageBox関数などが、実はマクロで MessageBoxA MessageBoxW に化けるということは知っており、それを真似ようとしたのですが loadWとloadAを作るとユーザーが2通りオーバーライドしなければならない(するべきでしょう)ので、面倒です。 となるとCHogeAとCHogeWを作り、マクロで #define CHoge CHogeA とかすべきなのでしょうか? しかしそれをしたとしても、libではW版、もしくはA版しか入っていないことになるので hogeA.lib hogeW,lib みたいに2通りのlibを作らなければならない気がします。 どのようにするのが正解なのでしょうか?
ヘッダ側にテンプレート作って包め
>>797 お返事ありがとうございます。
テンプレート…。
スマポを見よう見まねで作ったり、vectorとかを使ったりはできるのですが
「包め」というのはどういう意味でしょうか?
何かのスラングかと思うのですが…
Aは捨ててWだけにすればいいじゃん。
template <typename CharType> class CHoge { public: virtual int load(const CharType* filename) const; };
>>799 それも考慮に入れて置きますが、なるべくなら両サポートしたいところです。
>>800 えーと、その場合loadの中身の実装をヘッダに書く必要がでてくるのではないでしょうか?
例として出しているのでCHogeは1つしか関数を持っていませんが、
同様な条件ででかいクラスをすべてヘッダに書くのはしんどそうです
> libではW版、もしくはA版しか入っていないことになるので 何で?両方入れれば?
>>801 たぶん、ほとんどの場合、両方サポートしてもいいことない。
結局のところ「いい手はない」のが事実だったりするわけで
Windowsの汎用テキストマッピングは機能してない。 (_T()で文字列をくくったり、_tで始まる関数をつかったりするやつ) 文字列を編集する処理があるところとか、WとAの両方で動くように 意識してるやつとか少数だろうし、ほとんどのところで、_UNICODEと _MBCSの両方でテストどころか、コンパイルを通すも行われてないと思う。 事実上片方下かつかえないコードになるんで、最初から片方に決めうち したほうが混乱がなくていい。 で、いまどちらか片方ってことならWを選ぶことになる。
「〜W」の方に処理を実装して 「〜A」の方は内部でユニコードに変換して「〜W」を呼び出すのはどう? 文字列を単なるパラメタとして使用するなら特に問題ないんじゃないかな 文字列自体をアレコレするにしても再度アスキーに変換すれば... たしかWindowsはそうやってるハズ
AからWに変換って、可逆変換なんだっけ? なんか必ずしも対応する漢字がないとかなかったっけ?
既存の関数でAを受け取る関数などもあるからねぇ。APIとか。 そのパラメータの加工用にA系の関数も必要ではあるよね。
VC++で簡単なゲームを作りたいんですが、 ウィンドウを作ったり画像を表示させたりするのに使うライブラリって、DirectXが一般的なんでしょうか?
よろしい まずは『一般的』の定義から語ろうか ↓頼んだ
DXライブラリとか まあ、簡単でいいならコンソールでおkだよ
そもそもdirectxはウィンドウ作ったりするのかと
>>809 DirectXを直接あつかうのはてめーにはどーせ無理だ
DXlibなりYaneSDKなりSDLなりつかっとけ
>>807 漢字セットとしてはA⊆Wじゃなかったっけ?詳しくないから断言できないけど;
オーバーライドの手間はWの片方ですむし、Windows依存でいいならAPIで済ませられるし
>>801 文字型の別に対応するだけなら宣言をヘッダ、定義とテンプレート強制実体化を
ソースに書く手もある
-- a.h --
template<typename Char> struct A { void f(const Char *); };
-- a.cpp --
template<typanme Char> void A<Char>::f(const Char *str) { ... }
template A<char>;
template A<wchar_t>;
訂正 template struct A<char>; // 特定の型でクラステンプレートを実体化 template struct A<wchar_t>;
クラステンプレートってバイナリにした後でオーバーライドってできたっけ?
ダメ文字フィルタクラスでも作って例外投げて対処求めれば済む そんな事気にする奴は自作関数の引数にC文字列を取ったりしないでしょ
>>818 でもそれは、IBM拡張文字とNEC選定IBM拡張文字などのように、
同じ文字がWindows-31Jで重複して割り当てられている場合ばかりのはず。
こういう例外はあるけど、基本的にはUnicodeの原規格分離の原則でラウンドトリップは保証されていると考えていい。
どうせNTのWinAPIもそうなんだし、自分も
>>806 方式に賛成。
というかそもそも〜A()と〜W()の両方のインタフェースを定義したところで 最後は最後に行き着く文字セット(+コード体系)に直すわけで 〜A()か〜W()のどちらかは実装しておいて、virtualなインタフェースは一つに絞るなりなんなりすべきなのでは
>>813 DXlibって、ソース公開してないわけ?
マジで?
わかりやすく 提供クラスの中身がMessageBoxを呼び出すものだったとして Aコード体系で直接MessageBoxを呼び出せば、MessaeBoxAが呼ばれて正しく表示される。 だが、提供クラスが「Aで受け取ったらWに変換し、W実装に処理を移譲する」だった場合、 Wへの変換+MessageBoxWとなり、うまく表示されないかもしれない。 ってことだよな?
AもWも両方virtualにしておいて、基本的にはWのみに処理を記述 AはWに処理を委譲し、不具合が出る場合はAにも処理を記述でよいのでは?
ゲームとか作るときのパラメータ.txtやらスクリプト.txtも、半角英数字が主流(?) まだまだAの需要はあるわけで難しいな
icuぶっこんで内部ではUCS-4使うようにして表示する段階でUTF-16LE(unicode)にするようにして 〜Wで表示すれば間違いはなくなる(キリッ
>>796 libを二つ作らないとダメだと思った理由がわからない
>>827 ごめん、確かにあったわ。
こりゃ解析つらいな。作者がメンテしやすいようにか、マクロ使いすぎw
Cでも使えるようにするために、クラス化もされていないようだし、ちとこれを初心者に薦めるのはダメだな…。
これ使っても、DXlib使いにはなれても、DirectX使いにはなれそうにない
>>829 でもDirectXの長い修行に耐えかねてゲームロジックを考える前に挫折するくらいなら
DXライブラリは悪くないと思うけどな
MessageBoxがWとAになるのは、マクロ使って実践してるけど、これが MessageBoxクラスのopenクラス関数だった場合、マクロってわけにはいかなくならね? #ifdef UNICODE #define open openW #else #define open openA #endif とかやったら、ものすごい幅広い範囲に影響でてしまいそうだよな。 だからといってせっかくMessageBoxクラスなのに、openMessageBoxとか書かせるのは馬鹿らしい
オーバーロードすればいいじゃん
もう何をどう考えて広い範囲だとか馬鹿らしいとかになってるのかわからんよ
>>833 みたいなのって、わざと理解しないようにしてんだよな
>>831 面倒だが、#undefすりゃいいんじゃね?
少なくとも広い範囲に影響が出るのは防げる
テンプレートで分岐する m.open<use_unicode>(); m.open<use_ascii>();
#undef じゃ解決しない問題だろ。 同じソース内でMessageBoxクラスとそれ以外の openをメンバに持つクラスを使う場合とか。 オーバーロードで open(char *) open(wchar_t *) 両方用意した方が大分マシ。
むしろMessageBoxクラスそのものをテンプレートにして インスタンス化時に使用する文字コードをタグ構造体で指定する
template<typename T>struct AnyString; template<typename T>MessageBox::open(AnyString<T>); だろふつう
タイプ量が増えるのでイヤです
>>838 std::basic_string<T>使えよ。
ライブラリをリンクしようとすると "未定義の識別子 _HUGE" というリンカエラーが出ます _HUGE 自体は math.h にあり、それをライブラリ内で使っているみたいなのですが、 これはどの lib ファイルをリンクすればいいのでしょうか??
環境を書くんだ
-lm とか
845 :
842 :2009/07/06(月) 10:59:20
すみません、 環境はvisual c++ で Luaを使ってます。Lua内部でHUGE_VAL をつかっていて、それが原因みたいです
ビルド条件違うんじゃない? 合わせてみては。特にランタイム
VC++のアプリで大量のデータを扱いたい場合 アプリにデータベースを埋め込むようなことがしたい場合はどうすればいいんでしょうか? データベースサーバーを作ってそれとやり取りするアプリしかむりなんでしょうか? データが6万以上あるのでエクセルの埋め込みじゃ無理なんです
xml(笑) 使ったことないけどprotocol bufferてのはどうだろ
まさにこれです。早速導入してみます。 速度が遅かったらgoogleの奴、難しそうですが試してみます。 ありがとうございます。
sqlとかってよくわからないんだけどクライアントもsqlインストールしなくても使えるの?
SQLiteは組み込みのDBMS それ単体で完結する。
SQLiteはぶっちゃけて言えば、あるファイルに対して SQLの文法を使って読み書きするファイルストリームというか、まぁそんなノリ。
CHttpConnectionのOpenRequestの第2引数って何をいれればいいんですか?
DELETE GET HEAD PUT POSTの対象を入れるらしいよ
HDCを描画クラスに渡すとき プロシージャでHDCをstaticで生成してDrawerのコンストラクタに渡すべきか void Draw(HDC& hdc)のように描画用関数に引数で渡すのはどちらが良いでしょうか?
>>856 前者の意味がわからない。ソースコードで語ってくれ
ウィンドウプロシージャ内にstaticなHDC置いておいて、Drawerオブジェクトにその間接参照を持たせて WM_PAINTでHDCの値を変更して、引数なしDrawを呼び出すってことじゃないの? 普通に引数で渡した方が後々拡張しやすいと思うし、俺ならそうする
げげ、そんな意味なのか。それなにかメリットあるのか
ああ、DrawerオブジェクトはHDCをprivateにしてDraw()だけ公開するってことか もうケースバイケースじゃね。ありがちな答だけど
短期間でプログラミング覚えないといけないんですが 何したらいいのか全然分からなくて困ってます何をしたらいいでしょうか 教本とかをやったら良いならお薦めのものを教えてもらえないでしょうか
862 :
デフォルトの名無しさん :2009/07/07(火) 14:28:41
HTMLをやればいい
なぜそんな状況になったのかkwsk
>>862 簡単なことしかできないですけどHTMLはできます
C++覚えたいからここで聞いたんです
よろしくお願いします
プログラミングは覚えるというより慣れるべきものだから、 とにかくたくさん書いて数をこなすのみ
>>863 プログラムバッチリできますって嘘ついちゃったんです
>>866 偽証罪、或いは詐欺罪で自白してくれば宜しいかと。
王道なし
>>869 職場によっては猫は全く役立たずだから、どういう経緯だったのかをkwsk。
>>871 えーと・・・仕事絡みじゃないんです、程度で言ってしまえば趣味の範囲の事になります
数名の人で集まってゲーム作る事になってそれで自分がプログラミング担当になったんです
>>868 の時点で言うべきだったかもしれないですね、すいません
趣味ですって言うと流されてしまうかと思いぼかして書きました・・・
業務とかじゃないなら、最良の解決法がある あやまっとけw 「仕様をよく検討したところ僕には無理でした」って
猫は古いからなあ
>>873 そうですね・・・とりあえず謝ってきます
ただどの道プログラミング担当は自分なんで覚えないといけないんですよ
なのでゲーム向け?のプログラミング勉強できる何かを教えてもらえないでしょうか
掲示板とかじゃなくて直接アドバイスもらえる人と密に連絡取るようにしないと難しそう。
RPGツクールとか使えばいいんじゃないかなw あれはたしかrubyっぽい言語でスクリプト書くんだよね
一度リアルで辛酸をなめた方がいいね
>>876 知り合いに一人できる人居るけど気難しい人だからなぁ・・・
>>877 読んでみます、ありがとうございます
環境はえーっとVC++2008EEですかね
>>878 RPGツクールですか
使った事ないのでちょっとどんなのか分からないので何とも
>>879 辛酸なめた方がいいと言われてもどうしろと・・・
とりあえずプログラマはタイピストじゃないことは認識しておけ。
882 :
デフォルトの名無しさん :2009/07/07(火) 17:46:08
Linux+GCC 4.2なのですが subversionで管理しているリビジョン番号を プログラムの出力結果に表示させる場合って どのようにすればいいのでしょうか?
>>882 リビジョン番号を実行時に問い合わせたいのか、ソース中に埋め込みたいのか、どっちなのかと。
いずれにしても、subversionスレで聞いた方が早そうだ。
884 :
デフォルトの名無しさん :2009/07/07(火) 18:37:23
辛酸が塩酸に見えた俺乙
>>882 char *rev = "$Rev$";
で置換されないかな
後はsprintfで数字のみ抜き出すとか
" "で囲んだら無理か
たぶん文字列内も置換される。 昔からのソースでは static char sccsid = "$Id$"; みたいなのをそこそこ見かける。 #ifndef lint で囲まれて足りもするが
889 :
デフォルトの名無しさん :2009/07/13(月) 18:13:35
GCC@UNIXを前提の質問です。 空白を含むテキストファイルを読み込んで 先頭の部分から順番に単語や数値を調べていくプログラムをつくろうと思っています 具体的には 2ch 1200 WD 55 ss 130 って書かれているファイルがあったときに 先頭から順番に調べて「2ch」が文字列で「1200」が数値とみなされるようにしたいなと考えております。 このような場合はどのように組めばいいのでしょうか?
単に scanf("%s %d", &moji, &inte); じゃだめなん?
バラバラなんだったらとりあえず取って、全部数字かどうか見ればよいと思うよ
初心者向けじゃないけど正規表現ライブラリ使う
>>889 そのテキストは
文字列 空白 数字 改行
というフォーマットに決まってる?
なら
>>890
894 :
デフォルトの名無しさん :2009/07/14(火) 10:53:28
Unicode文字セットで開発していると std::exception.what() や std::type_info.name() などの 戻り値が char で返却されるメソッドに遭遇するたびに その都度 mbstowcs_s で wchar_t に変換して使用してます しかし、mbstowcs_s で変換するときに 事前に文字列の長さを取得したり、変換先のバッファを用意したり なんか冗長だなぁと思えてしまいます そもそも上記のような標準ライブラリのクラスって、TCHAR版は無いのでしょうか? よろしくお願いします
>>894 _bstr_t、CComBSTR、W2A, A2W
>>894 標準にない関数や型の話をするときは、環境が何かも語りましょう。
>>894 一応書いておくけど、無いよ。
exceptionは独自の例外クラスを使うという抜け道はあるけど。
下記のプログラムをcygwin環境でコンパイルすると、 "error: invalid use of nonstatic data member 'Outer::m_outer_value" と表示されます。 このコンパイルエラーはどうやったら解決できるでしょうか。 また、インナークラスからアウタークラスのメンバにアクセスするにはどうしたらいいのでしょうか。 #include <stdio.h> class Outer { private: int m_outer_value; public: Outer() { m_outer_value = 10; } class Inner { public: Inner(); }; }; Outer::Inner::Inner() { printf("m_outer_value %d\n", m_outer_value); } int main(void) { Outer obj; return 0; }
Outerのインスタンスを渡せ。 C++では、クラスの中にクラスを書いても、スコープが内側に入るだけ。 OuterのインスタンスとInnerのインスタンスに何ら関係性が作られることはない。
実際のしつけとは異なって、子供は親の言うことに従ってればいいと思うよ。
Outerインスタンスが存在しなくても、Innerインスタンスが独立に存在することが許されてるから、 InnerにちゃんとOuterインスタンスがどこにあるか分からせる必要があるってこと
親の財布から金を抜くのではなく、もらった小遣いでやりくりしろってことですねわかります
…というか、継承の概念を知らないだけじゃないのか?
Java
>>904 俺もそう思った。単に派生クラスで基底クラスのメンバをいじりたいだけなんじゃないか
#include <stdio.h>
class Outer
{
protected:
int m_outer_value;
public:
Outer() { m_outer_value = 10; }
};
class Inner : public Outer
{
public:
Inner();
};
Inner::Inner()
{
printf("m_outer_value %d\n", m_outer_value);
}
int main(void)
{
Inner obj;
return 0;
}
レベル高けぇ・・・ どんな言語の流儀を基にそんな勘違いできるんだ?
継承を機能の拡張と捉えるなら、そんなに非直感的な勘違いでもないと思うが。
どれを指して勘違いといっているのかが分からないぐらいカオス
Javaならできるが、C++ではできない。
クラス間の意味合いを考えて、 A is a B ならAはBの派生関係 A has a B ならAの中にBのインスタンスを持たせる とよく言われますわな。 それにしても、包含されているクラスのインスタンスから包含しているほうのメンバを操作しようとか無茶すぎ。
912 :
デフォルトの名無しさん :2009/07/15(水) 12:20:09
かなり微妙な質問だと思うんですけどします。 クラスの宣言部分(h)と実装部分(cpp)を分ける意味がいまいち良くわからないのですが 例えば使いまわせるようなクラス郡をコンパイルしておけば、そのライブラリを利用する時は利用する側だけ コンパイルですむってことでしょうか? つまり、ライブラリのクライアント側、というか再利用できない部分は、あえて分けて書かなくてもいいって事でしょうか? それとも皆さん多少めんどくさくても全部分けたりしてます?
そのクラスを他のソースでも使う場合、事前にコンパイルするしないにかかわらず ヘッダにしないと不便だろう。
>>912 全部のソース (100万行とか?) をひとつの.cppファイルに書く
→ 見通しが悪い、メンテが大変、コンパイルに時間がかかる
→ じゃあソースを複数の.cppファイルに分けよう
→ 各.cppファイルは別々にコンパイルするから他ファイルの関数とかクラスを使えないよ
→ 他ファイルから参照できるように宣言とかだけ.hファイルに分けてインクルードしよう
という感じ
915 :
912 :2009/07/15(水) 13:21:59
>>913 >>914 レスありがとうございます。
一クラス一ファイルという原則は理解できます。
ただ、一つのクラスをhファイルに全ての実装も含めて書いてしまってもincludeは問題ないですよね?
つまり宣言と実装を二つのファイルに分けなくても全部hに書いてしまってもOKなんじゃないかと思ったのですが
なにか、勘違いしてますでしょうか?
あと、分割コンパイルの件ですが、確かにC++のコンパイルって時間かかりますよね。
例えばあるクラス、ClassAがあって、それはもうコンパイルしてるとします。
それをべつのクラスや関数で使用するとき例えば
#include "ClassA.h";
としますよね?で、既にコンパイルしてあるClassA.libをリンカが見つけられるようにしてやれば
ClassAはコンパイルしなくてもつかえますよね?つまり#include "ClassA.h";は名前の解決をするためにしてるって事でしょうか。
この場合もhファイルに全ての実装も書いてしまっても同じことにならないでしょうか?
実装の隠蔽とかコンパイル時間の短縮とか・・・ 大きなプロジェクトになるほど分割したほうが良くなってくる とくにコンパイル時間の短縮は大きな問題だよ たとえばfoo.hにclass fooの実装まで全部を書いて、それをインクルードするファイルが1000個あったら class fooは1000回コンパイルされることになる ここでfoo.hと実装を分離しておけばfooのコンパイルは1回のですむ 1時間のコンパイルが数分になるなんてことも普通にありえる
>>915 hに全部書いたらClassA.lib自体いらなくなる
そしてhをincludeしたそれぞれにClassA.libが内蔵されることになるから無駄にサイズも大きくなる
まてサイズは・・・
ひとつのソースファイルに全部書いた方がコンパイル時間は減るのでは
>>920 修正して再コンパイルする時にかかる時間が大差。
1回コンパイルして完成。その後は一切触らないっていうのがありえない。
「ひとつのソースファイルで…」とか「ひとつのヘッダーファイルで…」と言って しまえる人間がうらやましい。小さなソースで格闘できるんだなーと。
それは夏休みのある小学生はうらやましいなぁつってるようなもんだなぁ
うわー、実際、夏休みがほすいー
>>918 それぞれに内蔵(?)されたなら多重定義になりそうな気がしないか?
>>921 リビルドするならソースは一つの方が速いとおもうよ
必要なものだけコンパイル、リンクするために分割するわけだし(きっとそれが言いたかったんだろうと思いつつ補足)
プロジェクト全体でひとつのソースとか気がくるっとる
>>920 の意味がわからなくなってきた。
話の流れからヘッダに実装も書く事かと思ったが。
どっちにしても修正したコードの量に対して、再コンパイルがかかるコードの量が増えると思うんだけど違う?
完全ビルドするならディスクI/Oの分は早いかなw
ヘッダの修正はそれに依存してるソース全部再コンパイル ソースの修正はそのソースだけ再コンパイル
>>931 まんどくせ
最小限のエラーを再現するプログラムを書いてうpれ
たぶん、それをやったらバグ発見して自己解決すると思うが。
#include <iostream> #include <fstream> #include <cstdio> using namespace std; int main(void){ double a[5],b[5]; int i; for (i=1;i<=4;i++){ cout << " a[" << i <<"]=" ;cin >> a[i] ; cout << " b[" << i <<"]=" ;cin >> b[i] ; } ofstream abOut ("ab.dat"); for (i=1;i<=4;i++){ abOut << a[i] << " " << b[i] << endl; } FILE *fp = popen("gnuplot -persist", "w"); if (fp == NULL) return -1; fputs("set mouse\n", fp); //マウス有効化 fputs("set xrange [-10:10] \n", fp); fputs("set yrange [-10:10] \n", fp); fputs("plot 'ab.dat' \n", fp); fflush(fp); cin.get(); pclose(fp); return 0; } これでも1/3くらいでエラーがでます。不規則にエラーが出るので原因は分かりません。
Failed to receive messages at scim_bridge_client_read_and_dispatch () An IOException occurred at handle_message () *** glibc detected *** gnuplot: double free or corruption (fasttop): 0x091af000 *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6[0xb7748604] /lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb774a5b6] /usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_free_messenger+0x52)[0xb604d892] /usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_client_close_messenger+0x3b)[0xb604f92b] /usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_client_finalize+0x42)[0xb60521e2] /usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_client_gtk_finalize+0x41)[0xb6049441] /lib/tls/i686/cmov/libc.so.6(exit+0x89)[0xb7707bb9] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xed)[0xb76ef77d] gnuplot[0x8057e31] ======= Memory map: ======== 08048000-0816a000 r-xp 00000000 08:01 1384430 /usr/bin/gnuplot 0816a000-0816b000 r--p 00121000 08:01 1384430 /usr/bin/gnuplot 0816b000-0817c000 rw-p 00122000 08:01 1384430 /usr/bin/gnuplot 0817c000-08187000 rw-p 0817c000 00:00 0 090a7000-0920f000 rw-p 090a7000 00:00 0 [heap] b5a00000-b5a21000 rw-p b5a00000 00:00 0 b5a21000-b5b00000 ---p b5a21000 00:00 0 b5b2f000-b5b31000 r-xp 00000000 08:01 629791 /usr/lib/gconv/UTF-32.so b5b31000-b5b32000 r--p 00001000 08:01 629791 /usr/lib/gconv/UTF-32.so b5b32000-b5b33000 rw-p 00002000 08:01 629791 /usr/lib/gconv/UTF-32.so b5b33000-b5b36000 rw-s 00000000 00:09 5603366 /SYSV00000000 (deleted) b5b36000-b5c40000 rw-p b5b36000 00:00 0 b5c40000-b5ffc000 r--p 00000000 08:01 1645905 /usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf こんなエラー
インデントのないソースは見ないことになっている
そんなへそ曲がりな教授みたいな
ネットの見知らぬ人に見てもらうのにせめて体裁くらいは整えて置けよ
実はインデントされているという事実 情弱乙
>>938 知ってる
専ブラだとアンカー経由でみるとインデントは残ってるのもあるね。
まあ極力ソースは外部ロダにテキストで上げて見てもらうとかの方がいいよ
マルチ乙
普通に動きました こういうのであってもエラー出たりしますか? #include <iostream> #include <cstdio> using namespace std; int main(void){ FILE *fp = popen("ls", "w"); if (fp == NULL) return -1; pclose(fp); return 0; }
ttp://www1.axfc.net/uploader/He/so/234773 VC++2008 を使用しています。
PNG 画像を扱う時に _aligned_malloc でメモリ確保する方法を使ってみた所、
sample1.png の画像は読み書きに成功したのですが、sample2.png の画像は
「libpng error: Too many IDATs found」と出てうまくいきませんでした。
何かやり方が悪いのでしょうか、どなたかご教授下さい。
>>944 エラーメッセージにあるとおり、IDATタグが余計にあるからpng画像としては規約違反だとlibpngが宣っている。
別にあんたのやり方が悪いわけではなさそうだ。
>>933 abOut() をブロックで囲んでないのが気になる。
popen()とstdioがごっちゃになってるのも気になる。
少なくともpopen()前にcout.flush()すべき。
とはいっても件のエラーには関係無さそうだなぁ…。
>>933 >946の言うように、abOutがクローズされないままgnuplotを呼び出している希ガス。
ブロックで括るかしてデストラクションを強制させる方がよさそうだ。
>>945 なるほど、そういった類のエラーでしたか。
教えて下さりありがとうございました。
>>945 細かい突っ込みだけど、複数のIDATタグは違反でも何でもない。
>>944 のsample2.png見てみたけど、ぱっと見では違反してなさそうなんだけどなぁ。
sample1.pngにα追加してADAM7インターレース方式にしただけだよね?
libpngを覗いてみたが、どうも画像を読み込み終わった後に余計なIDATチャンクがあると出るエラーメッセージみたい。
もしかしたら出力したソフトに問題があるのかもしれないが、流石にそこまで確認する余裕はない。
何のソフトで出力したよ?
%dや%sという表記を見かけたことがあるのですが、これはどういう意味でしょうか "%d"を検索しようとしてもうまくかかりません
>>951 "printf" "フォーマット" あたりで検索すれ
>>949 sample2の方がオリジナルで、しかもネットで拾った物なので、
何のソフトで作られた物なのか判らないのです。
たまたま、この画像を使って実験をしたらエラーになったという案配でして…。
csvファイルを読み込むクラスをvectorで実装してみたのですが 17000行*7列のデータを読み込むのに57秒かかりました・・・遅いですよね 読み込む内容は数桁の数字のみです
>>956 フロッピーかデータテープからから読み込むとそのくらいかかるのか?
どこに問題があるの?
遅いのが気になるなら仮想的にファイルアクセスしてるような関数(クラスでもいいや) 用意して、そいつがファイル読み込みを担当するんだけど、csvの細かい部分読みじゃなく ファイル全体をメモリに読み込み(バイナリ扱い) で、関数(もしくはクラス)がメモリに上げたデータから切り出してあげる
まさかとは思うが、最適化してないなんて落ちじゃないだろうな。
>>958 今まではfgetsで1行ずつ読み込んでデータテーブルにセットしてたのですが
そうではなくてファイルを全部読み込んで、メモリからデータをセットした方が早いと言うことでしょうか?
そうするとファイルを読み込むのに必要な領域の量を求めないといけないのですが良い方法はあるのでしょうか?
>>959 ・・・orz
リリースビルドで実験したら1.8秒まで短縮しました
>>960 だから遅い早いは自分でしらべ()
一行 or 全部 だけじゃなくて 一部 とかもあるんじゃないか
>>960 ファイルIO系の関数でサイズは求めれると思うけど・・
×求めれる ○求められる
>>961 2万行弱で2秒って、それでも遅すぎない?
double n[7];
vector< vector<double> > table;
FILE *fp = fopen("hoge.csv", "r");
while (fscanf(fp,"%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6])==7) {
table.push_back(vector<double>(n, n+7));
}
うちだとこれで2万行×7データで0.1秒かからないけど
何をやったら遅いコードになるかという今後のためにも貼っておけw
>>968 数値がダブルクォートでくくられてるのか・・・
なんでそんな面倒なデータ仕様にしたのw
>>969 頂いたデータがそういう仕様だったからとしか・・・
あとは時々数字以外のデータも飛び込んでくるので
もうわけわかめ
vector は capasity を超えると再割り当て(要素の全コピー)が行われるのを忘れないようにしましょう。 つまり、巨大データを格納する場合は、あらかじめ予想サイズに reserve しておくことが必須です。^^ データサイズが予測できないなら、 ランスしないことを条件に list の方が有利なケースもおっぱいあります。
おっぱいなんですね
fseekとftellでファイルサイズを求めてその分メモリ上に領域確保するというのは解りましたが バイナリモードで読み込んで、ファイルの内容をメモリから切り出すとき 改行の検出は'\n'で良いのでしょうか?
ビルドの方法でそんなに時間が違うって、MSのCコンパイラは何やってんだよ こえー
>>975 当たり前だろデバッグに必要な余計なコードが入ってるか否かなのに
デバッグモードはほとんどインタプリタ状態だからね。
入れすぎってこと。 gcc -g で 1.8秒が57秒になるこたあないだろ
push_backやりまくるならdequeにしろよ〜
dequeよりvectorのほうが全体的に動作が速かったはずだが 先頭要素にpushすることが無い限りvector1択じゃないか?
>>982 VC++のまぬある
Vectors allow constant time insertions and deletions at the end of the sequence.
Inserting or deleting elements in the middle of a vector requires linear time.
The performance of the deque Class container is superior with respect to
insertions and deletions at the beginning and end of a sequence.
ケツに挿入する時もdequeの方が優勢と書いてアッー
メモリ配置の連続を保障しないといけないから、vectorの場合確保してる領域が尽きたらreallocするけどdequeなら分断しててもいいのでreallocせずに追加できる。
vectorが2万要素も途中でメモリ確保しなおさずにpush_backできると思えん。
とりあえずプロファイラにかけてみるのはどーよ。
それだけで答えが見えることも多い。
>>983 まぬある文は正しいと思うけど、
分断の話はほんとかい?
分断されるとlistみたいにランダムアクセスが定数時間でできなくなっちゃうけど。
dequeの定数時って、「ならし定数時間」および ”amortized constant time” という表現の ほうがより正確らしい。
ランダムアクセスして中間にある要素を削除しまくるようなことをする場合はvectorのほうが早いが それ以外なら大きな差はでないらしい それよりもpush_backしまくるのをどうにかしたほうが高速化に寄与しそうだが
vector<vector<> > は、内部配列を拡張するときのコピーコンストラクタの ペナルティが大きすぎるだろ。
どっかにコンテナの破棄以外はほとんどdequeの方が高速、または誤差程度の差 というベンチ結果があった気がする
速度が重要なら必要な機能だけ実装した速度特化の似非vector自分で書けばいい
>985 償却定数時間って表現もするね。 でもそういう意味なら vector の push_back だって amortized constant time だよ?
a1からh8なら縦横の位置を出して qが入ると終了する。どうするの?
他人のソースを早く読めるようになりたいんですけどどうすればいいですか
業界を改革してスパゲティ職人を排除するといいよ
自転車に早く乗れるようになりたいんだけど、どうすればいいですか?
難易度が5段階あるとして、難易度3以上のソースには手を出さない
鍵をはずして跨ぐだけだから、早くしようが無いよ 思い切って鍵をつけないことにすれば早くなるけど安全じゃないね
紙面の大きい落書きノートにソース見ててピンと来た流れや項目を都度殴り書きしとく
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。