【初心者歓迎】C/C++室 Ver.66【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2デフォルトの名無しさん:2009/05/28(木) 02:13:44
複数の半角スペース→ ×個数
TAB→    の置き換えを
お勧めする。
3デフォルトの名無しさん:2009/05/28(木) 11:41:07
VisualC++2008EEですが、
浮動小数点型として、別の型を定義して使っています。

typdef float float_t;

これは、後でdoubleにしても対応できるようにする為です。
しかし、実際にdoubleに変えると、コンパイルが通らないことがわかりました。

std::pow( f, 2.0f );

このように、実数定数をf付きで書いている為、オーバーロードが解決出来ない為です。
しかし、2.0fを2.0に変えると、逆のケースでコンパイルが通らなくなります。
何かよい解決法はありませんか?
4デフォルトの名無しさん:2009/05/28(木) 11:44:52
間に自前の関数かましては
5デフォルトの名無しさん:2009/05/28(木) 11:47:25
リテラルを引数に取らずに const float_t k = 2.0; とかおいといて
そいつを渡したらだめ?
6デフォルトの名無しさん:2009/05/28(木) 11:48:18
>>4
自前の関数とは、
自前のpowを作るということですか?
それとも、2.0fをfloat_t(2.0f)とすることでしょうか?
前者は、組み合わせを網羅するとなると、結構厳しいです。
後者も、既に書いてしまったコードが大量にあるので
これも厳しいです。
7デフォルトの名無しさん:2009/05/28(木) 12:17:44
キャストすりゃいいんだろうけど、大量にあるなら自前のやつ作れば数個で済むし
テンプレートでやっちゃうのもいいんじゃない?
8デフォルトの名無しさん:2009/05/28(木) 12:34:19
>>7
すみません、ちょっと意図が伝わりません。
数個とは、何が数個になりますか?

例えば、pow()にしても
pow(float,float);
pow(float,double);
pow(double,float);
pow(double,double);
の4つ必要になります。
そして、こういった関数は
引数を2つ以上とるもの全てだから
無数にあります。
さらに、実際はfloatとdoubleだけではなく
halfとlong doubleも含まれます。
この方法は現実的ではないように思えます。

それとも、複数の引数を、それぞれのサイズから最大サイズの型を作って
再代入するようなテンプレートをかます・・?
なるほど、これはいけそうな気がします。

最善策としては、今は大変ですけど
今後の為にも、定数はマクロなりで括るってのがいいでしょうか?
F(2.0f)みたいに。
9デフォルトの名無しさん:2009/05/28(木) 12:37:00
エラーはオーバーロードの解決だろ、これの意味わかってる?
10デフォルトの名無しさん:2009/05/28(木) 16:21:00
>>9
はい。今回の問題は、実数定数とfloat_tの組み合わせに
対するオーバーロードが解決できない為に起こっています。
なぜ型がアンマッチするか、それは実数定数がfloat_t型でない為です。
ゆえに、解決手段として正しいものは、実数定数をfloat_t型で書くことになります。

しかし、実数型は小さい型から大きい型にキャストしても
情報が欠損しないことは明らかです。
だったら、オーバーロードの候補が複数あった場合、
小さい型を大きくする方向でマッチングして、
最小の変更で済むものにするというルールでいいはずです。
そのルールが適用出来れば、ソースの改修を最小限に留め
問題を解決出来ます。
そういった方法がないか、確認した次第です。
実際ないですよね、F(2.0f)のマクロにします。
ありがとうございました。
11デフォルトの名無しさん:2009/05/28(木) 17:40:11
f*f
が早いしエラーでない。
12デフォルトの名無しさん:2009/05/28(木) 17:46:36
unsigned 同士の演算の最小値はどんな場合でも 0 でいいの?
13デフォルトの名無しさん:2009/05/28(木) 19:13:45
printfで出力した文字を全部消すのはsyrtem("CLS")でできたのですが
一部だけ消す方法はありませんか?
例えば最新の1行だけとか。。。
よろしくお願いします。
14デフォルトの名無しさん:2009/05/28(木) 20:15:57
>>11
それって何ですか?
さっぱりわかりません。
15デフォルトの名無しさん:2009/05/28(木) 21:10:58
boost::scoped_ptrを使ってるのですが、なぜ
boost::scoped_ptr<hoge> phoge = new hoge();
は駄目で、
boost::scoped_ptr<hoge> phoge(new hoge());
はいいのでしょうか。両方とも普通にコンストラクタが呼ばれるだけじゃないかと思ったのですが。
hoge* h0(new hoge());
hoge* h1 = new hoge();
は両方とも通るし。

16デフォルトの名無しさん:2009/05/28(木) 21:40:28
>>15
暗黙の変換を避けるため、コンストラクタがexplicitになっている。

こんなとき
void f(scoped_ptr<hoge> const&, int);
int g();

f(new f, g());の評価順序は決まっていないのだが、
もしnew hoge→g呼出→scoped_ptr一時オブジェクト生成→f呼出の順だったら、
g()が例外を投げると、new hogeに対するdeleteが呼ばれなくなる。
そこでf(new f, g());がエラーになるようexplicitが使われている。
=で初期化できなくなる弊害より安全性が優先されたということ。
なお、f(scoped_ptr<hoge>(new f), g());とすればコンパイルできるが、だめぜったい。
17デフォルトの名無しさん:2009/05/28(木) 22:42:43
種類のわからない構造体へのポインタって宣言できますか?
18デフォルトの名無しさん:2009/05/28(木) 23:01:59
void*??
19デフォルトの名無しさん:2009/05/28(木) 23:12:16
>>18
すげえこんな便利なのがあったのか
20デフォルトの名無しさん:2009/05/28(木) 23:17:56
で、どうやって構造体のメンバにアクセスするつもり?
21デフォルトの名無しさん:2009/05/28(木) 23:18:49
便利だけど強力すぎて丁寧に使わないと大域変数みたいに混乱の元になったり
22デフォルトの名無しさん:2009/05/28(木) 23:53:30
>>15
phogeはboost::scoped_ptr<hoge>型、new hoge()はhoge*型。
別の型のため、
> hoge* h1 = new hoge();
これとは比べられない。
暗黙の型変換で、型変換してコンストラクタを呼ぶ仕組みがC++にはあるが>>16の通り。

>>17
void*はポインタの先にアクセスする時に、元の型に型変換する事になるが型を間違えないように注意。
23デフォルトの名無しさん:2009/05/29(金) 07:51:31
VS2008だと以下のコードをコンパイルできるのですが、これってコンパイルできない
はずではないでしょうか?constでない参照に一時オブジェクトを渡してもよいので
しょうか?

class A{
public:
void method()const{}
};
void test(A& a){a.method();}
int main(){
test(A());
return 0;
}
24デフォルトの名無しさん:2009/05/29(金) 17:39:39
>>23
A.method() の内部では A を書き換えないことを保証しているだけ

だから

void test(A& a) { a.method(); } は許される。

逆パターンの
 class B {
 public:
  void method() {}
 };
 void test2(const B& b) { b.method(); }

これは test2 中の b は const であるにも関わらず
method 呼び出しで b内部変る呼び出しだぜ と判断するからコンパイルエラー
25デフォルトの名無しさん:2009/05/29(金) 18:00:45
>>23
test(A()); のことを言ってる?

 { A tmp; test(tmp); }

と等価だから全然問題ないぞ。

別件で
 class A {
 int* p;
 public:
  A() : p(new int) {}
  ~A() { delete p; }
  int* get() const { return p; }
 };

 int* test(A& a) { return a.get(); }
 ----
 int* ptr;
 ptr = test(A());
は問題が発生するけど
Aの一時オブジェクトのデストラクタが呼ばれた後に ptr を使おうとするから
26デフォルトの名無しさん:2009/05/29(金) 21:07:19
>>23
そう。それはコンパイルエラーになるのが正しい。
Visual C++の独自拡張でコンパイルが通ってしまうだけ。
/W4で警告になる。あるいは、/Za(独自拡張なし)でエラーになる。
/Zaが嫌なら/we2664を使えばこれだけエラーにすることも可能。
27デフォルトの名無しさん:2009/05/29(金) 22:08:03
#include <iostream>
class test{
public:
test(double x=0, double y=0) : m_x(x), m_y(y) {}
double m_x, m_y;
};
void main(){
test t = (100.0, 0.0);
std::cout << t.m_x << " " << t.m_y << std::endl;
}
こうすると、
0 0
と表示されます。本当は
100 0
と表示されてほしいのですが、なぜこうなってしまうのでしょうか?
28デフォルトの名無しさん:2009/05/29(金) 22:19:04
>>27
test t(100.0, 0.0);と書くんだ。
test t = (100.0, 0.0);だと、まず(100.0, 0.0)が順次演算子を使った式として評価されて、test t = test(0.0);と同じ意味になる。
29デフォルトの名無しさん: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);」と書け
30デフォルトの名無しさん:2009/05/29(金) 22:27:41
>>28
なるほど、分かりました。実は
test t = (100.0, 0.0, 99999);
と書いたら
99999 0
と表示されたので、クラスの中身を破壊でもしてるのかと思ってました。
最後に右側が評価されるので、
test t = 99999
と評価され、コンストラクタにデフォルト値を設定してたのでコンパイルも
通ってたみたいです。
言われたとおりに初期化を書き換えました。
ありがとうございます。
31デフォルトの名無しさん:2009/05/30(土) 02:03:47
ビルド→デバッグ
0 0 0 0 0
デバッグ
0 0 0 0 1
デバッグ
1 0 0 0 1

といった様に配列に追加書き込みをする方法を教えていただけませんでしょうか?
32デフォルトの名無しさん:2009/05/30(土) 03:26:20
項目名とその値の組み合わせを複数渡す必要があるとき
構造体のlistを渡すのとmapを利用するのはどっちが無難でしょうか?
33デフォルトの名無しさん:2009/05/30(土) 03:37:51
>>32
map の方が楽
34デフォルトの名無しさん:2009/05/30(土) 04:56:14
あるポインタが指してるアドレスを別のポインタとか変数に入力する事って出来ますか?
35デフォルトの名無しさん:2009/05/30(土) 05:07:28
はい
36デフォルトの名無しさん:2009/05/30(土) 08:09:11
来年就職に備えて、行き当たりばったりな開発の仕方から
しっかりと設計してから開発の流れにもっていきたいんだけど、
デザインパターンとかUML学べばおk?

ためになる資格とかお薦めの参考書あれば教えてくほしい
37デフォルトの名無しさん:2009/05/30(土) 10:09:35
struct Hoge {
int hoge;
...
};
class Hoge {
Hoge():hoge(0){}
public:
int hoge;
...
};

上みたいにclassにメンバ関数加えても、継承や仮想関数を使わない限り同じメモリ配列になるのは決まってるんでしょうか
それとも、そう思い込んではいけませんか
38デフォルトの名無しさん:2009/05/30(土) 10:24:33
NULLポインタをdeleteしても何も起こらないらしいですが、配列のポインタの場合がNULLポインタだった場合にdelete[]をしても何も起こりませんよね???
39デフォルトの名無しさん:2009/05/30(土) 11:43:01
起こりませんよ!!!
40デフォルトの名無しさん:2009/05/30(土) 13:11:02
まあ、NULLのポンタをdeleteする時点で
何か間違ってる可能性は否定しない
41デフォルトの名無しさん:2009/05/30(土) 13:18:00
ポンタか
なるほどね
42デフォルトの名無しさん:2009/05/30(土) 13:57:13
ぬるぽんた
4338:2009/05/30(土) 14:15:34
デストラクタでわざわざif (pArray) delete[] pArray;って書くのもナンセンスなのかなって思っただけです。
普通のポインタはdelete p;で済ませますよね?
で、配列もやっぱり同じことができるのかな、と。
"delete[]"で検索してみても、[]はキーワードにならないみたいで、マッチしたページが出てこないのでここで質問してみました。
44デフォルトの名無しさん:2009/05/30(土) 14:48:28
>>43
うん,ナンセンス。
NULLをdelete[]しても何も起こりませんからご安心ください!!!
45デフォルトの名無しさん:2009/05/30(土) 14:54:16
>>40
行田市でタヌキの赤ちゃんが見つかったニュースですね
46デフォルトの名無しさん:2009/05/30(土) 16:22:53
VC2008で関数にカーソル合わせると、ヘッダファイルに書いた宣言とコメントが表示されたような気がするのですが、コメントが表示されません。
コメントはヘッダのどこに書けば表示されるのでしょうか。
それともなにか設定があるのでしょうか?
47デフォルトの名無しさん:2009/05/30(土) 17:27:01
>>37
コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子以外なら大丈夫
これらを一つでも作った場合は規格上は保証されない
48デフォルトの名無しさん:2009/05/30(土) 19:39:16
>>38
そんなのやる時間があったら、なにかソフトを1つ自分で書いてみろ。
49デフォルトの名無しさん:2009/05/30(土) 21:32:16
>>48
は?w
50デフォルトの名無しさん:2009/05/31(日) 12:34:34
std::vector<T>の最後尾の要素を移動したいとき、
std::vector<T> vec;
T tmp = vec.back();
vec.pop_back();
という感じで、二段階でやるしかないでしょうか?
51デフォルトの名無しさん:2009/05/31(日) 13:57:17
C++の参照渡しについての質問です。

以下のようなメンバ関数があったとします。
SStruct GetReturnStruct() const;
INT32 GetReturnINT() const;

これらの関数を以下のように使用します。

1. SStruct sStruct = GetReturnStruct();
2. INT32 nINT = GetReturnINT();
3. SStruct& sTestStruct = GetReturnStruct();
4. INT32& nTestINT = GetReturnINT();
5. const SStruct& c_nTestStruct = GetReturnStruct();
6. const INT32& c_nTestINT = GetReturnINT();

実行環境はVisualStudio2005です。
1と2は普通にコンパイルして実行できるのですが、
3と4の場合、3はコンパイルが通り、4はエラーメッセージ
「'INT32' から 'INT32 &' に変換できません。」
が出てしまいました。
また、5と6ではコンパイルが通りました。

1から6までは内容的には同じ値が入ると思うのですが、
内部的な処理はそれぞれどのようになされているのでしょうか?

構造体などを使うときはなるべく参照かポインタを引数にしたほうがよい
と聞いたのですが、参照の使い方がまだ今ひとつ理解できていません。

どのような場合に参照渡しをしたほうがよいのでしょうか?
52デフォルトの名無しさん:2009/05/31(日) 14:49:15
>>51
参照渡しと言えば普通は引数についての議論だけど、
1〜6は戻り値の受け取り方だろ。噛み合ってない。

まあ、戻り値について言えば、3〜6は参照先の実体が失われるような受け取り方なので、
危険であり、ありえない。

内部的な処理で言えば、参照はポインタと同じで、どこかにある実体を指しているだけ。
実体は他でちゃんと保持されなければならない。
53デフォルトの名無しさん:2009/05/31(日) 14:51:16
>>50
例外安全のために二段階に分けられている。
そのやり方しかない。
54デフォルトの名無しさん:2009/05/31(日) 15:28:12
>>52

ごめんなさい、参照での戻り値についての質問でした。
3〜6は参照先の実体が失われるとのことですが、
具体的にはどのようなケースで危険が発生するのでしょうか

SStruct& sTestStruct = GetReturnStruct(); は
1.GetReturnStruct()で返り値の変数が作られる
2.それを参照する。

SStruct sTest1Struct = GetReturnStruct();は
1.GetReturnStruct()で返り値の変数が作られる
2.宣言SStruct sTest1Structで変数が作られる
3.返り値の変数をsTest1Structに代入

と思っていたため、変数が作られるのが一つ少ない分
SStruct& sTestStruct = GetReturnStruct();
の方が良いと思っていたのですが・・・


55デフォルトの名無しさん:2009/05/31(日) 16:15:17
>>54
> SStruct& sTestStruct = GetReturnStruct(); は
> 1.GetReturnStruct()で返り値の変数が作られる
> 2.それを参照する。
つづきは
3. 1で作った返り値の変数が破棄される。(参照は破棄済みのデータを指すことになり、使えない)

> SStruct sTest1Struct = GetReturnStruct();は
> 1.GetReturnStruct()で返り値の変数が作られる
> 2.宣言SStruct sTest1Structで変数が作られる
> 3.返り値の変数をsTest1Structに代入
つづきは
4. 1で作った返り値の変数が破棄される。(コピー済みのsTest1Structは残るので、使える)
56デフォルトの名無しさん:2009/05/31(日) 16:32:15
>>55

Thanks

ですが、
SStruct& sTestStruct = GetReturnStruct();
では、その後も普通に取得した値の参照が使えてしまいます・・

なぜこのような事態が発生するのかわかりますでしょうか?
57デフォルトの名無しさん:2009/05/31(日) 16:58:56
>>56
ごめん、私の勉強不足のために嘘を教えてしまった。
ttp://www.sun-inet.or.jp/~yaneurao/intensive/cppmaniax/chap0001.html
にあるように、const参照は一時オブジェクトを束縛するということなので、5と6はOK。
3が通るのは、そのコンパイラが一時オブジェクトを破棄するタイミングを
たまたま遅らせているだけと考えられるので、
環境を変えたときに安全は保証されないと思う。
58デフォルトの名無しさん:2009/05/31(日) 17:28:49
const参照は一時オブジェクトを束縛する
ということで了解しました。回答ありがとうございます。

ところで、クラスのメンバ関数の作り方で再び質問で、
以下のようなクラスがあるとします。

class CTest
{
private:
SStruct m_sTestStruct;
public
inline VOID GetStruct(SStruct& sGetStruct) { sGetStruct = m_sTestStruct; }
inline SStruct GetStruct() { return m_sTestStruct; }
}

メンバ変数のm_sTestStructを取得する関数の書き方としては、
1. VOID GetStruct(SStruct& sGetStruct);
2. SStruct GetStruct();
のどちらが処理的には良いのでしょうか?

直感的な見た目としては戻り値がSStructの方がわかりやすいと思うので
自分は大体2の方を使っております。
59デフォルトの名無しさん:2009/05/31(日) 17:30:10
あと、構造体の質問で以下のような構造体があるとします、
struct SList
{
SStraightCardList();
~SStraightCardList();

E_TYPE eType;
INT32 anArray[3];
};

このとき、以下のような初期化をしようとすると
static const SList SLIST_DEFAULT = {
eN_DEFTYPE, 1, 2, 3
};

error C2552: 初期化子リストによる個別の識別子の初期化に誤りがあります。
ユーザー定義のコンストラクタを含む型はアグリゲートではありません。

とのエラーメッセージで構造体の初期化がうまくいきません・・・
構造体ではデフォルトコンストラクタを自分で定義してしまったら
初期化 = {..., ..., ...}; の書き方は使えないということなのでしょうか?
60デフォルトの名無しさん:2009/05/31(日) 17:30:26
すいませんプリコンパイル済みヘッダーというのが使い方がよく分からないのですが、
pch.hファイルに使用する全てのヘッダーファイルのincludeを書いて、
他のcppファイルはpch.hのみincludeするというのが正しい使い方なんでしょうか
61デフォルトの名無しさん:2009/05/31(日) 17:32:40
すいません。コンストラクタ部分をこぴぺミスしました。
SStraightCardList()→SList()です。 よろしくお願いします
62デフォルトの名無しさん:2009/05/31(日) 18:09:52
>>58
今はVOIDだが、他に戻り値が必要なら1。
SStructがコンストラクタを持つなら、コピーコンストラクタ一発で値を返すことができるので2。
SStructがただの構造体なら1も2も同じだけど、呼び出しが楽なので2。
それより良い手は const SStruct& GetStruct() const { return m_sTestStruct; }

>>59
ttp://msdn.microsoft.com/ja-jp/library/0s6730bb(VS.80).aspx

>>60
プリコンパイル済みヘッダには、各cppで共通のヘッダで、変更の少ないものを書くのが普通かと。
変更があると、全cppを再コンパイルする羽目になるので。
各cppはプリコンパイル済みヘッダと、不足分のヘッダをincludeする。
63デフォルトの名無しさん:2009/05/31(日) 19:03:18
int data_1[100][200]

int* p_data;

p_data = &(data_1[0][0]);

として、

p_data[50][70];

などとしてデータを取り出したいのですが、うまくいきません。
*(p_data + 50*200 + 70)とすれば取り出せることは分かったのですが、
2次元配列形式でデータを取り出すのは不可能なのでしょうかデータのコピーはしたくありません
64デフォルトの名無しさん:2009/05/31(日) 19:06:10
int* p_data[][];

もしくは

int* p_data[100][200];
65デフォルトの名無しさん:2009/05/31(日) 19:13:56
int* p_data[][];
と記述するとコンパイルエラーになります。

あと、p_dataの参照先はdata_1だけでなく、
条件によってサイズの異なる別の配列を参照する場合があるので、
サイズを固定することはできないです。
66デフォルトの名無しさん:2009/05/31(日) 19:14:43
先頭を渡すなら p_data = &(data_1[0][0]);
じゃなくて p_data = data_1;
67デフォルトの名無しさん:2009/05/31(日) 19:16:01
>>65
サイズが違うなら多次元配列を1次元配列とみなして
*(p_data + 50*200 + 70)
のような感じでアクセスするしかないんじゃない?
68デフォルトの名無しさん:2009/05/31(日) 20:52:22
typedef int (*data200)[200];
data200 p_data = data_1[50];

return p_data[70];
69デフォルトの名無しさん:2009/05/31(日) 20:54:47
>>68
それだと前の配列しか可変になってねえ?
70デフォルトの名無しさん:2009/05/31(日) 23:21:53
>>65
ポインタの配列を使えば可

でも、受け取った関数側でサイズを知る方法が無いから
追加の引数でサイズを渡すとか構造体にまとめてから渡すとかしないとダメぽ

struct tag_matrix_t
{
int width, height;
int **data;
};

みたいに
71デフォルトの名無しさん:2009/06/01(月) 11:30:21
std::vector<T> vec;
std::deque<T> deq;
があるとき、中の要素を適当に並べ替える関数を定義したいのですが、オーバーロードを使って、
mysort(std::vector<T> &v);
mysort(std::deque<T> &d);
とやっていたのですが、イテレータ引数の関数を定義して1つにまとめてしまいたいです。
どうやればいいですか?
テンプレートを使って書くのは、結局自分ではイテレータを定義してないというか、
dequeやvectorのテンプレート機能を呼び出しているだけという感じがするのですが。
72デフォルトの名無しさん:2009/06/01(月) 12:18:40
ファイルからの入力の場合、vectorのソートと、setのソートはどっちが速いですか?
メモリに一気に格納してソートか、一つずつソートする違いです。
73デフォルトの名無しさん:2009/06/01(月) 12:21:20
>>72
テストソース書いて実測してみればいいよ。
ファイルの置き場所によって変わる可能性もあるだろうけど
メモリに一回あげたほうが早いと思う
74デフォルトの名無しさん:2009/06/01(月) 12:23:51
ありがトン
実測してみます
75デフォルトの名無しさん:2009/06/01(月) 13:20:15
最小2乗法によるm次の多項式近似を行うプログラムを教えてください
教えて

xがー2の時yが3.02
−1の時0.98
0の時1.22
1の時2.16
2の時2.61         の時のです
出来ればソース全文書いてください
76デフォルトの名無しさん:2009/06/01(月) 13:23:04
いいえ
77デフォルトの名無しさん:2009/06/01(月) 14:33:33
VS2008でC++でコンソールプログラムを書いてます。
std::cout << "" << std::endl;
とかで出力を出しているのですが、それをテキストファイルに書き込みたいのですが、
プログラム内でファイルを開いてそこに書き込んで、、、渡河やらないと駄目でしょうか?
78デフォルトの名無しさん:2009/06/01(月) 14:38:39
> でリダイレクトすれば標準出力をファイルに落とせる
79デフォルトの名無しさん:2009/06/01(月) 15:54:04
Windows & C++の質問です。

例えばCのqsort()関数のように、中身を直接弄らなくても、
ユーザが処理の一部を書けるようにする……という手法がありますよね。

とあるフレームワーク(ライブラリ群)を作成するにあたり、
エントリポイント(main関数)を隠蔽した状態で、一部の処理をユーザに記述させるにはどうやるのがスマートでしょうか?


現在こちらが想定しているイメージとしては、フレームワーク開発側が以下のようなコードを書いておき、
その中の setting.init() をユーザに用意してもらう……といった感じです。

 int main ( 〜 )
 {
   Setting setting;   //適当なシングルトンクラス
   setting.init ( );   //ユーザが記述する初期化処理
 
   /*メイン処理*/
   return 0;
 }

Setting::init()は、中身が空っぽでも大丈夫とします。
その際、もし可能であれば、わざわざユーザがinit()部分を書かなくても良いようにしたいなあと考えています。

Settingクラスには、init()以外のメンバ関数があり、それらはユーザがタッチしなくてもよい部分です。
そのため、それらはフレームワークの中に隠蔽しなければなりません。
ですが、そのままやると、1つのクラスがフレームワークの内外に散ってしまうので、なんとなく気持ち悪いです。

継承や関数ポインタも考えましたが、main()内を弄らずに指定する方法が分かりません。
また、DLLを用意して読み込む方法はナシとします。

80デフォルトの名無しさん:2009/06/01(月) 19:33:03
Cの初心者本でオススメってなんかない?
基本情報の午後にむけて勉強したいもんで
81デフォルトの名無しさん:2009/06/01(月) 19:54:20
VC++ 2008 にて、コントロールのサブクラス化を行っているのですが、
ボタンのクリックイベントで詰まりました。


ウィンドウプロシージャ内で、 
マウスの左ボタンクリックのイベントを拾いたいのですが、
WM_LBUTTONDOWN、WM_LBUTTONUP や
ダブルクリックの WM_LBUTTONDBLCLK はあるものの、
シングルクリック(マウスを押して離す)の定義が見つかりませんでした。

WM_COMMAND だと親コントロール依存になってしまうので避けたいです。

.NETクラスライブラリの Control.WndProc を覗いてみると、
WM_LBUTTONDOWN の際に、押された事を示すフラグを内部的に立て、
フラグが立っている状態(そのコントロール外でマウスボタンを離さない)で、
WM_LBUTTONUP が来たら クリックイベント発動。
という、けっこう面倒な処理をしていました。

どうしようもなければ、.NETと同じようなコードにしようと思うのですが、
もっと簡単な実装などありますでしょうか?
よろしくお願い致します。
82デフォルトの名無しさん:2009/06/01(月) 20:30:23
>>81
多分無い

ボタンに対して マウスLB押下
そのまま ドラッグしていって ボタンの範囲外に抜けた後に
マウスLB開放

した場合とかを考え出すとね…
83デフォルトの名無しさん:2009/06/01(月) 20:48:19
メモリマップ度ファイル便利と思って多用していたが、
巨大なファイルのシーケンシャルリードするとメモリ解放しないままで
次々に読むから不安定になるな。
8483:2009/06/01(月) 20:51:35
自分の予定では、次に読むだろうところだけ先読みして
あとは開放しているもんだと思っていた。
しかしためられるだけためてた。
85デフォルトの名無しさん:2009/06/01(月) 21:07:33
>>82
ありがとうございます。やっぱ厳しそうですね。。。
.NETのクラスライブラリを参考に作ることにします。
86デフォルトの名無しさん:2009/06/01(月) 21:13:30
>>83,84
もしよかったら、どういうシチュエーションで便利に使ってたか教えてよ。
8783:2009/06/01(月) 21:28:40
メモリにロードせずに、そのまま操作できるところ。
ケースによっては、自前でバッファを管理して入出力するより高速に動く。
OSやディスクのキャッシュが適切に効いた場合、入出力バッファ処理を気にする必要がなくなる。
88デフォルトの名無しさん:2009/06/01(月) 21:45:44
>71
template<typename RandomAccessIterator>
void mysort(RandomAccessIterator first, RandomAccessIterator last);
の何が不満なの?
他人が書いた Iterator を使って望みの事ができるならわざわざ自分で書く必要ないだろ?
そもそもコンテナ用の Iterator 書くならコンテナの実装を知ってる方がいいわけで、
その意味でも自分で書く必要がない。

>84
物理メモリ上に載ったままって話?
89デフォルトの名無しさん:2009/06/01(月) 21:49:42
物理メモリにはのったままではないけど、ギリギリまで使い切ってる。
あとは仮想メモリに入っているよう。この仮想メモリはOSのものとは別物の気がする。
メモリマップドファイルすると、した分は仮想メモリとしてOSは認識しているようにおもう。
90デフォルトの名無しさん:2009/06/01(月) 21:53:09
予想では、次々に同一ファイルのロードが起こると、
OSは大事なファイルと認識しメモリに蓄えておこうとするのだと思う。
もっとも最近に参照されたファイルが優先されて、そのファイルだけが残ると思う。
91デフォルトの名無しさん:2009/06/01(月) 21:57:14
>>90
OSじゃなくメモリマップドファイルを実現してるクラスとかがメモリを確保してるだけでしょ
windowsだと確か設定を変えなければ一つのアプリが最大使えるメモリって
2GBだっけ?
そのくらい物理メモリ詰んでなければそりゃ使い続ければいずれ物理メモリを超えるので
スワップ発生するだろうし
92デフォルトの名無しさん:2009/06/01(月) 22:21:16
メモリマップドファイルは、windowsが用意している関数でそのメモリ使用量を自前で制御できない。
まったくメモリにキャッシュしないようにするオプションはあるけど。
OSの制御にあって、使用中は全く手出しできない。
93デフォルトの名無しさん:2009/06/01(月) 22:44:39
WindowsXP VisualC++2008EEです。
クラスの中のメンバクラスに関する質問です。

