【初心者歓迎】C/C++室 Ver.66【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/05/28(木) 01:08:48ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.65【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1239326399/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2009/05/28(木) 02:13:44TAB→ の置き換えを
お勧めする。
0003デフォルトの名無しさん
2009/05/28(木) 11:41:07浮動小数点型として、別の型を定義して使っています。
typdef float float_t;
これは、後でdoubleにしても対応できるようにする為です。
しかし、実際にdoubleに変えると、コンパイルが通らないことがわかりました。
std::pow( f, 2.0f );
このように、実数定数をf付きで書いている為、オーバーロードが解決出来ない為です。
しかし、2.0fを2.0に変えると、逆のケースでコンパイルが通らなくなります。
何かよい解決法はありませんか?
0004デフォルトの名無しさん
2009/05/28(木) 11:44:520005デフォルトの名無しさん
2009/05/28(木) 11:47:25そいつを渡したらだめ?
0006デフォルトの名無しさん
2009/05/28(木) 11:48:18自前の関数とは、
自前のpowを作るということですか?
それとも、2.0fをfloat_t(2.0f)とすることでしょうか?
前者は、組み合わせを網羅するとなると、結構厳しいです。
後者も、既に書いてしまったコードが大量にあるので
これも厳しいです。
0007デフォルトの名無しさん
2009/05/28(木) 12:17:44テンプレートでやっちゃうのもいいんじゃない?
0008デフォルトの名無しさん
2009/05/28(木) 12:34:19すみません、ちょっと意図が伝わりません。
数個とは、何が数個になりますか?
例えば、pow()にしても
pow(float,float);
pow(float,double);
pow(double,float);
pow(double,double);
の4つ必要になります。
そして、こういった関数は
引数を2つ以上とるもの全てだから
無数にあります。
さらに、実際はfloatとdoubleだけではなく
halfとlong doubleも含まれます。
この方法は現実的ではないように思えます。
それとも、複数の引数を、それぞれのサイズから最大サイズの型を作って
再代入するようなテンプレートをかます・・?
なるほど、これはいけそうな気がします。
最善策としては、今は大変ですけど
今後の為にも、定数はマクロなりで括るってのがいいでしょうか?
F(2.0f)みたいに。
0009デフォルトの名無しさん
2009/05/28(木) 12:37:000010デフォルトの名無しさん
2009/05/28(木) 16:21:00はい。今回の問題は、実数定数とfloat_tの組み合わせに
対するオーバーロードが解決できない為に起こっています。
なぜ型がアンマッチするか、それは実数定数がfloat_t型でない為です。
ゆえに、解決手段として正しいものは、実数定数をfloat_t型で書くことになります。
しかし、実数型は小さい型から大きい型にキャストしても
情報が欠損しないことは明らかです。
だったら、オーバーロードの候補が複数あった場合、
小さい型を大きくする方向でマッチングして、
最小の変更で済むものにするというルールでいいはずです。
そのルールが適用出来れば、ソースの改修を最小限に留め
問題を解決出来ます。
そういった方法がないか、確認した次第です。
実際ないですよね、F(2.0f)のマクロにします。
ありがとうございました。
0011デフォルトの名無しさん
2009/05/28(木) 17:40:11が早いしエラーでない。
0012デフォルトの名無しさん
2009/05/28(木) 17:46:360013デフォルトの名無しさん
2009/05/28(木) 19:13:45一部だけ消す方法はありませんか?
例えば最新の1行だけとか。。。
よろしくお願いします。
0014デフォルトの名無しさん
2009/05/28(木) 20:15:57それって何ですか?
さっぱりわかりません。
0015デフォルトの名無しさん
2009/05/28(木) 21:10:58boost::scoped_ptr<hoge> phoge = new hoge();
は駄目で、
boost::scoped_ptr<hoge> phoge(new hoge());
はいいのでしょうか。両方とも普通にコンストラクタが呼ばれるだけじゃないかと思ったのですが。
hoge* h0(new hoge());
hoge* h1 = new hoge();
は両方とも通るし。
0016デフォルトの名無しさん
2009/05/28(木) 21:40:28暗黙の変換を避けるため、コンストラクタが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());とすればコンパイルできるが、だめぜったい。
0017デフォルトの名無しさん
2009/05/28(木) 22:42:430018デフォルトの名無しさん
2009/05/28(木) 23:01:590019デフォルトの名無しさん
2009/05/28(木) 23:12:16すげえこんな便利なのがあったのか
0020デフォルトの名無しさん
2009/05/28(木) 23:17:560021デフォルトの名無しさん
2009/05/28(木) 23:18:490022デフォルトの名無しさん
2009/05/28(木) 23:53:30phogeはboost::scoped_ptr<hoge>型、new hoge()はhoge*型。
別の型のため、
> hoge* h1 = new hoge();
これとは比べられない。
暗黙の型変換で、型変換してコンストラクタを呼ぶ仕組みがC++にはあるが>>16の通り。
>>17
void*はポインタの先にアクセスする時に、元の型に型変換する事になるが型を間違えないように注意。
0023デフォルトの名無しさん
2009/05/29(金) 07:51:31はずではないでしょうか?constでない参照に一時オブジェクトを渡してもよいので
しょうか?
class A{
public:
void method()const{}
};
void test(A& a){a.method();}
int main(){
test(A());
return 0;
}
0024デフォルトの名無しさん
2009/05/29(金) 17:39:39A.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内部変る呼び出しだぜ と判断するからコンパイルエラー
0025デフォルトの名無しさん
2009/05/29(金) 18:00:45test(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 を使おうとするから
0026デフォルトの名無しさん
2009/05/29(金) 21:07:19そう。それはコンパイルエラーになるのが正しい。
Visual C++の独自拡張でコンパイルが通ってしまうだけ。
/W4で警告になる。あるいは、/Za(独自拡張なし)でエラーになる。
/Zaが嫌なら/we2664を使えばこれだけエラーにすることも可能。
0027デフォルトの名無しさん
2009/05/29(金) 22:08:03class 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
と表示されてほしいのですが、なぜこうなってしまうのでしょうか?
0028デフォルトの名無しさん
2009/05/29(金) 22:19:04test t(100.0, 0.0);と書くんだ。
test t = (100.0, 0.0);だと、まず(100.0, 0.0)が順次演算子を使った式として評価されて、test t = test(0.0);と同じ意味になる。
0029デフォルトの名無しさん
2009/05/29(金) 22:23:00まず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);」と書け
0030デフォルトの名無しさん
2009/05/29(金) 22:27:41なるほど、分かりました。実は
test t = (100.0, 0.0, 99999);
と書いたら
99999 0
と表示されたので、クラスの中身を破壊でもしてるのかと思ってました。
最後に右側が評価されるので、
test t = 99999
と評価され、コンストラクタにデフォルト値を設定してたのでコンパイルも
通ってたみたいです。
言われたとおりに初期化を書き換えました。
ありがとうございます。
0031デフォルトの名無しさん
2009/05/30(土) 02:03:470 0 0 0 0
デバッグ
0 0 0 0 1
デバッグ
1 0 0 0 1
といった様に配列に追加書き込みをする方法を教えていただけませんでしょうか?
0032デフォルトの名無しさん
2009/05/30(土) 03:26:20構造体のlistを渡すのとmapを利用するのはどっちが無難でしょうか?
0033デフォルトの名無しさん
2009/05/30(土) 03:37:51map の方が楽
0034デフォルトの名無しさん
2009/05/30(土) 04:56:140035デフォルトの名無しさん
2009/05/30(土) 05:07:280036デフォルトの名無しさん
2009/05/30(土) 08:09:11しっかりと設計してから開発の流れにもっていきたいんだけど、
デザインパターンとかUML学べばおk?
ためになる資格とかお薦めの参考書あれば教えてくほしい
0037デフォルトの名無しさん
2009/05/30(土) 10:09:35int hoge;
...
};
class Hoge {
Hoge():hoge(0){}
public:
int hoge;
...
};
上みたいにclassにメンバ関数加えても、継承や仮想関数を使わない限り同じメモリ配列になるのは決まってるんでしょうか
それとも、そう思い込んではいけませんか
0038デフォルトの名無しさん
2009/05/30(土) 10:24:330039デフォルトの名無しさん
2009/05/30(土) 11:43:010040デフォルトの名無しさん
2009/05/30(土) 13:11:02何か間違ってる可能性は否定しない
0041デフォルトの名無しさん
2009/05/30(土) 13:18:00なるほどね
0042デフォルトの名無しさん
2009/05/30(土) 13:57:13004338
2009/05/30(土) 14:15:34普通のポインタはdelete p;で済ませますよね?
で、配列もやっぱり同じことができるのかな、と。
"delete[]"で検索してみても、[]はキーワードにならないみたいで、マッチしたページが出てこないのでここで質問してみました。
0044デフォルトの名無しさん
2009/05/30(土) 14:48:28うん,ナンセンス。
NULLをdelete[]しても何も起こりませんからご安心ください!!!
0045デフォルトの名無しさん
2009/05/30(土) 14:54:16行田市でタヌキの赤ちゃんが見つかったニュースですね
0046デフォルトの名無しさん
2009/05/30(土) 16:22:53コメントはヘッダのどこに書けば表示されるのでしょうか。
それともなにか設定があるのでしょうか?
0047デフォルトの名無しさん
2009/05/30(土) 17:27:01コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子以外なら大丈夫
これらを一つでも作った場合は規格上は保証されない
0048デフォルトの名無しさん
2009/05/30(土) 19:39:16そんなのやる時間があったら、なにかソフトを1つ自分で書いてみろ。
0049デフォルトの名無しさん
2009/05/30(土) 21:32:16は?w
0050デフォルトの名無しさん
2009/05/31(日) 12:34:34std::vector<T> vec;
T tmp = vec.back();
vec.pop_back();
という感じで、二段階でやるしかないでしょうか?
0051デフォルトの名無しさん
2009/05/31(日) 13:57:17以下のようなメンバ関数があったとします。
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までは内容的には同じ値が入ると思うのですが、
内部的な処理はそれぞれどのようになされているのでしょうか?
構造体などを使うときはなるべく参照かポインタを引数にしたほうがよい
と聞いたのですが、参照の使い方がまだ今ひとつ理解できていません。
どのような場合に参照渡しをしたほうがよいのでしょうか?
0052デフォルトの名無しさん
2009/05/31(日) 14:49:15参照渡しと言えば普通は引数についての議論だけど、
1〜6は戻り値の受け取り方だろ。噛み合ってない。
まあ、戻り値について言えば、3〜6は参照先の実体が失われるような受け取り方なので、
危険であり、ありえない。
内部的な処理で言えば、参照はポインタと同じで、どこかにある実体を指しているだけ。
実体は他でちゃんと保持されなければならない。
0053デフォルトの名無しさん
2009/05/31(日) 14:51:16例外安全のために二段階に分けられている。
そのやり方しかない。
0054デフォルトの名無しさん
2009/05/31(日) 15:28:12ごめんなさい、参照での戻り値についての質問でした。
3〜6は参照先の実体が失われるとのことですが、
具体的にはどのようなケースで危険が発生するのでしょうか
SStruct& sTestStruct = GetReturnStruct(); は
1.GetReturnStruct()で返り値の変数が作られる
2.それを参照する。
SStruct sTest1Struct = GetReturnStruct();は
1.GetReturnStruct()で返り値の変数が作られる
2.宣言SStruct sTest1Structで変数が作られる
3.返り値の変数をsTest1Structに代入
と思っていたため、変数が作られるのが一つ少ない分
SStruct& sTestStruct = GetReturnStruct();
の方が良いと思っていたのですが・・・
0055デフォルトの名無しさん
2009/05/31(日) 16:15:17> SStruct& sTestStruct = GetReturnStruct(); は
> 1.GetReturnStruct()で返り値の変数が作られる
> 2.それを参照する。
つづきは
3. 1で作った返り値の変数が破棄される。(参照は破棄済みのデータを指すことになり、使えない)
> SStruct sTest1Struct = GetReturnStruct();は
> 1.GetReturnStruct()で返り値の変数が作られる
> 2.宣言SStruct sTest1Structで変数が作られる
> 3.返り値の変数をsTest1Structに代入
つづきは
4. 1で作った返り値の変数が破棄される。(コピー済みのsTest1Structは残るので、使える)
0056デフォルトの名無しさん
2009/05/31(日) 16:32:15Thanks
ですが、
SStruct& sTestStruct = GetReturnStruct();
では、その後も普通に取得した値の参照が使えてしまいます・・
なぜこのような事態が発生するのかわかりますでしょうか?
0057デフォルトの名無しさん
2009/05/31(日) 16:58:56ごめん、私の勉強不足のために嘘を教えてしまった。
ttp://www.sun-inet.or.jp/~yaneurao/intensive/cppmaniax/chap0001.html
にあるように、const参照は一時オブジェクトを束縛するということなので、5と6はOK。
3が通るのは、そのコンパイラが一時オブジェクトを破棄するタイミングを
たまたま遅らせているだけと考えられるので、
環境を変えたときに安全は保証されないと思う。
0058デフォルトの名無しさん
2009/05/31(日) 17:28:49ということで了解しました。回答ありがとうございます。
ところで、クラスのメンバ関数の作り方で再び質問で、
以下のようなクラスがあるとします。
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の方を使っております。
0059デフォルトの名無しさん
2009/05/31(日) 17:30:10struct SList
{
SStraightCardList();
~SStraightCardList();
E_TYPE eType;
INT32 anArray[3];
};
このとき、以下のような初期化をしようとすると
static const SList SLIST_DEFAULT = {
eN_DEFTYPE, 1, 2, 3
};
error C2552: 初期化子リストによる個別の識別子の初期化に誤りがあります。
ユーザー定義のコンストラクタを含む型はアグリゲートではありません。
とのエラーメッセージで構造体の初期化がうまくいきません・・・
構造体ではデフォルトコンストラクタを自分で定義してしまったら
初期化 = {..., ..., ...}; の書き方は使えないということなのでしょうか?
0060デフォルトの名無しさん
2009/05/31(日) 17:30:26pch.hファイルに使用する全てのヘッダーファイルのincludeを書いて、
他のcppファイルはpch.hのみincludeするというのが正しい使い方なんでしょうか
0061デフォルトの名無しさん
2009/05/31(日) 17:32:40SStraightCardList()→SList()です。 よろしくお願いします
0062デフォルトの名無しさん
2009/05/31(日) 18:09:52今は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する。
0063デフォルトの名無しさん
2009/05/31(日) 19:03:18int* p_data;
p_data = &(data_1[0][0]);
として、
p_data[50][70];
などとしてデータを取り出したいのですが、うまくいきません。
*(p_data + 50*200 + 70)とすれば取り出せることは分かったのですが、
2次元配列形式でデータを取り出すのは不可能なのでしょうかデータのコピーはしたくありません
0064デフォルトの名無しさん
2009/05/31(日) 19:06:10もしくは
int* p_data[100][200];
0065デフォルトの名無しさん
2009/05/31(日) 19:13:56と記述するとコンパイルエラーになります。
あと、p_dataの参照先はdata_1だけでなく、
条件によってサイズの異なる別の配列を参照する場合があるので、
サイズを固定することはできないです。
0066デフォルトの名無しさん
2009/05/31(日) 19:14:43じゃなくて p_data = data_1;
0067デフォルトの名無しさん
2009/05/31(日) 19:16:01サイズが違うなら多次元配列を1次元配列とみなして
*(p_data + 50*200 + 70)
のような感じでアクセスするしかないんじゃない?
0068デフォルトの名無しさん
2009/05/31(日) 20:52:22data200 p_data = data_1[50];
return p_data[70];
0069デフォルトの名無しさん
2009/05/31(日) 20:54:47それだと前の配列しか可変になってねえ?
0070デフォルトの名無しさん
2009/05/31(日) 23:21:53ポインタの配列を使えば可
でも、受け取った関数側でサイズを知る方法が無いから
追加の引数でサイズを渡すとか構造体にまとめてから渡すとかしないとダメぽ
struct tag_matrix_t
{
int width, height;
int **data;
};
みたいに
0071デフォルトの名無しさん
2009/06/01(月) 11:30:21std::deque<T> deq;
があるとき、中の要素を適当に並べ替える関数を定義したいのですが、オーバーロードを使って、
mysort(std::vector<T> &v);
mysort(std::deque<T> &d);
とやっていたのですが、イテレータ引数の関数を定義して1つにまとめてしまいたいです。
どうやればいいですか?
テンプレートを使って書くのは、結局自分ではイテレータを定義してないというか、
dequeやvectorのテンプレート機能を呼び出しているだけという感じがするのですが。
0072デフォルトの名無しさん
2009/06/01(月) 12:18:40メモリに一気に格納してソートか、一つずつソートする違いです。
0073デフォルトの名無しさん
2009/06/01(月) 12:21:20テストソース書いて実測してみればいいよ。
ファイルの置き場所によって変わる可能性もあるだろうけど
メモリに一回あげたほうが早いと思う
0074デフォルトの名無しさん
2009/06/01(月) 12:23:51実測してみます
0075デフォルトの名無しさん
2009/06/01(月) 13:20:15教えて
xがー2の時yが3.02
−1の時0.98
0の時1.22
1の時2.16
2の時2.61 の時のです
出来ればソース全文書いてください
0076デフォルトの名無しさん
2009/06/01(月) 13:23:040077デフォルトの名無しさん
2009/06/01(月) 14:33:33std::cout << "" << std::endl;
とかで出力を出しているのですが、それをテキストファイルに書き込みたいのですが、
プログラム内でファイルを開いてそこに書き込んで、、、渡河やらないと駄目でしょうか?
0078デフォルトの名無しさん
2009/06/01(月) 14:38:390079デフォルトの名無しさん
2009/06/01(月) 15:54:04例えばCのqsort()関数のように、中身を直接弄らなくても、
ユーザが処理の一部を書けるようにする……という手法がありますよね。
とあるフレームワーク(ライブラリ群)を作成するにあたり、
エントリポイント(main関数)を隠蔽した状態で、一部の処理をユーザに記述させるにはどうやるのがスマートでしょうか?
現在こちらが想定しているイメージとしては、フレームワーク開発側が以下のようなコードを書いておき、
その中の setting.init() をユーザに用意してもらう……といった感じです。
int main ( 〜 )
{
Setting setting; //適当なシングルトンクラス
setting.init ( ); //ユーザが記述する初期化処理
/*メイン処理*/
return 0;
}
Setting::init()は、中身が空っぽでも大丈夫とします。
その際、もし可能であれば、わざわざユーザがinit()部分を書かなくても良いようにしたいなあと考えています。
Settingクラスには、init()以外のメンバ関数があり、それらはユーザがタッチしなくてもよい部分です。
そのため、それらはフレームワークの中に隠蔽しなければなりません。
ですが、そのままやると、1つのクラスがフレームワークの内外に散ってしまうので、なんとなく気持ち悪いです。
継承や関数ポインタも考えましたが、main()内を弄らずに指定する方法が分かりません。
また、DLLを用意して読み込む方法はナシとします。
0080デフォルトの名無しさん
2009/06/01(月) 19:33:03基本情報の午後にむけて勉強したいもんで
0081デフォルトの名無しさん
2009/06/01(月) 19:54:20ボタンのクリックイベントで詰まりました。
ウィンドウプロシージャ内で、
マウスの左ボタンクリックのイベントを拾いたいのですが、
WM_LBUTTONDOWN、WM_LBUTTONUP や
ダブルクリックの WM_LBUTTONDBLCLK はあるものの、
シングルクリック(マウスを押して離す)の定義が見つかりませんでした。
WM_COMMAND だと親コントロール依存になってしまうので避けたいです。
.NETクラスライブラリの Control.WndProc を覗いてみると、
WM_LBUTTONDOWN の際に、押された事を示すフラグを内部的に立て、
フラグが立っている状態(そのコントロール外でマウスボタンを離さない)で、
WM_LBUTTONUP が来たら クリックイベント発動。
という、けっこう面倒な処理をしていました。
どうしようもなければ、.NETと同じようなコードにしようと思うのですが、
もっと簡単な実装などありますでしょうか?
よろしくお願い致します。
0082デフォルトの名無しさん
2009/06/01(月) 20:30:23多分無い
ボタンに対して マウスLB押下
そのまま ドラッグしていって ボタンの範囲外に抜けた後に
マウスLB開放
した場合とかを考え出すとね…
0083デフォルトの名無しさん
2009/06/01(月) 20:48:19巨大なファイルのシーケンシャルリードするとメモリ解放しないままで
次々に読むから不安定になるな。
008483
2009/06/01(月) 20:51:35あとは開放しているもんだと思っていた。
しかしためられるだけためてた。
0085デフォルトの名無しさん
2009/06/01(月) 21:07:33ありがとうございます。やっぱ厳しそうですね。。。
.NETのクラスライブラリを参考に作ることにします。
0086デフォルトの名無しさん
2009/06/01(月) 21:13:30もしよかったら、どういうシチュエーションで便利に使ってたか教えてよ。
008783
2009/06/01(月) 21:28:40ケースによっては、自前でバッファを管理して入出力するより高速に動く。
OSやディスクのキャッシュが適切に効いた場合、入出力バッファ処理を気にする必要がなくなる。
0088デフォルトの名無しさん
2009/06/01(月) 21:45:44template<typename RandomAccessIterator>
void mysort(RandomAccessIterator first, RandomAccessIterator last);
の何が不満なの?
他人が書いた Iterator を使って望みの事ができるならわざわざ自分で書く必要ないだろ?
そもそもコンテナ用の Iterator 書くならコンテナの実装を知ってる方がいいわけで、
その意味でも自分で書く必要がない。
>84
物理メモリ上に載ったままって話?
0089デフォルトの名無しさん
2009/06/01(月) 21:49:42あとは仮想メモリに入っているよう。この仮想メモリはOSのものとは別物の気がする。
メモリマップドファイルすると、した分は仮想メモリとしてOSは認識しているようにおもう。
0090デフォルトの名無しさん
2009/06/01(月) 21:53:09OSは大事なファイルと認識しメモリに蓄えておこうとするのだと思う。
もっとも最近に参照されたファイルが優先されて、そのファイルだけが残ると思う。
0091デフォルトの名無しさん
2009/06/01(月) 21:57:14OSじゃなくメモリマップドファイルを実現してるクラスとかがメモリを確保してるだけでしょ
windowsだと確か設定を変えなければ一つのアプリが最大使えるメモリって
2GBだっけ?
そのくらい物理メモリ詰んでなければそりゃ使い続ければいずれ物理メモリを超えるので
スワップ発生するだろうし
0092デフォルトの名無しさん
2009/06/01(月) 22:21:16まったくメモリにキャッシュしないようにするオプションはあるけど。
OSの制御にあって、使用中は全く手出しできない。
0093デフォルトの名無しさん
2009/06/01(月) 22:44:39クラスの中のメンバクラスに関する質問です。
----------------------------
class ClassA{
ClassA( int a, int b ) { }; //コンストラクタ
^ClassA( void ) { }; //デストラクタ
};
----------------------------
上記のように引数付きのコンストラクタを持つクラスがあるとき
----------------------------
class ClassB{
private:
ClassA mClassA( 1, 2 );
};
----------------------------
といった形で、メンバクラスを宣言しようとすると、
「error C2059: 構文エラー : '定数'」
といったエラーが出てきてしまいます。
引数付きのコンストラクタがあるクラスをメンバとして持つには、
どのようにすればよいのでしょうか?
0094デフォルトの名無しさん
2009/06/01(月) 22:47:20そういう作りなのか
まあ気に入らなければ自分で作ればいいだけだしな。
0095デフォルトの名無しさん
2009/06/01(月) 22:53:25class ClassB {
ClassA mClassA;
ClassB() : mClassA( 1, 2 ) {}
};
classB のコンストラクタで メンバの初期化
0096デフォルトの名無しさん
2009/06/01(月) 23:24:420097デフォルトの名無しさん
2009/06/01(月) 23:24:43Settingクラス(フレームワーク提供)を継承したクラスをユーザが定義し、
そのファクトリ関数もユーザが定義するようにすればできない?
Setting::init()は空の仮想関数。
ファクトリ関数はグローバルで、関数名とプロトタイプはフレームワーク仕様により規定。
0098デフォルトの名無しさん
2009/06/01(月) 23:42:28使う言語はC++なのですが(Win32APIは出来る限り使ってません)、
WindowsのAPI使った方がいいのか、わざわざboost::gil使う意味あるのか。
009979
2009/06/01(月) 23:42:39ありがとう。
ファクトリ関数が何なのか調べるところから始めてみる。
……要は、継承先のクラスを指定する部分だけを
フレームワークの外に出してしまえばいいんじゃね?ってこと?
0100デフォルトの名無しさん
2009/06/01(月) 23:44:49ありがとうございます!
動きました・・・・が、見たこと無い形なので、なぜ動いたかが分からない・・・。
「コンストラクタ初期化子」というのがあるそうですね。
そういうものだと割り切って覚えるのが早いでしょうか。
0101デフォルトの名無しさん
2009/06/02(火) 00:02:16知らなかったならちゃんと勉強し直した方がいい
0102デフォルトの名無しさん
2009/06/02(火) 00:07:250103デフォルトの名無しさん
2009/06/02(火) 00:10:43初期値を指定するのって、地味にめんどい
0104砂ぐま
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を計算するプログラムを作成しなさい。
�C�Bのプログラムを実行した結果はいくらになるか?
�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
で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。
0105デフォルトの名無しさん
2009/06/02(火) 00:29:27まだまだ勉強中の身なのです。
>>102
なるほど! 確かにconst指定したメンバが
コンストラクタで初期化できないから、
どうするんだ?、と悩んでたことがありました。
>>103
そうですね。自分も30個くらいメンバが必要なので
同じことを考えていました。
0106デフォルトの名無しさん
2009/06/02(火) 00:45:58具体的に何が分からないのか答えなさい。(5点)
0107砂ぐま
2009/06/02(火) 01:20:43解答をお願いします。
0108デフォルトの名無しさん
2009/06/02(火) 01:24:20宿題スレへ行くほうがいい。
0109デフォルトの名無しさん
2009/06/02(火) 02:12:17宿題スレとマルチしてるんだけどな
0110デフォルトの名無しさん
2009/06/02(火) 03:57:020111デフォルトの名無しさん
2009/06/02(火) 04:06:56こっちは?
http://pc12.2ch.net/test/read.cgi/tech/1232367742/
0112デフォルトの名無しさん
2009/06/02(火) 05:41:26float* pf = (float*) &i
pf = pf * 2
このコーディング、どこだダメなんでしょうか
0113デフォルトの名無しさん
2009/06/02(火) 05:47:46intとfloatの内部表現が一致している保証はどこにもないから
それとポインタに対する演算はアドレスを取る事と定数を足す引く
しか認められていないからポインタを2倍するとか全く無意味
0114デフォルトの名無しさん
2009/06/02(火) 05:53:16内部表現が一致するとは、具体的にどういうことでしょうか?
これであればアドレスの中身(100?)を2倍することになるのでしょうか
*pf = *pf * 2
0115デフォルトの名無しさん
2009/06/02(火) 05:57:52内部表現が一致するとはiと*pfの値が等しい時に常にiと*pfのビット列
が等しい事が保証されている事を意味する
しかし実際には大部分の計算機では浮動小数点はIEEE754、整数は
2の補数表現を取っている事が大部分で内部表現にお互いの互換性
はない
>*pf = *pf * 2;
*pfが元々floatの変数のアドレスを取っている時はその通り
今のように元々intの変数のアドレスを取ってそれを2倍したら浮動小数点例外
が起きるかもしれない
0116デフォルトの名無しさん
2009/06/02(火) 06:36:32で一番いいのはなんでしょうか?
0117デフォルトの名無しさん
2009/06/02(火) 06:43:49(世界各国で通用するのは)モジラかIEくらいしかしりません。
エディタの作者は自分で作っているんですか?
0118デフォルトの名無しさん
2009/06/02(火) 07:06:570119デフォルトの名無しさん
2009/06/02(火) 09:59:01ちょっと文字コード調べればわかると思うけど、
それぞれの文字コードで仮定して矛盾が生じたら違うと判断すればいいんだよ。
どこまで調べるか、どうやって調べるかはそのアプリの性質で決めたらいい。
判定不能な場合どうするかもね
0120デフォルトの名無しさん
2009/06/02(火) 10:07:44これはエディタの本体(GUI)を作るほど手間がかかりそうです。
世界各国語に対応させる場合。
0121デフォルトの名無しさん
2009/06/02(火) 10:11:05文字コード扱うプログラマとしては常識の範囲ですが・・・
テキストごときでwwwとかいうゆとり多いけどテキストほど面倒な物は無い。
文字コードを限定すればなんとかなるけど
0122デフォルトの名無しさん
2009/06/02(火) 10:17:180123デフォルトの名無しさん
2009/06/02(火) 11:24:03ユーザに選択させればいいだけ
ブラウザはhttpヘッダのcharsetで判定してるだけだろ
0124デフォルトの名無しさん
2009/06/02(火) 12:53:000125デフォルトの名無しさん
2009/06/02(火) 13:12:490126デフォルトの名無しさん
2009/06/02(火) 13:29:39CharsetDetectorっていう判別専用のクラスもある
世界中の業務用アプリで使われている実績もあるしライセンスも緩くて使い勝手もいい
問題は添付するdll(so)が糞大きいことだけ
0127デフォルトの名無しさん
2009/06/02(火) 13:43:370128デフォルトの名無しさん
2009/06/02(火) 16:55:470129デフォルトの名無しさん
2009/06/02(火) 16:59:460130デフォルトの名無しさん
2009/06/02(火) 17:03:220131デフォルトの名無しさん
2009/06/02(火) 20:50:15CLSはクラスで、int charなどの変数で構成されます。
CLSの変数と同じ順番で記録されているファイルがあり
これを vector< CLS > x; にロードしたいのですが
Read( &x[0] ) のようにしてもうまくいきません。
データが壊れています。 一括でロードする方法はありませんか?
0132デフォルトの名無しさん
2009/06/02(火) 20:54:22順番が同じでも、アラインメントが入ってどうせファイル上のデータの並びと同じではないだろう。
0133131
2009/06/02(火) 20:54:25それをvectorにコピーしたらいいでしょうか? 無駄なことをしている気がしますが。
0134131
2009/06/02(火) 20:56:51一度にロードして、vectorに正しく挿入することにします。
0135デフォルトの名無しさん
2009/06/02(火) 21:01:250136デフォルトの名無しさん
2009/06/02(火) 23:01:34この変数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 ); でないとエラーが出そうなのに・・。
むしろ後者は前者とどういう処理の違いがあるのか気になります。
0137デフォルトの名無しさん
2009/06/02(火) 23:06:04参照≠ポインタ
0138デフォルトの名無しさん
2009/06/03(水) 00:50:33大体何ターンくらいで終わるのか調べてみようと思って
UNOのゲームを書いてみたのですが、どなたか新しい戦略を書いてくれませんでしょうか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9331.zip
ルールは、
(1)Draw2とかDraw4はSkip飛ばしできません。
(2)最後にワイルドカードを出してあがれません。
あとは普通のルールと思います
0139デフォルトの名無しさん
2009/06/03(水) 01:21:43いちいち&aと書かずに済むポインタだと思っても3割くらい当たっていると思ってもいい。
0140デフォルトの名無しさん
2009/06/03(水) 01:22:26bool Player::SelectCard(const Card ¤t, int DrawObligation, Card *playcard)
という関数を書き換えれば新しい戦略が書けます。
この関数は前のプレイヤが出したカードがcurrent、何枚か引かないと駄目な状態になって
る場合には、DrawObligationが2以上になってます。出すべきカードが見つかればtrueを
返して、*playcardに出すべきカードを入れます。
以上です。失礼しました。
0141デフォルトの名無しさん
2009/06/03(水) 07:55:24stlのsetは効率がいいので開発されてないんでしょうか?
0142131
2009/06/03(水) 10:28:10値がずれずに一括でロード出来る方法はないんでしょうか?
一括で読み込んで、クラスや構造体に格納していくしかありませんか。
0143デフォルトの名無しさん
2009/06/03(水) 10:31:22そもそも保存するときにズレてるんじゃない?
パディングとかオープンモードとかあるから
0144131
2009/06/03(水) 10:35:05自己解決しました。
0145デフォルトの名無しさん
2009/06/03(水) 11:01:21ありがとうございます。
0146デフォルトの名無しさん
2009/06/03(水) 17:50:27char型配列の要素を、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 )」とエラー。
悩んでしまってここから全く前に進めなくて弱っています。
ご存知の方ご教示ください。よろしくお願いします。
0147デフォルトの名無しさん
2009/06/03(水) 17:52:16文字としての6ならatoi関数
0148デフォルトの名無しさん
2009/06/03(水) 17:53:18printf("int=%d\n",atoi((int)s[1]));
としてキャストしないと
0149デフォルトの名無しさん
2009/06/03(水) 18:25:17あるよ。DinkumwareとかSGIとかは、hash_mapと共にhash_setも作っている。
そして、unordered_mapとunordered_setという名前でC++標準にも入るし、VCやg++でももう使える。
0150デフォルトの名無しさん
2009/06/03(水) 18:51:43どんな教科書使って勉強してる?
C言語はBASICみたいに文字列をひとまとまりの変数として扱えないし
数値との相互変換も簡単にはできないので、
一通り教科書を読み終わってから
そういう(Cの初心者には)むつかしいことにはチャレンジしたほうがいいよ。
0151146
2009/06/03(水) 20:09:49早速のレスありがとうございます。
>>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;
}
0152デフォルトの名無しさん
2009/06/03(水) 20:14:11馬鹿はわざわざ書き込まなくてもいいのですよ。
>>151
取り敢えず、printf("%d\n", atoi(& s[1]))とでもして味噌。
0153146
2009/06/03(水) 20:45:12ありがとうございました!できました。
エラーの意味が少し分かった気がしました(これから勉強します)。
>>147-148
即レス感謝しております。色々とキッカケになりました。
ありがとうございました。
0154デフォルトの名無しさん
2009/06/03(水) 23:02:040155デフォルトの名無しさん
2009/06/04(木) 01:41:16このページを参考にコンパイラをインストールしました。
このページの最後にある、使い方を見るってやつのことで質問なのですが、
僕のbcc32は奥の方にあって(C:\Borland\...)、最終的にbcc32があるところにたどりつくのですが、
ここでしかコンパイラできないじゃないですか?
それが面倒なのでどうにか簡単にできないかってことと、
bcc32があるディレクトリの中には他にもいろんなプログラムがあるんですが、作成したCファイルも
同じところに保存しないとコンパイル&実行できないですよね?
つまりこのディレクトリの中がいろんな形式のファイルがあってめちゃくちゃ汚くなっちゃうわけです。。
これってなんとかキレイにまとめる方法ってあるでしょうか?
もしあるなら、申し訳ありませんが教えてください(>_<)
0156155
2009/06/04(木) 01:46:27一部コンパイラ→コンパイルですね
↑のは自分で見なおしてみるとちょっと日本語がアレなので簡潔に質問しますと、
1.cdの回数を最小限にする方法(bcc32を含むディレクトリをC:の直下に持ってきていいのでしょうか?)
2.CファイルはCファイルだけでどこかにまとめて、そのうえでコンパイル&実行はできるのか
ということです。
よろしくお願いします。。
0157デフォルトの名無しさん
2009/06/04(木) 02:27:13>インストール(WindowsVista)に進む
>インストール(WindowsXP,2000)に進む
>インストール(Windows98,95)に進む
のどれかを見ろ。
環境変数を設定する解説がある。
それを設定すれば、どこからでもbcc32が呼び出せるようになる。
あとは好きなところにディレクトリを作って、その中でコンパイルすればいい。
0158デフォルトの名無しさん
2009/06/04(木) 02:29:080159156
2009/06/04(木) 11:46:59ありがとうございます。
OSはVistaで、ここに書いてある通り環境変数も設定したつもりなのですが
できないんです。。
;c:\borland\bcc55\bin
ですよね?
これだとここで指定したディレクトリじゃないとできないってことでしょうか?
ローカルディスク(C)の中ならどこでもコンパイルできるようにするには、設定を
c:\
にすればいいということでしょうか?
0160デフォルトの名無しさん
2009/06/04(木) 11:52:18コマンドラインで、path と打って出てくる文字列に c:\borland\bcc55\bin はあるか?
ちなみにシステム変数の設定をしたあとで開いたコマンドプロンプトじゃないと
有効じゃないぞ
0161デフォルトの名無しさん
2009/06/04(木) 12:06:53コマンドプロンプトでpathを打つとちゃんと出てきます。
それで、確認用ファイルを
c:\Emacs\C\test.c
という風に作ったディレクトリに保存して、Cディレクトリ内で
c:\Emacs\C\>bcc32 test.c
というようにコマンドしても操作可能なプログラムとして…
というメッセージが返ってきます。。。
0162デフォルトの名無しさん
2009/06/04(木) 12:28:01これを、
c:\borland\bcc55\bin\bcc32 test.c
と打つとどうなるよ。
0163デフォルトの名無しさん
2009/06/04(木) 12:29:09最初と最後以外は ; で区切ってないと前後とくっつくぞ
0164デフォルトの名無しさん
2009/06/04(木) 13:16:59どうしてもC++で書きたかったら、
struct sockaddr_in
とかそういうのは、上手く自作のクラスにまとめてしまえばいいのでしょうか?
0165デフォルトの名無しさん
2009/06/04(木) 13:25:450166デフォルトの名無しさん
2009/06/04(木) 13:38:12とかそういう感じのプログラムばかりだったので、みんなそんな感じなのかなと。
0167デフォルトの名無しさん
2009/06/04(木) 14:03:34そうコマンドすればコンパイルできます。
ただし、"コマンド'ilink32.exe'を実行できない"とエラーが出ます。
やはりbinディレクトリの中でやりくりするしかないのでしょうか?
>>163
そこは大丈夫です。ちゃんと; ;で挟んであります。
0168デフォルトの名無しさん
2009/06/04(木) 14:07:11リンカがパス通ってないからな。
それでコンパイルできるなら、PATHがおかしいんだよ。
どこかタイプミスがあるはず。その部分コピペして貼り付けてみ。
コマンドプロンプトのコピーのしかたはわかるよな?
0169デフォルトの名無しさん
2009/06/04(木) 14:30:41%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\usr\local\bin;D:\MinGW\bin;c\borland\bcc55\bin;C:\Program Files\QuickTime\QTSystem\
これがパスの設定です。これのことですか?
コマンドプロンプトのコピーの仕方はわかりませんが(笑)、
ちょっと打ってからTabで出してるのでタイプミスはないと思います。。
0170デフォルトの名無しさん
2009/06/04(木) 14:33:55>c\borland\bcc55\bin
コロンが抜けてる
c:\borland\bcc55\bin
で
0171デフォルトの名無しさん
2009/06/04(木) 14:37:58感動した!
0172169
2009/06/04(木) 15:36:42おぉ!!できました!
親切にありがとうございます!!
171じゃないですが、本当に優しい人が多くて助かりました!
あと、ついでと言ってはなんですがコマンドプロンプトについて質問です。
コマンドプロンプトを開いたときの最初の位置が
C:\Users\kei
になってます。(keiは僕の名前です)
開いたとき一番最初は C:\ になってると一番都合がいいのですが、そのように設定できますか?
プロパティとかいろんなトコからやろうとしても見当たらないので…。
0173デフォルトの名無しさん
2009/06/04(木) 15:39:15何に使うんだろう
0174デフォルトの名無しさん
2009/06/04(木) 15:39:16プログラムはcmdで、作業フォルダはC:|
0175174
2009/06/04(木) 15:40:160176デフォルトの名無しさん
2009/06/04(木) 16:21:59どう開いても変なディレクトリから入っちゃいます。。
cd ../../
を毎回やるのは億劫なので。。。
0177デフォルトの名無しさん
2009/06/04(木) 16:37:32cd \ でいいじゃない
0178デフォルトの名無しさん
2009/06/04(木) 16:40:040179デフォルトの名無しさん
2009/06/05(金) 08:08:41extern AClass a;
でいいの?
0180デフォルトの名無しさん
2009/06/05(金) 08:22:59cd ..\...\
bcc32 %1
とか。
0181デフォルトの名無しさん
2009/06/05(金) 09:58:570182デフォルトの名無しさん
2009/06/05(金) 11:16:18みたいなメッセージが最初の動作時に一回だけ出るときがありますが、出ても最初の一回だけで
その後は出ません。これってプロパティのどこかにアンブロックしたという記録が残っている
のでしょうか?
0183デフォルトの名無しさん
2009/06/05(金) 17:56:010184デフォルトの名無しさん
2009/06/05(金) 19:23:36レジストリのどこかは知らないが、設定の閲覧・変更は
コントロールパネルのWindowsファイアウォールのところを見ればいい。
0185デフォルトの名無しさん
2009/06/05(金) 20:44:54ありがとうございます。コントロールパネルに見つかりました。
あともう1つだけ。(板違いといわれそうなのですが…一応C++で書いているので)
TCPで複数のコネクションを同時に保持するサーバーを書きたいのですが、サーバ側から
みた通信先はどうやって区別すればよいですか?適当にIDとかを割り振ってそこをみるように
すればいいんでしょうか?
××のソースをみろとかでもいいです。どうかお願いします。
0186デフォルトの名無しさん
2009/06/05(金) 20:48:43ソケットなら接続してきたクライアントの情報を得られる。
ネットワークプログラミング相談室なんてスレがなかったかな?
0187デフォルトの名無しさん
2009/06/05(金) 21:10:01ありがとうございます。
ということは、accept()で得られたクライアント情報のIPアドレス+ポート番号
の組でクライアントを識別するということですか?
>ネットワークプログラミング相談室なんてスレがなかったかな?
次からはそっちで聞いてみます。
0188質問
2009/06/05(金) 23:03:36textBox1に自由に入力させ、「眼鏡」という文字列が入力された瞬間に
メッセージボックスを表示するにはどうしたらいいでしょうか
TextChangedイベントの中でif(textBox1->Text=="眼鏡")としたんですが、
前後に文章があるときもメッセージボックスを表示させたいです
よろしくお願いします
0189デフォルトの名無しさん
2009/06/05(金) 23:57:400190デフォルトの名無しさん
2009/06/06(土) 01:25:52引数としてクラスのポインタを受け取り、そのポインタにnewでクラスのインスタンスを作る関数は作れますか?
また、どのように作るのでしょうか?
そうして作ったインスタンスを関数の外でdeleteしたいのです
よろしくお願いします
0191デフォルトの名無しさん
2009/06/06(土) 01:33:14void f(int*& rp)
{
rp = new int;
}
int main()
{
int *p;
f(p);
delete p;
}
0192デフォルトの名無しさん
2009/06/06(土) 01:45:090193デフォルトの名無しさん
2009/06/06(土) 01:51:180194デフォルトの名無しさん
2009/06/06(土) 03:34:30コンストラクタの後ろに付加、コンストラクタの中で代入、初期化用メンバ関数を用意してコンストラクタの中で呼び出し
……とかいろいろ考えられると思うけど、使い分けってある?
あと、特に理由がない限り、コピーコンストラクタに初期化処理ってしなくても大丈夫よね?
0195デフォルトの名無しさん
2009/06/06(土) 03:48:26初期化で済む物を代入にするメリットは全くない
0196デフォルトの名無しさん
2009/06/06(土) 03:50:05const なメンバ変数
=> 初期化リストでしか初期化できない。
初期化のために手続きが必要
=> 初期化リストでは無理
初期化のタイミングがコンストラクション時以外にもある
=> じゃ、別関数にしておくか
0197デフォルトの名無しさん
2009/06/06(土) 03:51:050198デフォルトの名無しさん
2009/06/06(土) 04:17:00途中でリセットする場合以外でも、お婆ロードでコンストラクタが複数あるときは
別関数の方が楽そう……かな?
0199デフォルトの名無しさん
2009/06/06(土) 04:53:35ユニコードONの状態で
wchar_t type[255] = _T("うんこ");
MessageBox(NULL, (PCTSTR)typeid(type).name(), NULL, MB_OK);
とすると文字化けしてしまうのですが、なんでですか?
文字列リテラルにLをつけないといけないのと関係あります?
うまく表示する方法ってどうやるのですか?
まだ始めたばっかだしマルチバイトでやればいいのでしょうけど
気になるので、よかったら教えてください
お願いします
0200デフォルトの名無しさん
2009/06/06(土) 06:47:24Effective C++は読んだかい?
まだなら定額給付金を片手に今すぐ本屋に行くんだ。
0201デフォルトの名無しさん
2009/06/06(土) 06:48:32MessageBoxA(NULL, typeid(type).name(), NULL, MB_OK)
0202デフォルトの名無しさん
2009/06/06(土) 06:57:13おや なぜか めのまえの ほんだなに おいてあるぞ!
0203199
2009/06/06(土) 15:31:21MessageBoxAとMessageBoxWがあって
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
こんなんなってるんですね
だからMessageBoxAを強制的に呼び出してやると
氷解しました。ありがとうございます。
0204デフォルトの名無しさん
2009/06/06(土) 17:26:42TCHAR type[255] = _T("ちんこ");
MessageBox(NULL, type, NULL, MB_OK);
0205デフォルトの名無しさん
2009/06/07(日) 13:03:160206デフォルトの名無しさん
2009/06/07(日) 14:01:55void *p = &org_i;
int i = *reinterpret_cast<int*>(p);
voidへのポインタからINTの値を取り出そうとして上のようにしたのですが、
reinterpret_castの前に*があったりしてなんとなくいやです。
ほかに方法はないでしょうか?
0207デフォルトの名無しさん
2009/06/07(日) 14:04:280208デフォルトの名無しさん
2009/06/07(日) 14:05:170209デフォルトの名無しさん
2009/06/07(日) 14:50:41template <class T>
T pointer_value(const void* p)
{
return *static_cast<const T*>(p);
}
こうする
int i = pointer_value<int>(p);
0210デフォルトの名無しさん
2009/06/07(日) 14:56:130211デフォルトの名無しさん
2009/06/07(日) 17:15:04お前が勉強しろ
0212デフォルトの名無しさん
2009/06/07(日) 18:35:310213デフォルトの名無しさん
2009/06/07(日) 18:46:180214デフォルトの名無しさん
2009/06/07(日) 18:56:050215デフォルトの名無しさん
2009/06/07(日) 19:20:16インスタンスAがB1に参照されてる状態から
B2がインスタンスAを参照したらB1からAの参照が切れる
常にAが1個のBから参照されるような関係を作るにはどうしたら良いでしょうか?
0216デフォルトの名無しさん
2009/06/07(日) 19:37:110217デフォルトの名無しさん
2009/06/07(日) 20:04:470218デフォルトの名無しさん
2009/06/07(日) 23:29:49B同士で所有の移動をするメソッドを、ということでしょうか?
>>217
BがAに更新通知してAがBの値を読みに行くので
Aへの更新通知を別の方法で実現できればそれでもいいのですが・・
0219デフォルトの名無しさん
2009/06/08(月) 00:37:330220デフォルトの名無しさん
2009/06/08(月) 00:38:580221デフォルトの名無しさん
2009/06/08(月) 00:41:570222デフォルトの名無しさん
2009/06/08(月) 01:43:02Aに"今からお前の相手するBインスタンスはわしじゃ"通知メソッドを作れば?
その際に元彼Bに"もう私のことは放っておいて"通知メソッドをAから呼んでもらう
0223デフォルトの名無しさん
2009/06/08(月) 11:43:40戻り値だけが違う関数を複数作りたい場合どうするべきでしょうか?
class C1;
class C2;
というのがあって、
C1 create();
C2 create();
という感じにやりたいときです。
お願いします。
0224デフォルトの名無しさん
2009/06/08(月) 12:11:13無理です。だいたい呼び出せません。
名前空間を使いましょう。
0225デフォルトの名無しさん
2009/06/08(月) 12:17:56,で区切られて1行に並んでるファイル内の行列から数値を配列に入れる方法を教えてください!
0226デフォルトの名無しさん
2009/06/08(月) 12:23:49とりあえず手始めに、fgets()とsscanf()使ってみるのはどうか?
まあ配列に入れるならループで回してstrtokとatoi使う手もあるけど、
最後はstrtok+atoiみたいな関数を自分で作るのがいいかもね。
0227デフォルトの名無しさん
2009/06/08(月) 12:24:30注意点、スレッドセーフな処理にするための方法などを詳しく扱った書籍やサイトはないでしょうか?
0228デフォルトの名無しさん
2009/06/08(月) 12:25:39ありがとうございます
,の除き方を詳しく教えてください
0229デフォルトの名無しさん
2009/06/08(月) 12:26:37csvデータの読み込みでぐぐった方がいいかも
0230デフォルトの名無しさん
2009/06/08(月) 12:27:37sscanf()もstrtok()も , の処理はやってくれるだろ。
自前でやるならstrchr()で場所調べて切り出していけばいいと思うよ。
0231デフォルトの名無しさん
2009/06/08(月) 12:32:12全然知りませんでした
ありがとうございました
0232デフォルトの名無しさん
2009/06/08(月) 14:05:22dmyC{};
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;}
なんのメリットがあるか知らんが使用側で偽多態受けなら出来ん事はない
前参照やスコープは適当に修正要
0233デフォルトの名無しさん
2009/06/08(月) 14:14:400234デフォルトの名無しさん
2009/06/08(月) 14:19:51dmyC{operator C1(){〜return c1;}operator C2(){〜return c2;}};
0235デフォルトの名無しさん
2009/06/08(月) 14:50:490236デフォルトの名無しさん
2009/06/08(月) 15:39:06わかったぽ
0237デフォルトの名無しさん
2009/06/08(月) 19:01:540238デフォルトの名無しさん
2009/06/08(月) 19:06:260239デフォルトの名無しさん
2009/06/08(月) 19:10:15GUIアプリを楽につくりたいならC#ですかね?
0240デフォルトの名無しさん
2009/06/08(月) 19:11:140241デフォルトの名無しさん
2009/06/08(月) 19:18:420242デフォルトの名無しさん
2009/06/09(火) 01:07:44があるとき、
array[10] == &array[10][0]
でしょうか?
0243デフォルトの名無しさん
2009/06/09(火) 01:14:000244デフォルトの名無しさん
2009/06/09(火) 01:14:190245デフォルトの名無しさん
2009/06/09(火) 01:17:52気になるならポインタがさしてるアドレスを比べてみなよ
0246デフォルトの名無しさん
2009/06/09(火) 01:20:47型は配列なので注意が必要、多分等しいだとは思うんだが。(両方とも配列)
配列はポインタに自動変換だが、逆はそうではない、やっぱ頭痛い。
0247デフォルトの名無しさん
2009/06/09(火) 01:23:22うぜぇぇ
0248デフォルトの名無しさん
2009/06/09(火) 01:24:56int a[10][20]; は、int10この配列が20個、ではないところがややこしい。
0249デフォルトの名無しさん
2009/06/09(火) 01:26:48Cの規則ですから
int func()[10]
{
return 配列;
}
おらよ、これでも喰らえってなもんだ
0250デフォルトの名無しさん
2009/06/09(火) 01:26:53配列や関数の型は、外側からはがしていく感じで解釈するんだよね。
0251デフォルトの名無しさん
2009/06/09(火) 01:49:26関数は配列を返せない
0252デフォルトの名無しさん
2009/06/09(火) 01:53:52ANSIでは使えない事になっているが、返せる処理系もっあってだな、
アホな開発者がそれを返している糞ライブラリがあるんだ
どこのかって?S○Eとか○CEとかSC○とか、まあそんなところ、死ねます。
0253デフォルトの名無しさん
2009/06/09(火) 01:56:17ポインターは返せるからできなくはないんじゃね?
ただサイズの問題とかあるけど
0254デフォルトの名無しさん
2009/06/09(火) 02:27:31Cのコードの中に大量の構造体を使ってるところがあって、malloc()でメモリを
取らずに、自分でメモリプールを管理する割り当て関数を使ってます。これを生かすため
placement_new()というのを使おうと思っているのですが、この場合delete()が使えない
(使う必要がない)と聞いたのですが、placement_new()の使い心地はどうでしょうか?
使いやすいですか?
0255デフォルトの名無しさん
2009/06/09(火) 03:16:280256デフォルトの名無しさん
2009/06/09(火) 03:24:55使う必要がない、ではなく使えないだな。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
placement newの文字通り引数を取る形式new(hoge) Tにたいして、delete(hoge) pという構文がないという話。
メモリ確保処理を自前でやるとしたら、
クラス・構造体にnew/deleteなどを定義するか、
アロケータクラスを作って、確保解放はvectorとかに任せる
という形態のほうが多いと思う。ほかの人はどう考えているか分からないけど。
0257デフォルトの名無しさん
2009/06/09(火) 04:13:45>>256の言うように、クラス・構造体にnew/deleteを定義するとか
アロケータとコンテナを組み合わせるのがいいと思う。
0258デフォルトの名無しさん
2009/06/09(火) 05:16:07たとえば
数値Aと
class NoA{
//ここに関数A
}
class NoB{
//ここに関数B
}
ここでNoAもNoBも引き継いだclass NoC
(NoC.関数AとNoC.関数Bの両方ができ)
みたいなことってできるの?
0259デフォルトの名無しさん
2009/06/09(火) 05:18:52http://www.geocities.jp/ky_webid/cpp/language/033.html
0260デフォルトの名無しさん
2009/06/09(火) 09:41:04文字列としてクラス名があったとして、それでオブジェクトを作ることができないって読んだんですけど。
自由度高そうなのに。
ごにょごにょしてやる方法あります?
0261デフォルトの名無しさん
2009/06/09(火) 09:46:39Smalltalkみたいな使い物にならないインタープリタと一緒にすんな
0262デフォルトの名無しさん
2009/06/09(火) 09:50:30こういう話か?
std::map<std::string, boost::shared_ptr>
0263デフォルトの名無しさん
2009/06/09(火) 09:56:44だな
0264デフォルトの名無しさん
2009/06/09(火) 10:05:56あってもよかったと思う
0265デフォルトの名無しさん
2009/06/09(火) 10:18:470266デフォルトの名無しさん
2009/06/09(火) 10:36:38やろうと思えばなんだってできるよ、コンパイラ呼び出しDLLにコンパイル、出来上がったDLL動的にリンク、そして呼び出す。
面倒くさくてやらないけど。
0267デフォルトの名無しさん
2009/06/09(火) 10:40:41ターゲットの環境にコンパイラをインストールなんて余りやりたくないからね
0268デフォルトの名無しさん
2009/06/09(火) 11:40:29引数がfloatとcharで20こあって"%d%f・・・・・",hairetu,&suuji・・・・とあるんだけど返り値=1にした時しかうまくいかない
switchにしてcase20はおkだけどcase 2とかdefaultにはcaseが正しくありませんってなる
0269デフォルトの名無しさん
2009/06/09(火) 11:44:10C言語でおk
0270デフォルトの名無しさん
2009/06/09(火) 11:47:180271デフォルトの名無しさん
2009/06/09(火) 11:51:27fscanfした時点で一行バッファに入ってそこから指定した型の順で前から取っていく感じでしょ?
3つ目で型が合わないことがわかったらどうなるの?
0272デフォルトの名無しさん
2009/06/09(火) 12:42:01行は関係ないよ
合う型を探して改行関係なしにファイルの最後まで行ったら終わり
3個目が見つからなかったら戻り値で2を返すだけ
0273デフォルトの名無しさん
2009/06/09(火) 12:59:17行関係無いのか
どっかのページ1行読み込むって書いてあったのに
0274デフォルトの名無しさん
2009/06/09(火) 13:25:480275デフォルトの名無しさん
2009/06/09(火) 14:29:48なんか使ってないのに違う行のcaseの所でcaseの値"1"は既に使用されていますって出るんだけど
0276デフォルトの名無しさん
2009/06/09(火) 14:34:30case 1:
case 2:
case 3:
case 4:
/* 本体 */
break;
こう書く
case (1||2||3||4): は
定数式 1 || 2 || 3 || 4 →結果は真で 1 として整数化されるから
結局 case 1: と書いてるのと同じ意味になってしまう
0277デフォルトの名無しさん
2009/06/09(火) 14:44:09あんまり載って無いですね、初心者ならやってしまいがちだとおもうのですが
0278デフォルトの名無しさん
2009/06/09(火) 14:51:46if { } 〜 else if { } 〜 else { }
の羅列のほうが先にじゃねーかな?
break しない case を持つ switch 文って個人的にはあまり好きじゃない。
見直したときに 「あれ? break 忘れてるんじゃね?」 って勘違いしちゃう可能性があるもの
0279デフォルトの名無しさん
2009/06/09(火) 14:57:110280デフォルトの名無しさん
2009/06/09(火) 15:21:520281デフォルトの名無しさん
2009/06/09(火) 15:24:570282デフォルトの名無しさん
2009/06/09(火) 15:28:39勉強中でROMしてます
>>276の
>case (1||2||3||4): は
>定数式 1 || 2 || 3 || 4 →結果は真で 1 として整数化されるから
>結局 case 1: と書いてるのと同じ意味になってしまう
として処理されるならそもそも書く必要すらないですしこういう記述を知ってる必要もない気が・・・
つまり
>case 1:
>case 2:
>case 3:
>case 4:
> /* 本体 */
> break;
こっちを知ってればいいかと。
それかジャンプテーブルとかで処理しちゃうか
0283デフォルトの名無しさん
2009/06/09(火) 16:02:48知るべきことは "case の後ろは定数式" であること だ。
・定数式のうち 論理演算式だけは 演算結果が所詮 0/1 にしかならないのでおいしくない
・四則演算な定数式や ビット毎の論理演算定数式 記述が簡単になったり可読性が上がるかもしれない
四則演算の例:
#define TOP (100)
case TOP+1:
ビット毎の論理演算の例
#define A (1<<0)
#define B (1<<1)
case A|B:
0284デフォルトの名無しさん
2009/06/09(火) 16:40:140285デフォルトの名無しさん
2009/06/09(火) 16:49:42メモ帳で書いてろ
0286デフォルトの名無しさん
2009/06/09(火) 16:56:58なんでだろう
0287デフォルトの名無しさん
2009/06/09(火) 17:09:35{}とかが上手くいってないと出ないよ
0288デフォルトの名無しさん
2009/06/09(火) 17:41:44ありがとうございました
0289デフォルトの名無しさん
2009/06/09(火) 19:53:26else ifの梯子なんてダサすぎる…
0290デフォルトの名無しさん
2009/06/09(火) 19:55:400291デフォルトの名無しさん
2009/06/09(火) 20:21:010292デフォルトの名無しさん
2009/06/09(火) 20:37:30条件演算子を使えば似たような書き方で好きな式を条件に出来る。
C++だけだったかも知れんが。
0293デフォルトの名無しさん
2009/06/09(火) 22:24:46(x==0||x==1||x==2||x==3)&&(func0(),true)
||x==4&&(func4(),true)
||x==5&&(func5(),true)
||(func_default(),false);
0294デフォルトの名無しさん
2009/06/09(火) 22:26:090295デフォルトの名無しさん
2009/06/09(火) 22:49:34どうしたらいいでしょうか。。
#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;
}
0296デフォルトの名無しさん
2009/06/09(火) 23:08:01でもブレイクスルーとdefaultの機能って、状況さえ許せば凄く便利じゃね?
0297デフォルトの名無しさん
2009/06/09(火) 23:30:32class 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();
}
0298デフォルトの名無しさん
2009/06/09(火) 23:32:38friend
0299デフォルトの名無しさん
2009/06/09(火) 23:35:43Duff's Deviceくらいしか使い道なくね?
0300デフォルトの名無しさん
2009/06/10(水) 01:17:05ブレイクスルーちゃう
fall through
0301デフォルトの名無しさん
2009/06/10(水) 01:18:140302デフォルトの名無しさん
2009/06/10(水) 01:23:48スレッドセーフですか?
0303デフォルトの名無しさん
2009/06/10(水) 01:29:06っていうか、C++の規約にはスレッドセーフに関する記述はないんじゃなかったっけ?
0304デフォルトの名無しさん
2009/06/10(水) 08:28:300305デフォルトの名無しさん
2009/06/10(水) 09:04:54失礼、別のと混ざった
0306デフォルトの名無しさん
2009/06/10(水) 14:23:36と書きたい今日この頃
なぜこの書き方でエラーがでるのかがわからない
0307デフォルトの名無しさん
2009/06/10(水) 14:28:13「もともと戻り値は存在しないもの」と、「戻り値は使わないことを宣言する」の違いじゃない?
0308デフォルトの名無しさん
2009/06/10(水) 14:28:380309デフォルトの名無しさん
2009/06/10(水) 14:47:46strcatとかstrcpyを使うよりも、便利だと教えられたのですが、いまいちどこが便利なのかわかりません。
教えてください。
0310デフォルトの名無しさん
2009/06/10(水) 14:53:53それをsprintfに置き換えてみりゃわかるだろ。
もちろん、strcatとかstrcpy一発で済むような例はstrcatとかstrcpy使えばいいのはわかるよな。
0311デフォルトの名無しさん
2009/06/10(水) 15:54:060312デフォルトの名無しさん
2009/06/10(水) 21:29:140313デフォルトの名無しさん
2009/06/10(水) 21:33:010314デフォルトの名無しさん
2009/06/10(水) 22:03:03#pragma warning (disable : 4996)
0315デフォルトの名無しさん
2009/06/10(水) 22:06:520316デフォルトの名無しさん
2009/06/10(水) 22:06:59いずれにせよsprintf一族はロクなもんじゃないから書き捨てコード以外には使うべきでない
0317デフォルトの名無しさん
2009/06/10(水) 22:08:06安全な使い方をすればいいだろ
0318デフォルトの名無しさん
2009/06/10(水) 22:11:26挙動バラバラだし、本当にクソみたいなsnprintfとかがいるから
ヌル終端しないくらいならカワイイもんで、例えば
一昔前のLinuxはnをガン無視してsprintfにブン投げるようになってることがある
本当に死ねばいいと思う
0319デフォルトの名無しさん
2009/06/10(水) 22:13:28いずれにせよプログラミング言語一族はロクなもんじゃないから書き捨てコード以外には使うべきでない
0320デフォルトの名無しさん
2009/06/10(水) 22:20:16ま、糞実装なsnprintfの存在以前にC99自体アレだが。
0321デフォルトの名無しさん
2009/06/10(水) 23:44:160322デフォルトの名無しさん
2009/06/10(水) 23:50:11異なるプラットフォーム間で利用されるソフトを開発しているならともかく
そうでない、小さなプロジェクト(おそらく世のプロジェクトの大部分)は
C89よりC99で開発したほうが(わずかだろうけど)コスト削減になりそうなものだが。
0323デフォルトの名無しさん
2009/06/10(水) 23:52:420324デフォルトの名無しさん
2009/06/10(水) 23:59:07__func__とか__VA_ARGS__とか_Pragmaとか<stdint.h>とか
restrictやら可変長配列やらはいりません
0325デフォルトの名無しさん
2009/06/11(木) 00:53:030326デフォルトの名無しさん
2009/06/11(木) 01:48:37class 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)
とやっても正しく出てくれません。
0327デフォルトの名無しさん
2009/06/11(木) 01:53:50kazu=is(h);
0328デフォルトの名無しさん
2009/06/11(木) 02:00:41{
int a
}
というクラスがあったとき
Hogeのインスタンス同士の比較をメンバ変数aの大小で行う場合
演算子をオーバーロードしたほうが良いのか
int GetA()という関数を比較するのが良いでしょうか?
またHogeインスタンスとintを比較することも考えてますがこういう場合はどうでしょうか?
0329デフォルトの名無しさん
2009/06/11(木) 02:02:44いやそれであっている。
うまくいかないならほかに原因がある。
0330デフォルトの名無しさん
2009/06/11(木) 02:37:59Hoge同士の比較方法がそれ以外にあり得ないなら演算子オーバーロードでいいんじゃね?
0331デフォルトの名無しさん
2009/06/11(木) 02:50:23すいません。
クラス配列を作るとき、
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なのですが、最初の書き方ではだめだったでしょうか?
0332デフォルトの名無しさん
2009/06/11(木) 03:10:02あと、どんな結果が出たのかも書いて欲しいかなかな。
0333デフォルトの名無しさん
2009/06/11(木) 03:35:460334デフォルトの名無しさん
2009/06/11(木) 08:03:300335デフォルトの名無しさん
2009/06/11(木) 09:35:480336デフォルトの名無しさん
2009/06/11(木) 15:17:42自分も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;
}
0337デフォルトの名無しさん
2009/06/11(木) 19:58:37initializer_listだろ
0338デフォルトの名無しさん
2009/06/11(木) 20:57:570339デフォルトの名無しさん
2009/06/11(木) 21:22:27委員会の人たちにクズと言わないと意味ない。
0340デフォルトの名無しさん
2009/06/11(木) 21:37:51本当にしょうもない物は入らないから大丈夫だと思うけどね
0341デフォルトの名無しさん
2009/06/11(木) 21:53:38ここはC++0xのスレじゃないよ
0342デフォルトの名無しさん
2009/06/11(木) 23:20:40特に、restrictはC++89のときに否決された過去があるから、
今回も入れられるわけないw
0343デフォルトの名無しさん
2009/06/11(木) 23:22:51FORTRAN並みに配列演算が高速化できる可能性がある
科学技術計算にはFORTRANを、と言わなくて済むようになるんだがな
それ以外には取り立てて利点はない
0344デフォルトの名無しさん
2009/06/12(金) 06:13:12ここがC++0xのスレかどうかなんて、>>338-339の流れには関係ないよ。
0345デフォルトの名無しさん
2009/06/12(金) 09:08:43スレ違いだクズ
0346デフォルトの名無しさん
2009/06/12(金) 09:24:450347デフォルトの名無しさん
2009/06/12(金) 09:52:320348デフォルトの名無しさん
2009/06/12(金) 09:56:38メモリのアクセスパターンががらっと変わる可能性があるから入れて欲しいけどねぇ。
0349デフォルトの名無しさん
2009/06/12(金) 23:16:420350デフォルトの名無しさん
2009/06/13(土) 00:39:410351デフォルトの名無しさん
2009/06/13(土) 00:44:10読む
{を探す
}を探す
範囲内の文字列を取得する
お前は真面目に質問する気あるのか
0352デフォルトの名無しさん
2009/06/13(土) 00:47:050353デフォルトの名無しさん
2009/06/13(土) 01:00:02正規表現が使えないって聞いたような気がしたから
文字列をくっつけたり長さを測ったりそういうとこからしかできないのかと思ってた
0354デフォルトの名無しさん
2009/06/13(土) 01:05:28お前の書いた文章を読む分には、{から次の}までということだから正規表現で余裕だ。
{から次の対応する}までだと正規表現では無理だが。
0355デフォルトの名無しさん
2009/06/13(土) 01:09:54なんかよくわからんけどサンクス
0356デフォルトの名無しさん
2009/06/13(土) 01:10:370357デフォルトの名無しさん
2009/06/13(土) 01:12:240358デフォルトの名無しさん
2009/06/13(土) 01:14:290359デフォルトの名無しさん
2009/06/13(土) 01:14:41計算処理込みの置き換えを主にしたいです
ベクターでそんなフリーソフトあるかもしれないけど
0360デフォルトの名無しさん
2009/06/13(土) 01:20:48>>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;
}
0361デフォルトの名無しさん
2009/06/13(土) 01:24:57このboostとかいう奴標準で入れとくべきなの?
0362デフォルトの名無しさん
2009/06/13(土) 01:33:28ああ、禁止されてる会社で使うコードとかでもない限りほぼ標準と思って間違いない。
ついでに補足だけど正規表現はC++標準規格の追加仕様(tr1)でライブラリに追加される予定。
0363デフォルトの名無しさん
2009/06/13(土) 01:35:09じゃあそれを入れることにします、ありがとうございました
0364デフォルトの名無しさん
2009/06/13(土) 01:45:42BoostのXpressiveも捨て難い。
0365デフォルトの名無しさん
2009/06/13(土) 01:54:560366デフォルトの名無しさん
2009/06/13(土) 13:52:21排他制御にMutex使ったら想定していたより処理が重くなった。
(頻度が多すぎなのでNGっぽい。アクセスが、がっちんこするのは
相当低い頻度なので、スピンロックの実装を検討したいです。
Windows系で、プロセス間排他制御で、スピンロックを使う方法って、
何か用意されているものはありますでしょうか?よろしくお願いします。
0367デフォルトの名無しさん
2009/06/13(土) 14:04:31http://msdn.microsoft.com/ja-jp/library/cc429052.aspx
0368デフォルトの名無しさん
2009/06/13(土) 15:29:21表からするとCreateMeteredSectionを使えって事らしい。
なんとかなりそう。何か関数名が、Wait、Releaseが、
Enter,Leaveになったり、知らない関数ばっかで、少し怠い。
まあ、前者はハンドル(イベントやその他)によって
動きが変わるものもあるから、その辺で条件処理で遅いのかな。
とりあえずテストします。
0369デフォルトの名無しさん
2009/06/13(土) 16:17:02// Spin and get access to the metered section lock
while (InterlockedExchange(&;(lpMetSect->lpSharedInfo-> _
lSpinLock), 1) != 0)
Sleep(0);
CreateMeteredSectionと同様の方法にします。
既存の共有メモリー上にスピンロック用の変数を作って、
InterlockedExchangeで、ロックできるまでループ。
アンロックは、同関数で0に戻して戻り値は捨て、
これでOKのような気がする。
0370デフォルトの名無しさん
2009/06/13(土) 22:12:470371デフォルトの名無しさん
2009/06/13(土) 23:10:200372デフォルトの名無しさん
2009/06/14(日) 00:13:56class 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だけですが、実際のクラスはもっと複雑な木構造になる予定です。
0373デフォルトの名無しさん
2009/06/14(日) 00:29:030374デフォルトの名無しさん
2009/06/14(日) 00:29:270375デフォルトの名無しさん
2009/06/14(日) 00:33:07・・・
virtual void hoge();
};
0376372
2009/06/14(日) 00:39:29いろんなAの子のクラス型の入ったリスト構造で順次にhoge()を呼び出したいので、
同じ命令で汎用的に使える必要があります。
0377372
2009/06/14(日) 00:48:13ありがとうございます。
オーバーライドに識別子が必要なのを忘れてました。
0378デフォルトの名無しさん
2009/06/14(日) 01:03:25test *ts = new test();
}
main(){
ts->draw();
}
みたいな事をしたいのですがtsが宣言されていないと怒られます
別の関数でクラスを使うにはどうすればよいのですか?
0379デフォルトの名無しさん
2009/06/14(日) 01:07:57もしくはそのポインタをグローバルスコープにするとか。
test *init() {
test *ts = new test();
return *ts;
}
int main() {
test *p = init();
p->draw();
}
0380デフォルトの名無しさん
2009/06/14(日) 01:09:170381デフォルトの名無しさん
2009/06/14(日) 03:37:40何か問題がありますか?
0382デフォルトの名無しさん
2009/06/14(日) 03:45:51ループを納めるためだけのクラスだとしたらあまりお勧めはしないが
0383デフォルトの名無しさん
2009/06/14(日) 04:25:25WTL::CMessageLoopとかboost::asio::io_serviceとか、
言わばループを提供することが主目的のクラスだっておかしくない。
0384デフォルトの名無しさん
2009/06/14(日) 09:29:42で質問したのですが返答をいただけなかったのでこちらで。
練習でブラウザを作っています。
JavaScriptを無効にしてページを開けるようにしたいと考えています。
Windowsフォームアプリケーションの関数だけで可能でしょうか。
それともCOMなどの知識が必要でしょうか。
環境はVC++2008EEです。
0385デフォルトの名無しさん
2009/06/14(日) 12:21:49class CHoge {
0386デフォルトの名無しさん
2009/06/14(日) 12:24:00コンストラクタからvirtualメンバ関数を呼び出すと危ないらしいですが
class CHoge {
public:
CHoge() {CHoge::Method();};
virtual void Method() {...;};
};
のようにスコープを限定すれば完全に安全でいいんでしょうか?
0387デフォルトの名無しさん
2009/06/14(日) 12:54:280388デフォルトの名無しさん
2009/06/14(日) 13:01:580389デフォルトの名無しさん
2009/06/14(日) 13:16:090390デフォルトの名無しさん
2009/06/14(日) 13:21:24そんなことしなくてもコンストラクタ内では virtual 関係なく
いつでも CHoge::Method() が呼ばれる
0391デフォルトの名無しさん
2009/06/14(日) 13:28:47デストラクタで自動的に解放するコードを書くと、そのクラスを使用する関数以外で
クラスオブジェクトの作成ができなくなる
何故なら関数終了後に自動的に解放され、別関数でクラス使用時にはオブジェクトの
実体がないから
デストラクタで自動解放コードを書かなきゃいいとか言われそうだが
0392デフォルトの名無しさん
2009/06/14(日) 13:34:15オブジェクトのライフタイムを考えてちゃんと設計しろ。
0393デフォルトの名無しさん
2009/06/14(日) 13:44:35>関数とクラスの良い部分が打ち消しあっているような気がする
それは認識不足、判断するのが早すぎ。
・・・こうして、オブジェクト指向排斥派が生まれていくのか・・・
0394デフォルトの名無しさん
2009/06/14(日) 13:51:08わかってるつもりでわかってない。
0395デフォルトの名無しさん
2009/06/14(日) 14:14:23Windowsフォームアプリケーションプロジェクトを作成し、フォームにWebBrowserコンポーネントを配置。
ビルドして適当なURLをドラッグ&ドロップ。
0396デフォルトの名無しさん
2009/06/14(日) 15:02:24その場合、どのようなデザインパターン(クラス間の関係)を持たせれば効果的でしょうか、
それとも、別にコールバック専用クラスを作りFoo、Hogeの基底クラスとするのがよい設計なのでしょうか?
0397デフォルトの名無しさん
2009/06/14(日) 15:04:00×呼び出される側がHogeで、呼び出す側がHogeのような、コールバック関数がある場合ですが
○呼び出される側がFooで、呼び出す側がHogeのような、コールバック関数がある場合ですが
0398デフォルトの名無しさん
2009/06/14(日) 15:12:51ただのC言語にはテンプレートみたいなのない?
たとえば(x^2+y^2)をreturn返す関数を作りたいとき
func(int x,int y){
}
func2(double x,double y){
}
みたいにいっぱいつくらにゃならんの?
0399デフォルトの名無しさん
2009/06/14(日) 15:15:59その例だったら全部 double でおk
0400デフォルトの名無しさん
2009/06/14(日) 15:30:501.(デフォルト)コンストラクタ
2.コピーコンストラクタ
3.代入演算子
4.デストラクタ
1と2は別として、3と4については解説書/サイトによってバラバラなのが気になる。
解説用に、シンプルなコードにするため書いてないだけなのか、
目的やシングルトンの実装方法によって変わるというだけなのか。
0401デフォルトの名無しさん
2009/06/14(日) 15:40:27Boost.FunctionやBoost.Signalsとか
>>398
#defineでがんばれ
0402400
2009/06/14(日) 15:40:48参考にした本が古かったのかしら?
>>398
・全部書く
・簡単な処理であればマクロ(#define)で書く
・>399のように、互換性のあるもので誤魔化す。共用体とか。
この辺でどうだろう?
0403デフォルトの名無しさん
2009/06/14(日) 16:15:23デバッグ時のリンク処理に時間がかかるので、
#if DEBUG
SOME_BMP "BITMAP" "./BMP/some_bmp.bmp"
#else
...
#endif
というようにしてデバッグに必要なリソースのみ読み込むようにしたのですが
*.rcファイルにはプリプロセッサの命令は使えないようでうまくいきません。
一行ずつコメントアウトするしかないのでしょうか
0404デフォルトの名無しさん
2009/06/14(日) 16:33:24>>396-397 です
いい感じですね、楽できそうですThx
0405デフォルトの名無しさん
2009/06/14(日) 17:40:48普通にプリプロセッサ使えるよ。
#ifじゃなくて#ifdefとか、rc.exeの/dオプションで渡してないとか
0406デフォルトの名無しさん
2009/06/14(日) 20:08:30コピー代入演算子が呼び出し可能なら singleton = singleton の代入を許すことになる。
インスタンスをひとつにするシングルトンとしては基本的に想定してない動作だろうから
private にしといたほうがいいかもしれない。
デストラクタが呼び出し可能なら singleton.~singleton() を許すことになる。
シングルトンが勝手に破棄されちゃ困るだろうから private にしとくべきだろう。
0407デフォルトの名無しさん
2009/06/14(日) 20:56:47さんくす。
デストラクタって明示的に呼び出せるんですね。知りませんでした。
0408デフォルトの名無しさん
2009/06/14(日) 22:13:31グローバルでオブジェクトを作成するとDXの初期化が済んでいないので
エラーになります。
いろんな関数で使いたいのですがどうすればいいでしょうか?
クラス化をあきらめた方が良いでしょうか?
0409デフォルトの名無しさん
2009/06/14(日) 22:14:31グローバルで作るのをあきらめろよ。
0410407
2009/06/14(日) 22:18:03>408
DirectXは詳しくないんだけど、シングルトンパターンはどうだろうか。
0411デフォルトの名無しさん
2009/06/14(日) 22:19:030412デフォルトの名無しさん
2009/06/14(日) 22:22:34クラス化あきらめると何とかなるの?
なるならやればいいじゃない
0413デフォルトの名無しさん
2009/06/14(日) 22:58:20フォントを生成しなおさなければなりませんでした。
ひょっとしたらやり方が間違ってるかもしれませんが。
おとなしくクラス化をあきらめます。
0414デフォルトの名無しさん
2009/06/14(日) 23:11:39>ひょっとしたらやり方が間違ってるかもしれませんが。
おそらく間違ってる。
実装方法は正しくとも、使い方を間違えてるかもしれない。
0415デフォルトの名無しさん
2009/06/14(日) 23:51:21ちらっとしらべたら代入しかできなというような書き込みを射たのですが。
class Window
{
private:
WNDCLASS wc;
・
・
・
Window(HINSTANCE hInstance, WNDPROC windowProc, PTSTR appName) : wc???
???で初期化です。
お願いします。
0416デフォルトの名無しさん
2009/06/15(月) 00:02:45ソースが長く見づらいので複数に分割しようと思っているのですが
作った関数をどのファイルからでも呼べるようにするには
分割した一つ一つにexternを書かないとだめですか?
何か共通のヘッダファイルとかを作って
どこからでも呼べるようにとかは出来ないんでしょうか?
0417デフォルトの名無しさん
2009/06/15(月) 00:03:18でも結局、
グローバルでポインタ宣言
初期化部でフォントセット
描画
と3つの手順を踏む必要があり、関数ベースと手間が変わらないので
なんだかなぁって感じ
コンストラクタでフォントセットしたかったけど、それだとDXの初期化前でNGだし
DX絡みはいろいろと面倒やね
多分、テクスチャとかその他諸々も全てこのタイプになるんだろうな
0418デフォルトの名無しさん
2009/06/15(月) 00:04:13何もいらない。ただ使いたい場所の直前で、
関数のプロトタイプ宣言すればいいだけ。
え?無名の名前空間に入れちゃった?
0419デフォルトの名無しさん
2009/06/15(月) 00:10:440420デフォルトの名無しさん
2009/06/15(月) 00:10:45フォントクラスのインスタンスをグローバルに置けば、
そりゃグローバル変数と同じようなタイミングで初期化されるさ。
それを防ぐためには、DirectXの初期化を行ったあとに
インスタンスが生成されるようにすればいい。
0421420
2009/06/15(月) 00:12:57>グローバルでポインタ宣言
ポインタをグローバルに置く必要ないと思うよ。
0422デフォルトの名無しさん
2009/06/15(月) 00:29:59学校の問題で分からないところがあったので質問をしたいんですが
0423デフォルトの名無しさん
2009/06/15(月) 00:32:180424デフォルトの名無しさん
2009/06/15(月) 00:37:33よく見かける、名前につられて正解を見失う
または、目的と手段が講じて 手段が目的になる。
0425デフォルトの名無しさん
2009/06/15(月) 00:47:450426デフォルトの名無しさん
2009/06/15(月) 00:49:17宿題スレへどうぞ
0427デフォルトの名無しさん
2009/06/15(月) 00:51:01すいません、板を検索したらありました。
ご迷惑をおかけしました
0428デフォルトの名無しさん
2009/06/15(月) 00:55:48一難面白い発言に。
>と3つの手順を踏む必要があり、関数ベースと手間が変わらないので
>なんだかなぁって感じ
そうなったからと言って、クラスの最大の利点であるカプセル化が無くなる訳
ではない。それに、コンストラクタやディストラクタ以外に初期化や終了メソッド
が必要になるのは、ごく普通にある。
0429デフォルトの名無しさん
2009/06/15(月) 00:59:160430デフォルトの名無しさん
2009/06/15(月) 00:59:34どこかのソースコードで勉強すれば定石わかるんじゃないの?
0431デフォルトの名無しさん
2009/06/15(月) 01:33:41今簡単なプログラムで試してみたら思い通りに出来ました。
以前は呼ばれる先と元で両方宣言しないといけないと勘違いしていて
おかしい書き方をしていました
仰るとおり素直に書いたら出来ました
ありがとうございます
0432デフォルトの名無しさん
2009/06/15(月) 01:42:16同一翻訳単位内で複数回インクルードした場合の処理など、
C++のファイル分割は学ばなければならないことが多い。大弱り。
0433デフォルトの名無しさん
2009/06/15(月) 01:59:270434デフォルトの名無しさん
2009/06/15(月) 02:51:06どの関数からも使えるようにするにはグローバルに置くしかないっしょ
0435デフォルトの名無しさん
2009/06/15(月) 03:09:35アドバイスをお願いします。
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
0436435
2009/06/15(月) 03:10:33#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)
0437デフォルトの名無しさん
2009/06/15(月) 03:11:10つまり、どの関数からも使う、わけではないという話だったわけですね
0438デフォルトの名無しさん
2009/06/15(月) 03:24:34遅らせると思うんだが。
シングルトンが使えてないほうに、俺も一票いれておく。
0439デフォルトの名無しさん
2009/06/15(月) 03:28:12Class0::Class0( ){ }
をコメントにしてみれば?
0440デフォルトの名無しさん
2009/06/15(月) 03:36:01これどこかcppファイルに移すか、inlineにしろ。
0441デフォルトの名無しさん
2009/06/15(月) 03:42:27Class0.hpp9行目のClass0::Class0( ){ }がmain.cppとClass1.cppの両方で実体化されるので、
リンカはどっちを使えばいいのか分からなくてエラーを吐いてる。
解決方法は>>439-440
0442デフォルトの名無しさん
2009/06/15(月) 05:20:26クラスとかの初歩的な利点というか特徴はわかるんですが・・・
0443デフォルトの名無しさん
2009/06/15(月) 07:47:24大規模なプログラムでもプログラムを細かな「粒」に分ける事が
できるので管理しやすくなる。つまりバグが取れやすくなり、一人で
開発したとしても扱える行数が増える
0444デフォルトの名無しさん
2009/06/15(月) 07:48:50粒に分解されるので手間が増えてパッと見直感的にプログラムの
動きが理解しにくくなる
0445デフォルトの名無しさん
2009/06/15(月) 08:06:330447デフォルトの名無しさん
2009/06/15(月) 11:43:05できるなら解説or詳しく書かれたサイトなどお願いします
0448デフォルトの名無しさん
2009/06/15(月) 13:08:27んなことない。
もちろん、C++の正確な仕様とかを持ち出したら異なるかもしれないが、
少なくとも>434が意識してるような意味で「グローバル」ではないと思う。
>447
>C/C++エディタでperlを一緒に使って変数などを渡したり
すまん、知識不足で俺には質問の意味が分からなかった。
0449デフォルトの名無しさん
2009/06/15(月) 13:23:280450448
2009/06/15(月) 13:31:24かなあ?
ExcelにおけるVBAマクロ、xyzzyにおけるLisp拡張みたいな感じで、
エディタにperl(実行環境)を組み込む……という風に読んだんだが。
0451デフォルトの名無しさん
2009/06/15(月) 13:33:58> C/C++エディタ
って具体的にどういう物?
0452447
2009/06/15(月) 13:36:17Cファイル内でperlの関数を使ったり両言語をごちゃ混ぜに使ったりということだったんですが
PHPの関数は呼び出すことができそうなのでそっちをやってみるつもりです
0453デフォルトの名無しさん
2009/06/15(月) 13:39:470454デフォルトの名無しさん
2009/06/15(月) 13:44:52http://d.hatena.ne.jp/moriyoshi/20080323/1206296385
ここでやってるらしいです
0455デフォルトの名無しさん
2009/06/15(月) 13:52:18見たこと無い
perlの文法的にC++のソースと混ぜられないんじゃないかなぁと思う
有るにしてもperlのライブラリをlinkして、perlスクリプトファイルを読み込ませて実行とかいう形になりそう
http://www.johnkeiser.com/perl-xs-c++.html
http://d.hatena.ne.jp/moriyoshi/20090401/1238563318
http://www.magicvox.net/archive/2005/10221914/
0456デフォルトの名無しさん
2009/06/15(月) 14:03:150457デフォルトの名無しさん
2009/06/15(月) 14:11:550458デフォルトの名無しさん
2009/06/15(月) 14:16:180459デフォルトの名無しさん
2009/06/15(月) 14:55:44やっぱ標準っぽいtr1のほうが使うこと多いですか?
0460デフォルトの名無しさん
2009/06/15(月) 18:21:43windows xp sp3
gcc 4.40 (g++)
C++
コンパイルオプション特になし
char buffer[1024];
while (fgets(buffer, 1024, fp))
{
printf(buffer);
}
こんな感じで単純にテキストファイルから読み込んで行単位で表示させようとしているのですが、
テキスト内に”%20”がある行に達すると、「アプリケーションエラー ○×のメモリーがread〜」で終了してしまいます。
buffer[1024]を大きくしてみたりしましたがだめでした。どのように対処すればよろしいでしょうか?
0461デフォルトの名無しさん
2009/06/15(月) 18:23:46と、正しく書く。
0462デフォルトの名無しさん
2009/06/15(月) 18:24:04buffer内に%があるので、フォーマット文字列として解釈しようとしています。
fputs(buffer, stdout)とすればOK。
0463デフォルトの名無しさん
2009/06/15(月) 18:29:51>>462
なるほど、原理がわかりました
ありがとうございます!
0464デフォルトの名無しさん
2009/06/15(月) 19:21:41fgetsでやれればいいのですが速度が欲しいので一気に読みたいのです
0465デフォルトの名無しさん
2009/06/15(月) 19:30:190466デフォルトの名無しさん
2009/06/15(月) 19:41:540467デフォルトの名無しさん
2009/06/15(月) 20:57:020468デフォルトの名無しさん
2009/06/15(月) 21:01:080469デフォルトの名無しさん
2009/06/15(月) 22:29:290470デフォルトの名無しさん
2009/06/15(月) 22:32:430471デフォルトの名無しさん
2009/06/15(月) 22:33:420472デフォルトの名無しさん
2009/06/16(火) 02:00:510473デフォルトの名無しさん
2009/06/16(火) 02:04:300474デフォルトの名無しさん
2009/06/16(火) 02:13:26staticなメソッドなら大丈夫かしら?
0475デフォルトの名無しさん
2009/06/16(火) 02:26:060476デフォルトの名無しさん
2009/06/16(火) 02:26:55まずそちらを解放してからでないとメモリリークが起きるけどな
0477デフォルトの名無しさん
2009/06/16(火) 02:27:49普通のやり方でしょうか?
あと、DWORDとunsigned intは違う型でしょうか
0478デフォルトの名無しさん
2009/06/16(火) 03:13:11普通
>DWORDとunsigned int
typedef unsigned long DWORD;
だから違う
0479デフォルトの名無しさん
2009/06/16(火) 03:44:44細心の注意を払って、限定された状況で、十分なコメントをつけたのなら、
してもよい。
0480デフォルトの名無しさん
2009/06/16(火) 04:35:320481デフォルトの名無しさん
2009/06/16(火) 05:29:44memcpy
0482デフォルトの名無しさん
2009/06/16(火) 08:58:35馬鹿?
初期データの構造体が既にあるなら単に代入でいいじゃん。
それとも、そんなことさえできなかったC89以前のCしか知らないロートル?
0483デフォルトの名無しさん
2009/06/16(火) 09:18:16MS風の構造体は型が一致しないことも結構ある
memcpy でおk
0484デフォルトの名無しさん
2009/06/16(火) 09:21:17"MS風の構造体" って何?
型が一致しないって何?
memcpy でおkとか言うのはおかしいな。
そんな特殊な状況じゃないなら、 memcpy は不要。
代入でいい。
0485デフォルトの名無しさん
2009/06/16(火) 09:28:350486デフォルトの名無しさん
2009/06/16(火) 09:29:56MS風っていうのは上書きするための構造体みたいな…
ビットマップとか互換性のために同名の構造体でも
サイズが違うとかそういう奴のつもり
0487デフォルトの名無しさん
2009/06/16(火) 09:34:40「上書き」って何?しかも「みたいな」って。
サイズが違うって何のサイズのこと言ってんの? sizeof 〜 のこと?
違うっていうからには何か2つ以上のものを比べて言ってるんだよね?
「ビットマップ」?構造体じゃないし。
エスパーと話してるんじゃないんだ。普通にしゃべってくれ。
0488デフォルトの名無しさん
2009/06/16(火) 09:36:150489デフォルトの名無しさん
2009/06/16(火) 09:36:32まぁ、あんまり虐めてやるな。
0490デフォルトの名無しさん
2009/06/16(火) 09:37:220491デフォルトの名無しさん
2009/06/16(火) 09:39:35というわけで、
初期設定された構造体を作っておいて代入、
でいいよ。
C++ ならコンストラクタ使う、って手もあるな。
0492デフォルトの名無しさん
2009/06/16(火) 10:58:06map<型, 型>::value_type(値,値)
piar<型, 型>(値,値)
ともう一個、型をまったく指定しないで挿入するのありましたよね?
見たはずなんですけど検索で見つけられなくなっちゃった。
お願いします
0493480
2009/06/16(火) 11:04:430494デフォルトの名無しさん
2009/06/16(火) 11:10:17「見つけられなくなっちゃった。お願いします」と言われても、
どうやって検索していたのかも判らないのに対処できませんが。
取り敢えず、「頑張って探してください」とだけ。
0495デフォルトの名無しさん
2009/06/16(火) 11:31:060496デフォルトの名無しさん
2009/06/16(火) 11:44:05その後に、動的に MultiLine かどうかを変えたい場合
http://hp.vector.co.jp/authors/VA024411/vbtips03.html
を眺めていると、MaltiLine に切り替えるメッセージが見つからないのですが、
CreateWindow で新規作成する時以外では、
マルチラインかどうかの切り替えって不可能なのでしょうか?
よろしくお願いします。
0497デフォルトの名無しさん
2009/06/16(火) 11:52:04>>495
ありがとうございます!
応援してもらったおかげで直ぐ見つかりました!
ちなみに
make_pairでした。
0498デフォルトの名無しさん
2009/06/16(火) 12:44:54WinAPIスレへどうぞ。
つーか、最初からMultiLineで作って自前で1行に制限しちゃいかんのかな。
0499デフォルトの名無しさん
2009/06/16(火) 12:47:00そこ見てみたけどスタイルの変更でできるんじゃないの
0500デフォルトの名無しさん
2009/06/16(火) 13:15:52ES_MULTILINE
まさかとは思うが、MALTIで検索して見つからなかったとか?w
0501デフォルトの名無しさん
2009/06/16(火) 16:24:59というエラーが出てコンパイルできません
http://www.vector.co.jp/soft/win95/prog/se432866.html
>インクルードパスの通ったディレクトリに下記のファイルをコピーします
Visual studio 2008 で作業をしているのですが、
インクルードパスの通ったディレクトリ、とは
どこのことを指しているのでしょうか…?
0502501
2009/06/16(火) 16:33:26http://sip.sci.shizuoka.ac.jp/
>C:/Program Files/Microsoft Visual Studio/VC98/Include
C:\Program Files\Microsoft Visual Studio 9.0\VC\include
壱から九まで早八年
あまり世界は変わってはいなかったのでした…
0503デフォルトの名無しさん
2009/06/16(火) 16:37:52オプション-ツールからそのディレクトリを設定。
というやりかた覚えておけば、その設定するところを見ればすでに登録されてるディレクトリがわかるぜ。
0504デフォルトの名無しさん
2009/06/16(火) 18:37:460505デフォルトの名無しさん
2009/06/16(火) 18:38:430506デフォルトの名無しさん
2009/06/16(火) 18:40:13一緒に勉強しましょう。とりあえず、何か良い本ないですかねぇ。
0507デフォルトの名無しさん
2009/06/16(火) 18:40:400508デフォルトの名無しさん
2009/06/16(火) 18:45:350509504
2009/06/16(火) 18:49:30最初OpennSSLでやろうとしたが上手くいかず、ライブラリもみんなリンク切れになってて、
他言語の関数を使おうとしてもXS?とかいうのがうまくいかずLinux用の関数があると知ったがVC++に移植は難しいというところで詰まってます
0510デフォルトの名無しさん
2009/06/16(火) 19:12:35実装パターンが多く、なおかつコンストラクタの引数のとり方も様々となった場合
下のように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&);
};
0511デフォルトの名無しさん
2009/06/16(火) 19:25:25void hoge()
{
test* ts = test::getinstance();
}
void aho()
{
test* ts = test::getinstance();
}
void baka()
{
test* ts = test::getinstance();
}
みたいに使う関数内でいちいちこう書かないといけないんだろ?
めんどくさ。
0512デフォルトの名無しさん
2009/06/16(火) 19:25:54それは単にあなたが、インテリそうな人間を見つけるたびに
ムシの良い乞食みたいなお願いばっかしてるからでしょう。
0513デフォルトの名無しさん
2009/06/16(火) 19:29:27ノブレスオブリージュでインテリはこじきに奉仕しろよ^^
0514デフォルトの名無しさん
2009/06/16(火) 19:34:16とりあえず暗号化したいだけ → Win32 CryptoAPI
俺俺コード詐欺 → Crypto++
0515デフォルトの名無しさん
2009/06/16(火) 19:35:05レスどうもです。
そもそも CreateWindow 以降で
ES_xxx を使ってスタイルを変えれることを知りませんでした。
ありがとうございました。
0516デフォルトの名無しさん
2009/06/16(火) 20:04:55画面キャプチャをして、.jpgファイルで保存するソフトを作ったんだよ。
GDI+は初めて使ったから苦労したよ。
で、vectorにうpしたいんだけど、やり方がわからないから困っているんだ。
その気のある人は教えてくれるとうれしいよ(´・ω・`)。
0517デフォルトの名無しさん
2009/06/16(火) 20:05:47C++で作ったからこのスレに聞いたんだよ(´・ω・`)。
0518デフォルトの名無しさん
2009/06/16(火) 20:08:580519デフォルトの名無しさん
2009/06/16(火) 20:10:42Win32 CryptoAPIってどこでダウンロードできます?
MSDNで日本語のチュートリアルやら何やら全て無いらしいですが
0520デフォルトの名無しさん
2009/06/16(火) 20:47:29自己顕示のためにVectorを利用しないでください。
ネット資源の無駄です。
0521デフォルトの名無しさん
2009/06/16(火) 20:54:04Windows SDKとかPlatform SDKに普通に含まれてるよ。
日本語マニュアルは無いけど手順通りにAPI呼ぶだけだから、
この辺↓をスタートにググってみるとか。
http://msdn.microsoft.com/en-us/library/aa382019.aspx
http://msdn.microsoft.com/en-us/library/aa382358.aspx
0523デフォルトの名無しさん
2009/06/16(火) 21:39:420524デフォルトの名無しさん
2009/06/16(火) 22:20:54なんでマニュアル読まないの?そのWinshot的なものはバグまみれだったりしないの?
0525デフォルトの名無しさん
2009/06/16(火) 22:33:21仮想関数の引数をサブクラスで変える事ができないのと同じように、
コンストラクタの引数も変えられないと考えるのが普通かな(デフォルトコンストラクタあるいは決まった引数のコンストラクタを使う)。
あえてやるなら、boost::anyを1つ取るコンストラクタに統一すれば、実質サブクラス毎に引数を変える事はできる。
0526デフォルトの名無しさん
2009/06/16(火) 23:19:13別人だが、そう言われると俺もネット資源の無駄でしかないのだろうかと…
0527デフォルトの名無しさん
2009/06/17(水) 00:08:29どうやって場合わけすれば良いですか?
何か典型的な場合分けの方法がありますか?
0528デフォルトの名無しさん
2009/06/17(水) 00:12:300529デフォルトの名無しさん
2009/06/17(水) 00:13:46−1.#INDなんとかかなんかなのですがググってもよくわかりませんでした
0530デフォルトの名無しさん
2009/06/17(水) 00:24:13if文で判断して0を渡していいんだけ?
0531デフォルトの名無しさん
2009/06/17(水) 00:26:10何故エラーになるのか分かると思うよ。
0532デフォルトの名無しさん
2009/06/17(水) 00:26:45確か ES_MULTILINE だけは後から変更できなかったんじゃなかったっけ?
スタイルのようで実質は違うコントロールだった気がする
誰か分かる人ツッコミよろ
0533デフォルトの名無しさん
2009/06/17(水) 00:27:44atan2に渡す直前が0と同値かでやったらできそうですね、多分
ありがとうございました
0534デフォルトの名無しさん
2009/06/17(水) 08:00:42試したら変わらなかった
ES_CENTERとかは変えられたけど
DestroyWindowしてCreateしなおせばいいのかな
0535デフォルトの名無しさん
2009/06/17(水) 15:05:11DLLだけ差し替えて機能切り替えみたいなことってできますか?
0536デフォルトの名無しさん
2009/06/17(水) 15:28:240537デフォルトの名無しさん
2009/06/17(水) 20:39:10悪いのはatan2ではなく、そこに渡す引数がおかしいんじゃないの?
普通は90度でも別に変な値は返さないぞ。
あと、#indはNaNのこと。
0538デフォルトの名無しさん
2009/06/17(水) 20:55:59atan2(0, 0) になってるか
片方の数値が NaN になってるか
0539デフォルトの名無しさん
2009/06/18(木) 00:45:56hoge.hとhoge.cppのどちらで#include<cmath>を書いたら良いのでしょうか?
好みの問題かもしれませんが、意見を頂きたいです。
0540デフォルトの名無しさん
2009/06/18(木) 00:49:49ヘッダファイルで必要ならインクルードしておく。
0541デフォルトの名無しさん
2009/06/18(木) 00:51:06とりあえずヘッダに書くのが基本
あまり見せたくないものは cpp に書く (機能分割してそのcpp内でしか使用されなくて、他の人と同時開発しているとき)
0542デフォルトの名無しさん
2009/06/18(木) 00:51:380543デフォルトの名無しさん
2009/06/18(木) 01:12:02vector<vector<string>>で実装するべきでしょうか
それともchar buffer[row][col][data]でいくべきでしょうか?
stlを使ったほうが変なバグは生みにくいと思うのですが
セル数が増えていくと重くなるようなきもしますし・・・
0544デフォルトの名無しさん
2009/06/18(木) 01:16:590545デフォルトの名無しさん
2009/06/18(木) 01:17:59どうしても遅かったら書き直せばいいじゃん
0546デフォルトの名無しさん
2009/06/18(木) 01:29:11vectorがよかろう
読み込む書式が決まっているのなら、各行をstructにするのもいいかも
0547デフォルトの名無しさん
2009/06/18(木) 05:31:49速度は実測が基本。
最適化はボトルネックを絞り込んでから。
0548デフォルトの名無しさん
2009/06/18(木) 08:38:57環境は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);
みたいに指定しても結果は同じでした
原因と対策にお知恵を拝借できれば幸いです
0549デフォルトの名無しさん
2009/06/18(木) 08:41:390550デフォルトの名無しさん
2009/06/18(木) 08:42:020551デフォルトの名無しさん
2009/06/18(木) 08:45:43レスありがとうございます
確かにprintfは%dで表示してます
10進法で正しく表示するにはどうすればいいのか
今調べてますが良くわかりません
もし教えていただければ助かります
0552デフォルトの名無しさん
2009/06/18(木) 08:49:03解決しました
ありがとうございました
0553デフォルトの名無しさん
2009/06/18(木) 11:01:52参考書などをみてると普通に使ってたりしますしどちらがよいのでしょうか?
0554デフォルトの名無しさん
2009/06/18(木) 11:32:04使い方がわかっていれば使ってよいのだ。
ひとつは using の影響範囲、
もうひとつは using ディレクティブと using 宣言の違い、
この二つを理解していればどんどん使って良いぞ^^
0555デフォルトの名無しさん
2009/06/18(木) 11:35:210556デフォルトの名無しさん
2009/06/18(木) 11:42:57using std::cin;
using std::cout;
using std::endl;
この三行で十分
0557デフォルトの名無しさん
2009/06/18(木) 13:08:490558デフォルトの名無しさん
2009/06/18(木) 13:16:090559デフォルトの名無しさん
2009/06/18(木) 13:17:360560デフォルトの名無しさん
2009/06/18(木) 13:19:56foo::bar::CHoge hoge;
を
foo::CHoge hoge;
に変えたい時とか、using使えばできますか?
0561デフォルトの名無しさん
2009/06/18(木) 14:12:360562デフォルトの名無しさん
2009/06/18(木) 14:23:010563デフォルトの名無しさん
2009/06/18(木) 14:42:390564デフォルトの名無しさん
2009/06/18(木) 16:24:10フォルダ内に大量にファイルがあるとその数だけスレッドが出来るんですが、これなんこまでスレッドって作れるんですか?
5000スレッドとかになっても問題ないですか?
0565デフォルトの名無しさん
2009/06/18(木) 16:45:57各スレッドのスタックがデフォルトのままだと5000も作成できないだろうけど、
各スレッドのスタックサイズを小さくすれば作成できるかも知れない。
0566デフォルトの名無しさん
2009/06/18(木) 17:35:37namespace foo { using bar::CHoge; }
とか
namespace foo { using namespace bar; }
0567デフォルトの名無しさん
2009/06/18(木) 18:28:52そんなにスレッドを増やしたら、シングルスレッドの方が間違いなく早い。
言っとくが、スレッドオーバーヘッドでは無く、HDDのシーク時間が鬼のように
0568デフォルトの名無しさん
2009/06/18(木) 19:31:53テラサンクスです
0569デフォルトの名無しさん
2009/06/18(木) 21:37:15XP
borland C++
なんだが誰か教えてくれ。
0570デフォルトの名無しさん
2009/06/18(木) 22:08:310571デフォルトの名無しさん
2009/06/18(木) 22:45:26アイコンやSEを公開しないといけないなんていやだあああああ
0572デフォルトの名無しさん
2009/06/18(木) 22:49:200573デフォルトの名無しさん
2009/06/18(木) 23:13:49>const char *start = _binary_foo_jpg_start; // データの先頭のアドレスを取得
このアドレスをどう使えばいいんでしょうか。
例えば画像を読みたい場合、このアドレスをSDLなどのグラフィクライブラリの画像読み込み用APIに食わせれば普通に読めるんでしょうか。
0574デフォルトの名無しさん
2009/06/18(木) 23:16:38やり方はいろいろあるけど何を使うかでやり方は違うけどねえ
libpngとかだとメモリに上げたファイルから展開する方法もあるし
libjpegなんかそうじゃないのかな?
ファイルアクセス関数を別に作って実はメモリにあがってるデータにアクセスするようにしちゃうとか
0575デフォルトの名無しさん
2009/06/19(金) 13:22:57たとえば、vector< vector<int> >型など。
datasave(x,"c:\\d.dat"); dataload(x,"c:\\d.dat"); とできると良いのですが。
0576デフォルトの名無しさん
2009/06/19(金) 13:30:36データのシリアライズ問題は結構深遠なテーマだと思うんだけど…
0577デフォルトの名無しさん
2009/06/19(金) 14:11:17POD及びその集合くらいなら「時空を越えるオブジェクト」でぐぐれ。
複雑な型は↑が言うように設計時に考えておかないと難しい。
この辺りはJavaでもそうだな。
0578デフォルトの名無しさん
2009/06/19(金) 14:15:300579デフォルトの名無しさん
2009/06/19(金) 15:48:520580デフォルトの名無しさん
2009/06/19(金) 15:49:46typeof のことか
0581デフォルトの名無しさん
2009/06/21(日) 04:26:19algorithmはインクルードしてあります。
using namespace stdは自分のコードではしてないし、使ってるライブラリは標準とboostだけなので、これが原因とは思えません。
またソースファイルによってはstd::maxで問題なくコンパイルできます。
どんな原因が考えられるでしょうか?
0582581
2009/06/21(日) 04:35:03error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
0583デフォルトの名無しさん
2009/06/21(日) 04:36:15#undef maxでうまくいかないかな。
Boostの中で<windows.h>がインクルードされているということはないか?
もしそうだったら、先に#define NOMINMAXを定義しておけばいい。
0584デフォルトの名無しさん
2009/06/21(日) 04:54:45レスthx
#undef maxでうまくいきました。
#define NOMINMAXは変わらずエラーが出ました(インクルードの前に定義すればいいんですよね?)。
どこかでマクロが定義されたいたということでしょうか。
マクロは嫌ですね・・・。
0585デフォルトの名無しさん
2009/06/21(日) 06:11:290586デフォルトの名無しさん
2009/06/21(日) 06:13:48で、じゃあ、独自拡張のmaxが高性能化っていうと、標準未満の性能なんだ、これが。
0587デフォルトの名無しさん
2009/06/21(日) 06:25:10とかする。
0588デフォルトの名無しさん
2009/06/21(日) 06:41:47機能がどうこうってことじゃねぇ
0589デフォルトの名無しさん
2009/06/21(日) 12:18:12フィボナッチ定数を出力したいのですがどのように書くのでしょうか?
ただし数は1000を超えない数にしたいです
ここ見たのですが、これをどういう風にコードに書けばいいのかわかりませんでした
http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0
0590デフォルトの名無しさん
2009/06/21(日) 12:40:10enum {
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;
}
0591デフォルトの名無しさん
2009/06/21(日) 12:46:50コード長杉フイタ
0592デフォルトの名無しさん
2009/06/21(日) 12:50:440593デフォルトの名無しさん
2009/06/21(日) 12:51:570594デフォルトの名無しさん
2009/06/21(日) 12:53:34うちは面接でいつもそれを3分与えて紙に書かせてるけど、正答率2%
0595デフォルトの名無しさん
2009/06/21(日) 12:57:06これはパワハラに当たりますので訴えられる覚悟はしておいたほうがいいですよ
0596デフォルトの名無しさん
2009/06/21(日) 12:59:09ちなみにどうい業種なんでしょうか?
そのような嫌がらせに見える試験を出すようなところってw
0597デフォルトの名無しさん
2009/06/21(日) 13:12:43そういう篩のための問題なのだろうか?
0598デフォルトの名無しさん
2009/06/21(日) 13:22:06>>595-596は素人乙w
0599デフォルトの名無しさん
2009/06/21(日) 13:37:31- O(2^N) のアルゴリズム →10点
- O(N) のアルゴリズム → 40点
- O(log N) のアルゴリズム → 100点
ちなみに同じオーダーでもやり方は一通りじゃなかったりして結構おもしろい
0600デフォルトの名無しさん
2009/06/21(日) 13:51:160601デフォルトの名無しさん
2009/06/21(日) 13:52:240602デフォルトの名無しさん
2009/06/21(日) 13:53:34一般項の式が先に思いついた。暗記できないけど。
0603デフォルトの名無しさん
2009/06/21(日) 13:54:18O(1)の意味がわからない
ちょっとやってみてよ、見てみたい
0604デフォルトの名無しさん
2009/06/21(日) 13:58:05double phi = (1 + sqrt5) * 0.5;
fib_n = (long)floor(power(phi, n) / sqrt5 + 0.5);
0605デフォルトの名無しさん
2009/06/21(日) 14:01:24あとO log Nも多倍長整数だとO(N)までにしかならんし
テストでもO(N)まで知ってれば十分な場合が殆んどだと思う
0606デフォルトの名無しさん
2009/06/21(日) 14:04:47そそ。あくまでもカッコ付きの「O(1)の解」ねw
0607599
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) くらいにはなる
0608デフォルトの名無しさん
2009/06/21(日) 14:21:080609599
2009/06/21(日) 14:22:150610デフォルトの名無しさん
2009/06/21(日) 14:22:380611デフォルトの名無しさん
2009/06/21(日) 14:26:34出題者がそこまで考えてるって前提があるのなら、基礎知識の問題としては典型だといえるよ
0612デフォルトの名無しさん
2009/06/21(日) 14:29:04出番があるから使うんじゃなくて、何に使うかわからんけど勉強さえしとけばいつでも出番があるような関数群なの?
一つも使ったことないんだけど・・・
マルチスレッドで中身のないループ書くと、CPU使用率MAXになるのを回避するためにSleep(10)とか入れると0%になるんだけど
これ、なんかごまかしてるみたいでやなんだけどSleepのなかで待機してるなら結局ループでCPU使用率上がらなきゃおかしいと思うんだけど、
CPU使用率上がるループと上がらないループって何が違うの?Sleepの中でなにやってるの?
0613デフォルトの名無しさん
2009/06/21(日) 14:34:490614デフォルトの名無しさん
2009/06/21(日) 14:36:12O(n)は普通に3分で出来るだろうね
一応、フィボナッチの定義ぐらいは問題文に含めてあげて
>>612
sleep中は別の人が別の仕事をしてるんだよ
誰も仕事がなければただ寝てるだけ
0615デフォルトの名無しさん
2009/06/21(日) 14:44:4810分後にセットした目覚まし時計とにらめっこして鳴るのを待ち続けるのが空ループ
当然目と耳を澄まして待ち構えてないといけないから気は抜けない(CPU使用率が高くなる)
0616デフォルトの名無しさん
2009/06/21(日) 15:34:32は関数じゃないよね?
Sleepは仮眠するために何やってるかを分解するにはアセンブラになるってこと?
仮眠するにも必ず10分経ったかを毎回確認しなきゃいけないと思うんだけど
CPU使わないSleepの為の待機命令ってなに?
Sleep
{
wait(10);
count--;
if(count = 0) return;
}
みたいなことしてると予想するんだけど結局じゃあwaitの中は何ってなるんだけど
0617デフォルトの名無しさん
2009/06/21(日) 15:36:47最終的に何かOSで統合的に待ちを管理してるのは分かったけど
その命令ってなに?
0618デフォルトの名無しさん
2009/06/21(日) 15:38:000619デフォルトの名無しさん
2009/06/21(日) 15:38:03while(1){}
無限ループ
自分が書いてるプログラムもOSなどから見れば所詮はタスクかスレッドに過ぎないので
OSなどが用意してるAPIを呼び出すと所定時間だけ実行が停止した後、また復旧できる
というか環境書いてよ
0620デフォルトの名無しさん
2009/06/21(日) 15:39:060621デフォルトの名無しさん
2009/06/21(日) 15:44:47WindowsXPのC++9です
なにか命令があるなら教えてください。詳しくは調べます
0622デフォルトの名無しさん
2009/06/21(日) 15:45:17・実行中状態(CPUが1つなら1つ)
・実行可能状態
・待ち状態(イベント待ち状態)
で管理している。
タイマ割り込みを設定して、待ち状態に放り込むと、
そのプロセスは時間が来るまで停止する。
その間は、他のプロセスやOSがCPUを使っている。
0623デフォルトの名無しさん
2009/06/21(日) 15:56:05わかりましたが、やっぱりプロセスを回すための時間を管理するループはCPUを使ってないことになるんですが
これはタスクマネージャはその計算を除外していて見えないだけということですか?
0624デフォルトの名無しさん
2009/06/21(日) 15:59:240625622
2009/06/21(日) 16:01:54タイマ割り込み自体は、非常に細かい時間間隔で常に動いている。
OSはさらにそれを使って、もうちょっと長い指定の待ち時間を実現する
タイマ機能を実装している。sleepとかはそれを使っている。
で、ここが重要だが、OSがそういうタイマ処理をしている時間は、
「OSの実行時間」だから、個別のプロセスの実行時間に含まれない。
Linuxの例
ttp://d.hatena.ne.jp/naoya/20080122/1200960926
0626デフォルトの名無しさん
2009/06/21(日) 16:13:18タスクマネージャはプロセスだけでC++はプロセスしか作れないから
どんな命令があろうと結局CPU時間が見えてしまうから、プログラムで作るソフトはSleepでCPU使用率が少ないように見せる適当な数値で待機
させるのが限界だと気づいた。>>619がやっとわかった
ありがとう
0627デフォルトの名無しさん
2009/06/21(日) 17:01:59馬鹿なこと聞いてると思うんだが、O(2^N) ってどうやるの?
0628デフォルトの名無しさん
2009/06/21(日) 19:01:28http://www.bohyoh.com/CandCPP/C/Library/vsprintf.html
http://www.geocities.jp/ky_webid/c/057.html
0629デフォルトの名無しさん
2009/06/21(日) 19:02:140630デフォルトの名無しさん
2009/06/21(日) 19:05:46vはvariadicだ
0631デフォルトの名無しさん
2009/06/21(日) 19:07:170632デフォルトの名無しさん
2009/06/21(日) 19:08:150633デフォルトの名無しさん
2009/06/21(日) 19:09:14VAriableのVA
0634デフォルトの名無しさん
2009/06/21(日) 19:09:200635628
2009/06/21(日) 19:11:13>>630さんの英字をググッタら↑でてきました。
variadic arguments でした。ちなみにvariadicって何ぞや?と思ったところ
↓でした。
http://dictionary.goo.ne.jp/srch/ej/variadic/m0e/
答えてくださったみなさん、ありがとうございました。自分では、答えが思いつかないわけだ。。
聞いたこともない単語でした。
0636デフォルトの名無しさん
2009/06/21(日) 19:18:490637デフォルトの名無しさん
2009/06/21(日) 19:45:28だが〜dicがなにかわからん
0638デフォルトの名無しさん
2009/06/21(日) 19:52:130639デフォルトの名無しさん
2009/06/21(日) 19:59:35http://en.wiktionary.org/wiki/-adic
hm
0640デフォルトの名無しさん
2009/06/21(日) 20:01:44vari + adic ってわけだ
http://en.wiktionary.org/wiki/-adic
0641デフォルトの名無しさん
2009/06/21(日) 20:05:100642デフォルトの名無しさん
2009/06/21(日) 20:13:42「〜個の引数を取る」っていう接尾詞か
マニアックすぎるw
0643デフォルトの名無しさん
2009/06/21(日) 23:18:37public:
B b;
}
class B{
public:
A a;
}
このようなお互いがお互いの実体を持つクラスは作れませんか?
似たような代替でも良いです
0644デフォルトの名無しさん
2009/06/21(日) 23:21:040645デフォルトの名無しさん
2009/06/21(日) 23:21:43実体は無理
ポインタならおk
0646デフォルトの名無しさん
2009/06/21(日) 23:22:38もし、お互いが実体を持ったら、a.b.a.b.a.b.a.b.・・・と無限に実体が存在し、
無限のメモリが必要になるので、そもそも不可能。
代替としては、どちらか一方もしくは両方が、相手をポインタで指すようにすればいいよ。
0647デフォルトの名無しさん
2009/06/21(日) 23:30:51サンプルをお願いします
0648デフォルトの名無しさん
2009/06/21(日) 23:35:07class A{
public:
B* b;
};
class A;
class B{
public:
A* a;
};
0649デフォルトの名無しさん
2009/06/21(日) 23:35:23降臨回答よろしく
0650デフォルトの名無しさん
2009/06/21(日) 23:39:44コンポジションは無理だから
0651デフォルトの名無しさん
2009/06/21(日) 23:43:56作れるんだろ?wwwwwwwwwwwwwwwwwwwwwwwwww
作ってみろやwwwwwwwww
0652デフォルトの名無しさん
2009/06/21(日) 23:48:06struct A {
struct B b;
};
struct B {
struct A a;
};
というのは>>646さんの言う通り無限にメモリを必要とするから無理
C++だからダメというわけじゃない
元々無理なの
0653デフォルトの名無しさん
2009/06/21(日) 23:51:05こんなクラスのプロトタイプはどう宣言しますか?
class A{
public:
void test();
}
0654デフォルトの名無しさん
2009/06/21(日) 23:54:59int fib(int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n - 1) + fib(n - 2);
}
0655デフォルトの名無しさん
2009/06/22(月) 00:15:28嘘をつかれて悔しかったの?
0656デフォルトの名無しさん
2009/06/22(月) 00:48:32あー、確かに。
素直にforで回せばいいものを(笑)
0657デフォルトの名無しさん
2009/06/22(月) 07:42:04vector配列の参照が文字数が長いため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 ){
}
}
0658デフォルトの名無しさん
2009/06/22(月) 11:03:49結果をプールすることに気づけば>654のような再帰版でも及第。
0659デフォルトの名無しさん
2009/06/22(月) 11:08:28コンパイルできているなら、エラーが出るのは別の原因じゃないか?
その恐ろしく無様なクラスの詳細が判れば別だが。
先ずは、vStaticBoxなるメンバの型を確認することお勧め。
# つーか、そいつがvectorの実体なら、vector<CStaticBox *> & vSBにでもしろよ。
0660644
2009/06/22(月) 12:45:22嘘つきました
実は何も知らなかったんです
いじめないで〜><
0661デフォルトの名無しさん
2009/06/22(月) 14:30:28Tがconstの有無だけしか違わないクラスのprivateメンバを参照したい場合には、
どのような方法を取るのが一般的なのでしょうか?
例えばHoge<const int>のコピーコンストラクタでHoge<int>を受け取りたい場合などです。
friendやreinterpret_castなどしか思い付かないのですが、
もっと良い定石があるのでしょうか?
0662デフォルトの名無しさん
2009/06/22(月) 14:32:080663デフォルトの名無しさん
2009/06/22(月) 14:41:17const_cast
つーか、具体例を出してみてくれ。
0664デフォルトの名無しさん
2009/06/22(月) 15:22:25thx。構文はおかしくないんですね。
ポインタを作るより参照にしたほうがいいメリットってなんですか?
0665デフォルトの名無しさん
2009/06/22(月) 15:32:21説明下手とタイプミスすみません。こんな感じになります。
簡略化のため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;
}
0666デフォルトの名無しさん
2009/06/22(月) 15:37:08参照にすると、こんだけ読みやすくなる。
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 とかする、くだらないバグも防げたりする。
0667デフォルトの名無しさん
2009/06/22(月) 17:07:38ありがとうございました!
0668デフォルトの名無しさん
2009/06/22(月) 19:27:54コンストラクタの初期化リストにどう記述すればよいでしょうか?
0669デフォルトの名無しさん
2009/06/22(月) 19:34:190670デフォルトの名無しさん
2009/06/22(月) 19:35:04:array( 20, vector<string>(10) )
でできない?
0671デフォルトの名無しさん
2009/06/22(月) 19:35:22コンパイルして試してないからエラったらすまん。
概念としてはまずvector< string >を20個の空stringで初期化し、
そのオブジェクト10個でもって、vector< vector < string > >を初期化する。
0672デフォルトの名無しさん
2009/06/22(月) 19:35:450673デフォルトの名無しさん
2009/06/22(月) 23:49:1710と20が逆だぞ
0674504
2009/06/23(火) 09:24:15平文を暗号化する前に鍵を生成するようなのですが、この鍵は自分で設定することはできないのですか?
また、saltというものが何なのかよくわかりません。どうかご教授お願いします。
0675デフォルトの名無しさん
2009/06/23(火) 10:32:59でいけました、ありがとうございます。
度々質問で申し訳ありませんが
配列の要素外に値をセットしたい場合、
例えば20行確保されてる配列に対して25行目に値を入れる場合は
21-24行目を適当な値で埋めていくしかないのでしょうか?
0676504
2009/06/24(水) 02:51:07HCRYPTPROV 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というものについてもよくわかりません。お願いします。
0677デフォルトの名無しさん
2009/06/24(水) 03:27:050678デフォルトの名無しさん
2009/06/24(水) 10:05:04PGP、 gnupg は base64 で可視テキスト化してたな
0679504
2009/06/24(水) 10:09:58>>678
なんとなく文字化けはわかりました。この辺は工夫次第でなんとかなりそうだ
0680デフォルトの名無しさん
2009/06/24(水) 10:15:03領域を再確保して配列の内容をコピーしなおすのでしょうか?
そうならばなんどもpush_backすることがわかってる場合は
テンポラリにある程度のサイズの配列を用意して配列の内容をコピー
それを元の配列にコピーしなおしたほうが早くなるのでしょうか?
0681デフォルトの名無しさん
2009/06/24(水) 10:25:23reserveで予め容量を増やしておいてpush_backすればよい。
0682デフォルトの名無しさん
2009/06/24(水) 10:25:54することもあるししないこともある
細かく言うと、push_backすると確保してあるサイズを超えるときは、
以前のサイズの二倍(倍率は処理系によって違うけど)の領域を新たに確保してから
そこを使う
てゆーかreserve使えばいいじゃん
0683デフォルトの名無しさん
2009/06/24(水) 10:28:51参考にしてたサイトにreserve()がのってなかったorz
こういうのは重要だとおもうのに・・・
0684デフォルトの名無しさん
2009/06/24(水) 13:25:440685デフォルトの名無しさん
2009/06/24(水) 13:33:13なに突っ込むかにもよる
長さもそんなに奴にに組み込み型とかだったら
そんな極限状況でcatchして何ができるの?って話になるからやるだけ無駄
0686デフォルトの名無しさん
2009/06/24(水) 13:35:20一度ずつ例外を調べたい場合はそうすればいいし、tryの中で繰り返しpush_backしてもいい。
上の続きでreserveした領域にpush_backする、というなら別に例外を補足する必要はない気もするけど、
自分なら、push_backするときのコピーコンストラクタとかで例外投げるかもしれないから補足しておく。
0687デフォルトの名無しさん
2009/06/25(木) 07:50:43char B[10];
と配列を作って
for(int i = 0; i < 10; i++)
B[i] = A[i];
で代入すると
strlen(B);
が10ではなく30になってしまいます。何でですか?
0688デフォルトの名無しさん
2009/06/25(木) 07:51:270689デフォルトの名無しさん
2009/06/25(木) 07:57:36たまたま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];
という風にするか
0690デフォルトの名無しさん
2009/06/25(木) 11:28:43strlenは0が見つかるまでを文字列の長さと判定する
たまたま31バイト目に0があったので30を返したんだろう
0691デフォルトの名無しさん
2009/06/25(木) 13:15:200692デフォルトの名無しさん
2009/06/25(木) 13:17:20コンパイラの最適化におまかせでもインラインアセンブラでもおk
0693デフォルトの名無しさん
2009/06/25(木) 13:27:270694デフォルトの名無しさん
2009/06/25(木) 23:57:13strncpyなりstrcpy_sなりも教えるべきだと思うんだ
0695デフォルトの名無しさん
2009/06/26(金) 01:10:05char *s = "12345";
int i = (int)s;
とか書いて期待通りに動かなくて悩んだよな。
0696デフォルトの名無しさん
2009/06/26(金) 01:13:21アセンブラ先にやってるのでCの記述に詳しくなかったけど
そんなことはしない
0697デフォルトの名無しさん
2009/06/26(金) 01:15:420698デフォルトの名無しさん
2009/06/26(金) 01:23:44でもatoi()の存在を知らなくて、str2num()とかいう関数を自作して使ってた。
0699デフォルトの名無しさん
2009/06/26(金) 06:22:490700デフォルトの名無しさん
2009/06/26(金) 06:25:25(float)0x0a
ならOKじゃない?
0701デフォルトの名無しさん
2009/06/26(金) 06:43:53_variant_t s = "12345";
short i = s;
ならやったことがある。
0702デフォルトの名無しさん
2009/06/26(金) 11:41:49それで勉強した人たちも>>695みたいなことはしないだろうと思う。
0703デフォルトの名無しさん
2009/06/27(土) 12:56:22staticな変数やグローバル変数、動的確保を一切使わなければ完全に安全な関数といえるんでしょうか?
また、上記のものを使う場合ミューテックスなどを使ってアクセスを一つに絞れば完全に安全でしょうか?
0704デフォルトの名無しさん
2009/06/27(土) 16:12:40この書き方はどういう名称のものなのでしょうか
0705デフォルトの名無しさん
2009/06/27(土) 16:21:18http://www5c.biglobe.ne.jp/~ecb/c/05_08.html
0706デフォルトの名無しさん
2009/06/27(土) 16:39:07その関数が外部の関数をコールしていない。
見えない、外部関数コールがあるかもしれない。
それが一切無ければ。
>上記のものを使う場合ミューテックスなどを使ってアクセスを一つに絞れば完全に安全でしょうか?
ほとんどの場合、この考えだけでは問題を発生させる。
0707デフォルトの名無しさん
2009/06/27(土) 16:56:43最も安全なのは、スレッド間で同一データへの参照を共有しない事。
static やグローバル変数が問題になり易いのは、それを参照している
処理が複数のスレッドから実行される場合、結果として複数スレッド
から同一データへの参照 ( 操作 ) が発生してしまう事が原因。
それと、ミューテックスなどによる排他制御は、「仕方なく」データ
を共有する場合の保護手段。使用時は慎重に設計しないとデッドロッ
クなどの要因になり易いので、なるべく使用しない方が良い。
0708デフォルトの名無しさん
2009/06/27(土) 20:04:48「お、これはデッドロック発生しそうなシナリオだ」と
かいうのは割とすぐにわかる。
解決策は OS とかの本読めば大別して四通りくらいあっ
たと思う(俺はタネンバウム先生ので勉強した)。俺が
よく使うのは
・単一の競合対象リソースを管理する独立したスレッド
を用意して処理を委譲する(か、手を抜いて mutex)。
・複数リソースの同時要求はロジックを見直すか、要求
順序を定義出来ないか考える(これは mutex 使うだけ
じゃ解決できないからね)。
・複数リソースを要求する作業は大抵もっと抽象化され
た処理単位があるので、read write lock を使ったキュー
を用意して同一順序同士はキュー内で read lock、逆順
は write lock とか(これは今考えた)。
といった感じ。でも、その「お、」と思う感覚を後輩に
どう教えたら良いのかってーのが全然わからん(w
0709デフォルトの名無しさん
2009/06/27(土) 20:26:550710デフォルトの名無しさん
2009/06/27(土) 20:51:47Java Concurrency in Practiceや
Synchronization Algorithms and Concurrent Programming
Principles of Concurrent and Distributed Programming
がある
0711デフォルトの名無しさん
2009/06/27(土) 20:54:310712デフォルトの名無しさん
2009/06/27(土) 22:05:03class Hoge
{
public:
void set(int x)
{
_x = x;
}
private:
int _x;
}
という宣言がコンパイルできてしまうのですが、素人考えでは
set関数の中で_xにアクセスする際、まだ_xは定義されていないのでエラーになりそうだと思うのです。
VS2008だと素直にコンパイルが通るのですが、これはC++言語的にも正しい書き方なのでしょうか?
それとも2008が気を利かせてOKにしてくれているのでしょうか
0713デフォルトの名無しさん
2009/06/27(土) 22:10:160714デフォルトの名無しさん
2009/06/27(土) 22:10:270715デフォルトの名無しさん
2009/06/27(土) 22:16:25{
public:
void set(int x);
private:
int _x;
}
void Hoge::set(int x) {
_x = x;
}
これがOKなのは分かるよね。
0716デフォルトの名無しさん
2009/06/27(土) 22:17:500717デフォルトの名無しさん
2009/06/27(土) 22:27:43なるほど、関数の中身の解析は最後にされる。みたいな感じなんですね。
安心しました。
0718デフォルトの名無しさん
2009/06/28(日) 14:13:02static を関数スコープ外で書くと「そのファイル以外から見れなくなる」といいますが、
ヘッダファイルに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"
↑いくらでも参照できてしまうのでは・・・?
//**************************************************
0719デフォルトの名無しさん
2009/06/28(日) 14:14:30書き換えは不可ということで
0720デフォルトの名無しさん
2009/06/28(日) 14:22:44入れたら一応そのファイルだけで使える変数になるよ。
インクルードしてるソースごとに同じ名前だけど別モノ。
0721デフォルトの名無しさん
2009/06/28(日) 14:29:32別々のファイルに同じ名前static変数ができている。
ただし、constの場合はやっても無害。
CとC++で微妙に意味が違う。
0722デフォルトの名無しさん
2009/06/28(日) 14:38:570723デフォルトの名無しさん
2009/06/28(日) 14:41:01static と違って全部同じ意味だから、別々で覚える必要はないよ。
文法がめんどいのは確かにそのとおりだけどね。
0724デフォルトの名無しさん
2009/06/28(日) 14:44:550725デフォルトの名無しさん
2009/06/28(日) 14:45:10ということは、
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変数を書けない」ということがでてきたのでしょうか?
0726デフォルトの名無しさん
2009/06/28(日) 14:47:49これってcの
#define TEST 10
と同じように使いたかったとか
0727デフォルトの名無しさん
2009/06/28(日) 15:00:34C++ ならどちらでも同じ。だから static を使わないのが普通。
そのサイトの記述は C の場合と勘違いしてると思って読むとつじつまは合う。
0728デフォルトの名無しさん
2009/06/28(日) 15:08:08ODR violationって簡単に言うとなんでしょうか?
0729デフォルトの名無しさん
2009/06/28(日) 15:09:20static で ODR 違反はないだろ。
0730デフォルトの名無しさん
2009/06/28(日) 15:10:42同じ名前に対しては定義はひとつでなければならない、
というルールに違反すること。
0731デフォルトの名無しさん
2009/06/29(月) 01:31:25初心者と言うのを踏まえたうえで、手始めにこんなのを作ってみたらどうだ
みたいな感じで何かお題をいただけないでしょうか
0732デフォルトの名無しさん
2009/06/29(月) 01:37:40関数電卓
たとえば、
(19+45/8)*45-75
と入力してその計算結果を出力
0733デフォルトの名無しさん
2009/06/29(月) 01:39:17よーしやってみる
0734デフォルトの名無しさん
2009/06/29(月) 11:00:230735デフォルトの名無しさん
2009/06/29(月) 11:22:21bisonなり色々ネットに参考文献がごろごろ転がってるし
実は良問なのかとおもう
0736デフォルトの名無しさん
2009/06/29(月) 12:03:01ここに問題と解答がごろごろしているよ!
たまに解説もあり。
0737デフォルトの名無しさん
2009/06/29(月) 12:03:46http://pc12.2ch.net/test/read.cgi/tech/1245853701/
0738デフォルトの名無しさん
2009/06/29(月) 19:47:34ファイルの有無に関してはC言語ではfopenをつかった判定がよく例として出てくると思うのですが、
C++ではこれらについてはどのような方法があるのでしょうか?
0739デフォルトの名無しさん
2009/06/29(月) 19:58:39しかしここは環境依存OKなスレなので、
環境(OS)を書いてくれればその環境特有の別な方法も示せる
0740デフォルトの名無しさん
2009/06/29(月) 21:02:160741740
2009/06/29(月) 21:03:06ファイルは環境依存しないでもわかるけど、
ディレクトリは環境依存しない方法あるの?
0742デフォルトの名無しさん
2009/06/29(月) 21:37:300743デフォルトの名無しさん
2009/06/30(火) 04:44:320744デフォルトの名無しさん
2009/06/30(火) 04:51:01boostを使えればいいのですが、使えない環境下でもコンパイルしたいのです。
ゲームならrand()でも良いのですが、科学計算なので、ある程度良質なものを探しています。
0745デフォルトの名無しさん
2009/06/30(火) 05:03:27メルセンヌ・ツイスタ
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3%83%BB%E3%83%84%E3%82%A4%E3%82%B9%E3%82%BF
0746デフォルトの名無しさん
2009/06/30(火) 05:36:08それって質はよいのですが、もう少し単純で高速なものはないですか?
0747デフォルトの名無しさん
2009/06/30(火) 05:40:14M系列をつかってみたら?
0748デフォルトの名無しさん
2009/06/30(火) 07:08:05XorShift
0749デフォルトの名無しさん
2009/06/30(火) 08:23:37想定している環境はMac OS XとLinuxとFreeBSDで
コンパイラはGCC 4.0(かそれ以降)です。
Windowsはまったく想定しておりません。
いわれて気がつきました。
0750デフォルトの名無しさん
2009/06/30(火) 09:14:55stat()を使うのが無難かな。access()も使えなくはないけど。
シンボリックリンクをそのままリンク自身として扱いたいならlstat()でないと無理。
0751デフォルトの名無しさん
2009/07/01(水) 01:00:41ちょっと話それるけど、
ファイル一覧の話で、scandir()でリスト取得しても、
windows(mingw32)だと「struct dirent *entry」の d_typeは、
環境依存(ファイルシステム依存)でいい?、DIR/FILEを調べるのに、
再度stat()した記憶がある。
あと、scandir()のfilterコールバック、なんともいやーーーな仕様って
感じるの俺だけ?1つ任意のオブジェクト位渡せるようにしてくれ、
正規化ルーチンを入れる時とか、その都度オブジェクト生成破棄してたら、
しゃれんならん。動的にフィルタールールを変えられねーだろつーーの。
どうぞ!
0752デフォルトの名無しさん
2009/07/02(木) 11:29:17このような場合、Bのインスタンスを含む構造体やコンテナをメンバに加えるような形にしてしまった方が良いでしょうか?
0753デフォルトの名無しさん
2009/07/02(木) 13:23:00もうちょっと具体的に・・・
丸々ソースをあげろとまではいわないので名称をhogeとか適当に変えてアップしてくださいな
0754デフォルトの名無しさん
2009/07/02(木) 14:57:330755デフォルトの名無しさん
2009/07/02(木) 15:10:27どうしても気になるなら配列にしとけば?
class AddressData {
std::string data[20];
public:
enum Key { FirstName, MiddleName, LastName, Address, PhoneNumber, ........ };
std::string GetData(Key key) { return data[key]; }
};
こんな感じで
0756デフォルトの名無しさん
2009/07/02(木) 15:16:22というかC++って便利になったのかね?とホント思ってしまう
0757デフォルトの名無しさん
2009/07/02(木) 16:44:17オブジェクト指向のいいところ殺してね?
0758デフォルトの名無しさん
2009/07/02(木) 16:50:380759デフォルトの名無しさん
2009/07/02(木) 16:53:34みたいですね
しかも関数型と違って、メンバ関数などを呼び出したりと構造的に重くなってるはずの
オブジェクト志向でさらに分離するためにあれこれかませてるとか・・・
0760デフォルトの名無しさん
2009/07/02(木) 17:31:03クラスを、変数と関数の単なる集合体と考えるのはあまり良くない……という話を聞いたことがあります。
さてここに、とある共通点を持った複数の関数があるとします。
これらの関数はすべて独立していて、静的変数なども特に使わないとします。
この関数群をグループ化したいとき、どのような方法を採るのがベストでしょうか?
・普通にクラス化する
・シングルトンパターンを組み込んだクラスにする
・全てのメンバ関数がstaticなクラスにする
・クラス化させずに名前空間
以上の方法を思いついたのですが、どれが相応しいやら。
その他にも、定番のような方法があればお願いします。
0761デフォルトの名無しさん
2009/07/02(木) 17:50:17「とある共通点」程度ならそれくらいでいいかと
0762デフォルトの名無しさん
2009/07/02(木) 17:56:26ありがとうございます。
使う側から見れば、staticな関数で揃えるのと使い勝手は大して変わらないですもんね。
0763デフォルトの名無しさん
2009/07/02(木) 19:03:12class Aというのがマイコンの状態をモニターするクラスで
class Bというのがシリアルポートを経由してコマンドを送信して
コマンド内容に合わせてADコンバータの値やIOの状態を適切な形に変換して渡すクラスです
class Aが構成ごとに必要なclass Bを内包していく形をとっていますが
構成によってはclass Bの数が15個↑になってしまって
なんか不味いような気がして相談にきた次第です
0764デフォルトの名無しさん
2009/07/02(木) 19:13:23マイコンの状態をモニターするクラスがシリアルポート経由でコマンドを送信するってのも変な話じゃね?
0765デフォルトの名無しさん
2009/07/02(木) 19:18:210766デフォルトの名無しさん
2009/07/02(木) 19:19:56マイコンにコマンド(というか文字列)を送信すると
その文字列に対応した目的の値が帰ってくるという仕組みな為
モニター側がリクエストしないといけないのです
0767デフォルトの名無しさん
2009/07/02(木) 19:24:51カプセル化強くなってるじゃん?
0768デフォルトの名無しさん
2009/07/02(木) 19:39:15class Bのインスタンスが複数必要な理由もわからないな。
ラッパー関数が大量にできて困るとかの方がまだ想像できるというか。
0769デフォルトの名無しさん
2009/07/02(木) 19:43:31class Bのコンストラクタで
コマンド番号と変換ロジック(AD値を電圧やその他の値へ変換)クラスをセットするようになっています
0770デフォルトの名無しさん
2009/07/02(木) 19:52:36ああ、まあそういう見方もあるよね
0771デフォルトの名無しさん
2009/07/02(木) 19:56:110772デフォルトの名無しさん
2009/07/02(木) 20:04:220773デフォルトの名無しさん
2009/07/03(金) 13:51:11変数は代入されるのかコピーされるのかどちらになるのでしょうか?
0774デフォルトの名無しさん
2009/07/03(金) 13:52:150775デフォルトの名無しさん
2009/07/03(金) 16:56:25ABCDE 78
FGHIJK 601
LMN 5976
とかがあたえられているときに
78 601 5976を整数型のデータとして変数に格納したいのですが
C言語のsscanfとか駆使する代わりに
C++ではどういうコードの書き方ができるのでしょうか
0776デフォルトの名無しさん
2009/07/03(金) 17:03:54sstream
stringstream
0777デフォルトの名無しさん
2009/07/03(金) 17:27:59#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;
}
}
0778デフォルトの名無しさん
2009/07/03(金) 17:57:30ある既存のライブラリAでaという外部変数が定義されています。
A: int a = 100; (みたいなかんじ)
別の既存のライブラリBでbという外部変数を参照しています。
B: extern int b;
AもBもバイナリで提供されていて変更できません。
bがaと同じものをさすようなラッパーというのは作れるでしょうか?
アセンブリで書く必要があるとすれば、(i486系では)どう書けばいいでしょう?
0779デフォルトの名無しさん
2009/07/03(金) 18:15:24ちゃんと環境を書きましょう。
・OSは?
・「バイナリ」とは .so .a .dll .lib のどれ?
0780デフォルトの名無しさん
2009/07/03(金) 18:34:32ライブラリは.so形式です。
OSはLinux(Fedora11 gcc4.4)と、FreeBSD(7.2 gcc4.2)です。
とりあえず一方だけでもかまいません。
よろしくお願いします。
0781デフォルトの名無しさん
2009/07/03(金) 18:42:58{
private:
vector<Foo>* pFoo;
public:
void SetFoo(Foo* foo);
}
HogeのメンバにFooというクラスの配列を持たせたいとき
vector<Foo>の実体のメンバmFooを持たせるか
vector<foo>のポインタpFooを持たせて動的生成するのはどちらがよいでしょうか?
0782デフォルトの名無しさん
2009/07/03(金) 18:49:17Hogeのコピーを作成しないなら、実体がいい。
Hogeのコピーを作る必要があるなら、ケースバイケース。
Hogeのコピーコンストラクタでvector<Foo>を、どのように処理したいかによって変わるが、
経験的には、ほぼ実体ですませている。
0783デフォルトの名無しさん
2009/07/03(金) 18:53:34実体で済むものは大抵実体にしといたほうが面倒が起こらないよ
vectorの内容がコピーされるコストを気にしてなんとなくポインタにしてるとかだったら特に
0784デフォルトの名無しさん
2009/07/03(金) 18:58:04その変数 a, b は自分が弄らなくても
書き換わる可能性がある?
無いなら setter を作って両方に
同じ数値を代入する関数を作ればいいと思う
0785デフォルトの名無しさん
2009/07/03(金) 20:26:57もしくは混合なのか、分かる方法ってあるでしょうか?
stripされておらずnmでシンボル名が取れます。
どうかお願いします。
0786デフォルトの名無しさん
2009/07/03(金) 20:55:19ldd して、依存ライブラリを見てはどうですか?
0787デフォルトの名無しさん
2009/07/03(金) 21:08:000788デフォルトの名無しさん
2009/07/03(金) 21:22:41libstdc++使ってないし、Cだけで書かれてるのかもしれないですね。
libcrypt
libssl
libpthread
libdl
libm
libc
libgssapi
libkrb5
libcom_Err
libk5crypt
libresolv
libz
0789デフォルトの名無しさん
2009/07/03(金) 22:27:32http://ja.wikipedia.org/wiki/%E5%90%8D%E5%89%8D%E4%BF%AE%E9%A3%BE
0790デフォルトの名無しさん
2009/07/04(土) 10:47:41ありがとうございます。
たぶん勝手には変化しないはずなので、初期化時に同じ値を入れることにします。
ただやはり同じものを指す方法があれば一番楽なので、
あればよろしくお願いします。
0791デフォルトの名無しさん
2009/07/04(土) 10:51:32二箇所に実体がある以上、同じものを指すというのは難しいです
一応はデバッガのように特定のアドレスを監視し続けて、
片方の変数に常に追従させるという手もありますが
どうやって実現するのやら
0792デフォルトの名無しさん
2009/07/04(土) 11:13:05なら新たなに
extern int a;
int b = a;
っていうライブラリ作ればいいんじゃね?
C++のみだけど
0793デフォルトの名無しさん
2009/07/04(土) 12:52:50いや、実体はライブラリAにあるa一つだけです。bは単なるexternです。
>>792
とりあえず今すぐは初期値だけで何とかなるのですが、
ちゃんと解決させる必要が出そうです。
0794デフォルトの名無しさん
2009/07/04(土) 16:28:24"イテレータ"のようなもの、と習ったのですが実体はなんなんでしょうか
ソース見ても判然としません。
0795デフォルトの名無しさん
2009/07/04(土) 18:22:21HANDLE型みたいなもんだ気にするな
0796デフォルトの名無しさん
2009/07/04(土) 20:46:55クラスとして
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を作らなければならない気がします。
どのようにするのが正解なのでしょうか?
0797デフォルトの名無しさん
2009/07/04(土) 20:51:140798デフォルトの名無しさん
2009/07/04(土) 20:55:53お返事ありがとうございます。
テンプレート…。
スマポを見よう見まねで作ったり、vectorとかを使ったりはできるのですが
「包め」というのはどういう意味でしょうか?
何かのスラングかと思うのですが…
0799デフォルトの名無しさん
2009/07/04(土) 20:57:210800デフォルトの名無しさん
2009/07/04(土) 21:07:13class CHoge
{
public:
virtual int load(const CharType* filename) const;
};
0801デフォルトの名無しさん
2009/07/04(土) 21:14:02それも考慮に入れて置きますが、なるべくなら両サポートしたいところです。
>>800
えーと、その場合loadの中身の実装をヘッダに書く必要がでてくるのではないでしょうか?
例として出しているのでCHogeは1つしか関数を持っていませんが、
同様な条件ででかいクラスをすべてヘッダに書くのはしんどそうです
0802デフォルトの名無しさん
2009/07/04(土) 21:26:44何で?両方入れれば?
0803デフォルトの名無しさん
2009/07/04(土) 21:41:30たぶん、ほとんどの場合、両方サポートしてもいいことない。
0804デフォルトの名無しさん
2009/07/04(土) 22:02:590805デフォルトの名無しさん
2009/07/04(土) 22:12:49(_T()で文字列をくくったり、_tで始まる関数をつかったりするやつ)
文字列を編集する処理があるところとか、WとAの両方で動くように
意識してるやつとか少数だろうし、ほとんどのところで、_UNICODEと
_MBCSの両方でテストどころか、コンパイルを通すも行われてないと思う。
事実上片方下かつかえないコードになるんで、最初から片方に決めうち
したほうが混乱がなくていい。
で、いまどちらか片方ってことならWを選ぶことになる。
0806デフォルトの名無しさん
2009/07/04(土) 22:21:54「〜A」の方は内部でユニコードに変換して「〜W」を呼び出すのはどう?
文字列を単なるパラメタとして使用するなら特に問題ないんじゃないかな
文字列自体をアレコレするにしても再度アスキーに変換すれば...
たしかWindowsはそうやってるハズ
0807デフォルトの名無しさん
2009/07/04(土) 22:32:13なんか必ずしも対応する漢字がないとかなかったっけ?
0808デフォルトの名無しさん
2009/07/04(土) 23:23:20そのパラメータの加工用にA系の関数も必要ではあるよね。
0809デフォルトの名無しさん
2009/07/04(土) 23:40:24ウィンドウを作ったり画像を表示させたりするのに使うライブラリって、DirectXが一般的なんでしょうか?
0810デフォルトの名無しさん
2009/07/04(土) 23:42:32まずは『一般的』の定義から語ろうか
↓頼んだ
0811デフォルトの名無しさん
2009/07/04(土) 23:43:09まあ、簡単でいいならコンソールでおkだよ
0812デフォルトの名無しさん
2009/07/04(土) 23:43:260813デフォルトの名無しさん
2009/07/04(土) 23:58:20DirectXを直接あつかうのはてめーにはどーせ無理だ
DXlibなりYaneSDKなりSDLなりつかっとけ
0814デフォルトの名無しさん
2009/07/04(土) 23:59:51漢字セットとしてはA⊆Wじゃなかったっけ?詳しくないから断言できないけど;
オーバーライドの手間はWの片方ですむし、Windows依存でいいならAPIで済ませられるし
0815デフォルトの名無しさん
2009/07/05(日) 00:03:50文字型の別に対応するだけなら宣言をヘッダ、定義とテンプレート強制実体化を
ソースに書く手もある
-- 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>;
0816デフォルトの名無しさん
2009/07/05(日) 00:06:42template struct A<char>; // 特定の型でクラステンプレートを実体化
template struct A<wchar_t>;
0817デフォルトの名無しさん
2009/07/05(日) 00:11:040818デフォルトの名無しさん
2009/07/05(日) 00:58:52Win32 API スレ管轄の話の気はするが round-trip しない文字列は存在する。
ttp://support.microsoft.com/default.aspx?scid=kb;ja;JP170559
0819デフォルトの名無しさん
2009/07/05(日) 01:07:16そんな事気にする奴は自作関数の引数にC文字列を取ったりしないでしょ
0820デフォルトの名無しさん
2009/07/05(日) 01:41:51でもそれは、IBM拡張文字とNEC選定IBM拡張文字などのように、
同じ文字がWindows-31Jで重複して割り当てられている場合ばかりのはず。
こういう例外はあるけど、基本的にはUnicodeの原規格分離の原則でラウンドトリップは保証されていると考えていい。
どうせNTのWinAPIもそうなんだし、自分も>>806方式に賛成。
0821デフォルトの名無しさん
2009/07/05(日) 05:39:12最後は最後に行き着く文字セット(+コード体系)に直すわけで
〜A()か〜W()のどちらかは実装しておいて、virtualなインタフェースは一つに絞るなりなんなりすべきなのでは
0822デフォルトの名無しさん
2009/07/05(日) 11:12:04DXlibって、ソース公開してないわけ?
マジで?
0823デフォルトの名無しさん
2009/07/05(日) 11:18:30提供クラスの中身がMessageBoxを呼び出すものだったとして
Aコード体系で直接MessageBoxを呼び出せば、MessaeBoxAが呼ばれて正しく表示される。
だが、提供クラスが「Aで受け取ったらWに変換し、W実装に処理を移譲する」だった場合、
Wへの変換+MessageBoxWとなり、うまく表示されないかもしれない。
ってことだよな?
0824デフォルトの名無しさん
2009/07/05(日) 14:38:58AはWに処理を委譲し、不具合が出る場合はAにも処理を記述でよいのでは?
0825デフォルトの名無しさん
2009/07/05(日) 16:11:46まだまだAの需要はあるわけで難しいな
0826デフォルトの名無しさん
2009/07/05(日) 16:16:28〜Wで表示すれば間違いはなくなる(キリッ
0827デフォルトの名無しさん
2009/07/05(日) 16:39:00してる
解析するのが大変だけど
0828デフォルトの名無しさん
2009/07/05(日) 17:07:36libを二つ作らないとダメだと思った理由がわからない
0829デフォルトの名無しさん
2009/07/05(日) 17:07:43ごめん、確かにあったわ。
こりゃ解析つらいな。作者がメンテしやすいようにか、マクロ使いすぎw
Cでも使えるようにするために、クラス化もされていないようだし、ちとこれを初心者に薦めるのはダメだな…。
これ使っても、DXlib使いにはなれても、DirectX使いにはなれそうにない
0830デフォルトの名無しさん
2009/07/05(日) 17:08:55でもDirectXの長い修行に耐えかねてゲームロジックを考える前に挫折するくらいなら
DXライブラリは悪くないと思うけどな
0831デフォルトの名無しさん
2009/07/05(日) 17:11:58MessageBoxクラスのopenクラス関数だった場合、マクロってわけにはいかなくならね?
#ifdef UNICODE
#define open openW
#else
#define open openA
#endif
とかやったら、ものすごい幅広い範囲に影響でてしまいそうだよな。
だからといってせっかくMessageBoxクラスなのに、openMessageBoxとか書かせるのは馬鹿らしい
0832デフォルトの名無しさん
2009/07/05(日) 17:43:500833デフォルトの名無しさん
2009/07/05(日) 17:45:130834デフォルトの名無しさん
2009/07/05(日) 17:47:48>>831
面倒だが、#undefすりゃいいんじゃね?
少なくとも広い範囲に影響が出るのは防げる
0835デフォルトの名無しさん
2009/07/05(日) 18:47:05m.open<use_unicode>();
m.open<use_ascii>();
0836デフォルトの名無しさん
2009/07/05(日) 18:47:33同じソース内でMessageBoxクラスとそれ以外の
openをメンバに持つクラスを使う場合とか。
オーバーロードで
open(char *)
open(wchar_t *)
両方用意した方が大分マシ。
0837デフォルトの名無しさん
2009/07/05(日) 18:50:39インスタンス化時に使用する文字コードをタグ構造体で指定する
0838デフォルトの名無しさん
2009/07/05(日) 19:11:13template<typename T>MessageBox::open(AnyString<T>);
だろふつう
0839デフォルトの名無しさん
2009/07/05(日) 21:14:270840デフォルトの名無しさん
2009/07/05(日) 21:29:57std::basic_string<T>使えよ。
0841デフォルトの名無しさん
2009/07/05(日) 21:36:37流れから類推出来ん素人はだまっとれ
0842デフォルトの名無しさん
2009/07/06(月) 09:30:32_HUGE 自体は math.h にあり、それをライブラリ内で使っているみたいなのですが、
これはどの lib ファイルをリンクすればいいのでしょうか??
0843デフォルトの名無しさん
2009/07/06(月) 09:34:040844デフォルトの名無しさん
2009/07/06(月) 10:17:100845842
2009/07/06(月) 10:59:20環境はvisual c++ で Luaを使ってます。Lua内部でHUGE_VAL をつかっていて、それが原因みたいです
0846デフォルトの名無しさん
2009/07/06(月) 12:45:25合わせてみては。特にランタイム
0847デフォルトの名無しさん
2009/07/06(月) 13:07:47アプリにデータベースを埋め込むようなことがしたい場合はどうすればいいんでしょうか?
データベースサーバーを作ってそれとやり取りするアプリしかむりなんでしょうか?
データが6万以上あるのでエクセルの埋め込みじゃ無理なんです
0848デフォルトの名無しさん
2009/07/06(月) 13:14:52使ったことないけどprotocol bufferてのはどうだろ
0849デフォルトの名無しさん
2009/07/06(月) 13:29:39sqlite は検討した?
0850デフォルトの名無しさん
2009/07/06(月) 14:22:04速度が遅かったらgoogleの奴、難しそうですが試してみます。
ありがとうございます。
0851デフォルトの名無しさん
2009/07/06(月) 14:24:530852デフォルトの名無しさん
2009/07/06(月) 14:26:41それ単体で完結する。
0853デフォルトの名無しさん
2009/07/06(月) 16:47:39SQLの文法を使って読み書きするファイルストリームというか、まぁそんなノリ。
0854デフォルトの名無しさん
2009/07/06(月) 18:53:380855デフォルトの名無しさん
2009/07/07(火) 00:58:030856デフォルトの名無しさん
2009/07/07(火) 11:49:11プロシージャでHDCをstaticで生成してDrawerのコンストラクタに渡すべきか
void Draw(HDC& hdc)のように描画用関数に引数で渡すのはどちらが良いでしょうか?
0857デフォルトの名無しさん
2009/07/07(火) 12:36:35前者の意味がわからない。ソースコードで語ってくれ
0858デフォルトの名無しさん
2009/07/07(火) 12:57:01WM_PAINTでHDCの値を変更して、引数なしDrawを呼び出すってことじゃないの?
普通に引数で渡した方が後々拡張しやすいと思うし、俺ならそうする
0859デフォルトの名無しさん
2009/07/07(火) 13:15:450860デフォルトの名無しさん
2009/07/07(火) 13:20:39もうケースバイケースじゃね。ありがちな答だけど
0861デフォルトの名無しさん
2009/07/07(火) 14:21:50何したらいいのか全然分からなくて困ってます何をしたらいいでしょうか
教本とかをやったら良いならお薦めのものを教えてもらえないでしょうか
0862デフォルトの名無しさん
2009/07/07(火) 14:28:410863デフォルトの名無しさん
2009/07/07(火) 14:30:250864デフォルトの名無しさん
2009/07/07(火) 14:31:19簡単なことしかできないですけどHTMLはできます
C++覚えたいからここで聞いたんです
よろしくお願いします
0865デフォルトの名無しさん
2009/07/07(火) 14:32:26とにかくたくさん書いて数をこなすのみ
0866デフォルトの名無しさん
2009/07/07(火) 14:34:01プログラムバッチリできますって嘘ついちゃったんです
0867デフォルトの名無しさん
2009/07/07(火) 14:34:36>863
0868デフォルトの名無しさん
2009/07/07(火) 14:36:13偽証罪、或いは詐欺罪で自白してくれば宜しいかと。
0869デフォルトの名無しさん
2009/07/07(火) 14:45:09とりあえず猫でもわかる〜を読みながら色々打ってみます
>>868
勘弁してください
0870デフォルトの名無しさん
2009/07/07(火) 14:59:100871デフォルトの名無しさん
2009/07/07(火) 14:59:17職場によっては猫は全く役立たずだから、どういう経緯だったのかをkwsk。
0872デフォルトの名無しさん
2009/07/07(火) 15:09:02えーと・・・仕事絡みじゃないんです、程度で言ってしまえば趣味の範囲の事になります
数名の人で集まってゲーム作る事になってそれで自分がプログラミング担当になったんです
>>868の時点で言うべきだったかもしれないですね、すいません
趣味ですって言うと流されてしまうかと思いぼかして書きました・・・
0873デフォルトの名無しさん
2009/07/07(火) 15:15:45あやまっとけw
「仕様をよく検討したところ僕には無理でした」って
0874デフォルトの名無しさん
2009/07/07(火) 15:17:560875デフォルトの名無しさん
2009/07/07(火) 15:29:49そうですね・・・とりあえず謝ってきます
ただどの道プログラミング担当は自分なんで覚えないといけないんですよ
なのでゲーム向け?のプログラミング勉強できる何かを教えてもらえないでしょうか
0876デフォルトの名無しさん
2009/07/07(火) 15:30:300877デフォルトの名無しさん
2009/07/07(火) 15:34:45自分にあった言語の本と↓の本あたりがいいかも.。この本は言語の説明ほとんど無いから注意ね
ゲームプログラマになる前に覚えておきたい技術
ttp://www.amazon.co.jp/dp/4798021180
0878デフォルトの名無しさん
2009/07/07(火) 15:36:04あれはたしかrubyっぽい言語でスクリプト書くんだよね
0879デフォルトの名無しさん
2009/07/07(火) 15:36:510880デフォルトの名無しさん
2009/07/07(火) 15:42:15知り合いに一人できる人居るけど気難しい人だからなぁ・・・
>>877
読んでみます、ありがとうございます
環境はえーっとVC++2008EEですかね
>>878
RPGツクールですか
使った事ないのでちょっとどんなのか分からないので何とも
>>879
辛酸なめた方がいいと言われてもどうしろと・・・
0881デフォルトの名無しさん
2009/07/07(火) 16:17:010882デフォルトの名無しさん
2009/07/07(火) 17:46:08subversionで管理しているリビジョン番号を
プログラムの出力結果に表示させる場合って
どのようにすればいいのでしょうか?
0883デフォルトの名無しさん
2009/07/07(火) 18:10:04リビジョン番号を実行時に問い合わせたいのか、ソース中に埋め込みたいのか、どっちなのかと。
いずれにしても、subversionスレで聞いた方が早そうだ。
0884デフォルトの名無しさん
2009/07/07(火) 18:37:23後者です
0885デフォルトの名無しさん
2009/07/07(火) 21:21:120886デフォルトの名無しさん
2009/07/08(水) 07:32:10char *rev = "$Rev$";
で置換されないかな
後はsprintfで数字のみ抜き出すとか
0887デフォルトの名無しさん
2009/07/08(水) 07:33:060888デフォルトの名無しさん
2009/07/08(水) 09:43:28昔からのソースでは
static char sccsid = "$Id$";
みたいなのをそこそこ見かける。
#ifndef lint で囲まれて足りもするが
0889デフォルトの名無しさん
2009/07/13(月) 18:13:35空白を含むテキストファイルを読み込んで
先頭の部分から順番に単語や数値を調べていくプログラムをつくろうと思っています
具体的には
2ch 1200
WD 55
ss 130
って書かれているファイルがあったときに
先頭から順番に調べて「2ch」が文字列で「1200」が数値とみなされるようにしたいなと考えております。
このような場合はどのように組めばいいのでしょうか?
0890デフォルトの名無しさん
2009/07/13(月) 19:05:25scanf("%s %d", &moji, &inte); じゃだめなん?
0891デフォルトの名無しさん
2009/07/13(月) 23:55:020892デフォルトの名無しさん
2009/07/14(火) 05:01:570893デフォルトの名無しさん
2009/07/14(火) 07:30:20そのテキストは
文字列 空白 数字 改行
というフォーマットに決まってる?
なら
>>890
0894デフォルトの名無しさん
2009/07/14(火) 10:53:28std::exception.what() や std::type_info.name() などの
戻り値が char で返却されるメソッドに遭遇するたびに
その都度 mbstowcs_s で wchar_t に変換して使用してます
しかし、mbstowcs_s で変換するときに
事前に文字列の長さを取得したり、変換先のバッファを用意したり
なんか冗長だなぁと思えてしまいます
そもそも上記のような標準ライブラリのクラスって、TCHAR版は無いのでしょうか?
よろしくお願いします
0895デフォルトの名無しさん
2009/07/14(火) 11:19:56_bstr_t、CComBSTR、W2A, A2W
0896デフォルトの名無しさん
2009/07/14(火) 11:20:13標準にない関数や型の話をするときは、環境が何かも語りましょう。
0897デフォルトの名無しさん
2009/07/14(火) 19:03:37一応書いておくけど、無いよ。
exceptionは独自の例外クラスを使うという抜け道はあるけど。
0898デフォルトの名無しさん
2009/07/14(火) 19:35:46ありがとうございます。
0899デフォルトの名無しさん
2009/07/14(火) 23:14:02"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;
}
0900デフォルトの名無しさん
2009/07/14(火) 23:19:55C++では、クラスの中にクラスを書いても、スコープが内側に入るだけ。
OuterのインスタンスとInnerのインスタンスに何ら関係性が作られることはない。
0901デフォルトの名無しさん
2009/07/14(火) 23:31:460902デフォルトの名無しさん
2009/07/14(火) 23:32:24InnerにちゃんとOuterインスタンスがどこにあるか分からせる必要があるってこと
0903デフォルトの名無しさん
2009/07/14(火) 23:34:510904デフォルトの名無しさん
2009/07/14(火) 23:41:410905デフォルトの名無しさん
2009/07/14(火) 23:54:050906デフォルトの名無しさん
2009/07/15(水) 00:42:37俺もそう思った。単に派生クラスで基底クラスのメンバをいじりたいだけなんじゃないか
#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;
}
0907デフォルトの名無しさん
2009/07/15(水) 01:02:48どんな言語の流儀を基にそんな勘違いできるんだ?
0908デフォルトの名無しさん
2009/07/15(水) 01:26:250909デフォルトの名無しさん
2009/07/15(水) 01:27:590910デフォルトの名無しさん
2009/07/15(水) 08:25:250911デフォルトの名無しさん
2009/07/15(水) 10:05:03A is a B ならAはBの派生関係
A has a B ならAの中にBのインスタンスを持たせる
とよく言われますわな。
それにしても、包含されているクラスのインスタンスから包含しているほうのメンバを操作しようとか無茶すぎ。
0912デフォルトの名無しさん
2009/07/15(水) 12:20:09クラスの宣言部分(h)と実装部分(cpp)を分ける意味がいまいち良くわからないのですが
例えば使いまわせるようなクラス郡をコンパイルしておけば、そのライブラリを利用する時は利用する側だけ
コンパイルですむってことでしょうか?
つまり、ライブラリのクライアント側、というか再利用できない部分は、あえて分けて書かなくてもいいって事でしょうか?
それとも皆さん多少めんどくさくても全部分けたりしてます?
0913デフォルトの名無しさん
2009/07/15(水) 12:24:06ヘッダにしないと不便だろう。
0914デフォルトの名無しさん
2009/07/15(水) 12:55:19全部のソース (100万行とか?) をひとつの.cppファイルに書く
→ 見通しが悪い、メンテが大変、コンパイルに時間がかかる
→ じゃあソースを複数の.cppファイルに分けよう
→ 各.cppファイルは別々にコンパイルするから他ファイルの関数とかクラスを使えないよ
→ 他ファイルから参照できるように宣言とかだけ.hファイルに分けてインクルードしよう
という感じ
0915912
2009/07/15(水) 13:21:59>>914
レスありがとうございます。
一クラス一ファイルという原則は理解できます。
ただ、一つのクラスをhファイルに全ての実装も含めて書いてしまってもincludeは問題ないですよね?
つまり宣言と実装を二つのファイルに分けなくても全部hに書いてしまってもOKなんじゃないかと思ったのですが
なにか、勘違いしてますでしょうか?
あと、分割コンパイルの件ですが、確かにC++のコンパイルって時間かかりますよね。
例えばあるクラス、ClassAがあって、それはもうコンパイルしてるとします。
それをべつのクラスや関数で使用するとき例えば
#include "ClassA.h";
としますよね?で、既にコンパイルしてあるClassA.libをリンカが見つけられるようにしてやれば
ClassAはコンパイルしなくてもつかえますよね?つまり#include "ClassA.h";は名前の解決をするためにしてるって事でしょうか。
この場合もhファイルに全ての実装も書いてしまっても同じことにならないでしょうか?
0916デフォルトの名無しさん
2009/07/15(水) 13:45:02ヘッダに実装を書かないのはコンパイルにかかる時間の問題の為だけ。
クラステンプレートや関数テンプレートはヘッダに全部書くしかないから、
STLやboostは全部ヘッダに書いている。
またポインタの宣言など先行宣言で済む場合、インクルードより先行宣言の方がコンパイルが速くなる。
ttp://www002.upp.so-net.ne.jp/ys_oota/effec/chapter5.htm#34kou
0917デフォルトの名無しさん
2009/07/15(水) 14:01:25大きなプロジェクトになるほど分割したほうが良くなってくる
とくにコンパイル時間の短縮は大きな問題だよ
たとえばfoo.hにclass fooの実装まで全部を書いて、それをインクルードするファイルが1000個あったら
class fooは1000回コンパイルされることになる
ここでfoo.hと実装を分離しておけばfooのコンパイルは1回のですむ
1時間のコンパイルが数分になるなんてことも普通にありえる
0918デフォルトの名無しさん
2009/07/15(水) 17:24:46hに全部書いたらClassA.lib自体いらなくなる
そしてhをincludeしたそれぞれにClassA.libが内蔵されることになるから無駄にサイズも大きくなる
0919デフォルトの名無しさん
2009/07/15(水) 17:49:370920デフォルトの名無しさん
2009/07/15(水) 22:53:280921デフォルトの名無しさん
2009/07/15(水) 23:01:21修正して再コンパイルする時にかかる時間が大差。
1回コンパイルして完成。その後は一切触らないっていうのがありえない。
0922デフォルトの名無しさん
2009/07/15(水) 23:08:29しまえる人間がうらやましい。小さなソースで格闘できるんだなーと。
0923デフォルトの名無しさん
2009/07/15(水) 23:17:440924デフォルトの名無しさん
2009/07/15(水) 23:21:100925デフォルトの名無しさん
2009/07/15(水) 23:41:27それぞれに内蔵(?)されたなら多重定義になりそうな気がしないか?
0926デフォルトの名無しさん
2009/07/15(水) 23:43:14リビルドするならソースは一つの方が速いとおもうよ
必要なものだけコンパイル、リンクするために分割するわけだし(きっとそれが言いたかったんだろうと思いつつ補足)
0927デフォルトの名無しさん
2009/07/15(水) 23:48:570928デフォルトの名無しさん
2009/07/15(水) 23:53:31話の流れからヘッダに実装も書く事かと思ったが。
どっちにしても修正したコードの量に対して、再コンパイルがかかるコードの量が増えると思うんだけど違う?
0929デフォルトの名無しさん
2009/07/16(木) 00:18:490930デフォルトの名無しさん
2009/07/16(木) 00:20:51ソースの修正はそのソースだけ再コンパイル
0931デフォルトの名無しさん
2009/07/16(木) 01:33:41An IOException occurred at handle_message ()
*** glibc detected *** gnuplot: double free or corruption (fasttop): 0x0a175e38 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7708604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb770a5b6]
/usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_free_messenger+0x52)[0xb600d892]
・
・
・
このエラーの対処法教えてください
単振り子の問題なのですが
http://www.algarcia.org/nummeth/Cpp/pendul.cpp (ヘッダーファイル http://www.algarcia.org/nummeth/Cpp/NumMeth.h )
に
http://www-sens.sys.es.osaka-u.ac.jp/wakate/tutorial/group3/gnuplot/
のパイプを用いたのをくっつけてg++でコンパイルしたらエラーがでました。
二回目にまったく同じ数値でやったらエラーはでなくなりますが数値を変えるとエラーはでます。
なお、gnuplotの部分を除けばエラーはでなくなります。
0932デフォルトの名無しさん
2009/07/16(木) 01:50:06まんどくせ
最小限のエラーを再現するプログラムを書いてうpれ
たぶん、それをやったらバグ発見して自己解決すると思うが。
0933デフォルトの名無しさん
2009/07/16(木) 03:19:12#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くらいでエラーがでます。不規則にエラーが出るので原因は分かりません。
0934デフォルトの名無しさん
2009/07/16(木) 03:20:39An 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
こんなエラー
0935デフォルトの名無しさん
2009/07/16(木) 03:34:180936デフォルトの名無しさん
2009/07/16(木) 03:40:500937デフォルトの名無しさん
2009/07/16(木) 03:43:510938デフォルトの名無しさん
2009/07/16(木) 03:46:23情弱乙
0939デフォルトの名無しさん
2009/07/16(木) 03:48:13知ってる
専ブラだとアンカー経由でみるとインデントは残ってるのもあるね。
まあ極力ソースは外部ロダにテキストで上げて見てもらうとかの方がいいよ
0940デフォルトの名無しさん
2009/07/16(木) 04:05:22>>933です。
gnuplotの部分が問題あると思うんですがどうダメなのかわかりません。
http://www-sens.sys.es.osaka-u.ac.jp/wakate/tutorial/group3/gnuplot/
参考にしたサイト
0941デフォルトの名無しさん
2009/07/16(木) 04:18:200942デフォルトの名無しさん
2009/07/16(木) 04:30:04こういうのであってもエラー出たりしますか?
#include <iostream>
#include <cstdio>
using namespace std;
int main(void){
FILE *fp = popen("ls", "w");
if (fp == NULL)
return -1;
pclose(fp);
return 0;
}
0943デフォルトの名無しさん
2009/07/16(木) 04:47:37それは大丈夫でした
0944デフォルトの名無しさん
2009/07/16(木) 08:32:17VC++2008 を使用しています。
PNG 画像を扱う時に _aligned_malloc でメモリ確保する方法を使ってみた所、
sample1.png の画像は読み書きに成功したのですが、sample2.png の画像は
「libpng error: Too many IDATs found」と出てうまくいきませんでした。
何かやり方が悪いのでしょうか、どなたかご教授下さい。
0945デフォルトの名無しさん
2009/07/16(木) 08:35:15エラーメッセージにあるとおり、IDATタグが余計にあるからpng画像としては規約違反だとlibpngが宣っている。
別にあんたのやり方が悪いわけではなさそうだ。
0946デフォルトの名無しさん
2009/07/16(木) 08:53:37abOut() をブロックで囲んでないのが気になる。
popen()とstdioがごっちゃになってるのも気になる。
少なくともpopen()前にcout.flush()すべき。
とはいっても件のエラーには関係無さそうだなぁ…。
0947デフォルトの名無しさん
2009/07/16(木) 08:58:20>946の言うように、abOutがクローズされないままgnuplotを呼び出している希ガス。
ブロックで括るかしてデストラクションを強制させる方がよさそうだ。
0948デフォルトの名無しさん
2009/07/16(木) 09:27:02なるほど、そういった類のエラーでしたか。
教えて下さりありがとうございました。
0949デフォルトの名無しさん
2009/07/16(木) 11:11:59細かい突っ込みだけど、複数のIDATタグは違反でも何でもない。
>>944のsample2.png見てみたけど、ぱっと見では違反してなさそうなんだけどなぁ。
sample1.pngにα追加してADAM7インターレース方式にしただけだよね?
libpngを覗いてみたが、どうも画像を読み込み終わった後に余計なIDATチャンクがあると出るエラーメッセージみたい。
もしかしたら出力したソフトに問題があるのかもしれないが、流石にそこまで確認する余裕はない。
何のソフトで出力したよ?
0950デフォルトの名無しさん
2009/07/16(木) 11:12:320951デフォルトの名無しさん
2009/07/16(木) 12:29:09"%d"を検索しようとしてもうまくかかりません
0952デフォルトの名無しさん
2009/07/16(木) 12:30:03やってみたけど関係なかったみたいです
0953デフォルトの名無しさん
2009/07/16(木) 12:32:37"printf" "フォーマット" あたりで検索すれ
0954デフォルトの名無しさん
2009/07/16(木) 14:40:04ありがとうございます!
0955デフォルトの名無しさん
2009/07/16(木) 23:10:20sample2の方がオリジナルで、しかもネットで拾った物なので、
何のソフトで作られた物なのか判らないのです。
たまたま、この画像を使って実験をしたらエラーになったという案配でして…。
0956デフォルトの名無しさん
2009/07/17(金) 13:31:3617000行*7列のデータを読み込むのに57秒かかりました・・・遅いですよね
読み込む内容は数桁の数字のみです
0957デフォルトの名無しさん
2009/07/17(金) 13:32:51フロッピーかデータテープからから読み込むとそのくらいかかるのか?
どこに問題があるの?
0958デフォルトの名無しさん
2009/07/17(金) 13:35:55用意して、そいつがファイル読み込みを担当するんだけど、csvの細かい部分読みじゃなく
ファイル全体をメモリに読み込み(バイナリ扱い)
で、関数(もしくはクラス)がメモリに上げたデータから切り出してあげる
0959デフォルトの名無しさん
2009/07/17(金) 13:41:180960デフォルトの名無しさん
2009/07/17(金) 13:43:29今まではfgetsで1行ずつ読み込んでデータテーブルにセットしてたのですが
そうではなくてファイルを全部読み込んで、メモリからデータをセットした方が早いと言うことでしょうか?
そうするとファイルを読み込むのに必要な領域の量を求めないといけないのですが良い方法はあるのでしょうか?
0961デフォルトの名無しさん
2009/07/17(金) 13:44:39・・・orz
リリースビルドで実験したら1.8秒まで短縮しました
0962デフォルトの名無しさん
2009/07/17(金) 13:44:47だから遅い早いは自分でしらべ()
一行 or 全部 だけじゃなくて 一部 とかもあるんじゃないか
0963デフォルトの名無しさん
2009/07/17(金) 13:44:54ファイルIO系の関数でサイズは求めれると思うけど・・
0964デフォルトの名無しさん
2009/07/17(金) 13:48:42○求められる
0965デフォルトの名無しさん
2009/07/17(金) 13:53:502万行弱で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秒かからないけど
0966デフォルトの名無しさん
2009/07/17(金) 13:55:50しまった%dだったorz
0967デフォルトの名無しさん
2009/07/17(金) 13:57:490968デフォルトの名無しさん
2009/07/17(金) 14:26:50ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9771.txt
こんな感じ
やっつけ仕事かつまだデバッグ途中なので変な挙動するかもしれません
あとコードが汚いのはお察しくださいorz
0969デフォルトの名無しさん
2009/07/17(金) 14:35:37数値がダブルクォートでくくられてるのか・・・
なんでそんな面倒なデータ仕様にしたのw
0970デフォルトの名無しさん
2009/07/17(金) 14:38:42頂いたデータがそういう仕様だったからとしか・・・
あとは時々数字以外のデータも飛び込んでくるので
もうわけわかめ
0971デフォルトの名無しさん
2009/07/17(金) 14:53:44つまり、巨大データを格納する場合は、あらかじめ予想サイズに reserve しておくことが必須です。^^
データサイズが予測できないなら、
ランスしないことを条件に list の方が有利なケースもおっぱいあります。
0972デフォルトの名無しさん
2009/07/17(金) 14:55:000973デフォルトの名無しさん
2009/07/17(金) 19:11:42バイナリモードで読み込んで、ファイルの内容をメモリから切り出すとき
改行の検出は'\n'で良いのでしょうか?
0974デフォルトの名無しさん
2009/07/17(金) 19:15:46たぶん
それか0x0Dと0x0Aの両方を見るようにすればいいんじゃないかな?
http://ash.jp/code/return.htm
あとEOFは存在しないのでね^^
0975デフォルトの名無しさん
2009/07/17(金) 21:39:12こえー
0976デフォルトの名無しさん
2009/07/17(金) 21:40:27当たり前だろデバッグに必要な余計なコードが入ってるか否かなのに
0977デフォルトの名無しさん
2009/07/17(金) 21:46:480978デフォルトの名無しさん
2009/07/17(金) 21:47:11gcc -g で 1.8秒が57秒になるこたあないだろ
0979デフォルトの名無しさん
2009/07/17(金) 23:28:23関数呼び出し回数が多すぎるな
0980デフォルトの名無しさん
2009/07/17(金) 23:30:520981デフォルトの名無しさん
2009/07/17(金) 23:59:33なんで?
0982デフォルトの名無しさん
2009/07/18(土) 00:18:06先頭要素にpushすることが無い限りvector1択じゃないか?
0983デフォルトの名無しさん
2009/07/18(土) 01:13:06VC++のまぬある
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できると思えん。
0984デフォルトの名無しさん
2009/07/18(土) 01:33:40それだけで答えが見えることも多い。
>>983
まぬある文は正しいと思うけど、
分断の話はほんとかい?
分断されるとlistみたいにランダムアクセスが定数時間でできなくなっちゃうけど。
0985デフォルトの名無しさん
2009/07/18(土) 05:40:15ほうがより正確らしい。
0986デフォルトの名無しさん
2009/07/18(土) 06:32:59それ以外なら大きな差はでないらしい
それよりもpush_backしまくるのをどうにかしたほうが高速化に寄与しそうだが
0987デフォルトの名無しさん
2009/07/18(土) 08:11:40ペナルティが大きすぎるだろ。
0988デフォルトの名無しさん
2009/07/18(土) 08:12:51というベンチ結果があった気がする
0989デフォルトの名無しさん
2009/07/18(土) 09:46:480990デフォルトの名無しさん
2009/07/18(土) 09:49:44唯一、ブロック転送だと凄く差が付く。
0991デフォルトの名無しさん
2009/07/18(土) 15:54:25償却定数時間って表現もするね。
でもそういう意味なら vector の push_back だって amortized constant time だよ?
0992デフォルトの名無しさん
2009/07/18(土) 23:42:55qが入ると終了する。どうするの?
0993デフォルトの名無しさん
2009/07/19(日) 00:01:560994デフォルトの名無しさん
2009/07/19(日) 00:04:150995デフォルトの名無しさん
2009/07/19(日) 00:05:110996デフォルトの名無しさん
2009/07/19(日) 00:06:360997デフォルトの名無しさん
2009/07/19(日) 00:08:13思い切って鍵をつけないことにすれば早くなるけど安全じゃないね
0998デフォルトの名無しさん
2009/07/19(日) 00:51:230999デフォルトの名無しさん
2009/07/19(日) 02:26:40【初心者歓迎】C/C++室 Ver.67【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1247937958/
1000デフォルトの名無しさん
2009/07/19(日) 02:34:46乙
>>1000
イケメン
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。