----------------------------
class ClassA{
ClassA( int a, int b ) { }; //コンストラクタ
^ClassA( void ) { }; //デストラクタ
};
----------------------------

上記のように引数付きのコンストラクタを持つクラスがあるとき

----------------------------
class ClassB{

private:
ClassA mClassA( 1, 2 );
};
----------------------------

といった形で、メンバクラスを宣言しようとすると、

「error C2059: 構文エラー : '定数'」

といったエラーが出てきてしまいます。

引数付きのコンストラクタがあるクラスをメンバとして持つには、
どのようにすればよいのでしょうか?
94デフォルトの名無しさん:2009/06/01(月) 22:47:20
>>92
そういう作りなのか
まあ気に入らなければ自分で作ればいいだけだしな。
95デフォルトの名無しさん:2009/06/01(月) 22:53:25
>>93
class ClassB {
ClassA mClassA;
ClassB() : mClassA( 1, 2 ) {}
};

classB のコンストラクタで メンバの初期化
96デフォルトの名無しさん:2009/06/01(月) 23:24:42
97デフォルトの名無しさん:2009/06/01(月) 23:24:43
>>79
Settingクラス(フレームワーク提供)を継承したクラスをユーザが定義し、
そのファクトリ関数もユーザが定義するようにすればできない?
Setting::init()は空の仮想関数。
ファクトリ関数はグローバルで、関数名とプロトタイプはフレームワーク仕様により規定。
98デフォルトの名無しさん:2009/06/01(月) 23:42:28
jpgファイルをWindowsのアプリから表示したい時、boost::gilを使ってる人いますか?
使う言語はC++なのですが(Win32APIは出来る限り使ってません)、
WindowsのAPI使った方がいいのか、わざわざboost::gil使う意味あるのか。


9979:2009/06/01(月) 23:42:39
>97
ありがとう。
ファクトリ関数が何なのか調べるところから始めてみる。

……要は、継承先のクラスを指定する部分だけを
フレームワークの外に出してしまえばいいんじゃね?ってこと?
100デフォルトの名無しさん:2009/06/01(月) 23:44:49
>>95
ありがとうございます! 
動きました・・・・が、見たこと無い形なので、なぜ動いたかが分からない・・・。

「コンストラクタ初期化子」というのがあるそうですね。
そういうものだと割り切って覚えるのが早いでしょうか。
101デフォルトの名無しさん:2009/06/02(火) 00:02:16
コンストラクタの初期化リストは大事だから
知らなかったならちゃんと勉強し直した方がいい
102デフォルトの名無しさん:2009/06/02(火) 00:07:25
初期化リスト使えないとconstなメンバを初期化できないから注意な
103デフォルトの名無しさん:2009/06/02(火) 00:10:43
コンストラクタの後ろにコロンで繋げて
初期値を指定するのって、地味にめんどい
104砂ぐま:2009/06/02(火) 00:28:02
教えてください。
[1]C++
[2]締切:6/3
[3]問題文

以下の問題はprintf scanfを用いらず、cin coutを使用しなさい

@2つの4行4列の行列が与えられたとき、
 その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。
 (※ヒント whileループは行列をキーボードから入力するためにも用いる)

A3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。
 (1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム
 (2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム

Bwhileループと複合代入演算子を用いて、等差数列 1+3+5+7+・・・・・・+9999を計算するプログラムを作成しなさい。

CBのプログラムを実行した結果はいくらになるか?

D型変換として、算術演算子のオペランドの一つがdoubleで、片方がintであれば、
 int型のオペランドはdouble型に変換されて、計算される。 下記は例である。
  int a;
float b;

a=(int)b
また、下記のようにすると、
int a=5,b=3;
float c,d;

c=a/b;
d=a/(float)b
 で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。
105デフォルトの名無しさん:2009/06/02(火) 00:29:27
>>101
まだまだ勉強中の身なのです。
>>102
なるほど! 確かにconst指定したメンバが
コンストラクタで初期化できないから、
どうするんだ?、と悩んでたことがありました。
>>103
そうですね。自分も30個くらいメンバが必要なので
同じことを考えていました。
106デフォルトの名無しさん:2009/06/02(火) 00:45:58
>>104
具体的に何が分からないのか答えなさい。(5点)
107砂ぐま:2009/06/02(火) 01:20:43
>>106
解答をお願いします。
108デフォルトの名無しさん:2009/06/02(火) 01:24:20
>>107
宿題スレへ行くほうがいい。
109デフォルトの名無しさん:2009/06/02(火) 02:12:17
>>108
宿題スレとマルチしてるんだけどな
110デフォルトの名無しさん:2009/06/02(火) 03:57:02
boost::gilの使い心地の方もお願いしま〜す。
111デフォルトの名無しさん:2009/06/02(火) 04:06:56
112デフォルトの名無しさん:2009/06/02(火) 05:41:26
int i =100;
float* pf = (float*) &i
pf = pf * 2

このコーディング、どこだダメなんでしょうか
113デフォルトの名無しさん:2009/06/02(火) 05:47:46
>>112
intとfloatの内部表現が一致している保証はどこにもないから
それとポインタに対する演算はアドレスを取る事と定数を足す引く
しか認められていないからポインタを2倍するとか全く無意味
114デフォルトの名無しさん:2009/06/02(火) 05:53:16
ありがとうございます。
内部表現が一致するとは、具体的にどういうことでしょうか?

これであればアドレスの中身(100?)を2倍することになるのでしょうか
*pf = *pf * 2
115デフォルトの名無しさん:2009/06/02(火) 05:57:52
>114
内部表現が一致するとはiと*pfの値が等しい時に常にiと*pfのビット列
が等しい事が保証されている事を意味する

しかし実際には大部分の計算機では浮動小数点はIEEE754、整数は
2の補数表現を取っている事が大部分で内部表現にお互いの互換性
はない

>*pf = *pf * 2;

*pfが元々floatの変数のアドレスを取っている時はその通り
今のように元々intの変数のアドレスを取ってそれを2倍したら浮動小数点例外
が起きるかもしれない
116デフォルトの名無しさん:2009/06/02(火) 06:36:32
高精度の文字エンコード判定・自動変換ライブラリ
で一番いいのはなんでしょうか?
117デフォルトの名無しさん:2009/06/02(火) 06:43:49
秀丸とかEmとかは判定どうやっているのかわかりませんか?
(世界各国で通用するのは)モジラかIEくらいしかしりません。 
エディタの作者は自分で作っているんですか?
118デフォルトの名無しさん:2009/06/02(火) 07:06:57
ありがとうございます。
119デフォルトの名無しさん:2009/06/02(火) 09:59:01
>>117
ちょっと文字コード調べればわかると思うけど、
それぞれの文字コードで仮定して矛盾が生じたら違うと判断すればいいんだよ。
どこまで調べるか、どうやって調べるかはそのアプリの性質で決めたらいい。
判定不能な場合どうするかもね
120デフォルトの名無しさん:2009/06/02(火) 10:07:44
理屈はわかりますが、実際にやると大変です。 
これはエディタの本体(GUI)を作るほど手間がかかりそうです。 
世界各国語に対応させる場合。

121デフォルトの名無しさん:2009/06/02(火) 10:11:05
>>120
文字コード扱うプログラマとしては常識の範囲ですが・・・

テキストごときでwwwとかいうゆとり多いけどテキストほど面倒な物は無い。
文字コードを限定すればなんとかなるけど
122デフォルトの名無しさん:2009/06/02(火) 10:17:18
たかがテキストごときで
123デフォルトの名無しさん:2009/06/02(火) 11:24:03
文字コードの自動判別は不可能なんだから実装する必要なし
ユーザに選択させればいいだけ
ブラウザはhttpヘッダのcharsetで判定してるだけだろ
124デフォルトの名無しさん:2009/06/02(火) 12:53:00
ICUライブラリを使う(キリッ
125デフォルトの名無しさん:2009/06/02(火) 13:12:49
判別、自動変換はできるのですか
126デフォルトの名無しさん:2009/06/02(火) 13:29:39
とりあえず入力コードと出力コードを指定して一発で変換することはできるし、
CharsetDetectorっていう判別専用のクラスもある
世界中の業務用アプリで使われている実績もあるしライセンスも緩くて使い勝手もいい

問題は添付するdll(so)が糞大きいことだけ
127デフォルトの名無しさん:2009/06/02(火) 13:43:37
トンクス
128デフォルトの名無しさん:2009/06/02(火) 16:55:47
float の NAN ってどういう値なんですか?
129デフォルトの名無しさん:2009/06/02(火) 16:59:46
130デフォルトの名無しさん:2009/06/02(火) 17:03:22
ありがとうございます
131デフォルトの名無しさん:2009/06/02(火) 20:50:15
質問です。
CLSはクラスで、int charなどの変数で構成されます。
CLSの変数と同じ順番で記録されているファイルがあり
これを vector< CLS > x; にロードしたいのですが
Read( &x[0] ) のようにしてもうまくいきません。
データが壊れています。 一括でロードする方法はありませんか?
132デフォルトの名無しさん:2009/06/02(火) 20:54:22
ないと思うべき。
順番が同じでも、アラインメントが入ってどうせファイル上のデータの並びと同じではないだろう。
133131:2009/06/02(火) 20:54:25
vectorのソートを使いたいんです。 構造体に読み込めば出来そうですが
それをvectorにコピーしたらいいでしょうか? 無駄なことをしている気がしますが。
134131:2009/06/02(火) 20:56:51
サンクス
一度にロードして、vectorに正しく挿入することにします。
135デフォルトの名無しさん:2009/06/02(火) 21:01:25
すみません。 変更して構造体に入れてqsortにします。
136デフォルトの名無しさん:2009/06/02(火) 23:01:34
int a = 10;
この変数aを関数の引数として渡す場合、
void FuncA(const int n){ int test = n; }
void FuncB(const int& n){ int test = n; }
の関数があるとして
FuncA( a );
FuncB( a );
結果としては2つとも各ローカルのtestに10が入りますが後者(FuncB)はなぜこれで大丈夫なのでしょうか。
aのアドレスをFuncBに渡している…となると Func( &a ); でないとエラーが出そうなのに・・。
むしろ後者は前者とどういう処理の違いがあるのか気になります。

137デフォルトの名無しさん:2009/06/02(火) 23:06:04
>>136
参照≠ポインタ
138デフォルトの名無しさん:2009/06/03(水) 00:50:33
時々このスレで質問させてもらってる者です。
大体何ターンくらいで終わるのか調べてみようと思って
UNOのゲームを書いてみたのですが、どなたか新しい戦略を書いてくれませんでしょうか?

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9331.zip

ルールは、
(1)Draw2とかDraw4はSkip飛ばしできません。
(2)最後にワイルドカードを出してあがれません。
あとは普通のルールと思います
139デフォルトの名無しさん:2009/06/03(水) 01:21:43
>>136
いちいち&aと書かずに済むポインタだと思っても3割くらい当たっていると思ってもいい。
140デフォルトの名無しさん:2009/06/03(水) 01:22:26
Player.cppの中の
bool Player::SelectCard(const Card ¤t, int DrawObligation, Card *playcard)
という関数を書き換えれば新しい戦略が書けます。
この関数は前のプレイヤが出したカードがcurrent、何枚か引かないと駄目な状態になって
る場合には、DrawObligationが2以上になってます。出すべきカードが見つかればtrueを
返して、*playcardに出すべきカードを入れます。
以上です。失礼しました。
141デフォルトの名無しさん:2009/06/03(水) 07:55:24
hashmapは存在してますが、hashsetは効いたことがありません。
stlのsetは効率がいいので開発されてないんでしょうか?
142131:2009/06/03(水) 10:28:10
構造体になんとかしてロードしたかったのですが、これも値がずれてしまいました。
値がずれずに一括でロード出来る方法はないんでしょうか?
一括で読み込んで、クラスや構造体に格納していくしかありませんか。
143デフォルトの名無しさん:2009/06/03(水) 10:31:22
>>142
そもそも保存するときにズレてるんじゃない?
パディングとかオープンモードとかあるから
144131:2009/06/03(水) 10:35:05
アライメントに注意してデータ作成時に隙間を作っておく必要があるんですね。
自己解決しました。
145デフォルトの名無しさん:2009/06/03(水) 11:01:21
隙間を作る (構造体、クラスをそのまま出力する) 方法で一括ロードできました。
ありがとうございます。
146デフォルトの名無しさん:2009/06/03(水) 17:50:27
C言語の学習を始めたばかりですが、
char型配列の要素を、int型の数値に出来なく困っています。
(Borland C++ 5.5.1 for Win32)

char s[3],a;
scanf("%s",&s);
の時、*6 と入力すると
s[0] → *
s[1] → 文字としての 6
s[2] → \0
となっていると思うのですが、s[1]の6を数値として
取り出すにはどうすればよいのでしょうか?

以下やってうまくいかなかった事です。
1)printf("int=%d\n",(int)s[1]);→int=54
2)a = s[1];
printf("int=%d\n",(int)a);→int=54
3)printf("int=%d\n",atoi(s[1]));
4)printf("int=%d\n",atoi(a));
3,4ともに「パラメータ '__s' は const signed char * 型とし
て定義されているので int は渡せない(関数 main )」とエラー。

悩んでしまってここから全く前に進めなくて弱っています。
ご存知の方ご教示ください。よろしくお願いします。
147デフォルトの名無しさん:2009/06/03(水) 17:52:16
>>146
文字としての6ならatoi関数
148デフォルトの名無しさん:2009/06/03(水) 17:53:18
途中になった
printf("int=%d\n",atoi((int)s[1]));

としてキャストしないと
149デフォルトの名無しさん:2009/06/03(水) 18:25:17
>>141
あるよ。DinkumwareとかSGIとかは、hash_mapと共にhash_setも作っている。
そして、unordered_mapとunordered_setという名前でC++標準にも入るし、VCやg++でももう使える。
150デフォルトの名無しさん:2009/06/03(水) 18:51:43
>>146
どんな教科書使って勉強してる?
C言語はBASICみたいに文字列をひとまとまりの変数として扱えないし
数値との相互変換も簡単にはできないので、
一通り教科書を読み終わってから
そういう(Cの初心者には)むつかしいことにはチャレンジしたほうがいいよ。
151146:2009/06/03(水) 20:09:49
>>147-148
早速のレスありがとうございます。

>>150
雑誌の初心者向けの連載を参考にしています。
サンプルを改造しようとしても型変換のようなところで躓いてしまいます。
仰る様にいくら考えても分からない部分は後回しにして進めてみたいと思います。

>>147-148
文末のコードでコンパイルしてみましたが、

エラー E2342  パラメータ '__s' は const signed char * 型と
して定義されているので int は渡せない(関数 main )

と出てしまいました。
本当に学びはじめなので、考えられない間違いがあるかもしれません…。
ご指摘いただければ助かります。よろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
int main() {
char s[3];

scanf("%s",&s);
printf("int=%d\n",atoi((int)s[1]));
return 0;
}
152デフォルトの名無しさん:2009/06/03(水) 20:14:11
>>147-148
馬鹿はわざわざ書き込まなくてもいいのですよ。

>>151
取り敢えず、printf("%d\n", atoi(& s[1]))とでもして味噌。
153146:2009/06/03(水) 20:45:12
>>152
ありがとうございました!できました。
エラーの意味が少し分かった気がしました(これから勉強します)。


>>147-148
即レス感謝しております。色々とキッカケになりました。
ありがとうございました。
154デフォルトの名無しさん:2009/06/03(水) 23:02:04
155デフォルトの名無しさん:2009/06/04(木) 01:41:16
http://www.setsunan.ac.jp/~center/kyositu/freec/dl2008.html
このページを参考にコンパイラをインストールしました。
このページの最後にある、使い方を見るってやつのことで質問なのですが、
僕のbcc32は奥の方にあって(C:\Borland\...)、最終的にbcc32があるところにたどりつくのですが、
ここでしかコンパイラできないじゃないですか?
それが面倒なのでどうにか簡単にできないかってことと、
bcc32があるディレクトリの中には他にもいろんなプログラムがあるんですが、作成したCファイルも
同じところに保存しないとコンパイル&実行できないですよね?
つまりこのディレクトリの中がいろんな形式のファイルがあってめちゃくちゃ汚くなっちゃうわけです。。

これってなんとかキレイにまとめる方法ってあるでしょうか?
もしあるなら、申し訳ありませんが教えてください(>_<)
156155:2009/06/04(木) 01:46:27
すみません補足です。。
一部コンパイラ→コンパイルですね

↑のは自分で見なおしてみるとちょっと日本語がアレなので簡潔に質問しますと、

1.cdの回数を最小限にする方法(bcc32を含むディレクトリをC:の直下に持ってきていいのでしょうか?)
2.CファイルはCファイルだけでどこかにまとめて、そのうえでコンパイル&実行はできるのか

ということです。
よろしくお願いします。。
157デフォルトの名無しさん:2009/06/04(木) 02:27:13
使い方を見るじゃなくて、先に

>インストール(WindowsVista)に進む
>インストール(WindowsXP,2000)に進む
>インストール(Windows98,95)に進む

のどれかを見ろ。
環境変数を設定する解説がある。

それを設定すれば、どこからでもbcc32が呼び出せるようになる。
あとは好きなところにディレクトリを作って、その中でコンパイルすればいい。
158デフォルトの名無しさん:2009/06/04(木) 02:29:08
そこの説明どおりにやればどこでもコンパイルできるはずだけど?
159156:2009/06/04(木) 11:46:59
>>157,158

ありがとうございます。
OSはVistaで、ここに書いてある通り環境変数も設定したつもりなのですが
できないんです。。
;c:\borland\bcc55\bin
ですよね?
これだとここで指定したディレクトリじゃないとできないってことでしょうか?
ローカルディスク(C)の中ならどこでもコンパイルできるようにするには、設定を
c:\
にすればいいということでしょうか?
160デフォルトの名無しさん:2009/06/04(木) 11:52:18
>>159
コマンドラインで、path と打って出てくる文字列に c:\borland\bcc55\bin はあるか?
ちなみにシステム変数の設定をしたあとで開いたコマンドプロンプトじゃないと
有効じゃないぞ
161デフォルトの名無しさん:2009/06/04(木) 12:06:53
>>160
コマンドプロンプトでpathを打つとちゃんと出てきます。
それで、確認用ファイルを
c:\Emacs\C\test.c
という風に作ったディレクトリに保存して、Cディレクトリ内で
c:\Emacs\C\>bcc32 test.c
というようにコマンドしても操作可能なプログラムとして…
というメッセージが返ってきます。。。
162デフォルトの名無しさん:2009/06/04(木) 12:28:01
bcc32 test.c
これを、
c:\borland\bcc55\bin\bcc32 test.c
と打つとどうなるよ。
163デフォルトの名無しさん:2009/06/04(木) 12:29:09
あと環境変数の最後に書いてある?
最初と最後以外は ; で区切ってないと前後とくっつくぞ
164デフォルトの名無しさん:2009/06/04(木) 13:16:59
WindowsでWinSockのプログラムを書くとき、C++ではなくCを使うのでしょうか?
どうしてもC++で書きたかったら、
struct sockaddr_in
とかそういうのは、上手く自作のクラスにまとめてしまえばいいのでしょうか?
165デフォルトの名無しさん:2009/06/04(木) 13:25:45
別にC++でもstruct sockaddr_in とかそういうのは書けるだろ
166デフォルトの名無しさん:2009/06/04(木) 13:38:12
でもネットワーク関係の例題プログラムを見てると、参照は使わないし、クラスもなし、マクロ使いまくり、
とかそういう感じのプログラムばかりだったので、みんなそんな感じなのかなと。
167デフォルトの名無しさん:2009/06/04(木) 14:03:34
>>162
そうコマンドすればコンパイルできます。
ただし、"コマンド'ilink32.exe'を実行できない"とエラーが出ます。
やはりbinディレクトリの中でやりくりするしかないのでしょうか?

>>163
そこは大丈夫です。ちゃんと; ;で挟んであります。
168デフォルトの名無しさん:2009/06/04(木) 14:07:11
>>167
リンカがパス通ってないからな。
それでコンパイルできるなら、PATHがおかしいんだよ。
どこかタイプミスがあるはず。その部分コピペして貼り付けてみ。
コマンドプロンプトのコピーのしかたはわかるよな?
169デフォルトの名無しさん:2009/06/04(木) 14:30:41
>>168
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\usr\local\bin;D:\MinGW\bin;c\borland\bcc55\bin;C:\Program Files\QuickTime\QTSystem\
これがパスの設定です。これのことですか?

コマンドプロンプトのコピーの仕方はわかりませんが(笑)、
ちょっと打ってからTabで出してるのでタイプミスはないと思います。。
170デフォルトの名無しさん:2009/06/04(木) 14:33:55
>>169
>c\borland\bcc55\bin
コロンが抜けてる
c:\borland\bcc55\bin
171デフォルトの名無しさん:2009/06/04(木) 14:37:58
このすれ優しい人が多いね。
感動した!
172169:2009/06/04(木) 15:36:42
>>170
おぉ!!できました!
親切にありがとうございます!!
171じゃないですが、本当に優しい人が多くて助かりました!

あと、ついでと言ってはなんですがコマンドプロンプトについて質問です。
コマンドプロンプトを開いたときの最初の位置が
C:\Users\kei
になってます。(keiは僕の名前です)
開いたとき一番最初は C:\ になってると一番都合がいいのですが、そのように設定できますか?
プロパティとかいろんなトコからやろうとしても見当たらないので…。
173デフォルトの名無しさん:2009/06/04(木) 15:39:15
\usr\local\bin
何に使うんだろう
174デフォルトの名無しさん:2009/06/04(木) 15:39:16
ショートカット作っとけばいいべ。
プログラムはcmdで、作業フォルダはC:|
175174:2009/06/04(木) 15:40:16
C:\だった、、、シフト押しっぱなしだった
176デフォルトの名無しさん:2009/06/04(木) 16:21:59
作業フォルダの設定はどうするんですか?
どう開いても変なディレクトリから入っちゃいます。。
cd ../../
を毎回やるのは億劫なので。。。
177デフォルトの名無しさん:2009/06/04(木) 16:37:32
右クリックでプロパティ出せばいいだろう。
cd \ でいいじゃない
178デフォルトの名無しさん:2009/06/04(木) 16:40:04
そろそろスレ違いだな
179デフォルトの名無しさん:2009/06/05(金) 08:08:41
クラスをグローバルにしたいんだけど、
extern AClass a;
でいいの?
180デフォルトの名無しさん:2009/06/05(金) 08:22:59
バッチファイル書けば楽にならないか?

cd ..\...\
bcc32 %1

とか。
181デフォルトの名無しさん:2009/06/05(金) 09:58:57
ルートで作業するのは論外。
182デフォルトの名無しさん:2009/06/05(金) 11:16:18
ネットワークのプログラムを書いてると、「Windowsのファイヤーウォールがブロックしました」
みたいなメッセージが最初の動作時に一回だけ出るときがありますが、出ても最初の一回だけで
その後は出ません。これってプロパティのどこかにアンブロックしたという記録が残っている
のでしょうか?
183デフォルトの名無しさん:2009/06/05(金) 17:56:01
板違い
184デフォルトの名無しさん:2009/06/05(金) 19:23:36
>>182
レジストリのどこかは知らないが、設定の閲覧・変更は
コントロールパネルのWindowsファイアウォールのところを見ればいい。
185デフォルトの名無しさん:2009/06/05(金) 20:44:54
>>183-184
ありがとうございます。コントロールパネルに見つかりました。
あともう1つだけ。(板違いといわれそうなのですが…一応C++で書いているので)
TCPで複数のコネクションを同時に保持するサーバーを書きたいのですが、サーバ側から
みた通信先はどうやって区別すればよいですか?適当にIDとかを割り振ってそこをみるように
すればいいんでしょうか?
××のソースをみろとかでもいいです。どうかお願いします。
186デフォルトの名無しさん:2009/06/05(金) 20:48:43
>>185
ソケットなら接続してきたクライアントの情報を得られる。
ネットワークプログラミング相談室なんてスレがなかったかな?
187デフォルトの名無しさん:2009/06/05(金) 21:10:01
>>186
ありがとうございます。
ということは、accept()で得られたクライアント情報のIPアドレス+ポート番号
の組でクライアントを識別するということですか?

>ネットワークプログラミング相談室なんてスレがなかったかな?
次からはそっちで聞いてみます。
188質問:2009/06/05(金) 23:03:36
VC++2008です
textBox1に自由に入力させ、「眼鏡」という文字列が入力された瞬間に
メッセージボックスを表示するにはどうしたらいいでしょうか

TextChangedイベントの中でif(textBox1->Text=="眼鏡")としたんですが、
前後に文章があるときもメッセージボックスを表示させたいです

よろしくお願いします
189デフォルトの名無しさん:2009/06/05(金) 23:57:40
strstr
190デフォルトの名無しさん:2009/06/06(土) 01:25:52
VisualC++2008EEです

引数としてクラスのポインタを受け取り、そのポインタにnewでクラスのインスタンスを作る関数は作れますか?
また、どのように作るのでしょうか?
そうして作ったインスタンスを関数の外でdeleteしたいのです
よろしくお願いします
191デフォルトの名無しさん:2009/06/06(土) 01:33:14
>>190
void f(int*& rp)
{
rp = new int;
}

int main()
{
int *p;
f(p);
delete p;
}
192デフォルトの名無しさん:2009/06/06(土) 01:45:09
キモイ設計だな
193デフォルトの名無しさん:2009/06/06(土) 01:51:18
メリット皆無だし
194デフォルトの名無しさん:2009/06/06(土) 03:34:30
普通のメンバ変数を初期化するときって、
コンストラクタの後ろに付加、コンストラクタの中で代入、初期化用メンバ関数を用意してコンストラクタの中で呼び出し
……とかいろいろ考えられると思うけど、使い分けってある?

あと、特に理由がない限り、コピーコンストラクタに初期化処理ってしなくても大丈夫よね?
195デフォルトの名無しさん:2009/06/06(土) 03:48:26
なるべく初期化リストで全部済ませる
初期化で済む物を代入にするメリットは全くない
196デフォルトの名無しさん:2009/06/06(土) 03:50:05
使い分けというか、言語やプログラムの仕様から制約されるってかんじジャね?

const なメンバ変数
 => 初期化リストでしか初期化できない。
初期化のために手続きが必要
 => 初期化リストでは無理
初期化のタイミングがコンストラクション時以外にもある
 => じゃ、別関数にしておくか
197デフォルトの名無しさん:2009/06/06(土) 03:51:05
意地でも例外を送出したくない場合。
198デフォルトの名無しさん:2009/06/06(土) 04:17:00
const以外でも初期化リスト結構みんな使ってるのかー。

途中でリセットする場合以外でも、お婆ロードでコンストラクタが複数あるときは
別関数の方が楽そう……かな?
199デフォルトの名無しさん:2009/06/06(土) 04:53:35
Visual C++ eeのWin32APIでやってます。
ユニコードONの状態で

wchar_t type[255] = _T("うんこ");
MessageBox(NULL, (PCTSTR)typeid(type).name(), NULL, MB_OK);

とすると文字化けしてしまうのですが、なんでですか?
文字列リテラルにLをつけないといけないのと関係あります?
うまく表示する方法ってどうやるのですか?

まだ始めたばっかだしマルチバイトでやればいいのでしょうけど
気になるので、よかったら教えてください

お願いします
200デフォルトの名無しさん:2009/06/06(土) 06:47:24
>>198
Effective C++は読んだかい?
まだなら定額給付金を片手に今すぐ本屋に行くんだ。
201デフォルトの名無しさん:2009/06/06(土) 06:48:32
typeid(type).name()はLPCTSTRじゃないから

MessageBoxA(NULL, typeid(type).name(), NULL, MB_OK)
202デフォルトの名無しさん:2009/06/06(土) 06:57:13
>200
おや なぜか めのまえの ほんだなに おいてあるぞ!
203199:2009/06/06(土) 15:31:21
>>201
MessageBoxAとMessageBoxWがあって
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
こんなんなってるんですね

だからMessageBoxAを強制的に呼び出してやると
氷解しました。ありがとうございます。
204デフォルトの名無しさん:2009/06/06(土) 17:26:42
>>199
TCHAR type[255] = _T("ちんこ");
MessageBox(NULL, type, NULL, MB_OK);
205デフォルトの名無しさん:2009/06/07(日) 13:03:16
dummy
206デフォルトの名無しさん:2009/06/07(日) 14:01:55
int org_i = 1000;
void *p = &org_i;
int i = *reinterpret_cast<int*>(p);
voidへのポインタからINTの値を取り出そうとして上のようにしたのですが、
reinterpret_castの前に*があったりしてなんとなくいやです。
ほかに方法はないでしょうか?
207デフォルトの名無しさん:2009/06/07(日) 14:04:28
それが正しい方法だからそれでいい
208デフォルトの名無しさん:2009/06/07(日) 14:05:17
voidのポインタをやめる
209デフォルトの名無しさん:2009/06/07(日) 14:50:41
こんなテンプレートを用意して

template <class T>
T pointer_value(const void* p)
{
return *static_cast<const T*>(p);
}

こうする

int i = pointer_value<int>(p);
210デフォルトの名無しさん:2009/06/07(日) 14:56:13
テンプレートは分からないので禁止
211デフォルトの名無しさん:2009/06/07(日) 17:15:04
>>210
お前が勉強しろ
212デフォルトの名無しさん:2009/06/07(日) 18:35:31
テンプレートはわからないので禁止
213デフォルトの名無しさん:2009/06/07(日) 18:46:18
ポインタはわからないので禁止
214デフォルトの名無しさん:2009/06/07(日) 18:56:05
C++はわからないので禁止
215デフォルトの名無しさん:2009/06/07(日) 19:20:16
クラスAがクラスBに所持されてる関係になってるとして

インスタンスAがB1に参照されてる状態から
B2がインスタンスAを参照したらB1からAの参照が切れる

常にAが1個のBから参照されるような関係を作るにはどうしたら良いでしょうか?
216デフォルトの名無しさん:2009/06/07(日) 19:37:11
所有を譲渡するメソッドをBに作る
217デフォルトの名無しさん:2009/06/07(日) 20:04:47
逆にAがBを参照するように変更できないか検討する
218デフォルトの名無しさん:2009/06/07(日) 23:29:49
>>216
B同士で所有の移動をするメソッドを、ということでしょうか?

>>217
BがAに更新通知してAがBの値を読みに行くので
Aへの更新通知を別の方法で実現できればそれでもいいのですが・・
219デフォルトの名無しさん:2009/06/08(月) 00:37:33
Aを触れないし値も引き出せない状態になったB1・B2の挙動をどうするつもりかに因るな
220デフォルトの名無しさん:2009/06/08(月) 00:38:58
AからBにコールバックでも登録させればいいんでない。
221デフォルトの名無しさん:2009/06/08(月) 00:41:57
AがB1に参照されたり、B2に参照されたりってのを決めるのはだれだ?
222デフォルトの名無しさん:2009/06/08(月) 01:43:02
> BがAに更新通知してAがBの値を読みに行くので

Aに"今からお前の相手するBインスタンスはわしじゃ"通知メソッドを作れば?
その際に元彼Bに"もう私のことは放っておいて"通知メソッドをAから呼んでもらう
223デフォルトの名無しさん:2009/06/08(月) 11:43:40
C++では、戻り値だけが違う関数は同じものとされますが、
戻り値だけが違う関数を複数作りたい場合どうするべきでしょうか?
class C1;
class C2;
というのがあって、
C1 create();
C2 create();
という感じにやりたいときです。
お願いします。

224デフォルトの名無しさん:2009/06/08(月) 12:11:13
>>223
無理です。だいたい呼び出せません。
名前空間を使いましょう。
225デフォルトの名無しさん:2009/06/08(月) 12:17:56
ファイルの開け方、閉じ方はわかったのですが読み取って処理するところがよくわかりません
,で区切られて1行に並んでるファイル内の行列から数値を配列に入れる方法を教えてください!
226デフォルトの名無しさん:2009/06/08(月) 12:23:49
やりかたはいろいろありすぎて、、、
とりあえず手始めに、fgets()とsscanf()使ってみるのはどうか?
まあ配列に入れるならループで回してstrtokとatoi使う手もあるけど、
最後はstrtok+atoiみたいな関数を自分で作るのがいいかもね。
227デフォルトの名無しさん:2009/06/08(月) 12:24:30
今回初めてマルチスレッドな処理を行う必要があるのですが
注意点、スレッドセーフな処理にするための方法などを詳しく扱った書籍やサイトはないでしょうか?
228デフォルトの名無しさん:2009/06/08(月) 12:25:39
>>226
ありがとうございます
,の除き方を詳しく教えてください
229デフォルトの名無しさん:2009/06/08(月) 12:26:37
>>228
csvデータの読み込みでぐぐった方がいいかも
230デフォルトの名無しさん:2009/06/08(月) 12:27:37
>>228
sscanf()もstrtok()も , の処理はやってくれるだろ。
自前でやるならstrchr()で場所調べて切り出していけばいいと思うよ。
231デフォルトの名無しさん:2009/06/08(月) 12:32:12
そうなんですが
全然知りませんでした
ありがとうございました
232デフォルトの名無しさん:2009/06/08(月) 14:05:22
>>223
dmyC{};
class C1{C1 operator=(dmyC&){*this=createC1();return *this;}};
class C2{C2 operator=(dmyC&){*this=createC2();return *this;}};
dmyC create(){return dmyC();}
C1 C1create(){〜return c1;}
C2 C2create(){〜return c2;}

なんのメリットがあるか知らんが使用側で偽多態受けなら出来ん事はない
前参照やスコープは適当に修正要
233デフォルトの名無しさん:2009/06/08(月) 14:14:40
C99より前の規格では、nanやinfを検出することってできないのでしょうか?
234デフォルトの名無しさん:2009/06/08(月) 14:19:51
修正 dmyC で弄った方が潰しが利くね
dmyC{operator C1(){〜return c1;}operator C2(){〜return c2;}};
235デフォルトの名無しさん:2009/06/08(月) 14:50:49
floatで数字をいろいろ処理して,でつないでcharに直してfputsで書き出したいんですけど方法を教えてください!
236デフォルトの名無しさん:2009/06/08(月) 15:39:06
fscantfとかsscanfとかそういうことか
わかったぽ
237デフォルトの名無しさん:2009/06/08(月) 19:01:54
.netはC++では扱えないんですか
238デフォルトの名無しさん:2009/06/08(月) 19:06:26
はい
239デフォルトの名無しさん:2009/06/08(月) 19:10:15
C#でしかやれないということですか?
GUIアプリを楽につくりたいならC#ですかね?
240デフォルトの名無しさん:2009/06/08(月) 19:11:14
その通り!
241デフォルトの名無しさん:2009/06/08(月) 19:18:42
テンプレートの話は禁止だって言ってんだろ
242デフォルトの名無しさん:2009/06/09(火) 01:07:44
int array[x][y];
があるとき、
array[10] == &array[10][0]
でしょうか?
243デフォルトの名無しさん:2009/06/09(火) 01:14:00
よく考えたら分かると思うが頭痛が悪くなるようなコードは書くな
244デフォルトの名無しさん:2009/06/09(火) 01:14:19
配列は分からないので禁止
245デフォルトの名無しさん:2009/06/09(火) 01:17:52
>>242
気になるならポインタがさしてるアドレスを比べてみなよ
246デフォルトの名無しさん:2009/06/09(火) 01:20:47
>>245
型は配列なので注意が必要、多分等しいだとは思うんだが。(両方とも配列)
配列はポインタに自動変換だが、逆はそうではない、やっぱ頭痛い。
247デフォルトの名無しさん:2009/06/09(火) 01:23:22
ああ違う、右はポインタ、左は配列、そして左が自動変換だ
うぜぇぇ
248デフォルトの名無しさん:2009/06/09(火) 01:24:56
int a[10]; は、int10個の配列aで分かりやすいのに。
int a[10][20]; は、int10この配列が20個、ではないところがややこしい。
249デフォルトの名無しさん:2009/06/09(火) 01:26:48
>>248
Cの規則ですから
int func()[10]
{
return 配列;
}
おらよ、これでも喰らえってなもんだ
250デフォルトの名無しさん:2009/06/09(火) 01:26:53
ポインタ本を読むと出てくる(K&Rでもかかれてる)けど
配列や関数の型は、外側からはがしていく感じで解釈するんだよね。
251デフォルトの名無しさん:2009/06/09(火) 01:49:26
>>249
関数は配列を返せない
252デフォルトの名無しさん:2009/06/09(火) 01:53:52
>>251
ANSIでは使えない事になっているが、返せる処理系もっあってだな、
アホな開発者がそれを返している糞ライブラリがあるんだ
どこのかって?S○Eとか○CEとかSC○とか、まあそんなところ、死ねます。
253デフォルトの名無しさん:2009/06/09(火) 01:56:17
>>251
ポインターは返せるからできなくはないんじゃね?
ただサイズの問題とかあるけど
254デフォルトの名無しさん:2009/06/09(火) 02:27:31
CのコードをC++に書き直してます。
Cのコードの中に大量の構造体を使ってるところがあって、malloc()でメモリを
取らずに、自分でメモリプールを管理する割り当て関数を使ってます。これを生かすため
placement_new()というのを使おうと思っているのですが、この場合delete()が使えない
(使う必要がない)と聞いたのですが、placement_new()の使い心地はどうでしょうか?
使いやすいですか?

255デフォルトの名無しさん:2009/06/09(火) 03:16:28
構造体に配列突っ込めば、ポインタじゃなくても直接返せるよ! よ!
256デフォルトの名無しさん:2009/06/09(火) 03:24:55
>>254
使う必要がない、ではなく使えないだな。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
placement newの文字通り引数を取る形式new(hoge) Tにたいして、delete(hoge) pという構文がないという話。

メモリ確保処理を自前でやるとしたら、
クラス・構造体にnew/deleteなどを定義するか、
アロケータクラスを作って、確保解放はvectorとかに任せる
という形態のほうが多いと思う。ほかの人はどう考えているか分からないけど。
257デフォルトの名無しさん:2009/06/09(火) 04:13:45
placement newを使いにくいとは思わないけど、むやみに使うものでもない。
>>256の言うように、クラス・構造体にnew/deleteを定義するとか
アロケータとコンテナを組み合わせるのがいいと思う。
258デフォルトの名無しさん:2009/06/09(火) 05:16:07
c++で複数のクラスからの継承ってできますか?

たとえば
数値Aと
class NoA{
//ここに関数A
}

class NoB{
//ここに関数B
}

ここでNoAもNoBも引き継いだclass NoC
(NoC.関数AとNoC.関数Bの両方ができ)

みたいなことってできるの?
259デフォルトの名無しさん:2009/06/09(火) 05:18:52
260デフォルトの名無しさん:2009/06/09(火) 09:41:04
C++に動的にクラスを生成する方法がないって本当ですか?
文字列としてクラス名があったとして、それでオブジェクトを作ることができないって読んだんですけど。

自由度高そうなのに。
ごにょごにょしてやる方法あります?
261デフォルトの名無しさん:2009/06/09(火) 09:46:39
>>260
Smalltalkみたいな使い物にならないインタープリタと一緒にすんな
262デフォルトの名無しさん:2009/06/09(火) 09:50:30
>>260
こういう話か?
std::map<std::string, boost::shared_ptr>
263デフォルトの名無しさん:2009/06/09(火) 09:56:44
インタプリタ村の村民らしい要望だな
だな
264デフォルトの名無しさん:2009/06/09(火) 10:05:56
クラスの動的生成ではないがC++にリフレクション機能は
あってもよかったと思う
265デフォルトの名無しさん:2009/06/09(火) 10:18:47
オーバーヘッドが好きな奴が多いな。
266デフォルトの名無しさん:2009/06/09(火) 10:36:38
>>260
やろうと思えばなんだってできるよ、コンパイラ呼び出しDLLにコンパイル、出来上がったDLL動的にリンク、そして呼び出す。
面倒くさくてやらないけど。
267デフォルトの名無しさん:2009/06/09(火) 10:40:41
.NETを見ていると、標準ライブラリにコンパイラコレクションが入っていると便利なのだがと思う事はあるな・・・
ターゲットの環境にコンパイラをインストールなんて余りやりたくないからね
268デフォルトの名無しさん:2009/06/09(火) 11:40:29
fscanfの引数の場合分けがうまくいかないんだけどどうして?
引数がfloatとcharで20こあって"%d%f・・・・・",hairetu,&suuji・・・・とあるんだけど返り値=1にした時しかうまくいかない
switchにしてcase20はおkだけどcase 2とかdefaultにはcaseが正しくありませんってなる
269デフォルトの名無しさん:2009/06/09(火) 11:44:10
>>268
C言語でおk
270デフォルトの名無しさん:2009/06/09(火) 11:47:18
swichの方はswith{}←のカッコを忘れてただけでした
271デフォルトの名無しさん:2009/06/09(火) 11:51:27
fscanfの感じがわからん
fscanfした時点で一行バッファに入ってそこから指定した型の順で前から取っていく感じでしょ?
3つ目で型が合わないことがわかったらどうなるの?
272デフォルトの名無しさん:2009/06/09(火) 12:42:01
>>271
行は関係ないよ
合う型を探して改行関係なしにファイルの最後まで行ったら終わり
3個目が見つからなかったら戻り値で2を返すだけ
273デフォルトの名無しさん:2009/06/09(火) 12:59:17
サンクス
行関係無いのか
どっかのページ1行読み込むって書いてあったのに
274デフォルトの名無しさん:2009/06/09(火) 13:25:48
scanfのほうの使用を思い出すんだ
275デフォルトの名無しさん:2009/06/09(火) 14:29:48
caseってcase(1||2||3||4):って使えますか?
なんか使ってないのに違う行のcaseの所でcaseの値"1"は既に使用されていますって出るんだけど
276デフォルトの名無しさん:2009/06/09(火) 14:34:30
1〜4 までの整数を1箇所で引っ掛ける時は
case 1:
case 2:
case 3:
case 4:
 /* 本体 */
 break;

こう書く

case (1||2||3||4): は
定数式 1 || 2 || 3 || 4 →結果は真で 1 として整数化されるから
結局 case 1: と書いてるのと同じ意味になってしまう
277デフォルトの名無しさん:2009/06/09(火) 14:44:09
ありがとうございました!
あんまり載って無いですね、初心者ならやってしまいがちだとおもうのですが
278デフォルトの名無しさん:2009/06/09(火) 14:51:46
習得順的には
if { } 〜 else if { } 〜 else { }
の羅列のほうが先にじゃねーかな?

break しない case を持つ switch 文って個人的にはあまり好きじゃない。
見直したときに 「あれ? break 忘れてるんじゃね?」 って勘違いしちゃう可能性があるもの
279デフォルトの名無しさん:2009/06/09(火) 14:57:11
むしろcase で || 使うというのをはじめてみた
280デフォルトの名無しさん:2009/06/09(火) 15:21:52
他言語から来た人とか?
281デフォルトの名無しさん:2009/06/09(火) 15:24:57
普通の初心者でつ
282デフォルトの名無しさん:2009/06/09(火) 15:28:39
>>280
勉強中でROMしてます

>>276
>case (1||2||3||4): は
>定数式 1 || 2 || 3 || 4 →結果は真で 1 として整数化されるから
>結局 case 1: と書いてるのと同じ意味になってしまう
として処理されるならそもそも書く必要すらないですしこういう記述を知ってる必要もない気が・・・

つまり
>case 1:
>case 2:
>case 3:
>case 4:
> /* 本体 */
> break;
こっちを知ってればいいかと。
それかジャンプテーブルとかで処理しちゃうか
283デフォルトの名無しさん:2009/06/09(火) 16:02:48
>>282
知るべきことは "case の後ろは定数式" であること だ。

・定数式のうち 論理演算式だけは 演算結果が所詮 0/1 にしかならないのでおいしくない

・四則演算な定数式や ビット毎の論理演算定数式 記述が簡単になったり可読性が上がるかもしれない

四則演算の例:
#define TOP (100)
case TOP+1:

ビット毎の論理演算の例
#define A (1<<0)
#define B (1<<1)
case A|B:
284デフォルトの名無しさん:2009/06/09(火) 16:40:14
string が色変わらないんだけどなんで?ちゃんとインクルードしてるのに
285デフォルトの名無しさん:2009/06/09(火) 16:49:42
>>284
メモ帳で書いてろ
286デフォルトの名無しさん:2009/06/09(火) 16:56:58
他の関数でもポップアップが出なくなった
なんでだろう
287デフォルトの名無しさん:2009/06/09(火) 17:09:35
>>286
{}とかが上手くいってないと出ないよ
288デフォルトの名無しさん:2009/06/09(火) 17:41:44
>>287
ありがとうございました
289デフォルトの名無しさん:2009/06/09(火) 19:53:26
caseに式を使えたらいいのにぁ
else ifの梯子なんてダサすぎる…
290デフォルトの名無しさん:2009/06/09(火) 19:55:40
制限は多いけど、その条件を満たす場合はパフォーマンスを発揮できると考えるべき。
291デフォルトの名無しさん:2009/06/09(火) 20:21:01
switch case のコンパイルコードに期待を持つなんてオールドタイプのバッドノウハウ
292デフォルトの名無しさん:2009/06/09(火) 20:37:30
>>289
条件演算子を使えば似たような書き方で好きな式を条件に出来る。
C++だけだったかも知れんが。
293デフォルトの名無しさん:2009/06/09(火) 22:24:46
else if するくらいなら

(x==0||x==1||x==2||x==3)&&(func0(),true)
||x==4&&(func4(),true)
||x==5&&(func5(),true)
||(func_default(),false);
294デフォルトの名無しさん:2009/06/09(火) 22:26:09
あ、カッコ不足だった
295デフォルトの名無しさん:2009/06/09(火) 22:49:34
AクラスのaにBクラスからアクセスしたいのですが、うまくいきません。
どうしたらいいでしょうか。。

#include <stdio.h>

class A
{
  public:
    A(int);
  private:
    int a;
  private:
    class B
    {
      public:
        B() { printf("constructer B\n"); }
        void some_func(void){ printf("a: %d\n", a); }
    };
};

A::A(int x)
{
  a = x;
  B* b = new B();
  b->some_func();
}

int main(void)
{
  A a(10);
  return 0;
}
296デフォルトの名無しさん:2009/06/09(火) 23:08:01
>291
でもブレイクスルーとdefaultの機能って、状況さえ許せば凄く便利じゃね?
297デフォルトの名無しさん:2009/06/09(火) 23:30:32
>>295
class A{
public:
A(int);
private:
int a;
class B
{
public:
B(A&a) : a(a) { printf("constructer B¥n"); }
void some_func(void){ printf("a: %d¥n", a.a); }
private:
A&a;
};
friend class B;
};
A::A(int x){
a = x;
B* b = new B(*this);
b->some_func();
}
298デフォルトの名無しさん:2009/06/09(火) 23:32:38
>>295
friend
299デフォルトの名無しさん:2009/06/09(火) 23:35:43
>>296
Duff's Deviceくらいしか使い道なくね?
300デフォルトの名無しさん:2009/06/10(水) 01:17:05
>>296
ブレイクスルーちゃう
fall through
301デフォルトの名無しさん:2009/06/10(水) 01:18:14
ブレイクするんちゃう?
302デフォルトの名無しさん:2009/06/10(水) 01:23:48
std::coutとかstd::endl;って
スレッドセーフですか?
303デフォルトの名無しさん:2009/06/10(水) 01:29:06
コンパイラごとに違うので、コンパイラの仕様書を読んでください。
っていうか、C++の規約にはスレッドセーフに関する記述はないんじゃなかったっけ?
304デフォルトの名無しさん:2009/06/10(水) 08:28:30
ライブラリによるしな
305デフォルトの名無しさん:2009/06/10(水) 09:04:54
>300
失礼、別のと混ざった
306デフォルトの名無しさん:2009/06/10(水) 14:23:36
class A{ public: void A( void ); virtual void ~A( void ); };
と書きたい今日この頃
なぜこの書き方でエラーがでるのかがわからない
307デフォルトの名無しさん:2009/06/10(水) 14:28:13
気持ちは分かるけどさ。
「もともと戻り値は存在しないもの」と、「戻り値は使わないことを宣言する」の違いじゃない?
308デフォルトの名無しさん:2009/06/10(水) 14:28:38
void
309デフォルトの名無しさん:2009/06/10(水) 14:47:46
sprintf関数について質問です。
strcatとかstrcpyを使うよりも、便利だと教えられたのですが、いまいちどこが便利なのかわかりません。
教えてください。
310デフォルトの名無しさん:2009/06/10(水) 14:53:53
具体的にstrcatとかstrcpyを使ったコード書いてみて
それをsprintfに置き換えてみりゃわかるだろ。

もちろん、strcatとかstrcpy一発で済むような例はstrcatとかstrcpy使えばいいのはわかるよな。
311デフォルトの名無しさん:2009/06/10(水) 15:54:06
HOGE_01、HOGE_02 …… みたいな文字列を生成するときは、sprintfじゃないとやってらんないと思う
312デフォルトの名無しさん:2009/06/10(水) 21:29:14
sprintfなんてキケンな物使っちゃいけません
313デフォルトの名無しさん:2009/06/10(水) 21:33:01
sprintf_sがあるから無問題
314デフォルトの名無しさん:2009/06/10(水) 22:03:03
>>312
#pragma warning (disable : 4996)
315デフォルトの名無しさん:2009/06/10(水) 22:06:52
ltoaで小数点以下の数値を文字にするにはどうするの?
316デフォルトの名無しさん:2009/06/10(水) 22:06:59
sprintf_sにしろsnprintfにしろ標準じゃないし、こいつらはこいつらで危なかったりするし(ヌル終端しないとか)
いずれにせよsprintf一族はロクなもんじゃないから書き捨てコード以外には使うべきでない
317デフォルトの名無しさん:2009/06/10(水) 22:08:06
>>316
安全な使い方をすればいいだろ
318デフォルトの名無しさん:2009/06/10(水) 22:11:26
sprintf系を使って本当に安全なコードを書こうとすると#ifdef地獄だぞ
挙動バラバラだし、本当にクソみたいなsnprintfとかがいるから
ヌル終端しないくらいならカワイイもんで、例えば
一昔前のLinuxはnをガン無視してsprintfにブン投げるようになってることがある
本当に死ねばいいと思う
319デフォルトの名無しさん:2009/06/10(水) 22:13:28
C/C++にしろJavaにしろ安全は保障されないし、こいつらはこいつらで危なかったりするし(すぐに暴走するし)
いずれにせよプログラミング言語一族はロクなもんじゃないから書き捨てコード以外には使うべきでない
320デフォルトの名無しさん:2009/06/10(水) 22:20:16
snprintfはC99標準……。
ま、糞実装なsnprintfの存在以前にC99自体アレだが。
321デフォルトの名無しさん:2009/06/10(水) 23:44:16
C99の仕様以前に、C99の対応率が。。。
322デフォルトの名無しさん:2009/06/10(水) 23:50:11
C99の方が便利なのに、どうしてC99に移行しないんだろうね?
異なるプラットフォーム間で利用されるソフトを開発しているならともかく
そうでない、小さなプロジェクト(おそらく世のプロジェクトの大部分)は
C89よりC99で開発したほうが(わずかだろうけど)コスト削減になりそうなものだが。
323デフォルトの名無しさん:2009/06/10(水) 23:52:42
世の中Cじゃ無くてC++方向に走ったからね。いまさら感があるよ
324デフォルトの名無しさん:2009/06/10(水) 23:59:07
便利な物だけつまみ食いしとけばいいんだよ
__func__とか__VA_ARGS__とか_Pragmaとか<stdint.h>とか

restrictやら可変長配列やらはいりません
325デフォルトの名無しさん:2009/06/11(木) 00:53:03
僕は複合リテラルだけ居てくれればそれでいい。
326デフォルトの名無しさん:2009/06/11(木) 01:48:37
C++でクラスの配列を作ったのですが、配列の要素数をどうやって求めればいいでしょうか。

class hoge
{
public:
int a,b,c,d,e;
void func1();
void func2();
};

hoge h[]={
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
};
このとき
sizeof(h)/sizeof(hoge)
とやっても正しく出てくれません。
327デフォルトの名無しさん:2009/06/11(木) 01:53:50
template<X>unsigned is(hoge[X]&){return X;}

kazu=is(h);
328デフォルトの名無しさん:2009/06/11(木) 02:00:41
class Hoge
{
int a
}

というクラスがあったとき
Hogeのインスタンス同士の比較をメンバ変数aの大小で行う場合
演算子をオーバーロードしたほうが良いのか
int GetA()という関数を比較するのが良いでしょうか?

またHogeインスタンスとintを比較することも考えてますがこういう場合はどうでしょうか?
329デフォルトの名無しさん:2009/06/11(木) 02:02:44
>>326
いやそれであっている。
うまくいかないならほかに原因がある。
330デフォルトの名無しさん:2009/06/11(木) 02:37:59
>>328
Hoge同士の比較方法がそれ以外にあり得ないなら演算子オーバーロードでいいんじゃね?
331デフォルトの名無しさん:2009/06/11(木) 02:50:23
>>329
すいません。
クラス配列を作るとき、
hoge h[]={
hoge{1,2,3,4,5},
hoge{1,2,3,4,5},
hoge{1,2,3,4,5},
hoge{1,2,3,4,5},
};

と書くようにしたら先のやり方で配列の要素数が取れました。
環境はVS2008なのですが、最初の書き方ではだめだったでしょうか?
332デフォルトの名無しさん:2009/06/11(木) 03:10:02
コンパイラ何使ってる?
あと、どんな結果が出たのかも書いて欲しいかなかな。
333デフォルトの名無しさん:2009/06/11(木) 03:35:46
hoge{1,2,3,4,5} ←なにこれ?
334デフォルトの名無しさん:2009/06/11(木) 08:03:30
新しいコンストラクタの呼び方
335デフォルトの名無しさん:2009/06/11(木) 09:35:48
デタラメ書くなカス
336デフォルトの名無しさん:2009/06/11(木) 15:17:42
>>331
自分もVS2008だけど、これはエラーなくコンパイルできて4と出力される。むしろ>>331がコンパイルエラーになる。
#include <iostream>

class hoge
{
public:
int a,b,c,d,e;
void func1();
void func2();
};

hoge h[]={
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
};

int main()
{
std::cout << sizeof(h)/sizeof(hoge) << std::endl;
}
337デフォルトの名無しさん:2009/06/11(木) 19:58:37
gcc4.3以上なら通るな
initializer_listだろ
338デフォルトの名無しさん:2009/06/11(木) 20:57:57
C99の機能をC++に持ち込むなクズ
339デフォルトの名無しさん:2009/06/11(木) 21:22:27
C++0xではC99の一部機能が採用されるよ。
委員会の人たちにクズと言わないと意味ない。
340デフォルトの名無しさん:2009/06/11(木) 21:37:51
restrictとか_Complexとか可変長配列みたいな
本当にしょうもない物は入らないから大丈夫だと思うけどね
341デフォルトの名無しさん:2009/06/11(木) 21:53:38
>>339
ここはC++0xのスレじゃないよ
342デフォルトの名無しさん:2009/06/11(木) 23:20:40
>>340
特に、restrictはC++89のときに否決された過去があるから、
今回も入れられるわけないw
343デフォルトの名無しさん:2009/06/11(木) 23:22:51
restrictは入れると一つだけ利点があるんだよなあ

FORTRAN並みに配列演算が高速化できる可能性がある
科学技術計算にはFORTRANを、と言わなくて済むようになるんだがな

それ以外には取り立てて利点はない
344デフォルトの名無しさん:2009/06/12(金) 06:13:12
>>341
ここがC++0xのスレかどうかなんて、>>338-339の流れには関係ないよ。
345デフォルトの名無しさん:2009/06/12(金) 09:08:43
>>344
スレ違いだクズ
346デフォルトの名無しさん:2009/06/12(金) 09:24:45
いいえ。
347デフォルトの名無しさん:2009/06/12(金) 09:52:32
いいえ。
348デフォルトの名無しさん:2009/06/12(金) 09:56:38
iccでもオプション指定さえすればrestrictが使えるんだよね。
メモリのアクセスパターンががらっと変わる可能性があるから入れて欲しいけどねぇ。
349デフォルトの名無しさん:2009/06/12(金) 23:16:42
ケフィアです。
350デフォルトの名無しさん:2009/06/13(土) 00:39:41
ファイルから読み込んで{から次の}までを取得したい場合はどのような方法になりますか?
351デフォルトの名無しさん:2009/06/13(土) 00:44:10
ファイルを開く
読む
{を探す
}を探す
範囲内の文字列を取得する


お前は真面目に質問する気あるのか
352デフォルトの名無しさん:2009/06/13(土) 00:47:05
system("grep -o "{.*}" <ファイル名>);
353デフォルトの名無しさん:2009/06/13(土) 01:00:02
ありがとうございます
正規表現が使えないって聞いたような気がしたから
文字列をくっつけたり長さを測ったりそういうとこからしかできないのかと思ってた
354デフォルトの名無しさん:2009/06/13(土) 01:05:28
>>353
お前の書いた文章を読む分には、{から次の}までということだから正規表現で余裕だ。
{から次の対応する}までだと正規表現では無理だが。
355デフォルトの名無しさん:2009/06/13(土) 01:09:54
>>354
なんかよくわからんけどサンクス
356デフォルトの名無しさん:2009/06/13(土) 01:10:37
"a { b { c } d } e" -> "{ b { c }"
357デフォルトの名無しさん:2009/06/13(土) 01:12:24
ソースコードでも処理したいのかね。
358デフォルトの名無しさん:2009/06/13(土) 01:14:29
ネストがあるならカウントしていくしかないよな
359デフォルトの名無しさん:2009/06/13(土) 01:14:41
まあそんなところですね
計算処理込みの置き換えを主にしたいです
ベクターでそんなフリーソフトあるかもしれないけど
360デフォルトの名無しさん:2009/06/13(土) 01:20:48
>>350
>>352 のおかげで何となく質問の意味が分かった
#include<stdio.h>

int main(void){
FILE *fp;
char brace[2][2], buf[2000+1];

fp=fopen(__FILE__, "r");
if(fp==NULL) return 0;

while(!feof(fp)){
fscanf(fp, "%*[^{]");
if(fscanf(fp, "%1[{]%2000[^}]%1[}]", brace[0], buf, brace[1])==3){
printf("\n=====ここから=====\n%s\n-----ここまで-----\n", buf);
}
}
fclose(fp);
return 0;
}
361デフォルトの名無しさん:2009/06/13(土) 01:24:57
というか正規表現使えないんじゃないの?
このboostとかいう奴標準で入れとくべきなの?
362デフォルトの名無しさん:2009/06/13(土) 01:33:28
>>361
ああ、禁止されてる会社で使うコードとかでもない限りほぼ標準と思って間違いない。
ついでに補足だけど正規表現はC++標準規格の追加仕様(tr1)でライブラリに追加される予定。
363デフォルトの名無しさん:2009/06/13(土) 01:35:09
そうなのか
じゃあそれを入れることにします、ありがとうございました
364デフォルトの名無しさん:2009/06/13(土) 01:45:42
TR1は最近のg++やVC++ 9 SP1とかで使えるけど、
BoostのXpressiveも捨て難い。
365デフォルトの名無しさん:2009/06/13(土) 01:54:56
SP1なんて出てたんだ。 教えてくれてありがと。
366デフォルトの名無しさん:2009/06/13(土) 13:52:21
CreateFileMappingでプロセス間の共有メモリを用意したんだが、
排他制御にMutex使ったら想定していたより処理が重くなった。
(頻度が多すぎなのでNGっぽい。アクセスが、がっちんこするのは
相当低い頻度なので、スピンロックの実装を検討したいです。
Windows系で、プロセス間排他制御で、スピンロックを使う方法って、
何か用意されているものはありますでしょうか?よろしくお願いします。
367デフォルトの名無しさん:2009/06/13(土) 14:04:31
368デフォルトの名無しさん:2009/06/13(土) 15:29:21
>>367 情報サンクスです ちゅー まいどw
表からするとCreateMeteredSectionを使えって事らしい。
なんとかなりそう。何か関数名が、Wait、Releaseが、
Enter,Leaveになったり、知らない関数ばっかで、少し怠い。
まあ、前者はハンドル(イベントやその他)によって
動きが変わるものもあるから、その辺で条件処理で遅いのかな。
とりあえずテストします。
369デフォルトの名無しさん:2009/06/13(土) 16:17:02
>>366 です。
// Spin and get access to the metered section lock
while (InterlockedExchange(&;(lpMetSect->lpSharedInfo-> _
lSpinLock), 1) != 0)
Sleep(0);
CreateMeteredSectionと同様の方法にします。
既存の共有メモリー上にスピンロック用の変数を作って、
InterlockedExchangeで、ロックできるまでループ。
アンロックは、同関数で0に戻して戻り値は捨て、
これでOKのような気がする。
370デフォルトの名無しさん:2009/06/13(土) 22:12:47
Bootsスレが落ちたみたいなんですが、どうしたらいいですか?
371デフォルトの名無しさん:2009/06/13(土) 23:10:20
ぶーつ。
372デフォルトの名無しさん:2009/06/14(日) 00:13:56
C++で

class A
{
public:
 A *next;
 void hoge();
};
class B: public A
{
public:
 void hoge();
};

というクラスの構造で

A *p = new B();
p->hoge(); ←ここ

とやるとAクラスのhoge()が実行されるのですが、
どうすればBクラスのhoge()が実行されるようにできるでしょうか。
ここではAとBだけですが、実際のクラスはもっと複雑な木構造になる予定です。
373デフォルトの名無しさん:2009/06/14(日) 00:29:03
関数の引数で、ただの値渡しかconst参照どちらにするか、決める基準ってあるんですか
374デフォルトの名無しさん:2009/06/14(日) 00:29:27
p->B::hoge();
375デフォルトの名無しさん:2009/06/14(日) 00:33:07
class A {
・・・
virtual void hoge();
};
376372:2009/06/14(日) 00:39:29
すみません。説明が不足していました。
いろんなAの子のクラス型の入ったリスト構造で順次にhoge()を呼び出したいので、
同じ命令で汎用的に使える必要があります。
377372:2009/06/14(日) 00:48:13
解決しました。
ありがとうございます。
オーバーライドに識別子が必要なのを忘れてました。
378デフォルトの名無しさん:2009/06/14(日) 01:03:25
init(){
test *ts = new test();
}

main(){
ts->draw();
}

みたいな事をしたいのですがtsが宣言されていないと怒られます
別の関数でクラスを使うにはどうすればよいのですか?
379デフォルトの名無しさん:2009/06/14(日) 01:07:57
何がしたいのかわからないけど、関数間でポインタを持ちまわらないと。
もしくはそのポインタをグローバルスコープにするとか。

test *init() {
test *ts = new test();
return *ts;
}

int main() {
test *p = init();
p->draw();
}

380デフォルトの名無しさん:2009/06/14(日) 01:09:17
あ、ごめん、return *ts じゃなくて return ts ね^^
381デフォルトの名無しさん:2009/06/14(日) 03:37:40
メインループをクラスに含めたプログラムを作ったのですが
何か問題がありますか?
382デフォルトの名無しさん:2009/06/14(日) 03:45:51
いいんじゃないの
ループを納めるためだけのクラスだとしたらあまりお勧めはしないが
383デフォルトの名無しさん:2009/06/14(日) 04:25:25
問題なし。
WTL::CMessageLoopとかboost::asio::io_serviceとか、
言わばループを提供することが主目的のクラスだっておかしくない。
384デフォルトの名無しさん:2009/06/14(日) 09:29:42
「★初心者にVisual C++を教えるスレ★」
で質問したのですが返答をいただけなかったのでこちらで。

練習でブラウザを作っています。
JavaScriptを無効にしてページを開けるようにしたいと考えています。
Windowsフォームアプリケーションの関数だけで可能でしょうか。
それともCOMなどの知識が必要でしょうか。

環境はVC++2008EEです。
385デフォルトの名無しさん:2009/06/14(日) 12:21:49
コンストラクタからvirtualメンバ関数を呼び出すと危ないらしいですが、CHoge::Method
class CHoge {
386デフォルトの名無しさん:2009/06/14(日) 12:24:00
まちがって送信してしまいました

コンストラクタからvirtualメンバ関数を呼び出すと危ないらしいですが
class CHoge {
public:
  CHoge() {CHoge::Method();};
  virtual void Method() {...;};
};
のようにスコープを限定すれば完全に安全でいいんでしょうか?
387デフォルトの名無しさん:2009/06/14(日) 12:54:28
何でもかんでもクラス化するのは良くない?
388デフォルトの名無しさん:2009/06/14(日) 13:01:58
えっ
389デフォルトの名無しさん:2009/06/14(日) 13:16:09
なんでもかんでもクラス(オブジェクト)として扱うフレームワークを作れば問題ない。
390デフォルトの名無しさん:2009/06/14(日) 13:21:24
>>386
そんなことしなくてもコンストラクタ内では virtual 関係なく
いつでも CHoge::Method() が呼ばれる
391デフォルトの名無しさん:2009/06/14(日) 13:28:47
関数とクラスの良い部分が打ち消しあっているような気がする

デストラクタで自動的に解放するコードを書くと、そのクラスを使用する関数以外で
クラスオブジェクトの作成ができなくなる
何故なら関数終了後に自動的に解放され、別関数でクラス使用時にはオブジェクトの
実体がないから

デストラクタで自動解放コードを書かなきゃいいとか言われそうだが
392デフォルトの名無しさん:2009/06/14(日) 13:34:15
開放する対象データによるだろ。
オブジェクトのライフタイムを考えてちゃんと設計しろ。
393デフォルトの名無しさん:2009/06/14(日) 13:44:35
>>391
>関数とクラスの良い部分が打ち消しあっているような気がする
それは認識不足、判断するのが早すぎ。

・・・こうして、オブジェクト指向排斥派が生まれていくのか・・・
394デフォルトの名無しさん:2009/06/14(日) 13:51:08
ただの勉強不足。
わかってるつもりでわかってない。
395デフォルトの名無しさん:2009/06/14(日) 14:14:23
>>384
Windowsフォームアプリケーションプロジェクトを作成し、フォームにWebBrowserコンポーネントを配置。
ビルドして適当なURLをドラッグ&ドロップ。
396デフォルトの名無しさん:2009/06/14(日) 15:02:24
呼び出される側がHogeで、呼び出す側がHogeのような、コールバック関数がある場合ですが
その場合、どのようなデザインパターン(クラス間の関係)を持たせれば効果的でしょうか、
それとも、別にコールバック専用クラスを作りFoo、Hogeの基底クラスとするのがよい設計なのでしょうか?
397デフォルトの名無しさん:2009/06/14(日) 15:04:00
↑間違えました
×呼び出される側がHogeで、呼び出す側がHogeのような、コールバック関数がある場合ですが
○呼び出される側がFooで、呼び出す側がHogeのような、コールバック関数がある場合ですが
398デフォルトの名無しさん:2009/06/14(日) 15:12:51
C++ではなく
ただのC言語にはテンプレートみたいなのない?

たとえば(x^2+y^2)をreturn返す関数を作りたいとき

func(int x,int y){
}
func2(double x,double y){
}

みたいにいっぱいつくらにゃならんの?
399デフォルトの名無しさん:2009/06/14(日) 15:15:59
>>398
その例だったら全部 double でおk
400デフォルトの名無しさん:2009/06/14(日) 15:30:50
シングルトンでprivateにするべき項目ってどれ?

 1.(デフォルト)コンストラクタ
 2.コピーコンストラクタ
 3.代入演算子
 4.デストラクタ

1と2は別として、3と4については解説書/サイトによってバラバラなのが気になる。

解説用に、シンプルなコードにするため書いてないだけなのか、
目的やシングルトンの実装方法によって変わるというだけなのか。


401デフォルトの名無しさん:2009/06/14(日) 15:40:27
>>396-397
Boost.FunctionやBoost.Signalsとか

>>398
#defineでがんばれ
402400:2009/06/14(日) 15:40:48
最近は代入演算子じゃなくコピー代入演算子って言うのね。
参考にした本が古かったのかしら?


>>398
・全部書く
・簡単な処理であればマクロ(#define)で書く
・>399のように、互換性のあるもので誤魔化す。共用体とか。

この辺でどうだろう?
403デフォルトの名無しさん:2009/06/14(日) 16:15:23
resource.rcで大量のリソースを読み込んで実行ファイルに埋め込むと言うことをしているのですが、
デバッグ時のリンク処理に時間がかかるので、
#if DEBUG
SOME_BMP "BITMAP" "./BMP/some_bmp.bmp"
#else
...
#endif
というようにしてデバッグに必要なリソースのみ読み込むようにしたのですが
*.rcファイルにはプリプロセッサの命令は使えないようでうまくいきません。
一行ずつコメントアウトするしかないのでしょうか
404デフォルトの名無しさん:2009/06/14(日) 16:33:24
>>401
>>396-397 です
いい感じですね、楽できそうですThx
405デフォルトの名無しさん:2009/06/14(日) 17:40:48
>>403
普通にプリプロセッサ使えるよ。
#ifじゃなくて#ifdefとか、rc.exeの/dオプションで渡してないとか
406デフォルトの名無しさん:2009/06/14(日) 20:08:30
>>400
コピー代入演算子が呼び出し可能なら singleton = singleton の代入を許すことになる。
インスタンスをひとつにするシングルトンとしては基本的に想定してない動作だろうから
private にしといたほうがいいかもしれない。

デストラクタが呼び出し可能なら singleton.~singleton() を許すことになる。
シングルトンが勝手に破棄されちゃ困るだろうから private にしとくべきだろう。
407デフォルトの名無しさん:2009/06/14(日) 20:56:47
>406
さんくす。
デストラクタって明示的に呼び出せるんですね。知りませんでした。
408デフォルトの名無しさん:2009/06/14(日) 22:13:31
D3Dでフォントクラスを作ろうと思ったのですが、
グローバルでオブジェクトを作成するとDXの初期化が済んでいないので
エラーになります。
いろんな関数で使いたいのですがどうすればいいでしょうか?
クラス化をあきらめた方が良いでしょうか?
409デフォルトの名無しさん:2009/06/14(日) 22:14:31
>>408
グローバルで作るのをあきらめろよ。
410407:2009/06/14(日) 22:18:03
ここは俺が答えるべきだよな。

>408
DirectXは詳しくないんだけど、シングルトンパターンはどうだろうか。
411デフォルトの名無しさん:2009/06/14(日) 22:19:03
いろんな自作関数を作り、それぞれの関数で使いたいのです。
412デフォルトの名無しさん:2009/06/14(日) 22:22:34
>>408
クラス化あきらめると何とかなるの?
なるならやればいいじゃない
413デフォルトの名無しさん:2009/06/14(日) 22:58:20
シングルトンを試してみましたが結局はそれぞれの関数でgetinstanceして
フォントを生成しなおさなければなりませんでした。
ひょっとしたらやり方が間違ってるかもしれませんが。

おとなしくクラス化をあきらめます。
414デフォルトの名無しさん:2009/06/14(日) 23:11:39
>フォントを生成しなおさなければなりませんでした。
>ひょっとしたらやり方が間違ってるかもしれませんが。

おそらく間違ってる。
実装方法は正しくとも、使い方を間違えてるかもしれない。
415デフォルトの名無しさん:2009/06/14(日) 23:51:21
メンバー変数にstructがある時コンストラクタ初期化子で初期化ってできます?
ちらっとしらべたら代入しかできなというような書き込みを射たのですが。

class Window
{
private:
WNDCLASS wc;





Window(HINSTANCE hInstance, WNDPROC windowProc, PTSTR appName) : wc???

???で初期化です。
お願いします。
416デフォルトの名無しさん:2009/06/15(月) 00:02:45
VS2008EEのC++を使っています。
ソースが長く見づらいので複数に分割しようと思っているのですが
作った関数をどのファイルからでも呼べるようにするには
分割した一つ一つにexternを書かないとだめですか?

何か共通のヘッダファイルとかを作って
どこからでも呼べるようにとかは出来ないんでしょうか?
417デフォルトの名無しさん:2009/06/15(月) 00:03:18
色々ためしたらシングルトンで行けました。
でも結局、

グローバルでポインタ宣言
初期化部でフォントセット
描画

と3つの手順を踏む必要があり、関数ベースと手間が変わらないので
なんだかなぁって感じ

コンストラクタでフォントセットしたかったけど、それだとDXの初期化前でNGだし
DX絡みはいろいろと面倒やね
多分、テクスチャとかその他諸々も全てこのタイプになるんだろうな
418デフォルトの名無しさん:2009/06/15(月) 00:04:13
関数のスコープは常にグローバル空間だよ。

何もいらない。ただ使いたい場所の直前で、
関数のプロトタイプ宣言すればいいだけ。

え?無名の名前空間に入れちゃった?
419デフォルトの名無しさん:2009/06/15(月) 00:10:44
「分割コンパイル」でググって定石を勉強しろとしか言いたくない自分がいる
420デフォルトの名無しさん:2009/06/15(月) 00:10:45
>417
フォントクラスのインスタンスをグローバルに置けば、
そりゃグローバル変数と同じようなタイミングで初期化されるさ。

それを防ぐためには、DirectXの初期化を行ったあとに
インスタンスが生成されるようにすればいい。
421420:2009/06/15(月) 00:12:57
ごめん、ちょっとミスリーディングしてた。

>グローバルでポインタ宣言
ポインタをグローバルに置く必要ないと思うよ。
422デフォルトの名無しさん:2009/06/15(月) 00:29:59
C言語ってここでいいんですかね?
学校の問題で分からないところがあったので質問をしたいんですが
423デフォルトの名無しさん:2009/06/15(月) 00:32:18
シングルトンパターンを使えてない気がする
424デフォルトの名無しさん:2009/06/15(月) 00:37:33
シングルトンパターンを使わないのが正しい解ではないのかな?
よく見かける、名前につられて正解を見失う
または、目的と手段が講じて 手段が目的になる。
425デフォルトの名無しさん:2009/06/15(月) 00:47:45
講じません
426デフォルトの名無しさん:2009/06/15(月) 00:49:17
>>422
宿題スレへどうぞ
427デフォルトの名無しさん:2009/06/15(月) 00:51:01
>>426
すいません、板を検索したらありました。
ご迷惑をおかけしました
428デフォルトの名無しさん:2009/06/15(月) 00:55:48
学から入ると、えてしてこの時はこうでなければならないと思いがちになる。
一難面白い発言に。
>と3つの手順を踏む必要があり、関数ベースと手間が変わらないので
>なんだかなぁって感じ
そうなったからと言って、クラスの最大の利点であるカプセル化が無くなる訳
ではない。それに、コンストラクタやディストラクタ以外に初期化や終了メソッド
が必要になるのは、ごく普通にある。
429デフォルトの名無しさん:2009/06/15(月) 00:59:16
プログラムが分かりやすくなるのが一番の目的で、そのためならグローバル変数もgoto文も非オブジェクト指向プログラミングでもなんでもおk
430デフォルトの名無しさん:2009/06/15(月) 00:59:34
よく状況わからないけどDirectX+C++なんてザラにありそうだから
どこかのソースコードで勉強すれば定石わかるんじゃないの?
431デフォルトの名無しさん:2009/06/15(月) 01:33:41
>>418は416に対してでしょうか
今簡単なプログラムで試してみたら思い通りに出来ました。
以前は呼ばれる先と元で両方宣言しないといけないと勘違いしていて
おかしい書き方をしていました
仰るとおり素直に書いたら出来ました
ありがとうございます
432デフォルトの名無しさん:2009/06/15(月) 01:42:16
ん。まぁ一度何かの教科書でヘッダファイルの書き方を学ぶと良いかも。
同一翻訳単位内で複数回インクルードした場合の処理など、
C++のファイル分割は学ばなければならないことが多い。大弱り。
433デフォルトの名無しさん:2009/06/15(月) 01:59:27
全部のヘッダーインクルードして、ヘッダの方にはインクルードガードつけときゃいいんだよ
434デフォルトの名無しさん:2009/06/15(月) 02:51:06
>>421
どの関数からも使えるようにするにはグローバルに置くしかないっしょ
435デフォルトの名無しさん:2009/06/15(月) 03:09:35
以下のコードのmakeが通りません。
アドバイスをお願いします。

gcc version 4.3.3

---------------------------------------

エラー
> make
g++ Class1.o main.o -o class.exe
main.o: In function `Class0':
Class0.hpp:9: multiple definition of `Class0::Class0()'
Class0.hpp:9: first defined here

---------------------------------------
// main.cpp
#include "./Class1.h"

int main(int argc, char* argv[])
{
 Class1 c1;
}
---------------------------------------------
// Class1.h
#ifndef CLASS1_H
#define CLASS1_H
#include "./Class0.hpp"

class Class1
{ public: Class1( ); };

#endif
436435:2009/06/15(月) 03:10:33
// Class1.cpp
#include "./Class1.h"
Class1::Class1( ){ }
---------------------------------------------
// Class0.hpp
#ifndef CLASS0_HPP
#define CLASS0_HPP

class Class0
{ public: Class0( ); };

Class0::Class0( ){ }

#endif
---------------------------------------------
# Makefile
CC = g++

OBJS = Class1.o main.o
OPTION =
PROGRAM = class.exe

.cpp.o :
$(CC) -Wall -g -c $< -o $@ $(OPTION)

$(PROGRAM) : $(OBJS)
$(CC) $(OBJS) -o $(PROGRAM) $(OPTION)

clean :
rm -f $(OBJS)
437デフォルトの名無しさん:2009/06/15(月) 03:11:10
>>434
つまり、どの関数からも使う、わけではないという話だったわけですね
438デフォルトの名無しさん:2009/06/15(月) 03:24:34
シングルトンだって、インスタンス生成は「はじめにインスタンスが要求されるとき」まで
遅らせると思うんだが。
シングルトンが使えてないほうに、俺も一票いれておく。
439デフォルトの名無しさん:2009/06/15(月) 03:28:12
コンストラクタに何も書かないなら

Class0::Class0( ){ }

をコメントにしてみれば?
440デフォルトの名無しさん:2009/06/15(月) 03:36:01
Class0::Class0( ){ }
これどこかcppファイルに移すか、inlineにしろ。
441デフォルトの名無しさん:2009/06/15(月) 03:42:27
>>435-436
Class0.hpp9行目のClass0::Class0( ){ }がmain.cppとClass1.cppの両方で実体化されるので、
リンカはどっちを使えばいいのか分からなくてエラーを吐いてる。
解決方法は>>439-440
442デフォルトの名無しさん:2009/06/15(月) 05:20:26
オブジェクト指向の特殊な利点ってなんでしょ

クラスとかの初歩的な利点というか特徴はわかるんですが・・・
443デフォルトの名無しさん:2009/06/15(月) 07:47:24
>>442
大規模なプログラムでもプログラムを細かな「粒」に分ける事が
できるので管理しやすくなる。つまりバグが取れやすくなり、一人で
開発したとしても扱える行数が増える
444デフォルトの名無しさん:2009/06/15(月) 07:48:50
オブジェクト指向の欠点はその丁度裏返しでプログラムが細かな
粒に分解されるので手間が増えてパッと見直感的にプログラムの
動きが理解しにくくなる
445デフォルトの名無しさん:2009/06/15(月) 08:06:33
分業しやすくなる
446435:2009/06/15(月) 08:50:40
>>339
>>340
>>410
ありがとうございます!
447デフォルトの名無しさん:2009/06/15(月) 11:43:05
C/C++エディタでperlを一緒に使って変数などを渡したりできますか?
できるなら解説or詳しく書かれたサイトなどお願いします
448デフォルトの名無しさん:2009/06/15(月) 13:08:27
>434
んなことない。

もちろん、C++の正確な仕様とかを持ち出したら異なるかもしれないが、
少なくとも>434が意識してるような意味で「グローバル」ではないと思う。


>447
>C/C++エディタでperlを一緒に使って変数などを渡したり

すまん、知識不足で俺には質問の意味が分からなかった。
449デフォルトの名無しさん:2009/06/15(月) 13:23:28
組み込みの話なのかなあ
450448:2009/06/15(月) 13:31:24
>449
かなあ?

ExcelにおけるVBAマクロ、xyzzyにおけるLisp拡張みたいな感じで、
エディタにperl(実行環境)を組み込む……という風に読んだんだが。
451デフォルトの名無しさん:2009/06/15(月) 13:33:58
>>447
> C/C++エディタ
って具体的にどういう物?
452447:2009/06/15(月) 13:36:17
すみませんよくわからないこと言ってたみたいですね
Cファイル内でperlの関数を使ったり両言語をごちゃ混ぜに使ったりということだったんですが
PHPの関数は呼び出すことができそうなのでそっちをやってみるつもりです
453デフォルトの名無しさん:2009/06/15(月) 13:39:47
え? PHPだと出来るの?
454デフォルトの名無しさん:2009/06/15(月) 13:44:52
出来るというか拡張ということで
http://d.hatena.ne.jp/moriyoshi/20080323/1206296385
ここでやってるらしいです
455デフォルトの名無しさん:2009/06/15(月) 13:52:18
>>452
見たこと無い
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/
456デフォルトの名無しさん:2009/06/15(月) 14:03:15
つ[system("perl foo")]
457デフォルトの名無しさん:2009/06/15(月) 14:11:55
luaでいいんじゃないの?
458デフォルトの名無しさん:2009/06/15(月) 14:16:18
なんならtclでもいいのよ〜ん
459デフォルトの名無しさん:2009/06/15(月) 14:55:44
tr1とboostってどっちがいいの?
やっぱ標準っぽいtr1のほうが使うこと多いですか?
460デフォルトの名無しさん:2009/06/15(月) 18:21:43
質問です

windows xp sp3
gcc 4.40 (g++)
C++
コンパイルオプション特になし

char buffer[1024];

while (fgets(buffer, 1024, fp))
{
  printf(buffer);
}

こんな感じで単純にテキストファイルから読み込んで行単位で表示させようとしているのですが、
テキスト内に”%20”がある行に達すると、「アプリケーションエラー ○×のメモリーがread〜」で終了してしまいます。

buffer[1024]を大きくしてみたりしましたがだめでした。どのように対処すればよろしいでしょうか?
461デフォルトの名無しさん:2009/06/15(月) 18:23:46
printf("%s", buffer);
と、正しく書く。
462デフォルトの名無しさん:2009/06/15(月) 18:24:04
>>460
buffer内に%があるので、フォーマット文字列として解釈しようとしています。
fputs(buffer, stdout)とすればOK。
463デフォルトの名無しさん:2009/06/15(月) 18:29:51
>>461
>>462

なるほど、原理がわかりました
ありがとうございます!
464デフォルトの名無しさん:2009/06/15(月) 19:21:41
WindowsAPIのReadFileまたはfreadはテキストファイルを読み込むのには不向きでしょうか?
fgetsでやれればいいのですが速度が欲しいので一気に読みたいのです
465デフォルトの名無しさん:2009/06/15(月) 19:30:19
fread()でもfgets()でも大差ない。APIなら速いかもしれない。
466デフォルトの名無しさん:2009/06/15(月) 19:41:54
fgets()の中はfread()でブロック読みしてるぞ、なぜfgetsが遅いと思う?
467デフォルトの名無しさん:2009/06/15(月) 20:57:02
fgetsは一気に読まないから遅いですよ
468デフォルトの名無しさん:2009/06/15(月) 21:01:08
まあたしかに内部は数百だった記憶があるな。一気読みしたらそれは早いな
469デフォルトの名無しさん:2009/06/15(月) 22:29:29
.hppってなんなの、こいつ?
470デフォルトの名無しさん:2009/06/15(月) 22:32:43
こいつじゃなくてあいつだよ
471デフォルトの名無しさん:2009/06/15(月) 22:33:42
cppのえっち!
472デフォルトの名無しさん:2009/06/16(火) 02:00:51
class Aのメソッドの中で~A()と自身のデストラクタを呼んで自身を破壊するようなことをしてよいのでしょうか?
473デフォルトの名無しさん:2009/06/16(火) 02:04:30
うん
474デフォルトの名無しさん:2009/06/16(火) 02:13:26
thisを殺すのはやめたほうがいいかなと思うけど。
staticなメソッドなら大丈夫かしら?
475デフォルトの名無しさん:2009/06/16(火) 02:26:06
delete *this; は合法だよ
476デフォルトの名無しさん:2009/06/16(火) 02:26:55
ただしクラスの中で動的確保をしているような場所があったら
まずそちらを解放してからでないとメモリリークが起きるけどな
477デフォルトの名無しさん:2009/06/16(火) 02:27:49
_beginthreadex()の戻り値を(HANDLE)とキャストしてHANDLE構造体を得るのは
普通のやり方でしょうか?
あと、DWORDとunsigned intは違う型でしょうか
478デフォルトの名無しさん:2009/06/16(火) 03:13:11
>_beginthreadex()の戻り値を(HANDLE)
普通
>DWORDとunsigned int
typedef unsigned long DWORD;
だから違う
479デフォルトの名無しさん:2009/06/16(火) 03:44:44
>>472
細心の注意を払って、限定された状況で、十分なコメントをつけたのなら、
してもよい。
480デフォルトの名無しさん:2009/06/16(火) 04:35:32
引数の多い構造体を一度にマイクロソフト指定の初期設定みたいな感じに初期化できる方法ってありませんか?
481デフォルトの名無しさん:2009/06/16(火) 05:29:44
初期設定された構造体データを作っておいて
memcpy
482デフォルトの名無しさん:2009/06/16(火) 08:58:35
>>481
馬鹿?
初期データの構造体が既にあるなら単に代入でいいじゃん。

それとも、そんなことさえできなかったC89以前のCしか知らないロートル?
483デフォルトの名無しさん:2009/06/16(火) 09:18:16
>>482
MS風の構造体は型が一致しないことも結構ある
memcpy でおk
484デフォルトの名無しさん:2009/06/16(火) 09:21:17
>>483
"MS風の構造体" って何?
型が一致しないって何?

memcpy でおkとか言うのはおかしいな。
そんな特殊な状況じゃないなら、 memcpy は不要。
代入でいい。
485デフォルトの名無しさん:2009/06/16(火) 09:28:35
型が一致しないのにmemcpyというのがよくわからん
486デフォルトの名無しさん:2009/06/16(火) 09:29:56
>>484
MS風っていうのは上書きするための構造体みたいな…
ビットマップとか互換性のために同名の構造体でも
サイズが違うとかそういう奴のつもり
487デフォルトの名無しさん:2009/06/16(火) 09:34:40
>>486
「上書き」って何?しかも「みたいな」って。
サイズが違うって何のサイズのこと言ってんの? sizeof 〜 のこと?
違うっていうからには何か2つ以上のものを比べて言ってるんだよね?
「ビットマップ」?構造体じゃないし。

エスパーと話してるんじゃないんだ。普通にしゃべってくれ。
488デフォルトの名無しさん:2009/06/16(火) 09:36:15
なんでいきなり「バカ?」とか、煽りモードなんだろ。
489デフォルトの名無しさん:2009/06/16(火) 09:36:32
つまりだ、「MS風邪」に吹かれた奴はまともな議論さえできなくなってしまうと言うことだな。
まぁ、あんまり虐めてやるな。
490デフォルトの名無しさん:2009/06/16(火) 09:37:22
うん。煽りは良くないな。ことの真偽は別として。
491デフォルトの名無しさん:2009/06/16(火) 09:39:35
>>480
というわけで、
初期設定された構造体を作っておいて代入、
でいいよ。

C++ ならコンストラクタ使う、って手もあるな。
492デフォルトの名無しさん:2009/06/16(火) 10:58:06
mapにinsertするときpairを作るのに
map<型, 型>::value_type(値,値)
piar<型, 型>(値,値)
ともう一個、型をまったく指定しないで挿入するのありましたよね?

見たはずなんですけど検索で見つけられなくなっちゃった。
お願いします
493480:2009/06/16(火) 11:04:43
ありがとうございました
494デフォルトの名無しさん:2009/06/16(火) 11:10:17
>>492
「見つけられなくなっちゃった。お願いします」と言われても、
どうやって検索していたのかも判らないのに対処できませんが。
取り敢えず、「頑張って探してください」とだけ。
495デフォルトの名無しさん:2009/06/16(火) 11:31:06
>>492 pair を作るんだ。
496デフォルトの名無しさん:2009/06/16(火) 11:44:05
CreateWindowEx にて単一行のテキストボックスを作成し
その後に、動的に MultiLine かどうかを変えたい場合

http://hp.vector.co.jp/authors/VA024411/vbtips03.html

を眺めていると、MaltiLine に切り替えるメッセージが見つからないのですが、
CreateWindow で新規作成する時以外では、
マルチラインかどうかの切り替えって不可能なのでしょうか?
よろしくお願いします。
497デフォルトの名無しさん:2009/06/16(火) 11:52:04
>>494
>>495
ありがとうございます!
応援してもらったおかげで直ぐ見つかりました!

ちなみに
make_pairでした。
498デフォルトの名無しさん:2009/06/16(火) 12:44:54
>>496
WinAPIスレへどうぞ。
つーか、最初からMultiLineで作って自前で1行に制限しちゃいかんのかな。
499デフォルトの名無しさん:2009/06/16(火) 12:47:00
>>496
そこ見てみたけどスタイルの変更でできるんじゃないの
500デフォルトの名無しさん:2009/06/16(火) 13:15:52
できるね。これを設定すればよさそうだ。
ES_MULTILINE

まさかとは思うが、MALTIで検索して見つからなかったとか?w
501デフォルトの名無しさん:2009/06/16(火) 16:24:59
'stdint.h': No such file or directory
というエラーが出てコンパイルできません

http://www.vector.co.jp/soft/win95/prog/se432866.html
>インクルードパスの通ったディレクトリに下記のファイルをコピーします

Visual studio 2008 で作業をしているのですが、
インクルードパスの通ったディレクトリ、とは
どこのことを指しているのでしょうか…?
502501:2009/06/16(火) 16:33:26
事故解決d

http://sip.sci.shizuoka.ac.jp/
>C:/Program Files/Microsoft Visual Studio/VC98/Include

C:\Program Files\Microsoft Visual Studio 9.0\VC\include

壱から九まで早八年
あまり世界は変わってはいなかったのでした…
503デフォルトの名無しさん:2009/06/16(火) 16:37:52
自分で作ったヘッダを置く場所設定してそこに入れ、
オプション-ツールからそのディレクトリを設定。

というやりかた覚えておけば、その設定するところを見ればすでに登録されてるディレクトリがわかるぜ。
504デフォルトの名無しさん:2009/06/16(火) 18:37:46
C言語でDES暗号化をやりたいんですが手取り足取りおしえてくださいも良いですか?
505デフォルトの名無しさん:2009/06/16(火) 18:38:43
おしえてくださいもダメです。
506デフォルトの名無しさん:2009/06/16(火) 18:40:13
教えてあげたいですがDES暗号について詳しく知りません。
一緒に勉強しましょう。とりあえず、何か良い本ないですかねぇ。
507デフォルトの名無しさん:2009/06/16(火) 18:40:40
理論と実装とを分けるなら、理論は自分で勉強してください
508デフォルトの名無しさん:2009/06/16(火) 18:45:35
これだからインテリはお高く留まってて嫌いなんだ;_;
509504:2009/06/16(火) 18:49:30
ああ日本語がおかしくなってたw
最初OpennSSLでやろうとしたが上手くいかず、ライブラリもみんなリンク切れになってて、
他言語の関数を使おうとしてもXS?とかいうのがうまくいかずLinux用の関数があると知ったがVC++に移植は難しいというところで詰まってます
510デフォルトの名無しさん:2009/06/16(火) 19:12:35
デザパタのfactoryについてなんですが
実装パターンが多く、なおかつコンストラクタの引数のとり方も様々となった場合
下のようにcreateメソッドをサブクラスと引数別に追加していくしかないんでしょうか?

class IChara {...};
class CCharaA : public IChara {CCharaA(); CCharaA(int, int);...};

class CCharaZ : public IChara {CCharaZ(); CCharaZ(const CharaX&);...};

class CharaFactory {
IChara* createCharaA(); IChara* createCharaA(int, int);

IChara* createCharaZ(); IChara* createCharaZ(const CharaX&);
};
511デフォルトの名無しさん:2009/06/16(火) 19:25:25
シングルトンって実体が一つしかなくて使うときは

void hoge()
{
test* ts = test::getinstance();
}

void aho()
{
test* ts = test::getinstance();
}

void baka()
{
test* ts = test::getinstance();
}

みたいに使う関数内でいちいちこう書かないといけないんだろ?
めんどくさ。
512デフォルトの名無しさん:2009/06/16(火) 19:25:54
>>508
それは単にあなたが、インテリそうな人間を見つけるたびに
ムシの良い乞食みたいなお願いばっかしてるからでしょう。
513デフォルトの名無しさん:2009/06/16(火) 19:29:27
>>512
ノブレスオブリージュでインテリはこじきに奉仕しろよ^^
514デフォルトの名無しさん:2009/06/16(火) 19:34:16
>>509
とりあえず暗号化したいだけ → Win32 CryptoAPI
俺俺コード詐欺 → Crypto++
515デフォルトの名無しさん:2009/06/16(火) 19:35:05
>>498-500
レスどうもです。
そもそも CreateWindow 以降で
ES_xxx を使ってスタイルを変えれることを知りませんでした。
ありがとうございました。
516デフォルトの名無しさん:2009/06/16(火) 20:04:55
やあ、僕だよ。ひろみつだよ(´・ω・`)。

画面キャプチャをして、.jpgファイルで保存するソフトを作ったんだよ。
GDI+は初めて使ったから苦労したよ。

で、vectorにうpしたいんだけど、やり方がわからないから困っているんだ。

その気のある人は教えてくれるとうれしいよ(´・ω・`)。
517デフォルトの名無しさん:2009/06/16(火) 20:05:47
ちなみにどのスレに聞けばいいのか分からないから、
C++で作ったからこのスレに聞いたんだよ(´・ω・`)。
518デフォルトの名無しさん:2009/06/16(火) 20:08:58
プリントスクリーン→ペイントおいしいです
519デフォルトの名無しさん:2009/06/16(火) 20:10:42
>>514
Win32 CryptoAPIってどこでダウンロードできます?
MSDNで日本語のチュートリアルやら何やら全て無いらしいですが
520デフォルトの名無しさん:2009/06/16(火) 20:47:29
>>516
自己顕示のためにVectorを利用しないでください。
ネット資源の無駄です。
521デフォルトの名無しさん:2009/06/16(火) 20:54:04
>>519
Windows SDKとかPlatform SDKに普通に含まれてるよ。
日本語マニュアルは無いけど手順通りにAPI呼ぶだけだから、
この辺↓をスタートにググってみるとか。
http://msdn.microsoft.com/en-us/library/aa382019.aspx
http://msdn.microsoft.com/en-us/library/aa382358.aspx
522952:2009/06/16(火) 21:37:11
>>520
うるせえはげ。vectorに聞いたからいいもんね。
523デフォルトの名無しさん:2009/06/16(火) 21:39:42
524デフォルトの名無しさん:2009/06/16(火) 22:20:54
問い合わせた時点で失格だろ
なんでマニュアル読まないの?そのWinshot的なものはバグまみれだったりしないの?
525デフォルトの名無しさん:2009/06/16(火) 22:33:21
>>510
仮想関数の引数をサブクラスで変える事ができないのと同じように、
コンストラクタの引数も変えられないと考えるのが普通かな(デフォルトコンストラクタあるいは決まった引数のコンストラクタを使う)。
あえてやるなら、boost::anyを1つ取るコンストラクタに統一すれば、実質サブクラス毎に引数を変える事はできる。
526デフォルトの名無しさん:2009/06/16(火) 23:19:13
>>520
別人だが、そう言われると俺もネット資源の無駄でしかないのだろうかと…
527デフォルトの名無しさん:2009/06/17(水) 00:08:29
atan2関数が90度の時エラー的な何かを返してくるのですが何が帰ってきてるかよくわかりません
どうやって場合わけすれば良いですか?
何か典型的な場合分けの方法がありますか?
528デフォルトの名無しさん:2009/06/17(水) 00:12:30
渡す前に判断
529デフォルトの名無しさん:2009/06/17(水) 00:13:46
何が帰るかわかりますか?
−1.#INDなんとかかなんかなのですがググってもよくわかりませんでした
530デフォルトの名無しさん:2009/06/17(水) 00:24:13
atan2はx側が0だと計算しない

if文で判断して0を渡していいんだけ?
531デフォルトの名無しさん:2009/06/17(水) 00:26:10
数学の教科書を引っ張り出せば
何故エラーになるのか分かると思うよ。
532デフォルトの名無しさん:2009/06/17(水) 00:26:45
>>515
確か ES_MULTILINE だけは後から変更できなかったんじゃなかったっけ?
スタイルのようで実質は違うコントロールだった気がする
誰か分かる人ツッコミよろ
533デフォルトの名無しさん:2009/06/17(水) 00:27:44
longからキャストしまくってdoubleに持って行ってるのでlongで場合わけして大丈夫かなと思ったのですが
atan2に渡す直前が0と同値かでやったらできそうですね、多分
ありがとうございました
534デフォルトの名無しさん:2009/06/17(水) 08:00:42
>>532
試したら変わらなかった
ES_CENTERとかは変えられたけど
DestroyWindowしてCreateしなおせばいいのかな
535デフォルトの名無しさん:2009/06/17(水) 15:05:11
基底クラスのポインタにDLLから派生クラスのインスタンスを渡すようにして
DLLだけ差し替えて機能切り替えみたいなことってできますか?
536デフォルトの名無しさん:2009/06/17(水) 15:28:24
同じ開発環境からできてるDLLならできると思うよ
537デフォルトの名無しさん:2009/06/17(水) 20:39:10
>>527
悪いのはatan2ではなく、そこに渡す引数がおかしいんじゃないの?
普通は90度でも別に変な値は返さないぞ。
あと、#indはNaNのこと。
538デフォルトの名無しさん:2009/06/17(水) 20:55:59
>>527
atan2(0, 0) になってるか
片方の数値が NaN になってるか
539デフォルトの名無しさん:2009/06/18(木) 00:45:56
関数をファイル分割させてコンパイルしたいのですが、その関数の中でcmathの関数を使いたいときに
hoge.hとhoge.cppのどちらで#include<cmath>を書いたら良いのでしょうか?

好みの問題かもしれませんが、意見を頂きたいです。
540デフォルトの名無しさん:2009/06/18(木) 00:49:49
ヘッダファイルでで<cmath>の内容が必要ないなら入れない。ソースファイルでインクルードする。
ヘッダファイルで必要ならインクルードしておく。
541デフォルトの名無しさん:2009/06/18(木) 00:51:06
>>539
とりあえずヘッダに書くのが基本
あまり見せたくないものは cpp に書く (機能分割してそのcpp内でしか使用されなくて、他の人と同時開発しているとき)
542デフォルトの名無しさん:2009/06/18(木) 00:51:38
可能な限りcppに書く
543デフォルトの名無しさん:2009/06/18(木) 01:12:02
CSVファイルのbufferを作るとき
vector<vector<string>>で実装するべきでしょうか
それともchar buffer[row][col][data]でいくべきでしょうか?

stlを使ったほうが変なバグは生みにくいと思うのですが
セル数が増えていくと重くなるようなきもしますし・・・
544デフォルトの名無しさん:2009/06/18(木) 01:16:59
Linux環境で画像ファイルなどのリソースを実行ファイルに埋め込みプログラム内から読むにはどうしたらいいのでしょうか
545デフォルトの名無しさん:2009/06/18(木) 01:17:59
おそらく、重くなるって言ってもたかが知れてる
どうしても遅かったら書き直せばいいじゃん
546デフォルトの名無しさん:2009/06/18(木) 01:29:11
>>543
vectorがよかろう
読み込む書式が決まっているのなら、各行をstructにするのもいいかも
547デフォルトの名無しさん:2009/06/18(木) 05:31:49
>>543
速度は実測が基本。
最適化はボトルネックを絞り込んでから。
548デフォルトの名無しさん:2009/06/18(木) 08:38:57
C言語で10桁の大きな数を扱うときにトラブってます
環境はVista 英語 64bit, 2008 Express editionです
0から4294967295の数を扱うために
unsigned long intでnumbersum[40]という配列を指定しました
iを0から増やしていくにしたがってnumbersum[i]も増えていくんですが
numbersum[34}で突然マイナスになってしまいます

numbersum[0]=67547008
numbersum[1]=135094016
numbersum[2]=202641024



numbersum[32]=2007582160
numbersum[33]=2090026704 ←ここまではOK
numbersum[34]=-2122496048 ←ここでおかしくなる
numbersum[35]=-2040051504
numbersum[36]=-1975188960
numbersum[37]=-1910326416
numbersum[38]=-1845463872
numbersum[39]=-1780601328

unsigned int long は0から4294967295までいけるはずなのに
なぜかunsignedとして認識されずその半分でマイナスになっているようです

一応ポインターで
unsigned long *numbersum;
numbersum=(unsigned long int *)malloc(sizeof(unsigned long int)*40);
memset( lkkzznum, 0, 40);

みたいに指定しても結果は同じでした
原因と対策にお知恵を拝借できれば幸いです
549デフォルトの名無しさん:2009/06/18(木) 08:41:39
%dで表示してるからかな
550デフォルトの名無しさん:2009/06/18(木) 08:42:02
環境大事
551デフォルトの名無しさん:2009/06/18(木) 08:45:43
>>549
レスありがとうございます
確かにprintfは%dで表示してます

10進法で正しく表示するにはどうすればいいのか
今調べてますが良くわかりません
もし教えていただければ助かります
552デフォルトの名無しさん:2009/06/18(木) 08:49:03
%luですね
解決しました
ありがとうございました
553デフォルトの名無しさん:2009/06/18(木) 11:01:52
using namespace stdは使わない方が良いという意見を聞きますが
参考書などをみてると普通に使ってたりしますしどちらがよいのでしょうか?
554デフォルトの名無しさん:2009/06/18(木) 11:32:04
誰が使わないほうが良いなどといったのだ。
使い方がわかっていれば使ってよいのだ。

ひとつは using の影響範囲、
もうひとつは using ディレクティブと using 宣言の違い、

この二つを理解していればどんどん使って良いぞ^^
555デフォルトの名無しさん:2009/06/18(木) 11:35:21
理解したころには使いたくなくなるはずさ。
556デフォルトの名無しさん:2009/06/18(木) 11:42:57
宿題などに使う場合は

using std::cin;
using std::cout;
using std::endl;

この三行で十分
557デフォルトの名無しさん:2009/06/18(木) 13:08:49
cinって何の意味?
558デフォルトの名無しさん:2009/06/18(木) 13:16:09
cをinする
559デフォルトの名無しさん:2009/06/18(木) 13:17:36
あ、c、inしたお。
560デフォルトの名無しさん:2009/06/18(木) 13:19:56
急に広範囲でnamespaceを変えたくなったらどうするの?
foo::bar::CHoge hoge;

foo::CHoge hoge;
に変えたい時とか、using使えばできますか?
561デフォルトの名無しさん:2009/06/18(木) 14:12:36
console in/out
562デフォルトの名無しさん:2009/06/18(木) 14:23:01
マジレスしちゃうとcharacter in/out(by びよーねすっぽすっぽ)
563デフォルトの名無しさん:2009/06/18(木) 14:42:39
つ、、、つられないぞ・・・
564デフォルトの名無しさん:2009/06/18(木) 16:24:10
MFCでファイル毎のちょい重の処理をマルチスレッドで入れたいんですが
フォルダ内に大量にファイルがあるとその数だけスレッドが出来るんですが、これなんこまでスレッドって作れるんですか?
5000スレッドとかになっても問題ないですか?
565デフォルトの名無しさん:2009/06/18(木) 16:45:57
WinAPIのリファレンスには仮想メモリが許す限りいくらでも作成できるとある。
各スレッドのスタックがデフォルトのままだと5000も作成できないだろうけど、
各スレッドのスタックサイズを小さくすれば作成できるかも知れない。
566デフォルトの名無しさん:2009/06/18(木) 17:35:37
>>560
namespace foo { using bar::CHoge; }
とか
namespace foo { using namespace bar; }
567デフォルトの名無しさん:2009/06/18(木) 18:28:52
>>564
そんなにスレッドを増やしたら、シングルスレッドの方が間違いなく早い。
言っとくが、スレッドオーバーヘッドでは無く、HDDのシーク時間が鬼のように
568デフォルトの名無しさん:2009/06/18(木) 19:31:53
>>566
テラサンクスです
569デフォルトの名無しさん:2009/06/18(木) 21:37:15
C++を使ってCPUの温度を取得するプログラムを書きたいんだが、どういうアルゴリズムで書けばいい?

XP
borland C++
なんだが誰か教えてくれ。
570デフォルトの名無しさん:2009/06/18(木) 22:08:31
マルチ氏ね
571デフォルトの名無しさん:2009/06/18(木) 22:45:26
Linux環境でリソースを実行ファイルに埋め込む方法を教えてくれええええ
アイコンやSEを公開しないといけないなんていやだあああああ
572デフォルトの名無しさん:2009/06/18(木) 22:49:20
objcopy
573デフォルトの名無しさん:2009/06/18(木) 23:13:49
binary hackに載ってた方法ですね。その方法で埋め込んだとして、どうやって読み込んだらいいんですか。

>const char *start = _binary_foo_jpg_start; // データの先頭のアドレスを取得

このアドレスをどう使えばいいんでしょうか。
例えば画像を読みたい場合、このアドレスをSDLなどのグラフィクライブラリの画像読み込み用APIに食わせれば普通に読めるんでしょうか。
574デフォルトの名無しさん:2009/06/18(木) 23:16:38
>>573
やり方はいろいろあるけど何を使うかでやり方は違うけどねえ

libpngとかだとメモリに上げたファイルから展開する方法もあるし
libjpegなんかそうじゃないのかな?

ファイルアクセス関数を別に作って実はメモリにあがってるデータにアクセスするようにしちゃうとか
575デフォルトの名無しさん:2009/06/19(金) 13:22:57
どんな型でもディスクに記録できるコードはありませんか?
たとえば、vector< vector<int> >型など。 
datasave(x,"c:\\d.dat"); dataload(x,"c:\\d.dat"); とできると良いのですが。
576デフォルトの名無しさん:2009/06/19(金) 13:30:36
>>575
データのシリアライズ問題は結構深遠なテーマだと思うんだけど…
577デフォルトの名無しさん:2009/06/19(金) 14:11:17
>>575
POD及びその集合くらいなら「時空を越えるオブジェクト」でぐぐれ。
複雑な型は↑が言うように設計時に考えておかないと難しい。
この辺りはJavaでもそうだな。
578デフォルトの名無しさん:2009/06/19(金) 14:15:30
Boost.Serialize
579デフォルトの名無しさん:2009/06/19(金) 15:48:52
自分で、セーブするのが面倒なので、自動で型を保存してくれるソースはないですか
580デフォルトの名無しさん:2009/06/19(金) 15:49:46
>>579
typeof のことか
581デフォルトの名無しさん:2009/06/21(日) 04:26:19
std::maxを使おうとするとコンパイルエラーになってしまいます(maxなら通る)。
algorithmはインクルードしてあります。
using namespace stdは自分のコードではしてないし、使ってるライブラリは標準とboostだけなので、これが原因とは思えません。
またソースファイルによってはstd::maxで問題なくコンパイルできます。
どんな原因が考えられるでしょうか?
582581:2009/06/21(日) 04:35:03
書き忘れました。エラメッセージです。
error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
583デフォルトの名無しさん:2009/06/21(日) 04:36:15
>>581
#undef maxでうまくいかないかな。

Boostの中で<windows.h>がインクルードされているということはないか?
もしそうだったら、先に#define NOMINMAXを定義しておけばいい。
584デフォルトの名無しさん:2009/06/21(日) 04:54:45
>>583
レスthx
#undef maxでうまくいきました。
#define NOMINMAXは変わらずエラーが出ました(インクルードの前に定義すればいいんですよね?)。

どこかでマクロが定義されたいたということでしょうか。
マクロは嫌ですね・・・。
585デフォルトの名無しさん:2009/06/21(日) 06:11:29
max min は超最悪だし PURE とか THIS とかなんてもんdefineしてんだって環境があるよね
586デフォルトの名無しさん:2009/06/21(日) 06:13:48
VC6なんて、標準のmax呼び出すのに__maxとかやらされたんだよ、なんなんだよ、チネヨって感じ。
で、じゃあ、独自拡張のmaxが高性能化っていうと、標準未満の性能なんだ、これが。
587デフォルトの名無しさん:2009/06/21(日) 06:25:10
他の方法としては (std::max)(a, b) とか (std::numeric_limits<int>::max)()
とかする。
588デフォルトの名無しさん:2009/06/21(日) 06:41:47
メンバや名前空間内で使い捨てにする様な単語を大域で予約するなよって話であって
機能がどうこうってことじゃねぇ
589デフォルトの名無しさん:2009/06/21(日) 12:18:12
0,1,1,2,3,5,8,13・・・・
フィボナッチ定数を出力したいのですがどのように書くのでしょうか?
ただし数は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
590デフォルトの名無しさん:2009/06/21(日) 12:40:10
#include <iostream>

enum {
MAX = 1000
};

int main(void) {
unsigned long fn = 0, fn1 = 1, fn2 = fn + fn1;

std::cout << fn;
std::cout << ',' << fn1;

while(fn2 < MAX) {
std::cout << ',' << fn2;

fn = fn1;
fn1 = fn2;
fn2 = fn + fn1;
}

std::cout << "..." << std::endl;

return 0;
}
591デフォルトの名無しさん:2009/06/21(日) 12:46:50
スパゲッティーすぎるだろ
コード長杉フイタ
592デフォルトの名無しさん:2009/06/21(日) 12:50:44
じゃあお前書いてみろよ
593デフォルトの名無しさん:2009/06/21(日) 12:51:57
boost::counting_iteratorを使ってfibonacci iterator作ろうぜ!!
594デフォルトの名無しさん:2009/06/21(日) 12:53:34
今時の新人君はフィボナッチも書けないクズが多くて困る
うちは面接でいつもそれを3分与えて紙に書かせてるけど、正答率2%
595デフォルトの名無しさん:2009/06/21(日) 12:57:06
圧力面接ですね
これはパワハラに当たりますので訴えられる覚悟はしておいたほうがいいですよ
596デフォルトの名無しさん:2009/06/21(日) 12:59:09
>>594
ちなみにどうい業種なんでしょうか?
そのような嫌がらせに見える試験を出すようなところってw
597デフォルトの名無しさん:2009/06/21(日) 13:12:43
大学で関数型言語を使った奴なら1分で終わるような問題だな
そういう篩のための問題なのだろうか?
598デフォルトの名無しさん:2009/06/21(日) 13:22:06
3分ありゃ書けるだろ
>>595-596は素人乙w
599デフォルトの名無しさん:2009/06/21(日) 13:37:31
フィボナッチ数の第N項を求めるコードの演算(足し算と掛け算)の回数が
- O(2^N) のアルゴリズム →10点
- O(N) のアルゴリズム → 40点
- O(log N) のアルゴリズム → 100点

ちなみに同じオーダーでもやり方は一通りじゃなかったりして結構おもしろい
600デフォルトの名無しさん:2009/06/21(日) 13:51:16
一般項の式を使って、「O(1)の解」を出されたらどうすんのさ
601デフォルトの名無しさん:2009/06/21(日) 13:52:24
優勝
602デフォルトの名無しさん:2009/06/21(日) 13:53:34
O(logN)というのが思いつかなかった。
一般項の式が先に思いついた。暗記できないけど。
603デフォルトの名無しさん:2009/06/21(日) 13:54:18
>>600
O(1)の意味がわからない
ちょっとやってみてよ、見てみたい
604デフォルトの名無しさん:2009/06/21(日) 13:58:05
double sqrt5 = sqrt(5.0);
double phi = (1 + sqrt5) * 0.5;
fib_n = (long)floor(power(phi, n) / sqrt5 + 0.5);
605デフォルトの名無しさん:2009/06/21(日) 14:01:24
黄金比を使うのはO(1)じゃないよ
あとO log Nも多倍長整数だとO(N)までにしかならんし
テストでもO(N)まで知ってれば十分な場合が殆んどだと思う
606デフォルトの名無しさん:2009/06/21(日) 14:04:47
>>605
そそ。あくまでもカッコ付きの「O(1)の解」ねw
607599: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) くらいにはなる
608デフォルトの名無しさん:2009/06/21(日) 14:21:08
そこまでを3分はムリ
609599:2009/06/21(日) 14:22:15
なんかつい反応しちゃったけどスレ違いだね、ごめんね
610デフォルトの名無しさん:2009/06/21(日) 14:22:38
一回考えたことがあれば思い出すだけだからムリじゃないよ
611デフォルトの名無しさん:2009/06/21(日) 14:26:34
黄金比を使うところまでならsicpを読んだことがあれば知ってるだろうから
出題者がそこまで考えてるって前提があるのなら、基礎知識の問題としては典型だといえるよ
612デフォルトの名無しさん:2009/06/21(日) 14:29:04
科学技術計算って出番なくない?
出番があるから使うんじゃなくて、何に使うかわからんけど勉強さえしとけばいつでも出番があるような関数群なの?
一つも使ったことないんだけど・・・

マルチスレッドで中身のないループ書くと、CPU使用率MAXになるのを回避するためにSleep(10)とか入れると0%になるんだけど
これ、なんかごまかしてるみたいでやなんだけどSleepのなかで待機してるなら結局ループでCPU使用率上がらなきゃおかしいと思うんだけど、
CPU使用率上がるループと上がらないループって何が違うの?Sleepの中でなにやってるの?
613デフォルトの名無しさん:2009/06/21(日) 14:34:49
空ループってループ回す回数が半端ないよ
614デフォルトの名無しさん:2009/06/21(日) 14:36:12
>>607
O(n)は普通に3分で出来るだろうね
一応、フィボナッチの定義ぐらいは問題文に含めてあげて

>>612
sleep中は別の人が別の仕事をしてるんだよ
誰も仕事がなければただ寝てるだけ
615デフォルトの名無しさん:2009/06/21(日) 14:44:48
「10分経ったら起こしてー」って(OSに)頼んで仮眠するのがsleep
10分後にセットした目覚まし時計とにらめっこして鳴るのを待ち続けるのが空ループ
当然目と耳を澄まして待ち構えてないといけないから気は抜けない(CPU使用率が高くなる)
616デフォルトの名無しさん:2009/06/21(日) 15:34:32
while(1){}
は関数じゃないよね?
Sleepは仮眠するために何やってるかを分解するにはアセンブラになるってこと?
仮眠するにも必ず10分経ったかを毎回確認しなきゃいけないと思うんだけど
CPU使わないSleepの為の待機命令ってなに?
Sleep

wait(10);
count--;
if(count = 0) return;

みたいなことしてると予想するんだけど結局じゃあwaitの中は何ってなるんだけど
617デフォルトの名無しさん:2009/06/21(日) 15:36:47
何が知りたいのかというと
最終的に何かOSで統合的に待ちを管理してるのは分かったけど
その命令ってなに?
618デフォルトの名無しさん:2009/06/21(日) 15:38:00
OSの勉強してくれ。
619デフォルトの名無しさん:2009/06/21(日) 15:38:03
>>616
while(1){}
無限ループ

自分が書いてるプログラムもOSなどから見れば所詮はタスクかスレッドに過ぎないので
OSなどが用意してるAPIを呼び出すと所定時間だけ実行が停止した後、また復旧できる

というか環境書いてよ

620デフォルトの名無しさん:2009/06/21(日) 15:39:06
なんだろ。割り込みが来るまでHALTさせてんのかな?
621デフォルトの名無しさん:2009/06/21(日) 15:44:47
>>619
WindowsXPのC++9です
なにか命令があるなら教えてください。詳しくは調べます
622デフォルトの名無しさん:2009/06/21(日) 15:45:17
おおざっぱに言うと、OSはプロセスを
・実行中状態(CPUが1つなら1つ)
・実行可能状態
・待ち状態(イベント待ち状態)
で管理している。
タイマ割り込みを設定して、待ち状態に放り込むと、
そのプロセスは時間が来るまで停止する。
その間は、他のプロセスやOSがCPUを使っている。
623デフォルトの名無しさん:2009/06/21(日) 15:56:05
よくわかりました
わかりましたが、やっぱりプロセスを回すための時間を管理するループはCPUを使ってないことになるんですが
これはタスクマネージャはその計算を除外していて見えないだけということですか?
624デフォルトの名無しさん:2009/06/21(日) 15:59:24
よくわからん
625622:2009/06/21(日) 16:01:54
ちょっと間違ってた。

タイマ割り込み自体は、非常に細かい時間間隔で常に動いている。
OSはさらにそれを使って、もうちょっと長い指定の待ち時間を実現する
タイマ機能を実装している。sleepとかはそれを使っている。

で、ここが重要だが、OSがそういうタイマ処理をしている時間は、
「OSの実行時間」だから、個別のプロセスの実行時間に含まれない。

Linuxの例
ttp://d.hatena.ne.jp/naoya/20080122/1200960926
626デフォルトの名無しさん:2009/06/21(日) 16:13:18
thxごめん完全に勘違いしてた
タスクマネージャはプロセスだけでC++はプロセスしか作れないから
どんな命令があろうと結局CPU時間が見えてしまうから、プログラムで作るソフトはSleepでCPU使用率が少ないように見せる適当な数値で待機
させるのが限界だと気づいた。>>619がやっとわかった
ありがとう
627デフォルトの名無しさん:2009/06/21(日) 17:01:59
>599
馬鹿なこと聞いてると思うんだが、O(2^N) ってどうやるの?
628デフォルトの名無しさん:2009/06/21(日) 19:01:28
629デフォルトの名無しさん:2009/06/21(日) 19:02:14
Variable Arguments
630デフォルトの名無しさん:2009/06/21(日) 19:05:46
違う違う
vはvariadicだ
631デフォルトの名無しさん:2009/06/21(日) 19:07:17
variable array だろ。
632デフォルトの名無しさん:2009/06/21(日) 19:08:15
vaka aho
633デフォルトの名無しさん:2009/06/21(日) 19:09:14
>>628
VAriableのVA
634デフォルトの名無しさん:2009/06/21(日) 19:09:20
VAriadic
635628:2009/06/21(日) 19:11:13
どうもっす。みなさん。http://d.hatena.ne.jp/fujita-y/20090319/1237478251
>>630さんの英字をググッタら↑でてきました。

variadic arguments でした。ちなみにvariadicって何ぞや?と思ったところ
↓でした。
http://dictionary.goo.ne.jp/srch/ej/variadic/m0e/

答えてくださったみなさん、ありがとうございました。自分では、答えが思いつかないわけだ。。
聞いたこともない単語でした。
636デフォルトの名無しさん:2009/06/21(日) 19:18:49
variableのvaだと思ってた
637デフォルトの名無しさん:2009/06/21(日) 19:45:28
variable+〜dicの造語なんだろう
だが〜dicがなにかわからん
638デフォルトの名無しさん:2009/06/21(日) 19:52:13
ちんぽのこと。
639デフォルトの名無しさん:2009/06/21(日) 19:59:35
-adic - Wiktionary
http://en.wiktionary.org/wiki/-adic

hm
640デフォルトの名無しさん:2009/06/21(日) 20:01:44
variable が vari + able であるように
vari + adic ってわけだ
http://en.wiktionary.org/wiki/-adic
641デフォルトの名無しさん:2009/06/21(日) 20:05:10
Variすごか(とてもすごい)
642デフォルトの名無しさん:2009/06/21(日) 20:13:42
>>639-640
「〜個の引数を取る」っていう接尾詞か
マニアックすぎるw
643デフォルトの名無しさん:2009/06/21(日) 23:18:37
class A{
public:
B b;
}
class B{
public:
A a;
}

このようなお互いがお互いの実体を持つクラスは作れませんか?
似たような代替でも良いです
644デフォルトの名無しさん:2009/06/21(日) 23:21:04
作れます。次の方どうぞ。
645デフォルトの名無しさん:2009/06/21(日) 23:21:43
>>643
実体は無理
ポインタならおk
646デフォルトの名無しさん:2009/06/21(日) 23:22:38
>>643
もし、お互いが実体を持ったら、a.b.a.b.a.b.a.b.・・・と無限に実体が存在し、
無限のメモリが必要になるので、そもそも不可能。
代替としては、どちらか一方もしくは両方が、相手をポインタで指すようにすればいいよ。
647デフォルトの名無しさん:2009/06/21(日) 23:30:51
ポインタで指す方法で試そうとしたのですが、クラスのプロトタイプ宣言がわからず出来ませんでした
サンプルをお願いします
648デフォルトの名無しさん:2009/06/21(日) 23:35:07
class B;
class A{
public:
B* b;
};

class A;
class B{
public:
A* a;
};
649デフォルトの名無しさん:2009/06/21(日) 23:35:23
>>644さん、実態を持つクラス作れるんですよね?
降臨回答よろしく
650デフォルトの名無しさん:2009/06/21(日) 23:39:44
だからポインタか参照を持って置いてコンストラクタで初期化しろや
コンポジションは無理だから
651デフォルトの名無しさん:2009/06/21(日) 23:43:56
644出てこいや
作れるんだろ?wwwwwwwwwwwwwwwwwwwwwwwwww
作ってみろやwwwwwwwww
652デフォルトの名無しさん:2009/06/21(日) 23:48:06
ちなみにC++に限らずC言語でも

struct A {
struct B b;
};

struct B {
struct A a;
};

というのは>>646さんの言う通り無限にメモリを必要とするから無理
C++だからダメというわけじゃない
元々無理なの
653デフォルトの名無しさん:2009/06/21(日) 23:51:05
>>648
こんなクラスのプロトタイプはどう宣言しますか?

class A{
public:
void test();
}
654デフォルトの名無しさん:2009/06/21(日) 23:54:59
>>627
int fib(int n)
{
  if (n == 0) return 0;
  if (n == 1) return 1;
  return fib(n - 1) + fib(n - 2);
}
655デフォルトの名無しさん:2009/06/22(月) 00:15:28
>>651
嘘をつかれて悔しかったの?
656デフォルトの名無しさん:2009/06/22(月) 00:48:32
>654
あー、確かに。
素直にforで回せばいいものを(笑)
657デフォルトの名無しさん:2009/06/22(月) 07:42:04
コンパイルは出来るんですが、(*vSB).size()でエラーで止まります
vector配列の参照が文字数が長いためvector配列のポインタを作ってvSBとして短くして使っていきたいんですが、どうかけばいいんでしょうか


vector<CStaticBox*> vStaticBox;

vector<CStaticBox*>* vSB = &(((CMainFrame*)AfxGetMainWnd())->m_wndFileView.m_ThumbnailStatic.vStaticBox);
for(UINT i=0; i< (*vSB).size(); i++){
 if( (*(*vSB)[i]).folderFlag == FALSE ){

 }
}

658デフォルトの名無しさん:2009/06/22(月) 11:03:49
うちだと、フィボナッチ関数は初心者研修で使っている。
結果をプールすることに気づけば>654のような再帰版でも及第。
659デフォルトの名無しさん:2009/06/22(月) 11:08:28
>>657
コンパイルできているなら、エラーが出るのは別の原因じゃないか?
その恐ろしく無様なクラスの詳細が判れば別だが。
先ずは、vStaticBoxなるメンバの型を確認することお勧め。
# つーか、そいつがvectorの実体なら、vector<CStaticBox *> & vSBにでもしろよ。
660644:2009/06/22(月) 12:45:22
ごめんなさい
嘘つきました
実は何も知らなかったんです
いじめないで〜><
661デフォルトの名無しさん:2009/06/22(月) 14:30:28
template<T> class Hogeがあり、
Tがconstの有無だけしか違わないクラスのprivateメンバを参照したい場合には、
どのような方法を取るのが一般的なのでしょうか?
例えばHoge<const int>のコピーコンストラクタでHoge<int>を受け取りたい場合などです。
friendやreinterpret_castなどしか思い付かないのですが、
もっと良い定石があるのでしょうか?
662デフォルトの名無しさん:2009/06/22(月) 14:32:08
aruyo
663デフォルトの名無しさん:2009/06/22(月) 14:41:17
>>661
const_cast

つーか、具体例を出してみてくれ。
664デフォルトの名無しさん:2009/06/22(月) 15:22:25
>>659
thx。構文はおかしくないんですね。
ポインタを作るより参照にしたほうがいいメリットってなんですか?
665デフォルトの名無しさん:2009/06/22(月) 15:32:21
>>663
説明下手とタイプミスすみません。こんな感じになります。
簡略化のためTがconstと非constの場合で定義を分けてあります。

template<class T> class Hoge {
 T t;
public:
 Hoge() {}
 Hoge(const Hoge& h) : t(h.t) {}
};

template<class T> class Hoge<const T> {
 const T t;
public:
 Hoge() {}
 Hoge(const Hoge& h) : t(h.t) {}
 Hoge(const Hoge<T>& h) : t(reinterpret_cast<const Hoge&>(h).t) {} // こんな感じで*_castするしかないのでしょうか?
};

int main(int, char**) {
 Hoge<int> h1;
 Hoge<const int> h2(h1);
 return 0;
}
666デフォルトの名無しさん:2009/06/22(月) 15:37:08
>>664
参照にすると、こんだけ読みやすくなる。

vector<CStaticBox*>& vSB = ((CMainFrame*)AfxGetMainWnd())->m_wndFileView.m_ThumbnailStatic.vStaticBox;
for(UINT i=0; i< vSB.size(); i++){
 if( vSB[i]->.folderFlag == FALSE ){

また、うっかり vSB + 1 とかする、くだらないバグも防げたりする。
667デフォルトの名無しさん:2009/06/22(月) 17:07:38
>>666
ありがとうございました!
668デフォルトの名無しさん:2009/06/22(月) 19:27:54
class Aのメンバのvector< vector<string> >array を20行*10列で初期化したいのですが
コンストラクタの初期化リストにどう記述すればよいでしょうか?
669デフォルトの名無しさん:2009/06/22(月) 19:34:19
:array( 20, vector(10) )
670デフォルトの名無しさん:2009/06/22(月) 19:35:04
間違えた
:array( 20, vector<string>(10) )
でできない?
671デフォルトの名無しさん:2009/06/22(月) 19:35:22
vector< vector< string > >( 10, vector< string >( 20, string() ) );

コンパイルして試してないからエラったらすまん。
概念としてはまずvector< string >を20個の空stringで初期化し、
そのオブジェクト10個でもって、vector< vector < string > >を初期化する。
672デフォルトの名無しさん:2009/06/22(月) 19:35:45
ageてしまった...もうやだ。
673デフォルトの名無しさん:2009/06/22(月) 23:49:17
>>671
10と20が逆だぞ
674504:2009/06/23(火) 09:24:15
CryptoAPIでDES暗号化をやっているんですが、いまいちよくわかりません。
平文を暗号化する前に鍵を生成するようなのですが、この鍵は自分で設定することはできないのですか?
また、saltというものが何なのかよくわかりません。どうかご教授お願いします。
675デフォルトの名無しさん:2009/06/23(火) 10:32:59
:array( 20, vector<string>(10,"") )
でいけました、ありがとうございます。

度々質問で申し訳ありませんが
配列の要素外に値をセットしたい場合、
例えば20行確保されてる配列に対して25行目に値を入れる場合は
21-24行目を適当な値で埋めていくしかないのでしょうか?
676504:2009/06/24(水) 02:51:07
#include <wincrypt.h>

HCRYPTPROV hProv;
HCRYPTHASH hHash;
char *PASS = "hoge";
HCRYPTKEY hKey;
BYTE pDate[100] = "12345";
DWORD dwDataLen = strlen((char*)pDate) + 1;

CryptAcquireContext( &hProv, NULL, MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, 0);

CryptCreateHash( hProv, CALG_SHA1, 0, 0, &hHash );

CryptHashData( hHash, (BYTE*)PASS, strlen(PASS), 0 );

CryptDeriveKey( hProv, CALG_DES, hHash, 0, &hKey);

CryptEncrypt( hKey, 0, TRUE, 0, pDate, &dwDataLen, 100 ):

これでやっても文字化けしたデータが出てしまいます。(復号はできる)
dwDataLenを大きくとって全てのデータを得たいのですが上手くいきません。
saltというものについてもよくわかりません。お願いします。
677デフォルトの名無しさん:2009/06/24(水) 03:27:05
暗号扱うなら結城本は読んどけ
678デフォルトの名無しさん:2009/06/24(水) 10:05:04
バイナリ→バイナリの写像だもの 文字化けするのはあたりまえだ
PGP、 gnupg は base64 で可視テキスト化してたな
679504:2009/06/24(水) 10:09:58
便宜上パスワードと鍵をハッシュ化して使うみたいだけど直接平文とキーを入れたいがよくわからない
>>678
なんとなく文字化けはわかりました。この辺は工夫次第でなんとかなりそうだ
680デフォルトの名無しさん:2009/06/24(水) 10:15:03
vectorとかの配列でpush_backすると
領域を再確保して配列の内容をコピーしなおすのでしょうか?

そうならばなんどもpush_backすることがわかってる場合は
テンポラリにある程度のサイズの配列を用意して配列の内容をコピー
それを元の配列にコピーしなおしたほうが早くなるのでしょうか?
681デフォルトの名無しさん:2009/06/24(水) 10:25:23
容量が足りなくなった場合だけ、メモリが再確保とコピーが行われる。
reserveで予め容量を増やしておいてpush_backすればよい。
682デフォルトの名無しさん:2009/06/24(水) 10:25:54
>>680
することもあるししないこともある

細かく言うと、push_backすると確保してあるサイズを超えるときは、
以前のサイズの二倍(倍率は処理系によって違うけど)の領域を新たに確保してから
そこを使う

てゆーかreserve使えばいいじゃん

683デフォルトの名無しさん:2009/06/24(水) 10:28:51
ありがとうございます

参考にしてたサイトにreserve()がのってなかったorz
こういうのは重要だとおもうのに・・・
684デフォルトの名無しさん:2009/06/24(水) 13:25:44
push_backするたびにtry catch(bad_alloc)するべきなの?
685デフォルトの名無しさん:2009/06/24(水) 13:33:13
>>684
なに突っ込むかにもよる
長さもそんなに奴にに組み込み型とかだったら
そんな極限状況でcatchして何ができるの?って話になるからやるだけ無駄
686デフォルトの名無しさん:2009/06/24(水) 13:35:20
自由。目的によるし好きなようにすればいい。
一度ずつ例外を調べたい場合はそうすればいいし、tryの中で繰り返しpush_backしてもいい。

上の続きでreserveした領域にpush_backする、というなら別に例外を補足する必要はない気もするけど、
自分なら、push_backするときのコピーコンストラクタとかで例外投げるかもしれないから補足しておく。
687デフォルトの名無しさん:2009/06/25(木) 07:50:43
char A[15] = "12345abcde";
char B[10];

と配列を作って

for(int i = 0; i < 10; i++)
B[i] = A[i];

で代入すると

strlen(B);

が10ではなく30になってしまいます。何でですか?
688デフォルトの名無しさん:2009/06/25(木) 07:51:27
'\0'がないから
689デフォルトの名無しさん:2009/06/25(木) 07:57:36
>>687
たまたま30なだけで10かもしれないし11かもしれないし

char A[15] = "12345abcde";

とすると "e"の後ろに自動的に>>688の言ってる'\0'が追加される。

なのでC/C++で

char A[15] = "12345abcde";

こういう記述をする場合は'\0'の1文字分余分に考えておかないといけない。

>>687
の場合は

char B[10];

だと正味の文字数は9文字までに絞ってB[9]='\0';とするか

char B[11];
という風にするか
690デフォルトの名無しさん:2009/06/25(木) 11:28:43
>>687
strlenは0が見つかるまでを文字列の長さと判定する
たまたま31バイト目に0があったので30を返したんだろう
691デフォルトの名無しさん:2009/06/25(木) 13:15:20
CでSSEとか対応のプログラムって書けないんですか?
692デフォルトの名無しさん:2009/06/25(木) 13:17:20
>>691
コンパイラの最適化におまかせでもインラインアセンブラでもおk
693デフォルトの名無しさん:2009/06/25(木) 13:27:27
つ組み込み関数
694デフォルトの名無しさん:2009/06/25(木) 23:57:13
ヌル文字を教えた上で
strncpyなりstrcpy_sなりも教えるべきだと思うんだ
695デフォルトの名無しさん:2009/06/26(金) 01:10:05
おまいらも昔は、
 char *s = "12345";
 int i = (int)s;
とか書いて期待通りに動かなくて悩んだよな。
696デフォルトの名無しさん:2009/06/26(金) 01:13:21
ない
アセンブラ先にやってるのでCの記述に詳しくなかったけど
そんなことはしない
697デフォルトの名無しさん:2009/06/26(金) 01:15:42
>>695だけはないわ
698デフォルトの名無しさん:2009/06/26(金) 01:23:44
俺もそんなことはしないぜ。
でもatoi()の存在を知らなくて、str2num()とかいう関数を自作して使ってた。
699デフォルトの名無しさん:2009/06/26(金) 06:22:49
(float) 10 はできて (float) "10" はなんでできないんだろう
700デフォルトの名無しさん:2009/06/26(金) 06:25:25
>>699
(float)0x0a
ならOKじゃない?
701デフォルトの名無しさん:2009/06/26(金) 06:43:53
>>695
_variant_t s = "12345";
short i = s;
ならやったことがある。
702デフォルトの名無しさん:2009/06/26(金) 11:41:49
K&Rはかなり最初のほうで自作atoiが出てくるから
それで勉強した人たちも>>695みたいなことはしないだろうと思う。
703デフォルトの名無しさん:2009/06/27(土) 12:56:22
スレッドセーフなアプリやDLLを作るのに心がけることはどんなことでしょうか?

staticな変数やグローバル変数、動的確保を一切使わなければ完全に安全な関数といえるんでしょうか?
また、上記のものを使う場合ミューテックスなどを使ってアクセスを一つに絞れば完全に安全でしょうか?
704デフォルトの名無しさん:2009/06/27(土) 16:12:40
(式)? trueの場合 : falseの場合

この書き方はどういう名称のものなのでしょうか
705デフォルトの名無しさん:2009/06/27(土) 16:21:18
条件演算子(三項演算子)
http://www5c.biglobe.ne.jp/~ecb/c/05_08.html
706デフォルトの名無しさん:2009/06/27(土) 16:39:07
>staticな変数やグローバル変数、動的確保を一切使わなければ完全に安全な関数といえるんでしょうか?
その関数が外部の関数をコールしていない。
見えない、外部関数コールがあるかもしれない。
それが一切無ければ。

>上記のものを使う場合ミューテックスなどを使ってアクセスを一つに絞れば完全に安全でしょうか?
ほとんどの場合、この考えだけでは問題を発生させる。
707デフォルトの名無しさん:2009/06/27(土) 16:56:43
>>703
最も安全なのは、スレッド間で同一データへの参照を共有しない事。

static やグローバル変数が問題になり易いのは、それを参照している
処理が複数のスレッドから実行される場合、結果として複数スレッド
から同一データへの参照 ( 操作 ) が発生してしまう事が原因。

それと、ミューテックスなどによる排他制御は、「仕方なく」データ
を共有する場合の保護手段。使用時は慎重に設計しないとデッドロッ
クなどの要因になり易いので、なるべく使用しない方が良い。
708デフォルトの名無しさん:2009/06/27(土) 20:04:48
俺もまさに今マルチスレッドなアプリ書いてるんだけど、
「お、これはデッドロック発生しそうなシナリオだ」と
かいうのは割とすぐにわかる。

解決策は OS とかの本読めば大別して四通りくらいあっ
たと思う(俺はタネンバウム先生ので勉強した)。俺が
よく使うのは

・単一の競合対象リソースを管理する独立したスレッド
を用意して処理を委譲する(か、手を抜いて mutex)。

・複数リソースの同時要求はロジックを見直すか、要求
順序を定義出来ないか考える(これは mutex 使うだけ
じゃ解決できないからね)。

・複数リソースを要求する作業は大抵もっと抽象化され
た処理単位があるので、read write lock を使ったキュー
を用意して同一順序同士はキュー内で read lock、逆順
は write lock とか(これは今考えた)。

といった感じ。でも、その「お、」と思う感覚を後輩に
どう教えたら良いのかってーのが全然わからん(w
709デフォルトの名無しさん:2009/06/27(土) 20:26:55
それは経験則が大きいね〜、経験させるしかないと思われ
710デフォルトの名無しさん:2009/06/27(土) 20:51:47
参考になる本としては
Java Concurrency in Practiceや
Synchronization Algorithms and Concurrent Programming
Principles of Concurrent and Distributed Programming
がある
711デフォルトの名無しさん:2009/06/27(土) 20:54:31
EffectiveC++とか呼んでみたけどいざ使おうとすると悩むぜ・・・自分の応用力の無さに泣いた
712デフォルトの名無しさん:2009/06/27(土) 22:05:03
クラスの宣言で

class Hoge
{
public:
void set(int x)
{
_x = x;
}

private:
int _x;
}

という宣言がコンパイルできてしまうのですが、素人考えでは
set関数の中で_xにアクセスする際、まだ_xは定義されていないのでエラーになりそうだと思うのです。
VS2008だと素直にコンパイルが通るのですが、これはC++言語的にも正しい書き方なのでしょうか?
それとも2008が気を利かせてOKにしてくれているのでしょうか
713デフォルトの名無しさん:2009/06/27(土) 22:10:16
正しいです。
714デフォルトの名無しさん:2009/06/27(土) 22:10:27
言語仕様です
715デフォルトの名無しさん:2009/06/27(土) 22:16:25
class Hoge
{
public:
  void set(int x);

private:
  int _x;
}

void Hoge::set(int x) {
  _x = x;
}

これがOKなのは分かるよね。
716デフォルトの名無しさん:2009/06/27(土) 22:17:50
・・・classの閉じ括弧に;つけるのを忘れたのでOKじゃないな。
717デフォルトの名無しさん:2009/06/27(土) 22:27:43
ありがとうございます。
なるほど、関数の中身の解析は最後にされる。みたいな感じなんですね。
安心しました。
718デフォルトの名無しさん:2009/06/28(日) 14:13:02
スコープ外のstatic宣言に関する質問です。

static を関数スコープ外で書くと「そのファイル以外から見れなくなる」といいますが、
ヘッダファイルにstaticで書いた場合、そのヘッダをインクルードするだけでいくらでも外部から参照できてしまいます。
そのため、cppソースファイルではなく、ヘッダファイルの場合、
「そのファイル以外から見れなくなる」という意味がほとんど無い気がします。

ヘッダにstatic を書く意味があれば教えてください。
あと、以下のようにヘッダに書く「static const」と「const」の具体的な違いはどのようなものでしょうか?
「namespace{...}」も同じ効果?ということも聞きますが・・・

// ヘッダファイルの内容
static const int TEST = 10;
const int TEST = 10;
namespace{ const int TEST = 10; }
これら、3つの違いは???

//**************************************************
↓test.hの内容
static const int nTest = 100;

test1.cppの内容
#include "test.h"
test2.cppの内容
#include "test.h"
test3.cppの内容
#include "test.h"
↑いくらでも参照できてしまうのでは・・・?
//**************************************************
719デフォルトの名無しさん:2009/06/28(日) 14:14:30
constは参照だけとか
書き換えは不可ということで
720デフォルトの名無しさん:2009/06/28(日) 14:22:44
ヘッダでstatic使うな。
入れたら一応そのファイルだけで使える変数になるよ。
インクルードしてるソースごとに同じ名前だけど別モノ。
721デフォルトの名無しさん:2009/06/28(日) 14:29:32
別々の関数に同じ名前のローカル変数を作れるように、
別々のファイルに同じ名前static変数ができている。
ただし、constの場合はやっても無害。
CとC++で微妙に意味が違う。
722デフォルトの名無しさん:2009/06/28(日) 14:38:57
C++のconstは曲者だな。メンバ関数に付くやつとかポインタ関係につくやつとか。覚え切れません。
723デフォルトの名無しさん:2009/06/28(日) 14:41:01
>>722
static と違って全部同じ意味だから、別々で覚える必要はないよ。

文法がめんどいのは確かにそのとおりだけどね。
724デフォルトの名無しさん:2009/06/28(日) 14:44:55
header fileでstaticはODR violationが怖ひ
725デフォルトの名無しさん:2009/06/28(日) 14:45:10
>>719-723 adviceありがとうございます。

ということは、

test.hの内容
(1)static const int TEST = 10;
(2)const int TEST = 10;

test1.cppの内容
#include "test.h"
test2.cppの内容
#include "test.h"
test3.cppの内容
#include "test.h"

とした場合、
(1)の場合だとインクルードした3回分だけ、同じ名前の変数TESTが作成される
(2)の場合だとTESTはtest.hの一つしか作成されない。
という理解でよいでしょうか。
これが正しいとすると、ヘッダにstatic constで書く理由がほぼ無いと思うのですが・・・

ところが、以下のサイトではヘッダファイルに(2)の方法では書けないとあります。
http://www.paw.hi-ho.ne.jp/takadayouhei/technic/42.html

しかし、自分の環境VisualStudio2005では普通に(2)の方法で書くことができました。
なぜ、上記サイトで「ヘッダでconst変数を書けない」ということがでてきたのでしょうか?
726デフォルトの名無しさん:2009/06/28(日) 14:47:49
static const int TEST = 10;
これってcの
#define TEST 10
と同じように使いたかったとか
727デフォルトの名無しさん:2009/06/28(日) 15:00:34
>>725
C++ ならどちらでも同じ。だから static を使わないのが普通。

そのサイトの記述は C の場合と勘違いしてると思って読むとつじつまは合う。
728デフォルトの名無しさん:2009/06/28(日) 15:08:08
>>724
ODR violationって簡単に言うとなんでしょうか?
729デフォルトの名無しさん:2009/06/28(日) 15:09:20
>>724
static で ODR 違反はないだろ。
730デフォルトの名無しさん:2009/06/28(日) 15:10:42
>>728
同じ名前に対しては定義はひとつでなければならない、
というルールに違反すること。
731デフォルトの名無しさん:2009/06/29(月) 01:31:25
プログラミング初心者です
初心者と言うのを踏まえたうえで、手始めにこんなのを作ってみたらどうだ
みたいな感じで何かお題をいただけないでしょうか
732デフォルトの名無しさん:2009/06/29(月) 01:37:40
>>731
関数電卓
たとえば、
(19+45/8)*45-75
と入力してその計算結果を出力
733デフォルトの名無しさん:2009/06/29(月) 01:39:17
>>732
よーしやってみる
734デフォルトの名無しさん:2009/06/29(月) 11:00:23
んーいきなりそれは難しいと思うが・・・
735デフォルトの名無しさん:2009/06/29(月) 11:22:21
俺も思ったけど
bisonなり色々ネットに参考文献がごろごろ転がってるし
実は良問なのかとおもう
736デフォルトの名無しさん:2009/06/29(月) 12:03:01
http://pc12.2ch.net/test/read.cgi/tech/1244942050/
ここに問題と解答がごろごろしているよ!
たまに解説もあり。
737デフォルトの名無しさん:2009/06/29(月) 12:03:46
間違えた。こっちだった。
http://pc12.2ch.net/test/read.cgi/tech/1245853701/
738デフォルトの名無しさん:2009/06/29(月) 19:47:34
C++で指定したファイルやディレクトリの存在を調べるプログラムをつくりたいと思っています。
ファイルの有無に関してはC言語ではfopenをつかった判定がよく例として出てくると思うのですが、
C++ではこれらについてはどのような方法があるのでしょうか?
739デフォルトの名無しさん:2009/06/29(月) 19:58:39
C++でも似たようなもん
しかしここは環境依存OKなスレなので、
環境(OS)を書いてくれればその環境特有の別な方法も示せる
740デフォルトの名無しさん:2009/06/29(月) 21:02:16
ファイルは分かるけど、環境依存しないで分かるの?
741740:2009/06/29(月) 21:03:06
ミス。

ファイルは環境依存しないでもわかるけど、
ディレクトリは環境依存しない方法あるの?
742デフォルトの名無しさん:2009/06/29(月) 21:37:30
boost::filesystemしかないな・・・
743デフォルトの名無しさん:2009/06/30(火) 04:44:32
makefileの改行コードって\nですかそれとも$ですか?
744デフォルトの名無しさん:2009/06/30(火) 04:51:01
簡単で良質な乱数の生成方法を教えてください。
boostを使えればいいのですが、使えない環境下でもコンパイルしたいのです。
ゲームならrand()でも良いのですが、科学計算なので、ある程度良質なものを探しています。



745デフォルトの名無しさん:2009/06/30(火) 05:03:27
746デフォルトの名無しさん:2009/06/30(火) 05:36:08
>>745
それって質はよいのですが、もう少し単純で高速なものはないですか?
747デフォルトの名無しさん:2009/06/30(火) 05:40:14
>>746
M系列をつかってみたら?
748デフォルトの名無しさん:2009/06/30(火) 07:08:05
>>746
XorShift
749デフォルトの名無しさん:2009/06/30(火) 08:23:37
>>739-741
想定している環境はMac OS XとLinuxとFreeBSDで
コンパイラはGCC 4.0(かそれ以降)です。
Windowsはまったく想定しておりません。

いわれて気がつきました。
750デフォルトの名無しさん:2009/06/30(火) 09:14:55
>>749
stat()を使うのが無難かな。access()も使えなくはないけど。
シンボリックリンクをそのままリンク自身として扱いたいならlstat()でないと無理。
751デフォルトの名無しさん:2009/07/01(水) 01:00:41
>>749,750
ちょっと話それるけど、
ファイル一覧の話で、scandir()でリスト取得しても、
windows(mingw32)だと「struct dirent *entry」の d_typeは、
環境依存(ファイルシステム依存)でいい?、DIR/FILEを調べるのに、
再度stat()した記憶がある。

あと、scandir()のfilterコールバック、なんともいやーーーな仕様って
感じるの俺だけ?1つ任意のオブジェクト位渡せるようにしてくれ、
正規化ルーチンを入れる時とか、その都度オブジェクト生成破棄してたら、
しゃれんならん。動的にフィルタールールを変えられねーだろつーーの。
どうぞ!
752デフォルトの名無しさん:2009/07/02(木) 11:29:17
class Aのメンバにclass Bのインスタンスが20個近く含まれるような状態になってしまいました。
このような場合、Bのインスタンスを含む構造体やコンテナをメンバに加えるような形にしてしまった方が良いでしょうか?
753デフォルトの名無しさん:2009/07/02(木) 13:23:00
>>752
もうちょっと具体的に・・・

丸々ソースをあげろとまではいわないので名称をhogeとか適当に変えてアップしてくださいな
754デフォルトの名無しさん:2009/07/02(木) 14:57:33
pImplを使うんだ
755デフォルトの名無しさん:2009/07/02(木) 15:10:27
20個くらい別にイインジャネ
どうしても気になるなら配列にしとけば?
class AddressData {
 std::string data[20];
public:
 enum Key { FirstName, MiddleName, LastName, Address, PhoneNumber, ........ };
 std::string GetData(Key key) { return data[key]; }
};
こんな感じで
756デフォルトの名無しさん:2009/07/02(木) 15:16:22
pImplのわかりやすい説明してるサイトとかないでしょうか?
というかC++って便利になったのかね?とホント思ってしまう
757デフォルトの名無しさん:2009/07/02(木) 16:44:17
pImplちょっと勉強してみた・・・
オブジェクト指向のいいところ殺してね?
758デフォルトの名無しさん:2009/07/02(木) 16:50:38
pImplはオブジェクト指向によるヘッダの重さを軽減するためのものだしね
759デフォルトの名無しさん:2009/07/02(木) 16:53:34
>758
みたいですね
しかも関数型と違って、メンバ関数などを呼び出したりと構造的に重くなってるはずの
オブジェクト志向でさらに分離するためにあれこれかませてるとか・・・
760デフォルトの名無しさん:2009/07/02(木) 17:31:03
クラスについて質問です。
クラスを、変数と関数の単なる集合体と考えるのはあまり良くない……という話を聞いたことがあります。

さてここに、とある共通点を持った複数の関数があるとします。
これらの関数はすべて独立していて、静的変数なども特に使わないとします。
この関数群をグループ化したいとき、どのような方法を採るのがベストでしょうか?

・普通にクラス化する
・シングルトンパターンを組み込んだクラスにする
・全てのメンバ関数がstaticなクラスにする
・クラス化させずに名前空間

以上の方法を思いついたのですが、どれが相応しいやら。
その他にも、定番のような方法があればお願いします。
761デフォルトの名無しさん:2009/07/02(木) 17:50:17
クラス化させずに名前空間
「とある共通点」程度ならそれくらいでいいかと
762デフォルトの名無しさん:2009/07/02(木) 17:56:26
>>761
ありがとうございます。
使う側から見れば、staticな関数で揃えるのと使い勝手は大して変わらないですもんね。
763デフォルトの名無しさん:2009/07/02(木) 19:03:12
>>753-755
class Aというのがマイコンの状態をモニターするクラスで
class Bというのがシリアルポートを経由してコマンドを送信して
コマンド内容に合わせてADコンバータの値やIOの状態を適切な形に変換して渡すクラスです

class Aが構成ごとに必要なclass Bを内包していく形をとっていますが
構成によってはclass Bの数が15個↑になってしまって
なんか不味いような気がして相談にきた次第です
764デフォルトの名無しさん:2009/07/02(木) 19:13:23
>>763
マイコンの状態をモニターするクラスがシリアルポート経由でコマンドを送信するってのも変な話じゃね?
765デフォルトの名無しさん:2009/07/02(木) 19:18:21
モニタするためにシリアル通信が必要ならそうでもないんじゃね?
766デフォルトの名無しさん:2009/07/02(木) 19:19:56
>>764
マイコンにコマンド(というか文字列)を送信すると
その文字列に対応した目的の値が帰ってくるという仕組みな為
モニター側がリクエストしないといけないのです
767デフォルトの名無しさん:2009/07/02(木) 19:24:51
>>757
カプセル化強くなってるじゃん?
768デフォルトの名無しさん:2009/07/02(木) 19:39:15
ああ、なるほど。
class Bのインスタンスが複数必要な理由もわからないな。
ラッパー関数が大量にできて困るとかの方がまだ想像できるというか。
769デフォルトの名無しさん:2009/07/02(木) 19:43:31
>>768
class Bのコンストラクタで
コマンド番号と変換ロジック(AD値を電圧やその他の値へ変換)クラスをセットするようになっています
770デフォルトの名無しさん:2009/07/02(木) 19:52:36
>>767
ああ、まあそういう見方もあるよね
771デフォルトの名無しさん:2009/07/02(木) 19:56:11
適当に言うけど、それぞれBから派生した別のクラスにしちゃうのはどうなんだろう。
772デフォルトの名無しさん:2009/07/02(木) 20:04:22
全部のBインスタンスに対してなんか処理してるわけじゃないなら気にしなくていいと思う
773デフォルトの名無しさん:2009/07/03(金) 13:51:11
STLへpush等して変数を格納するとき
変数は代入されるのかコピーされるのかどちらになるのでしょうか?
774デフォルトの名無しさん:2009/07/03(金) 13:52:15
コピーコンストラクタが呼ばれる
775デフォルトの名無しさん:2009/07/03(金) 16:56:25
C++@Linuxで

ABCDE 78
FGHIJK 601
LMN 5976

とかがあたえられているときに
78 601 5976を整数型のデータとして変数に格納したいのですが
C言語のsscanfとか駆使する代わりに
C++ではどういうコードの書き方ができるのでしょうか
776デフォルトの名無しさん:2009/07/03(金) 17:03:54
>>775
sstream
stringstream
777デフォルトの名無しさん:2009/07/03(金) 17:27:59
#include <iostream>
#include <sstream>
#include <string>

int main()
{
std::string str[] = {"ABCDE 78", "FGHIJK 601", "LMN 5976"};
int a[3];

for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++) {
std::string dummy;
std::istringstream os(str[i]);
os >> dummy >> a[i];
std::cout << a[i] << std::endl;
}
}
778デフォルトの名無しさん:2009/07/03(金) 17:57:30
質問させてください。gcc前提です。

ある既存のライブラリAでaという外部変数が定義されています。
A: int a = 100; (みたいなかんじ)
別の既存のライブラリBでbという外部変数を参照しています。
B: extern int b;
AもBもバイナリで提供されていて変更できません。

bがaと同じものをさすようなラッパーというのは作れるでしょうか?
アセンブリで書く必要があるとすれば、(i486系では)どう書けばいいでしょう?
779デフォルトの名無しさん:2009/07/03(金) 18:15:24
>>778
ちゃんと環境を書きましょう。
・OSは?
・「バイナリ」とは .so .a .dll .lib のどれ?
780デフォルトの名無しさん:2009/07/03(金) 18:34:32
あ、すみません。
ライブラリは.so形式です。
OSはLinux(Fedora11 gcc4.4)と、FreeBSD(7.2 gcc4.2)です。
とりあえず一方だけでもかまいません。
よろしくお願いします。
781デフォルトの名無しさん:2009/07/03(金) 18:42:58
class Hoge
{
private:
vector<Foo>* pFoo;
public:
void SetFoo(Foo* foo);
}

HogeのメンバにFooというクラスの配列を持たせたいとき
vector<Foo>の実体のメンバmFooを持たせるか
vector<foo>のポインタpFooを持たせて動的生成するのはどちらがよいでしょうか?
782デフォルトの名無しさん:2009/07/03(金) 18:49:17
>>781
Hogeのコピーを作成しないなら、実体がいい。
Hogeのコピーを作る必要があるなら、ケースバイケース。
Hogeのコピーコンストラクタでvector<Foo>を、どのように処理したいかによって変わるが、
経験的には、ほぼ実体ですませている。

783デフォルトの名無しさん:2009/07/03(金) 18:53:34
>>781
実体で済むものは大抵実体にしといたほうが面倒が起こらないよ
vectorの内容がコピーされるコストを気にしてなんとなくポインタにしてるとかだったら特に
784デフォルトの名無しさん:2009/07/03(金) 18:58:04
>>780
その変数 a, b は自分が弄らなくても
書き換わる可能性がある?

無いなら setter を作って両方に
同じ数値を代入する関数を作ればいいと思う
785デフォルトの名無しさん:2009/07/03(金) 20:26:57
Linux(RedHat)のELF形式のバイナリがあるのですが、ソースを見ないでもこれがCで書かれたのかC++で書かれたのか
もしくは混合なのか、分かる方法ってあるでしょうか?
stripされておらずnmでシンボル名が取れます。
どうかお願いします。
786デフォルトの名無しさん:2009/07/03(金) 20:55:19
>>785
ldd して、依存ライブラリを見てはどうですか?
787デフォルトの名無しさん:2009/07/03(金) 21:08:00
コンパイラはC++でもC風に書いてたら分からないだろ
788デフォルトの名無しさん:2009/07/03(金) 21:22:41
ありがとうです。やってみたら、こんなライブラリに依存してました。
libstdc++使ってないし、Cだけで書かれてるのかもしれないですね。

libcrypt
libssl
libpthread
libdl
libm
libc
libgssapi
libkrb5
libcom_Err
libk5crypt
libresolv
libz

789デフォルトの名無しさん:2009/07/03(金) 22:27:32
790デフォルトの名無しさん:2009/07/04(土) 10:47:41
>>784
ありがとうございます。
たぶん勝手には変化しないはずなので、初期化時に同じ値を入れることにします。

ただやはり同じものを指す方法があれば一番楽なので、
あればよろしくお願いします。
791デフォルトの名無しさん:2009/07/04(土) 10:51:32
>>790
二箇所に実体がある以上、同じものを指すというのは難しいです

一応はデバッガのように特定のアドレスを監視し続けて、
片方の変数に常に追従させるという手もありますが
どうやって実現するのやら
792デフォルトの名無しさん:2009/07/04(土) 11:13:05
え?初期値だけでいいの?
なら新たなに
extern int a;
int b = a;

っていうライブラリ作ればいいんじゃね?
C++のみだけど
793デフォルトの名無しさん:2009/07/04(土) 12:52:50
>>791
いや、実体はライブラリAにあるa一つだけです。bは単なるexternです。
>>792
とりあえず今すぐは初期値だけで何とかなるのですが、
ちゃんと解決させる必要が出そうです。
794デフォルトの名無しさん:2009/07/04(土) 16:28:24
MFCのCListやCMapなどに出てくるPOSITION型とは
"イテレータ"のようなもの、と習ったのですが実体はなんなんでしょうか
ソース見ても判然としません。
795デフォルトの名無しさん:2009/07/04(土) 18:22:21
場合によって違う
HANDLE型みたいなもんだ気にするな
796デフォルトの名無しさん: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を作らなければならない気がします。

どのようにするのが正解なのでしょうか?
797デフォルトの名無しさん:2009/07/04(土) 20:51:14
ヘッダ側にテンプレート作って包め
798デフォルトの名無しさん:2009/07/04(土) 20:55:53
>>797
お返事ありがとうございます。

テンプレート…。
スマポを見よう見まねで作ったり、vectorとかを使ったりはできるのですが
「包め」というのはどういう意味でしょうか?
何かのスラングかと思うのですが…
799デフォルトの名無しさん:2009/07/04(土) 20:57:21
Aは捨ててWだけにすればいいじゃん。
800デフォルトの名無しさん:2009/07/04(土) 21:07:13
template <typename CharType>
class CHoge
{
public:
virtual int load(const CharType* filename) const;
};
801デフォルトの名無しさん:2009/07/04(土) 21:14:02
>>799
それも考慮に入れて置きますが、なるべくなら両サポートしたいところです。

>>800
えーと、その場合loadの中身の実装をヘッダに書く必要がでてくるのではないでしょうか?
例として出しているのでCHogeは1つしか関数を持っていませんが、
同様な条件ででかいクラスをすべてヘッダに書くのはしんどそうです
802デフォルトの名無しさん:2009/07/04(土) 21:26:44
> libではW版、もしくはA版しか入っていないことになるので
何で?両方入れれば?
803デフォルトの名無しさん:2009/07/04(土) 21:41:30
>>801
たぶん、ほとんどの場合、両方サポートしてもいいことない。
804デフォルトの名無しさん:2009/07/04(土) 22:02:59
結局のところ「いい手はない」のが事実だったりするわけで
805デフォルトの名無しさん:2009/07/04(土) 22:12:49
Windowsの汎用テキストマッピングは機能してない。
(_T()で文字列をくくったり、_tで始まる関数をつかったりするやつ)
文字列を編集する処理があるところとか、WとAの両方で動くように
意識してるやつとか少数だろうし、ほとんどのところで、_UNICODEと
_MBCSの両方でテストどころか、コンパイルを通すも行われてないと思う。

事実上片方下かつかえないコードになるんで、最初から片方に決めうち
したほうが混乱がなくていい。

で、いまどちらか片方ってことならWを選ぶことになる。
806デフォルトの名無しさん:2009/07/04(土) 22:21:54
「〜W」の方に処理を実装して
「〜A」の方は内部でユニコードに変換して「〜W」を呼び出すのはどう?
文字列を単なるパラメタとして使用するなら特に問題ないんじゃないかな
文字列自体をアレコレするにしても再度アスキーに変換すれば...
たしかWindowsはそうやってるハズ
807デフォルトの名無しさん:2009/07/04(土) 22:32:13
AからWに変換って、可逆変換なんだっけ?
なんか必ずしも対応する漢字がないとかなかったっけ?
808デフォルトの名無しさん:2009/07/04(土) 23:23:20
既存の関数でAを受け取る関数などもあるからねぇ。APIとか。
そのパラメータの加工用にA系の関数も必要ではあるよね。
809デフォルトの名無しさん:2009/07/04(土) 23:40:24
VC++で簡単なゲームを作りたいんですが、
ウィンドウを作ったり画像を表示させたりするのに使うライブラリって、DirectXが一般的なんでしょうか?
810デフォルトの名無しさん:2009/07/04(土) 23:42:32
よろしい
まずは『一般的』の定義から語ろうか



↓頼んだ
811デフォルトの名無しさん:2009/07/04(土) 23:43:09
DXライブラリとか
まあ、簡単でいいならコンソールでおkだよ
812デフォルトの名無しさん:2009/07/04(土) 23:43:26
そもそもdirectxはウィンドウ作ったりするのかと
813デフォルトの名無しさん:2009/07/04(土) 23:58:20
>>809
DirectXを直接あつかうのはてめーにはどーせ無理だ
DXlibなりYaneSDKなりSDLなりつかっとけ
814デフォルトの名無しさん:2009/07/04(土) 23:59:51
>>807
漢字セットとしてはA⊆Wじゃなかったっけ?詳しくないから断言できないけど;
オーバーライドの手間はWの片方ですむし、Windows依存でいいならAPIで済ませられるし
815デフォルトの名無しさん:2009/07/05(日) 00:03:50
>>801
文字型の別に対応するだけなら宣言をヘッダ、定義とテンプレート強制実体化を
ソースに書く手もある
-- a.h --
template<typename Char> struct A { void f(const Char *); };
-- a.cpp --
template<typanme Char> void A<Char>::f(const Char *str) { ... }
template A<char>;
template A<wchar_t>;
816デフォルトの名無しさん:2009/07/05(日) 00:06:42
訂正
template struct A<char>; // 特定の型でクラステンプレートを実体化
template struct A<wchar_t>;
817デフォルトの名無しさん:2009/07/05(日) 00:11:04
クラステンプレートってバイナリにした後でオーバーライドってできたっけ?
818デフォルトの名無しさん:2009/07/05(日) 00:58:52
>814
Win32 API スレ管轄の話の気はするが round-trip しない文字列は存在する。
ttp://support.microsoft.com/default.aspx?scid=kb;ja;JP170559
819デフォルトの名無しさん:2009/07/05(日) 01:07:16
ダメ文字フィルタクラスでも作って例外投げて対処求めれば済む
そんな事気にする奴は自作関数の引数にC文字列を取ったりしないでしょ
820デフォルトの名無しさん:2009/07/05(日) 01:41:51
>>818
でもそれは、IBM拡張文字とNEC選定IBM拡張文字などのように、
同じ文字がWindows-31Jで重複して割り当てられている場合ばかりのはず。
こういう例外はあるけど、基本的にはUnicodeの原規格分離の原則でラウンドトリップは保証されていると考えていい。

どうせNTのWinAPIもそうなんだし、自分も>>806方式に賛成。
821デフォルトの名無しさん:2009/07/05(日) 05:39:12
というかそもそも〜A()と〜W()の両方のインタフェースを定義したところで
最後は最後に行き着く文字セット(+コード体系)に直すわけで
〜A()か〜W()のどちらかは実装しておいて、virtualなインタフェースは一つに絞るなりなんなりすべきなのでは
822デフォルトの名無しさん:2009/07/05(日) 11:12:04
>>813
DXlibって、ソース公開してないわけ?
マジで?
823デフォルトの名無しさん:2009/07/05(日) 11:18:30
わかりやすく
提供クラスの中身がMessageBoxを呼び出すものだったとして

Aコード体系で直接MessageBoxを呼び出せば、MessaeBoxAが呼ばれて正しく表示される。
だが、提供クラスが「Aで受け取ったらWに変換し、W実装に処理を移譲する」だった場合、
Wへの変換+MessageBoxWとなり、うまく表示されないかもしれない。

ってことだよな?
824デフォルトの名無しさん:2009/07/05(日) 14:38:58
AもWも両方virtualにしておいて、基本的にはWのみに処理を記述
AはWに処理を委譲し、不具合が出る場合はAにも処理を記述でよいのでは?
825デフォルトの名無しさん:2009/07/05(日) 16:11:46
ゲームとか作るときのパラメータ.txtやらスクリプト.txtも、半角英数字が主流(?)
まだまだAの需要はあるわけで難しいな
826デフォルトの名無しさん:2009/07/05(日) 16:16:28
icuぶっこんで内部ではUCS-4使うようにして表示する段階でUTF-16LE(unicode)にするようにして
〜Wで表示すれば間違いはなくなる(キリッ
827デフォルトの名無しさん:2009/07/05(日) 16:39:00
>>822
してる
解析するのが大変だけど
828デフォルトの名無しさん:2009/07/05(日) 17:07:36
>>796
libを二つ作らないとダメだと思った理由がわからない
829デフォルトの名無しさん:2009/07/05(日) 17:07:43
>>827
ごめん、確かにあったわ。
こりゃ解析つらいな。作者がメンテしやすいようにか、マクロ使いすぎw
Cでも使えるようにするために、クラス化もされていないようだし、ちとこれを初心者に薦めるのはダメだな…。
これ使っても、DXlib使いにはなれても、DirectX使いにはなれそうにない
830デフォルトの名無しさん:2009/07/05(日) 17:08:55
>>829
でもDirectXの長い修行に耐えかねてゲームロジックを考える前に挫折するくらいなら
DXライブラリは悪くないと思うけどな
831デフォルトの名無しさん:2009/07/05(日) 17:11:58
MessageBoxがWとAになるのは、マクロ使って実践してるけど、これが

MessageBoxクラスのopenクラス関数だった場合、マクロってわけにはいかなくならね?

#ifdef UNICODE
#define open openW
#else
#define open openA
#endif

とかやったら、ものすごい幅広い範囲に影響でてしまいそうだよな。
だからといってせっかくMessageBoxクラスなのに、openMessageBoxとか書かせるのは馬鹿らしい
832デフォルトの名無しさん:2009/07/05(日) 17:43:50
オーバーロードすればいいじゃん
833デフォルトの名無しさん:2009/07/05(日) 17:45:13
もう何をどう考えて広い範囲だとか馬鹿らしいとかになってるのかわからんよ
834デフォルトの名無しさん:2009/07/05(日) 17:47:48
>>833みたいなのって、わざと理解しないようにしてんだよな

>>831
面倒だが、#undefすりゃいいんじゃね?
少なくとも広い範囲に影響が出るのは防げる
835デフォルトの名無しさん:2009/07/05(日) 18:47:05
テンプレートで分岐する
m.open<use_unicode>();
m.open<use_ascii>();
836デフォルトの名無しさん:2009/07/05(日) 18:47:33
#undef じゃ解決しない問題だろ。
同じソース内でMessageBoxクラスとそれ以外の
openをメンバに持つクラスを使う場合とか。

オーバーロードで
open(char *)
open(wchar_t *)
両方用意した方が大分マシ。
837デフォルトの名無しさん:2009/07/05(日) 18:50:39
むしろMessageBoxクラスそのものをテンプレートにして
インスタンス化時に使用する文字コードをタグ構造体で指定する
838デフォルトの名無しさん:2009/07/05(日) 19:11:13
template<typename T>struct AnyString;
template<typename T>MessageBox::open(AnyString<T>);
だろふつう
839デフォルトの名無しさん:2009/07/05(日) 21:14:27
タイプ量が増えるのでイヤです
840デフォルトの名無しさん:2009/07/05(日) 21:29:57
>>838
std::basic_string<T>使えよ。
841デフォルトの名無しさん:2009/07/05(日) 21:36:37
>>840
流れから類推出来ん素人はだまっとれ
842デフォルトの名無しさん:2009/07/06(月) 09:30:32
ライブラリをリンクしようとすると "未定義の識別子 _HUGE" というリンカエラーが出ます
_HUGE 自体は math.h にあり、それをライブラリ内で使っているみたいなのですが、
これはどの lib ファイルをリンクすればいいのでしょうか??
843デフォルトの名無しさん:2009/07/06(月) 09:34:04
環境を書くんだ
844デフォルトの名無しさん:2009/07/06(月) 10:17:10
-lm とか
845842:2009/07/06(月) 10:59:20
すみません、
環境はvisual c++ で Luaを使ってます。Lua内部でHUGE_VAL をつかっていて、それが原因みたいです
846デフォルトの名無しさん:2009/07/06(月) 12:45:25
ビルド条件違うんじゃない?
合わせてみては。特にランタイム
847デフォルトの名無しさん:2009/07/06(月) 13:07:47
VC++のアプリで大量のデータを扱いたい場合
アプリにデータベースを埋め込むようなことがしたい場合はどうすればいいんでしょうか?
データベースサーバーを作ってそれとやり取りするアプリしかむりなんでしょうか?
データが6万以上あるのでエクセルの埋め込みじゃ無理なんです
848デフォルトの名無しさん:2009/07/06(月) 13:14:52
xml(笑)

使ったことないけどprotocol bufferてのはどうだろ
849デフォルトの名無しさん:2009/07/06(月) 13:29:39
>>847
sqlite は検討した?
850デフォルトの名無しさん:2009/07/06(月) 14:22:04
まさにこれです。早速導入してみます。
速度が遅かったらgoogleの奴、難しそうですが試してみます。
ありがとうございます。
851デフォルトの名無しさん:2009/07/06(月) 14:24:53
sqlとかってよくわからないんだけどクライアントもsqlインストールしなくても使えるの?
852デフォルトの名無しさん:2009/07/06(月) 14:26:41
SQLiteは組み込みのDBMS
それ単体で完結する。
853デフォルトの名無しさん:2009/07/06(月) 16:47:39
SQLiteはぶっちゃけて言えば、あるファイルに対して
SQLの文法を使って読み書きするファイルストリームというか、まぁそんなノリ。
854デフォルトの名無しさん:2009/07/06(月) 18:53:38
CHttpConnectionのOpenRequestの第2引数って何をいれればいいんですか?
855デフォルトの名無しさん:2009/07/07(火) 00:58:03
DELETE GET HEAD PUT POSTの対象を入れるらしいよ
856デフォルトの名無しさん:2009/07/07(火) 11:49:11
HDCを描画クラスに渡すとき
プロシージャでHDCをstaticで生成してDrawerのコンストラクタに渡すべきか
void Draw(HDC& hdc)のように描画用関数に引数で渡すのはどちらが良いでしょうか?
857デフォルトの名無しさん:2009/07/07(火) 12:36:35
>>856
前者の意味がわからない。ソースコードで語ってくれ
858デフォルトの名無しさん:2009/07/07(火) 12:57:01
ウィンドウプロシージャ内にstaticなHDC置いておいて、Drawerオブジェクトにその間接参照を持たせて
WM_PAINTでHDCの値を変更して、引数なしDrawを呼び出すってことじゃないの?
普通に引数で渡した方が後々拡張しやすいと思うし、俺ならそうする
859デフォルトの名無しさん:2009/07/07(火) 13:15:45
げげ、そんな意味なのか。それなにかメリットあるのか
860デフォルトの名無しさん:2009/07/07(火) 13:20:39
ああ、DrawerオブジェクトはHDCをprivateにしてDraw()だけ公開するってことか
もうケースバイケースじゃね。ありがちな答だけど
861デフォルトの名無しさん:2009/07/07(火) 14:21:50
短期間でプログラミング覚えないといけないんですが
何したらいいのか全然分からなくて困ってます何をしたらいいでしょうか
教本とかをやったら良いならお薦めのものを教えてもらえないでしょうか
862デフォルトの名無しさん:2009/07/07(火) 14:28:41
HTMLをやればいい
863デフォルトの名無しさん:2009/07/07(火) 14:30:25
なぜそんな状況になったのかkwsk
864デフォルトの名無しさん:2009/07/07(火) 14:31:19
>>862
簡単なことしかできないですけどHTMLはできます
C++覚えたいからここで聞いたんです
よろしくお願いします
865デフォルトの名無しさん:2009/07/07(火) 14:32:26
プログラミングは覚えるというより慣れるべきものだから、
とにかくたくさん書いて数をこなすのみ
866デフォルトの名無しさん:2009/07/07(火) 14:34:01
>>863
プログラムバッチリできますって嘘ついちゃったんです
867デフォルトの名無しさん:2009/07/07(火) 14:34:36
>>864
>863
868デフォルトの名無しさん:2009/07/07(火) 14:36:13
>>866
偽証罪、或いは詐欺罪で自白してくれば宜しいかと。
869デフォルトの名無しさん:2009/07/07(火) 14:45:09
>>865
とりあえず猫でもわかる〜を読みながら色々打ってみます
>>868
勘弁してください
870デフォルトの名無しさん:2009/07/07(火) 14:59:10
王道なし
871デフォルトの名無しさん:2009/07/07(火) 14:59:17
>>869
職場によっては猫は全く役立たずだから、どういう経緯だったのかをkwsk。
872デフォルトの名無しさん:2009/07/07(火) 15:09:02
>>871
えーと・・・仕事絡みじゃないんです、程度で言ってしまえば趣味の範囲の事になります
数名の人で集まってゲーム作る事になってそれで自分がプログラミング担当になったんです
>>868の時点で言うべきだったかもしれないですね、すいません
趣味ですって言うと流されてしまうかと思いぼかして書きました・・・
873デフォルトの名無しさん:2009/07/07(火) 15:15:45
業務とかじゃないなら、最良の解決法がある
あやまっとけw
「仕様をよく検討したところ僕には無理でした」って
874デフォルトの名無しさん:2009/07/07(火) 15:17:56
猫は古いからなあ
875デフォルトの名無しさん:2009/07/07(火) 15:29:49
>>873
そうですね・・・とりあえず謝ってきます
ただどの道プログラミング担当は自分なんで覚えないといけないんですよ

なのでゲーム向け?のプログラミング勉強できる何かを教えてもらえないでしょうか
876デフォルトの名無しさん:2009/07/07(火) 15:30:30
掲示板とかじゃなくて直接アドバイスもらえる人と密に連絡取るようにしないと難しそう。
877デフォルトの名無しさん:2009/07/07(火) 15:34:45
とりあえず環境は?
自分にあった言語の本と↓の本あたりがいいかも.。この本は言語の説明ほとんど無いから注意ね

ゲームプログラマになる前に覚えておきたい技術
ttp://www.amazon.co.jp/dp/4798021180
878デフォルトの名無しさん:2009/07/07(火) 15:36:04
RPGツクールとか使えばいいんじゃないかなw
あれはたしかrubyっぽい言語でスクリプト書くんだよね
879デフォルトの名無しさん:2009/07/07(火) 15:36:51
一度リアルで辛酸をなめた方がいいね
880デフォルトの名無しさん:2009/07/07(火) 15:42:15
>>876
知り合いに一人できる人居るけど気難しい人だからなぁ・・・
>>877
読んでみます、ありがとうございます
環境はえーっとVC++2008EEですかね
>>878
RPGツクールですか
使った事ないのでちょっとどんなのか分からないので何とも
>>879
辛酸なめた方がいいと言われてもどうしろと・・・
881デフォルトの名無しさん:2009/07/07(火) 16:17:01
とりあえずプログラマはタイピストじゃないことは認識しておけ。
882デフォルトの名無しさん:2009/07/07(火) 17:46:08
Linux+GCC 4.2なのですが
subversionで管理しているリビジョン番号を
プログラムの出力結果に表示させる場合って
どのようにすればいいのでしょうか?
883デフォルトの名無しさん:2009/07/07(火) 18:10:04
>>882
リビジョン番号を実行時に問い合わせたいのか、ソース中に埋め込みたいのか、どっちなのかと。
いずれにしても、subversionスレで聞いた方が早そうだ。
884デフォルトの名無しさん:2009/07/07(火) 18:37:23
>>883
後者です
885デフォルトの名無しさん:2009/07/07(火) 21:21:12
辛酸が塩酸に見えた俺乙
886デフォルトの名無しさん:2009/07/08(水) 07:32:10
>>882
char *rev = "$Rev$";
で置換されないかな
後はsprintfで数字のみ抜き出すとか
887デフォルトの名無しさん:2009/07/08(水) 07:33:06
" "で囲んだら無理か
888デフォルトの名無しさん:2009/07/08(水) 09:43:28
たぶん文字列内も置換される。
昔からのソースでは
static char sccsid = "$Id$";
みたいなのをそこそこ見かける。
#ifndef lint で囲まれて足りもするが
889デフォルトの名無しさん:2009/07/13(月) 18:13:35
GCC@UNIXを前提の質問です。
空白を含むテキストファイルを読み込んで
先頭の部分から順番に単語や数値を調べていくプログラムをつくろうと思っています
具体的には

2ch 1200
WD 55
ss 130

って書かれているファイルがあったときに
先頭から順番に調べて「2ch」が文字列で「1200」が数値とみなされるようにしたいなと考えております。
このような場合はどのように組めばいいのでしょうか?
890デフォルトの名無しさん:2009/07/13(月) 19:05:25
単に
scanf("%s %d", &moji, &inte); じゃだめなん?
891デフォルトの名無しさん:2009/07/13(月) 23:55:02
バラバラなんだったらとりあえず取って、全部数字かどうか見ればよいと思うよ
892デフォルトの名無しさん:2009/07/14(火) 05:01:57
初心者向けじゃないけど正規表現ライブラリ使う
893デフォルトの名無しさん:2009/07/14(火) 07:30:20
>>889
そのテキストは
文字列 空白 数字 改行
というフォーマットに決まってる?
なら
>>890
894デフォルトの名無しさん:2009/07/14(火) 10:53:28
Unicode文字セットで開発していると
std::exception.what() や std::type_info.name() などの
戻り値が char で返却されるメソッドに遭遇するたびに
その都度 mbstowcs_s で wchar_t に変換して使用してます

しかし、mbstowcs_s で変換するときに
事前に文字列の長さを取得したり、変換先のバッファを用意したり
なんか冗長だなぁと思えてしまいます
そもそも上記のような標準ライブラリのクラスって、TCHAR版は無いのでしょうか?
よろしくお願いします
895デフォルトの名無しさん:2009/07/14(火) 11:19:56
>>894
_bstr_t、CComBSTR、W2A, A2W
896デフォルトの名無しさん:2009/07/14(火) 11:20:13
>>894
標準にない関数や型の話をするときは、環境が何かも語りましょう。
897デフォルトの名無しさん:2009/07/14(火) 19:03:37
>>894
一応書いておくけど、無いよ。
exceptionは独自の例外クラスを使うという抜け道はあるけど。
898デフォルトの名無しさん:2009/07/14(火) 19:35:46
>>895-897
ありがとうございます。
899デフォルトの名無しさん:2009/07/14(火) 23:14:02
下記のプログラムをcygwin環境でコンパイルすると、
"error: invalid use of nonstatic data member 'Outer::m_outer_value"
と表示されます。
このコンパイルエラーはどうやったら解決できるでしょうか。
また、インナークラスからアウタークラスのメンバにアクセスするにはどうしたらいいのでしょうか。

#include <stdio.h>

class Outer
{
  private:
    int m_outer_value;
  public:
    Outer() { m_outer_value = 10; }
  class Inner
  {
    public:
      Inner();
  };
};

Outer::Inner::Inner()
{
  printf("m_outer_value %d\n", m_outer_value);
}

int main(void)
{
  Outer obj;
  return 0;
}
900デフォルトの名無しさん:2009/07/14(火) 23:19:55
Outerのインスタンスを渡せ。
C++では、クラスの中にクラスを書いても、スコープが内側に入るだけ。
OuterのインスタンスとInnerのインスタンスに何ら関係性が作られることはない。
901デフォルトの名無しさん:2009/07/14(火) 23:31:46
実際のしつけとは異なって、子供は親の言うことに従ってればいいと思うよ。
902デフォルトの名無しさん:2009/07/14(火) 23:32:24
Outerインスタンスが存在しなくても、Innerインスタンスが独立に存在することが許されてるから、
InnerにちゃんとOuterインスタンスがどこにあるか分からせる必要があるってこと
903デフォルトの名無しさん:2009/07/14(火) 23:34:51
親の財布から金を抜くのではなく、もらった小遣いでやりくりしろってことですねわかります
904デフォルトの名無しさん:2009/07/14(火) 23:41:41
…というか、継承の概念を知らないだけじゃないのか?
905デフォルトの名無しさん:2009/07/14(火) 23:54:05
Java
906デフォルトの名無しさん:2009/07/15(水) 00:42:37
>>904
俺もそう思った。単に派生クラスで基底クラスのメンバをいじりたいだけなんじゃないか

#include <stdio.h>

class Outer
{
  protected:
    int m_outer_value;
  public:
    Outer() { m_outer_value = 10; }
};

class Inner : public Outer
{
  public:
    Inner();
};

Inner::Inner()
{
  printf("m_outer_value %d\n", m_outer_value);
}

int main(void)
{
  Inner obj;
  return 0;
}
907デフォルトの名無しさん:2009/07/15(水) 01:02:48
レベル高けぇ・・・
どんな言語の流儀を基にそんな勘違いできるんだ?
908デフォルトの名無しさん:2009/07/15(水) 01:26:25
継承を機能の拡張と捉えるなら、そんなに非直感的な勘違いでもないと思うが。
909デフォルトの名無しさん:2009/07/15(水) 01:27:59
どれを指して勘違いといっているのかが分からないぐらいカオス
910デフォルトの名無しさん:2009/07/15(水) 08:25:25
Javaならできるが、C++ではできない。
911デフォルトの名無しさん:2009/07/15(水) 10:05:03
クラス間の意味合いを考えて、
A is a B ならAはBの派生関係
A has a B ならAの中にBのインスタンスを持たせる
とよく言われますわな。
それにしても、包含されているクラスのインスタンスから包含しているほうのメンバを操作しようとか無茶すぎ。
912デフォルトの名無しさん:2009/07/15(水) 12:20:09
かなり微妙な質問だと思うんですけどします。

クラスの宣言部分(h)と実装部分(cpp)を分ける意味がいまいち良くわからないのですが
例えば使いまわせるようなクラス郡をコンパイルしておけば、そのライブラリを利用する時は利用する側だけ
コンパイルですむってことでしょうか?

つまり、ライブラリのクライアント側、というか再利用できない部分は、あえて分けて書かなくてもいいって事でしょうか?
それとも皆さん多少めんどくさくても全部分けたりしてます?
913デフォルトの名無しさん:2009/07/15(水) 12:24:06
そのクラスを他のソースでも使う場合、事前にコンパイルするしないにかかわらず
ヘッダにしないと不便だろう。
914デフォルトの名無しさん:2009/07/15(水) 12:55:19
>>912
全部のソース (100万行とか?) をひとつの.cppファイルに書く
→ 見通しが悪い、メンテが大変、コンパイルに時間がかかる
→ じゃあソースを複数の.cppファイルに分けよう
→ 各.cppファイルは別々にコンパイルするから他ファイルの関数とかクラスを使えないよ
→ 他ファイルから参照できるように宣言とかだけ.hファイルに分けてインクルードしよう
という感じ
915912:2009/07/15(水) 13:21:59
>>913
>>914
レスありがとうございます。
一クラス一ファイルという原則は理解できます。

ただ、一つのクラスをhファイルに全ての実装も含めて書いてしまってもincludeは問題ないですよね?
つまり宣言と実装を二つのファイルに分けなくても全部hに書いてしまってもOKなんじゃないかと思ったのですが
なにか、勘違いしてますでしょうか?

あと、分割コンパイルの件ですが、確かにC++のコンパイルって時間かかりますよね。

例えばあるクラス、ClassAがあって、それはもうコンパイルしてるとします。
それをべつのクラスや関数で使用するとき例えば
#include "ClassA.h";
としますよね?で、既にコンパイルしてあるClassA.libをリンカが見つけられるようにしてやれば
ClassAはコンパイルしなくてもつかえますよね?つまり#include "ClassA.h";は名前の解決をするためにしてるって事でしょうか。

この場合もhファイルに全ての実装も書いてしまっても同じことにならないでしょうか?


916デフォルトの名無しさん:2009/07/15(水) 13:45:02
>>915
ヘッダに実装を書かないのはコンパイルにかかる時間の問題の為だけ。
クラステンプレートや関数テンプレートはヘッダに全部書くしかないから、
STLやboostは全部ヘッダに書いている。

またポインタの宣言など先行宣言で済む場合、インクルードより先行宣言の方がコンパイルが速くなる。
ttp://www002.upp.so-net.ne.jp/ys_oota/effec/chapter5.htm#34kou
917デフォルトの名無しさん:2009/07/15(水) 14:01:25
実装の隠蔽とかコンパイル時間の短縮とか・・・
大きなプロジェクトになるほど分割したほうが良くなってくる
とくにコンパイル時間の短縮は大きな問題だよ

たとえばfoo.hにclass fooの実装まで全部を書いて、それをインクルードするファイルが1000個あったら
class fooは1000回コンパイルされることになる
ここでfoo.hと実装を分離しておけばfooのコンパイルは1回のですむ
1時間のコンパイルが数分になるなんてことも普通にありえる
918デフォルトの名無しさん:2009/07/15(水) 17:24:46
>>915
hに全部書いたらClassA.lib自体いらなくなる
そしてhをincludeしたそれぞれにClassA.libが内蔵されることになるから無駄にサイズも大きくなる
919デフォルトの名無しさん:2009/07/15(水) 17:49:37
まてサイズは・・・
920デフォルトの名無しさん:2009/07/15(水) 22:53:28
ひとつのソースファイルに全部書いた方がコンパイル時間は減るのでは
921デフォルトの名無しさん:2009/07/15(水) 23:01:21
>>920
修正して再コンパイルする時にかかる時間が大差。
1回コンパイルして完成。その後は一切触らないっていうのがありえない。
922デフォルトの名無しさん:2009/07/15(水) 23:08:29
「ひとつのソースファイルで…」とか「ひとつのヘッダーファイルで…」と言って
しまえる人間がうらやましい。小さなソースで格闘できるんだなーと。
923デフォルトの名無しさん:2009/07/15(水) 23:17:44
それは夏休みのある小学生はうらやましいなぁつってるようなもんだなぁ
924デフォルトの名無しさん:2009/07/15(水) 23:21:10
うわー、実際、夏休みがほすいー
925デフォルトの名無しさん:2009/07/15(水) 23:41:27
>>918
それぞれに内蔵(?)されたなら多重定義になりそうな気がしないか?
926デフォルトの名無しさん:2009/07/15(水) 23:43:14
>>921
リビルドするならソースは一つの方が速いとおもうよ
必要なものだけコンパイル、リンクするために分割するわけだし(きっとそれが言いたかったんだろうと思いつつ補足)
927デフォルトの名無しさん:2009/07/15(水) 23:48:57
プロジェクト全体でひとつのソースとか気がくるっとる
928デフォルトの名無しさん:2009/07/15(水) 23:53:31
>>920の意味がわからなくなってきた。
話の流れからヘッダに実装も書く事かと思ったが。

どっちにしても修正したコードの量に対して、再コンパイルがかかるコードの量が増えると思うんだけど違う?
929デフォルトの名無しさん:2009/07/16(木) 00:18:49
完全ビルドするならディスクI/Oの分は早いかなw
930デフォルトの名無しさん:2009/07/16(木) 00:20:51
ヘッダの修正はそれに依存してるソース全部再コンパイル
ソースの修正はそのソースだけ再コンパイル
931デフォルトの名無しさん:2009/07/16(木) 01:33:41
Failed to receive messages at scim_bridge_client_read_and_dispatch ()
An IOException occurred at handle_message ()
*** glibc detected *** gnuplot: double free or corruption (fasttop): 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の部分を除けばエラーはでなくなります。
932デフォルトの名無しさん:2009/07/16(木) 01:50:06
>>931
まんどくせ
最小限のエラーを再現するプログラムを書いてうpれ
たぶん、それをやったらバグ発見して自己解決すると思うが。
933デフォルトの名無しさん:2009/07/16(木) 03:19:12
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;

int main(void){
double a[5],b[5];
int i;
for (i=1;i<=4;i++){
cout << " a[" << i <<"]=" ;cin >> a[i] ;
cout << " b[" << i <<"]=" ;cin >> b[i] ;
}

ofstream abOut ("ab.dat");
for (i=1;i<=4;i++){
abOut << a[i] << " " << b[i] << endl;
}

FILE *fp = popen("gnuplot -persist", "w");
if (fp == NULL)
return -1;
fputs("set mouse\n", fp); //マウス有効化
fputs("set xrange [-10:10] \n", fp);
fputs("set yrange [-10:10] \n", fp);
fputs("plot 'ab.dat' \n", fp);
fflush(fp);
cin.get();
pclose(fp);
return 0;
}

これでも1/3くらいでエラーがでます。不規則にエラーが出るので原因は分かりません。
934デフォルトの名無しさん:2009/07/16(木) 03:20:39
Failed to receive messages at scim_bridge_client_read_and_dispatch ()
An IOException occurred at handle_message ()
*** glibc detected *** gnuplot: double free or corruption (fasttop): 0x091af000 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7748604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb774a5b6]
/usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_free_messenger+0x52)[0xb604d892]
/usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_client_close_messenger+0x3b)[0xb604f92b]
/usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_client_finalize+0x42)[0xb60521e2]
/usr/lib/gtk-2.0/2.10.0/immodules/im-scim-bridge.so(scim_bridge_client_gtk_finalize+0x41)[0xb6049441]
/lib/tls/i686/cmov/libc.so.6(exit+0x89)[0xb7707bb9]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xed)[0xb76ef77d]
gnuplot[0x8057e31]
======= Memory map: ========
08048000-0816a000 r-xp 00000000 08:01 1384430 /usr/bin/gnuplot
0816a000-0816b000 r--p 00121000 08:01 1384430 /usr/bin/gnuplot
0816b000-0817c000 rw-p 00122000 08:01 1384430 /usr/bin/gnuplot
0817c000-08187000 rw-p 0817c000 00:00 0
090a7000-0920f000 rw-p 090a7000 00:00 0 [heap]
b5a00000-b5a21000 rw-p b5a00000 00:00 0
b5a21000-b5b00000 ---p b5a21000 00:00 0
b5b2f000-b5b31000 r-xp 00000000 08:01 629791 /usr/lib/gconv/UTF-32.so
b5b31000-b5b32000 r--p 00001000 08:01 629791 /usr/lib/gconv/UTF-32.so
b5b32000-b5b33000 rw-p 00002000 08:01 629791 /usr/lib/gconv/UTF-32.so
b5b33000-b5b36000 rw-s 00000000 00:09 5603366 /SYSV00000000 (deleted)
b5b36000-b5c40000 rw-p b5b36000 00:00 0
b5c40000-b5ffc000 r--p 00000000 08:01 1645905 /usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf


こんなエラー
935デフォルトの名無しさん:2009/07/16(木) 03:34:18
インデントのないソースは見ないことになっている
936デフォルトの名無しさん:2009/07/16(木) 03:40:50
そんなへそ曲がりな教授みたいな
937デフォルトの名無しさん:2009/07/16(木) 03:43:51
ネットの見知らぬ人に見てもらうのにせめて体裁くらいは整えて置けよ
938デフォルトの名無しさん:2009/07/16(木) 03:46:23
実はインデントされているという事実
情弱乙
939デフォルトの名無しさん:2009/07/16(木) 03:48:13
>>938
知ってる
専ブラだとアンカー経由でみるとインデントは残ってるのもあるね。
まあ極力ソースは外部ロダにテキストで上げて見てもらうとかの方がいいよ
940デフォルトの名無しさん:2009/07/16(木) 04:05:22
http://uproda.2ch-library.com/lib149086.cpp.shtml

>>933です。
gnuplotの部分が問題あると思うんですがどうダメなのかわかりません。
http://www-sens.sys.es.osaka-u.ac.jp/wakate/tutorial/group3/gnuplot/
参考にしたサイト
941デフォルトの名無しさん:2009/07/16(木) 04:18:20
マルチ乙
942デフォルトの名無しさん: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;
}
943デフォルトの名無しさん:2009/07/16(木) 04:47:37
>>942
それは大丈夫でした
944デフォルトの名無しさん:2009/07/16(木) 08:32:17
ttp://www1.axfc.net/uploader/He/so/234773

VC++2008 を使用しています。

PNG 画像を扱う時に _aligned_malloc でメモリ確保する方法を使ってみた所、
sample1.png の画像は読み書きに成功したのですが、sample2.png の画像は
「libpng error: Too many IDATs found」と出てうまくいきませんでした。

何かやり方が悪いのでしょうか、どなたかご教授下さい。
945デフォルトの名無しさん:2009/07/16(木) 08:35:15
>>944
エラーメッセージにあるとおり、IDATタグが余計にあるからpng画像としては規約違反だとlibpngが宣っている。
別にあんたのやり方が悪いわけではなさそうだ。
946デフォルトの名無しさん:2009/07/16(木) 08:53:37
>>933
abOut() をブロックで囲んでないのが気になる。

popen()とstdioがごっちゃになってるのも気になる。
少なくともpopen()前にcout.flush()すべき。

とはいっても件のエラーには関係無さそうだなぁ…。
947デフォルトの名無しさん:2009/07/16(木) 08:58:20
>>933
>946の言うように、abOutがクローズされないままgnuplotを呼び出している希ガス。
ブロックで括るかしてデストラクションを強制させる方がよさそうだ。
948デフォルトの名無しさん:2009/07/16(木) 09:27:02
>>945
なるほど、そういった類のエラーでしたか。
教えて下さりありがとうございました。
949デフォルトの名無しさん:2009/07/16(木) 11:11:59
>>945
細かい突っ込みだけど、複数のIDATタグは違反でも何でもない。
>>944のsample2.png見てみたけど、ぱっと見では違反してなさそうなんだけどなぁ。
sample1.pngにα追加してADAM7インターレース方式にしただけだよね?

libpngを覗いてみたが、どうも画像を読み込み終わった後に余計なIDATチャンクがあると出るエラーメッセージみたい。
もしかしたら出力したソフトに問題があるのかもしれないが、流石にそこまで確認する余裕はない。
何のソフトで出力したよ?
950デフォルトの名無しさん:2009/07/16(木) 11:12:32
あ、ちょっと勘違いしてたか。>>945ごめん。
951デフォルトの名無しさん:2009/07/16(木) 12:29:09
%dや%sという表記を見かけたことがあるのですが、これはどういう意味でしょうか
"%d"を検索しようとしてもうまくかかりません
952デフォルトの名無しさん:2009/07/16(木) 12:30:03
>>946-947
やってみたけど関係なかったみたいです
953デフォルトの名無しさん:2009/07/16(木) 12:32:37
>>951
"printf" "フォーマット" あたりで検索すれ
954デフォルトの名無しさん:2009/07/16(木) 14:40:04
>>953
ありがとうございます!
955デフォルトの名無しさん:2009/07/16(木) 23:10:20
>>949
sample2の方がオリジナルで、しかもネットで拾った物なので、
何のソフトで作られた物なのか判らないのです。

たまたま、この画像を使って実験をしたらエラーになったという案配でして…。
956デフォルトの名無しさん:2009/07/17(金) 13:31:36
csvファイルを読み込むクラスをvectorで実装してみたのですが
17000行*7列のデータを読み込むのに57秒かかりました・・・遅いですよね

読み込む内容は数桁の数字のみです
957デフォルトの名無しさん:2009/07/17(金) 13:32:51
>>956
フロッピーかデータテープからから読み込むとそのくらいかかるのか?
どこに問題があるの?
958デフォルトの名無しさん:2009/07/17(金) 13:35:55
遅いのが気になるなら仮想的にファイルアクセスしてるような関数(クラスでもいいや)
用意して、そいつがファイル読み込みを担当するんだけど、csvの細かい部分読みじゃなく
ファイル全体をメモリに読み込み(バイナリ扱い)
で、関数(もしくはクラス)がメモリに上げたデータから切り出してあげる
959デフォルトの名無しさん:2009/07/17(金) 13:41:18
まさかとは思うが、最適化してないなんて落ちじゃないだろうな。
960デフォルトの名無しさん:2009/07/17(金) 13:43:29
>>958
今まではfgetsで1行ずつ読み込んでデータテーブルにセットしてたのですが
そうではなくてファイルを全部読み込んで、メモリからデータをセットした方が早いと言うことでしょうか?

そうするとファイルを読み込むのに必要な領域の量を求めないといけないのですが良い方法はあるのでしょうか?
961デフォルトの名無しさん:2009/07/17(金) 13:44:39
>>959
・・・orz
リリースビルドで実験したら1.8秒まで短縮しました
962デフォルトの名無しさん:2009/07/17(金) 13:44:47
>>960
だから遅い早いは自分でしらべ()

一行 or 全部 だけじゃなくて 一部 とかもあるんじゃないか
963デフォルトの名無しさん:2009/07/17(金) 13:44:54
>>960
ファイルIO系の関数でサイズは求めれると思うけど・・
964デフォルトの名無しさん:2009/07/17(金) 13:48:42
×求めれる
○求められる
965デフォルトの名無しさん:2009/07/17(金) 13:53:50
>>961
2万行弱で2秒って、それでも遅すぎない?

double n[7];
vector< vector<double> > table;
FILE *fp = fopen("hoge.csv", "r");

while (fscanf(fp,"%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6])==7) {
 table.push_back(vector<double>(n, n+7));
}

うちだとこれで2万行×7データで0.1秒かからないけど
966デフォルトの名無しさん:2009/07/17(金) 13:55:50
>>965
しまった%dだったorz
967デフォルトの名無しさん:2009/07/17(金) 13:57:49
何をやったら遅いコードになるかという今後のためにも貼っておけw
968デフォルトの名無しさん:2009/07/17(金) 14:26:50
>>967
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9771.txt
こんな感じ

やっつけ仕事かつまだデバッグ途中なので変な挙動するかもしれません
あとコードが汚いのはお察しくださいorz
969デフォルトの名無しさん:2009/07/17(金) 14:35:37
>>968
数値がダブルクォートでくくられてるのか・・・
なんでそんな面倒なデータ仕様にしたのw
970デフォルトの名無しさん:2009/07/17(金) 14:38:42
>>969
頂いたデータがそういう仕様だったからとしか・・・
あとは時々数字以外のデータも飛び込んでくるので

もうわけわかめ
971デフォルトの名無しさん:2009/07/17(金) 14:53:44
vector は capasity を超えると再割り当て(要素の全コピー)が行われるのを忘れないようにしましょう。
つまり、巨大データを格納する場合は、あらかじめ予想サイズに reserve しておくことが必須です。^^

データサイズが予測できないなら、
ランスしないことを条件に list の方が有利なケースもおっぱいあります。
972デフォルトの名無しさん:2009/07/17(金) 14:55:00
おっぱいなんですね
973デフォルトの名無しさん:2009/07/17(金) 19:11:42
fseekとftellでファイルサイズを求めてその分メモリ上に領域確保するというのは解りましたが
バイナリモードで読み込んで、ファイルの内容をメモリから切り出すとき
改行の検出は'\n'で良いのでしょうか?
974デフォルトの名無しさん:2009/07/17(金) 19:15:46
>>973
たぶん
それか0x0Dと0x0Aの両方を見るようにすればいいんじゃないかな?
http://ash.jp/code/return.htm
あとEOFは存在しないのでね^^
975デフォルトの名無しさん:2009/07/17(金) 21:39:12
ビルドの方法でそんなに時間が違うって、MSのCコンパイラは何やってんだよ
こえー
976デフォルトの名無しさん:2009/07/17(金) 21:40:27
>>975
当たり前だろデバッグに必要な余計なコードが入ってるか否かなのに
977デフォルトの名無しさん:2009/07/17(金) 21:46:48
デバッグモードはほとんどインタプリタ状態だからね。
978デフォルトの名無しさん:2009/07/17(金) 21:47:11
入れすぎってこと。
gcc -g で 1.8秒が57秒になるこたあないだろ
979デフォルトの名無しさん:2009/07/17(金) 23:28:23
>>978
関数呼び出し回数が多すぎるな
980デフォルトの名無しさん:2009/07/17(金) 23:30:52
push_backやりまくるならdequeにしろよ〜
981デフォルトの名無しさん:2009/07/17(金) 23:59:33
>>980
なんで?
982デフォルトの名無しさん:2009/07/18(土) 00:18:06
dequeよりvectorのほうが全体的に動作が速かったはずだが
先頭要素にpushすることが無い限りvector1択じゃないか?
983デフォルトの名無しさん:2009/07/18(土) 01:13:06
>>982
VC++のまぬある
Vectors allow constant time insertions and deletions at the end of the sequence.
Inserting or deleting elements in the middle of a vector requires linear time.
The performance of the deque Class container is superior with respect to
insertions and deletions at the beginning and end of a sequence.

ケツに挿入する時もdequeの方が優勢と書いてアッー
メモリ配置の連続を保障しないといけないから、vectorの場合確保してる領域が尽きたらreallocするけどdequeなら分断しててもいいのでreallocせずに追加できる。
vectorが2万要素も途中でメモリ確保しなおさずにpush_backできると思えん。
984デフォルトの名無しさん:2009/07/18(土) 01:33:40
とりあえずプロファイラにかけてみるのはどーよ。
それだけで答えが見えることも多い。

>>983
まぬある文は正しいと思うけど、
分断の話はほんとかい?
分断されるとlistみたいにランダムアクセスが定数時間でできなくなっちゃうけど。
985デフォルトの名無しさん:2009/07/18(土) 05:40:15
dequeの定数時って、「ならし定数時間」および ”amortized constant time” という表現の
ほうがより正確らしい。
986デフォルトの名無しさん:2009/07/18(土) 06:32:59
ランダムアクセスして中間にある要素を削除しまくるようなことをする場合はvectorのほうが早いが
それ以外なら大きな差はでないらしい

それよりもpush_backしまくるのをどうにかしたほうが高速化に寄与しそうだが
987デフォルトの名無しさん:2009/07/18(土) 08:11:40
vector<vector<> > は、内部配列を拡張するときのコピーコンストラクタの
ペナルティが大きすぎるだろ。
988デフォルトの名無しさん:2009/07/18(土) 08:12:51
どっかにコンテナの破棄以外はほとんどdequeの方が高速、または誤差程度の差
というベンチ結果があった気がする
989デフォルトの名無しさん:2009/07/18(土) 09:46:48
速度が重要なら必要な機能だけ実装した速度特化の似非vector自分で書けばいい
990デフォルトの名無しさん:2009/07/18(土) 09:49:44
>>988
唯一、ブロック転送だと凄く差が付く。
991デフォルトの名無しさん:2009/07/18(土) 15:54:25
>985
償却定数時間って表現もするね。
でもそういう意味なら vector の push_back だって amortized constant time だよ?
992デフォルトの名無しさん:2009/07/18(土) 23:42:55
a1からh8なら縦横の位置を出して
qが入ると終了する。どうするの?
993デフォルトの名無しさん:2009/07/19(日) 00:01:56
他人のソースを早く読めるようになりたいんですけどどうすればいいですか
994デフォルトの名無しさん:2009/07/19(日) 00:04:15
業界を改革してスパゲティ職人を排除するといいよ
995デフォルトの名無しさん:2009/07/19(日) 00:05:11
自転車に早く乗れるようになりたいんだけど、どうすればいいですか?
996デフォルトの名無しさん:2009/07/19(日) 00:06:36
難易度が5段階あるとして、難易度3以上のソースには手を出さない
997デフォルトの名無しさん:2009/07/19(日) 00:08:13
鍵をはずして跨ぐだけだから、早くしようが無いよ
思い切って鍵をつけないことにすれば早くなるけど安全じゃないね
998デフォルトの名無しさん:2009/07/19(日) 00:51:23
紙面の大きい落書きノートにソース見ててピンと来た流れや項目を都度殴り書きしとく
999デフォルトの名無しさん: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
>>999


>>1000
イケメン
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。