【初心者歓迎】C/C++室 Ver.66【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.66【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
09/05/28 01:08:48
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.65【環境依存OK】
スレリンク(tech板)

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

2:デフォルトの名無しさん
09/05/28 02:13:44
複数の半角スペース→ ×個数
TAB→    の置き換えを
お勧めする。

3:デフォルトの名無しさん
09/05/28 11:41:07
VisualC++2008EEですが、
浮動小数点型として、別の型を定義して使っています。

typdef float float_t;

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

std::pow( f, 2.0f );

このように、実数定数をf付きで書いている為、オーバーロードが解決出来ない為です。
しかし、2.0fを2.0に変えると、逆のケースでコンパイルが通らなくなります。
何かよい解決法はありませんか?


4:デフォルトの名無しさん
09/05/28 11:44:52
間に自前の関数かましては

5:デフォルトの名無しさん
09/05/28 11:47:25
リテラルを引数に取らずに const float_t k = 2.0; とかおいといて
そいつを渡したらだめ?

6:デフォルトの名無しさん
09/05/28 11:48:18
>>4
自前の関数とは、
自前のpowを作るということですか?
それとも、2.0fをfloat_t(2.0f)とすることでしょうか?
前者は、組み合わせを網羅するとなると、結構厳しいです。
後者も、既に書いてしまったコードが大量にあるので
これも厳しいです。

7:デフォルトの名無しさん
09/05/28 12:17:44
キャストすりゃいいんだろうけど、大量にあるなら自前のやつ作れば数個で済むし
テンプレートでやっちゃうのもいいんじゃない?

8:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/28 12:37:00
エラーはオーバーロードの解決だろ、これの意味わかってる?

10:デフォルトの名無しさん
09/05/28 16:21:00
>>9
はい。今回の問題は、実数定数とfloat_tの組み合わせに
対するオーバーロードが解決できない為に起こっています。
なぜ型がアンマッチするか、それは実数定数がfloat_t型でない為です。
ゆえに、解決手段として正しいものは、実数定数をfloat_t型で書くことになります。

しかし、実数型は小さい型から大きい型にキャストしても
情報が欠損しないことは明らかです。
だったら、オーバーロードの候補が複数あった場合、
小さい型を大きくする方向でマッチングして、
最小の変更で済むものにするというルールでいいはずです。
そのルールが適用出来れば、ソースの改修を最小限に留め
問題を解決出来ます。
そういった方法がないか、確認した次第です。
実際ないですよね、F(2.0f)のマクロにします。
ありがとうございました。

11:デフォルトの名無しさん
09/05/28 17:40:11
f*f
が早いしエラーでない。

12:デフォルトの名無しさん
09/05/28 17:46:36
unsigned 同士の演算の最小値はどんな場合でも 0 でいいの?

13:デフォルトの名無しさん
09/05/28 19:13:45
printfで出力した文字を全部消すのはsyrtem("CLS")でできたのですが
一部だけ消す方法はありませんか?
例えば最新の1行だけとか。。。
よろしくお願いします。

14:デフォルトの名無しさん
09/05/28 20:15:57
>>11
それって何ですか?
さっぱりわかりません。

15:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/28 22:42:43
種類のわからない構造体へのポインタって宣言できますか?

18:デフォルトの名無しさん
09/05/28 23:01:59
void*??

19:デフォルトの名無しさん
09/05/28 23:12:16
>>18
すげえこんな便利なのがあったのか

20:デフォルトの名無しさん
09/05/28 23:17:56
で、どうやって構造体のメンバにアクセスするつもり?

21:デフォルトの名無しさん
09/05/28 23:18:49
便利だけど強力すぎて丁寧に使わないと大域変数みたいに混乱の元になったり

22:デフォルトの名無しさん
09/05/28 23:53:30
>>15
phogeはboost::scoped_ptr<hoge>型、new hoge()はhoge*型。
別の型のため、
> hoge* h1 = new hoge();
これとは比べられない。
暗黙の型変換で、型変換してコンストラクタを呼ぶ仕組みがC++にはあるが>>16の通り。

>>17
void*はポインタの先にアクセスする時に、元の型に型変換する事になるが型を間違えないように注意。

23:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/29 21:07:19
>>23
そう。それはコンパイルエラーになるのが正しい。
Visual C++の独自拡張でコンパイルが通ってしまうだけ。
/W4で警告になる。あるいは、/Za(独自拡張なし)でエラーになる。
/Zaが嫌なら/we2664を使えばこれだけエラーにすることも可能。

27:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/29 22:27:41
>>28
なるほど、分かりました。実は
test t = (100.0, 0.0, 99999);
と書いたら
99999 0
と表示されたので、クラスの中身を破壊でもしてるのかと思ってました。
最後に右側が評価されるので、
test t = 99999
と評価され、コンストラクタにデフォルト値を設定してたのでコンパイルも
通ってたみたいです。
言われたとおりに初期化を書き換えました。
ありがとうございます。


31:デフォルトの名無しさん
09/05/30 02:03:47
ビルド→デバッグ
0 0 0 0 0
デバッグ
0 0 0 0 1
デバッグ
1 0 0 0 1

といった様に配列に追加書き込みをする方法を教えていただけませんでしょうか?

32:デフォルトの名無しさん
09/05/30 03:26:20
項目名とその値の組み合わせを複数渡す必要があるとき
構造体のlistを渡すのとmapを利用するのはどっちが無難でしょうか?

33:デフォルトの名無しさん
09/05/30 03:37:51
>>32
map の方が楽

34:デフォルトの名無しさん
09/05/30 04:56:14
あるポインタが指してるアドレスを別のポインタとか変数に入力する事って出来ますか?

35:デフォルトの名無しさん
09/05/30 05:07:28
はい

36:デフォルトの名無しさん
09/05/30 08:09:11
来年就職に備えて、行き当たりばったりな開発の仕方から
しっかりと設計してから開発の流れにもっていきたいんだけど、
デザインパターンとかUML学べばおk?

ためになる資格とかお薦めの参考書あれば教えてくほしい

37:デフォルトの名無しさん
09/05/30 10:09:35
struct Hoge {
int hoge;
...
};
class Hoge {
Hoge():hoge(0){}
public:
int hoge;
...
};

上みたいにclassにメンバ関数加えても、継承や仮想関数を使わない限り同じメモリ配列になるのは決まってるんでしょうか
それとも、そう思い込んではいけませんか

38:デフォルトの名無しさん
09/05/30 10:24:33
NULLポインタをdeleteしても何も起こらないらしいですが、配列のポインタの場合がNULLポインタだった場合にdelete[]をしても何も起こりませんよね???

39:デフォルトの名無しさん
09/05/30 11:43:01
起こりませんよ!!!

40:デフォルトの名無しさん
09/05/30 13:11:02
まあ、NULLのポンタをdeleteする時点で
何か間違ってる可能性は否定しない

41:デフォルトの名無しさん
09/05/30 13:18:00
ポンタか
なるほどね

42:デフォルトの名無しさん
09/05/30 13:57:13
ぬるぽんた

43:38
09/05/30 14:15:34
デストラクタでわざわざif (pArray) delete[] pArray;って書くのもナンセンスなのかなって思っただけです。
普通のポインタはdelete p;で済ませますよね?
で、配列もやっぱり同じことができるのかな、と。
"delete[]"で検索してみても、[]はキーワードにならないみたいで、マッチしたページが出てこないのでここで質問してみました。

44:デフォルトの名無しさん
09/05/30 14:48:28
>>43
うん,ナンセンス。
NULLをdelete[]しても何も起こりませんからご安心ください!!!

45:デフォルトの名無しさん
09/05/30 14:54:16
>>40
行田市でタヌキの赤ちゃんが見つかったニュースですね

46:デフォルトの名無しさん
09/05/30 16:22:53
VC2008で関数にカーソル合わせると、ヘッダファイルに書いた宣言とコメントが表示されたような気がするのですが、コメントが表示されません。
コメントはヘッダのどこに書けば表示されるのでしょうか。
それともなにか設定があるのでしょうか?

47:デフォルトの名無しさん
09/05/30 17:27:01
>>37
コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子以外なら大丈夫
これらを一つでも作った場合は規格上は保証されない

48:デフォルトの名無しさん
09/05/30 19:39:16
>>38
そんなのやる時間があったら、なにかソフトを1つ自分で書いてみろ。


49:デフォルトの名無しさん
09/05/30 21:32:16
>>48
は?w

50:デフォルトの名無しさん
09/05/31 12:34:34
std::vector<T>の最後尾の要素を移動したいとき、
std::vector<T> vec;
T tmp = vec.back();
vec.pop_back();
という感じで、二段階でやるしかないでしょうか?


51:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/31 14:49:15
>>51
参照渡しと言えば普通は引数についての議論だけど、
1~6は戻り値の受け取り方だろ。噛み合ってない。

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

内部的な処理で言えば、参照はポインタと同じで、どこかにある実体を指しているだけ。
実体は他でちゃんと保持されなければならない。

53:デフォルトの名無しさん
09/05/31 14:51:16
>>50
例外安全のために二段階に分けられている。
そのやり方しかない。

54:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/31 16:32:15
>>55

Thanks

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

なぜこのような事態が発生するのかわかりますでしょうか?

57:デフォルトの名無しさん
09/05/31 16:58:56
>>56
ごめん、私の勉強不足のために嘘を教えてしまった。
URLリンク(www.sun-inet.or.jp)
にあるように、const参照は一時オブジェクトを束縛するということなので、5と6はOK。
3が通るのは、そのコンパイラが一時オブジェクトを破棄するタイミングを
たまたま遅らせているだけと考えられるので、
環境を変えたときに安全は保証されないと思う。

58:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/31 17:30:26
すいませんプリコンパイル済みヘッダーというのが使い方がよく分からないのですが、
pch.hファイルに使用する全てのヘッダーファイルのincludeを書いて、
他のcppファイルはpch.hのみincludeするというのが正しい使い方なんでしょうか

61:デフォルトの名無しさん
09/05/31 17:32:40
すいません。コンストラクタ部分をこぴぺミスしました。
SStraightCardList()→SList()です。 よろしくお願いします

62:デフォルトの名無しさん
09/05/31 18:09:52
>>58
今はVOIDだが、他に戻り値が必要なら1。
SStructがコンストラクタを持つなら、コピーコンストラクタ一発で値を返すことができるので2。
SStructがただの構造体なら1も2も同じだけど、呼び出しが楽なので2。
それより良い手は const SStruct& GetStruct() const { return m_sTestStruct; }

>>59
URLリンク(msdn.microsoft.com)(VS.80).aspx

>>60
プリコンパイル済みヘッダには、各cppで共通のヘッダで、変更の少ないものを書くのが普通かと。
変更があると、全cppを再コンパイルする羽目になるので。
各cppはプリコンパイル済みヘッダと、不足分のヘッダをincludeする。

63:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/05/31 19:06:10
int* p_data[][];

もしくは

int* p_data[100][200];

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

あと、p_dataの参照先はdata_1だけでなく、
条件によってサイズの異なる別の配列を参照する場合があるので、
サイズを固定することはできないです。

66:デフォルトの名無しさん
09/05/31 19:14:43
先頭を渡すなら p_data = &(data_1[0][0]);
じゃなくて p_data = data_1;


67:デフォルトの名無しさん
09/05/31 19:16:01
>>65
サイズが違うなら多次元配列を1次元配列とみなして
*(p_data + 50*200 + 70)
のような感じでアクセスするしかないんじゃない?

68:デフォルトの名無しさん
09/05/31 20:52:22
typedef int (*data200)[200];
data200 p_data = data_1[50];

return p_data[70];

69:デフォルトの名無しさん
09/05/31 20:54:47
>>68
それだと前の配列しか可変になってねえ?

70:デフォルトの名無しさん
09/05/31 23:21:53
>>65
ポインタの配列を使えば可

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

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

みたいに

71:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/01 12:18:40
ファイルからの入力の場合、vectorのソートと、setのソートはどっちが速いですか?
メモリに一気に格納してソートか、一つずつソートする違いです。

73:デフォルトの名無しさん
09/06/01 12:21:20
>>72
テストソース書いて実測してみればいいよ。
ファイルの置き場所によって変わる可能性もあるだろうけど
メモリに一回あげたほうが早いと思う

74:デフォルトの名無しさん
09/06/01 12:23:51
ありがトン
実測してみます

75:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/01 13:23:04
いいえ

77:デフォルトの名無しさん
09/06/01 14:33:33
VS2008でC++でコンソールプログラムを書いてます。
std::cout << "" << std::endl;
とかで出力を出しているのですが、それをテキストファイルに書き込みたいのですが、
プログラム内でファイルを開いてそこに書き込んで、、、渡河やらないと駄目でしょうか?


78:デフォルトの名無しさん
09/06/01 14:38:39
> でリダイレクトすれば標準出力をファイルに落とせる

79:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/01 19:33:03
Cの初心者本でオススメってなんかない?
基本情報の午後にむけて勉強したいもんで

81:デフォルトの名無しさん
09/06/01 19:54:20
VC++ 2008 にて、コントロールのサブクラス化を行っているのですが、
ボタンのクリックイベントで詰まりました。


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

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

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

どうしようもなければ、.NETと同じようなコードにしようと思うのですが、
もっと簡単な実装などありますでしょうか?
よろしくお願い致します。

82:デフォルトの名無しさん
09/06/01 20:30:23
>>81
多分無い

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

した場合とかを考え出すとね…

83:デフォルトの名無しさん
09/06/01 20:48:19
メモリマップ度ファイル便利と思って多用していたが、
巨大なファイルのシーケンシャルリードするとメモリ解放しないままで
次々に読むから不安定になるな。


84:83
09/06/01 20:51:35
自分の予定では、次に読むだろうところだけ先読みして
あとは開放しているもんだと思っていた。
しかしためられるだけためてた。

85:デフォルトの名無しさん
09/06/01 21:07:33
>>82
ありがとうございます。やっぱ厳しそうですね。。。
.NETのクラスライブラリを参考に作ることにします。

86:デフォルトの名無しさん
09/06/01 21:13:30
>>83,84
もしよかったら、どういうシチュエーションで便利に使ってたか教えてよ。


87:83
09/06/01 21:28:40
メモリにロードせずに、そのまま操作できるところ。
ケースによっては、自前でバッファを管理して入出力するより高速に動く。
OSやディスクのキャッシュが適切に効いた場合、入出力バッファ処理を気にする必要がなくなる。


88:デフォルトの名無しさん
09/06/01 21:45:44
>71
template<typename RandomAccessIterator>
void mysort(RandomAccessIterator first, RandomAccessIterator last);
の何が不満なの?
他人が書いた Iterator を使って望みの事ができるならわざわざ自分で書く必要ないだろ?
そもそもコンテナ用の Iterator 書くならコンテナの実装を知ってる方がいいわけで、
その意味でも自分で書く必要がない。

>84
物理メモリ上に載ったままって話?

89:デフォルトの名無しさん
09/06/01 21:49:42
物理メモリにはのったままではないけど、ギリギリまで使い切ってる。
あとは仮想メモリに入っているよう。この仮想メモリはOSのものとは別物の気がする。
メモリマップドファイルすると、した分は仮想メモリとしてOSは認識しているようにおもう。

90:デフォルトの名無しさん
09/06/01 21:53:09
予想では、次々に同一ファイルのロードが起こると、
OSは大事なファイルと認識しメモリに蓄えておこうとするのだと思う。
もっとも最近に参照されたファイルが優先されて、そのファイルだけが残ると思う。

91:デフォルトの名無しさん
09/06/01 21:57:14
>>90
OSじゃなくメモリマップドファイルを実現してるクラスとかがメモリを確保してるだけでしょ
windowsだと確か設定を変えなければ一つのアプリが最大使えるメモリって
2GBだっけ?
そのくらい物理メモリ詰んでなければそりゃ使い続ければいずれ物理メモリを超えるので
スワップ発生するだろうし


92:デフォルトの名無しさん
09/06/01 22:21:16
メモリマップドファイルは、windowsが用意している関数でそのメモリ使用量を自前で制御できない。
まったくメモリにキャッシュしないようにするオプションはあるけど。
OSの制御にあって、使用中は全く手出しできない。

93:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/01 22:47:20
>>92
そういう作りなのか
まあ気に入らなければ自分で作ればいいだけだしな。


95:デフォルトの名無しさん
09/06/01 22:53:25
>>93
class ClassB {
ClassA mClassA;
ClassB() : mClassA( 1, 2 ) {}
};

classB のコンストラクタで メンバの初期化

96:デフォルトの名無しさん
09/06/01 23:24:42
URLリンク(funini.com)

97:デフォルトの名無しさん
09/06/01 23:24:43
>>79
Settingクラス(フレームワーク提供)を継承したクラスをユーザが定義し、
そのファクトリ関数もユーザが定義するようにすればできない?
Setting::init()は空の仮想関数。
ファクトリ関数はグローバルで、関数名とプロトタイプはフレームワーク仕様により規定。

98:デフォルトの名無しさん
09/06/01 23:42:28
jpgファイルをWindowsのアプリから表示したい時、boost::gilを使ってる人いますか?
使う言語はC++なのですが(Win32APIは出来る限り使ってません)、
WindowsのAPI使った方がいいのか、わざわざboost::gil使う意味あるのか。




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

……要は、継承先のクラスを指定する部分だけを
フレームワークの外に出してしまえばいいんじゃね?ってこと?

100:デフォルトの名無しさん
09/06/01 23:44:49
>>95
ありがとうございます! 
動きました・・・・が、見たこと無い形なので、なぜ動いたかが分からない・・・。

「コンストラクタ初期化子」というのがあるそうですね。
そういうものだと割り切って覚えるのが早いでしょうか。


101:デフォルトの名無しさん
09/06/02 00:02:16
コンストラクタの初期化リストは大事だから
知らなかったならちゃんと勉強し直した方がいい

102:デフォルトの名無しさん
09/06/02 00:07:25
初期化リスト使えないとconstなメンバを初期化できないから注意な

103:デフォルトの名無しさん
09/06/02 00:10:43
コンストラクタの後ろにコロンで繋げて
初期値を指定するのって、地味にめんどい

104:砂ぐま
09/06/02 00:28:02
教えてください。
[1]C++
[2]締切:6/3
[3]問題文

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

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

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

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

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

⑤型変換として、算術演算子のオペランドの一つが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:デフォルトの名無しさん
09/06/02 00:29:27
>>101
まだまだ勉強中の身なのです。
>>102
なるほど! 確かにconst指定したメンバが
コンストラクタで初期化できないから、
どうするんだ?、と悩んでたことがありました。
>>103
そうですね。自分も30個くらいメンバが必要なので
同じことを考えていました。


106:デフォルトの名無しさん
09/06/02 00:45:58
>>104
具体的に何が分からないのか答えなさい。(5点)

107:砂ぐま
09/06/02 01:20:43
>>106
解答をお願いします。

108:デフォルトの名無しさん
09/06/02 01:24:20
>>107
宿題スレへ行くほうがいい。

109:デフォルトの名無しさん
09/06/02 02:12:17
>>108
宿題スレとマルチしてるんだけどな

110:デフォルトの名無しさん
09/06/02 03:57:02
boost::gilの使い心地の方もお願いしま~す。


111:デフォルトの名無しさん
09/06/02 04:06:56
>110
こっちは?
スレリンク(tech板)


112:デフォルトの名無しさん
09/06/02 05:41:26
int i =100;
float* pf = (float*) &i
pf = pf * 2

このコーディング、どこだダメなんでしょうか

113:デフォルトの名無しさん
09/06/02 05:47:46
>>112
intとfloatの内部表現が一致している保証はどこにもないから
それとポインタに対する演算はアドレスを取る事と定数を足す引く
しか認められていないからポインタを2倍するとか全く無意味

114:デフォルトの名無しさん
09/06/02 05:53:16
ありがとうございます。
内部表現が一致するとは、具体的にどういうことでしょうか?

これであればアドレスの中身(100?)を2倍することになるのでしょうか
*pf = *pf * 2

115:デフォルトの名無しさん
09/06/02 05:57:52
>114
内部表現が一致するとはiと*pfの値が等しい時に常にiと*pfのビット列
が等しい事が保証されている事を意味する

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

>*pf = *pf * 2;

*pfが元々floatの変数のアドレスを取っている時はその通り
今のように元々intの変数のアドレスを取ってそれを2倍したら浮動小数点例外
が起きるかもしれない

116:デフォルトの名無しさん
09/06/02 06:36:32
高精度の文字エンコード判定・自動変換ライブラリ
で一番いいのはなんでしょうか?

117:デフォルトの名無しさん
09/06/02 06:43:49
秀丸とかEmとかは判定どうやっているのかわかりませんか?
(世界各国で通用するのは)モジラかIEくらいしかしりません。 
エディタの作者は自分で作っているんですか?

118:デフォルトの名無しさん
09/06/02 07:06:57
ありがとうございます。

119:デフォルトの名無しさん
09/06/02 09:59:01
>>117
ちょっと文字コード調べればわかると思うけど、
それぞれの文字コードで仮定して矛盾が生じたら違うと判断すればいいんだよ。
どこまで調べるか、どうやって調べるかはそのアプリの性質で決めたらいい。
判定不能な場合どうするかもね

120:デフォルトの名無しさん
09/06/02 10:07:44
理屈はわかりますが、実際にやると大変です。 
これはエディタの本体(GUI)を作るほど手間がかかりそうです。 
世界各国語に対応させる場合。



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

テキストごときでwwwとかいうゆとり多いけどテキストほど面倒な物は無い。
文字コードを限定すればなんとかなるけど

122:デフォルトの名無しさん
09/06/02 10:17:18
たかがテキストごときで

123:デフォルトの名無しさん
09/06/02 11:24:03
文字コードの自動判別は不可能なんだから実装する必要なし
ユーザに選択させればいいだけ
ブラウザはhttpヘッダのcharsetで判定してるだけだろ

124:デフォルトの名無しさん
09/06/02 12:53:00
ICUライブラリを使う(キリッ

125:デフォルトの名無しさん
09/06/02 13:12:49
判別、自動変換はできるのですか

126:デフォルトの名無しさん
09/06/02 13:29:39
とりあえず入力コードと出力コードを指定して一発で変換することはできるし、
CharsetDetectorっていう判別専用のクラスもある
世界中の業務用アプリで使われている実績もあるしライセンスも緩くて使い勝手もいい

問題は添付するdll(so)が糞大きいことだけ

127:デフォルトの名無しさん
09/06/02 13:43:37
トンクス

128:デフォルトの名無しさん
09/06/02 16:55:47
float の NAN ってどういう値なんですか?

129:デフォルトの名無しさん
09/06/02 16:59:46
URLリンク(ja.wikipedia.org)

130:デフォルトの名無しさん
09/06/02 17:03:22
ありがとうございます

131:デフォルトの名無しさん
09/06/02 20:50:15
質問です。
CLSはクラスで、int charなどの変数で構成されます。
CLSの変数と同じ順番で記録されているファイルがあり
これを vector< CLS > x; にロードしたいのですが
Read( &x[0] ) のようにしてもうまくいきません。
データが壊れています。 一括でロードする方法はありませんか?

132:デフォルトの名無しさん
09/06/02 20:54:22
ないと思うべき。
順番が同じでも、アラインメントが入ってどうせファイル上のデータの並びと同じではないだろう。

133:131
09/06/02 20:54:25
vectorのソートを使いたいんです。 構造体に読み込めば出来そうですが
それをvectorにコピーしたらいいでしょうか? 無駄なことをしている気がしますが。

134:131
09/06/02 20:56:51
サンクス
一度にロードして、vectorに正しく挿入することにします。

135:デフォルトの名無しさん
09/06/02 21:01:25
すみません。 変更して構造体に入れてqsortにします。

136:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/02 23:06:04
>>136
参照≠ポインタ

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

URLリンク(kansai2channeler.hp.infoseek.co.jp)

ルールは、
(1)Draw2とかDraw4はSkip飛ばしできません。
(2)最後にワイルドカードを出してあがれません。
あとは普通のルールと思います


139:デフォルトの名無しさん
09/06/03 01:21:43
>>136
いちいち&aと書かずに済むポインタだと思っても3割くらい当たっていると思ってもいい。

140:デフォルトの名無しさん
09/06/03 01:22:26
Player.cppの中の
bool Player::SelectCard(const Card ¤t, int DrawObligation, Card *playcard)
という関数を書き換えれば新しい戦略が書けます。
この関数は前のプレイヤが出したカードがcurrent、何枚か引かないと駄目な状態になって
る場合には、DrawObligationが2以上になってます。出すべきカードが見つかればtrueを
返して、*playcardに出すべきカードを入れます。
以上です。失礼しました。


141:デフォルトの名無しさん
09/06/03 07:55:24
hashmapは存在してますが、hashsetは効いたことがありません。
stlのsetは効率がいいので開発されてないんでしょうか?


142:131
09/06/03 10:28:10
構造体になんとかしてロードしたかったのですが、これも値がずれてしまいました。
値がずれずに一括でロード出来る方法はないんでしょうか?
一括で読み込んで、クラスや構造体に格納していくしかありませんか。

143:デフォルトの名無しさん
09/06/03 10:31:22
>>142
そもそも保存するときにズレてるんじゃない?
パディングとかオープンモードとかあるから

144:131
09/06/03 10:35:05
アライメントに注意してデータ作成時に隙間を作っておく必要があるんですね。
自己解決しました。

145:デフォルトの名無しさん
09/06/03 11:01:21
隙間を作る (構造体、クラスをそのまま出力する) 方法で一括ロードできました。
ありがとうございます。

146:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/03 17:52:16
>>146
文字としての6ならatoi関数

148:デフォルトの名無しさん
09/06/03 17:53:18
途中になった
printf("int=%d\n",atoi((int)s[1]));

としてキャストしないと

149:デフォルトの名無しさん
09/06/03 18:25:17
>>141
あるよ。DinkumwareとかSGIとかは、hash_mapと共にhash_setも作っている。
そして、unordered_mapとunordered_setという名前でC++標準にも入るし、VCやg++でももう使える。

150:デフォルトの名無しさん
09/06/03 18:51:43
>>146
どんな教科書使って勉強してる?
C言語はBASICみたいに文字列をひとまとまりの変数として扱えないし
数値との相互変換も簡単にはできないので、
一通り教科書を読み終わってから
そういう(Cの初心者には)むつかしいことにはチャレンジしたほうがいいよ。


151:146
09/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:デフォルトの名無しさん
09/06/03 20:14:11
>>147-148
馬鹿はわざわざ書き込まなくてもいいのですよ。

>>151
取り敢えず、printf("%d\n", atoi(& s[1]))とでもして味噌。

153:146
09/06/03 20:45:12
>>152
ありがとうございました!できました。
エラーの意味が少し分かった気がしました(これから勉強します)。


>>147-148
即レス感謝しております。色々とキッカケになりました。
ありがとうございました。


154:デフォルトの名無しさん
09/06/03 23:02:04
URLリンク(marupeke296.com)

155:デフォルトの名無しさん
09/06/04 01:41:16
URLリンク(www.setsunan.ac.jp)
このページを参考にコンパイラをインストールしました。
このページの最後にある、使い方を見るってやつのことで質問なのですが、
僕のbcc32は奥の方にあって(C:\Borland\...)、最終的にbcc32があるところにたどりつくのですが、
ここでしかコンパイラできないじゃないですか?
それが面倒なのでどうにか簡単にできないかってことと、
bcc32があるディレクトリの中には他にもいろんなプログラムがあるんですが、作成したCファイルも
同じところに保存しないとコンパイル&実行できないですよね?
つまりこのディレクトリの中がいろんな形式のファイルがあってめちゃくちゃ汚くなっちゃうわけです。。

これってなんとかキレイにまとめる方法ってあるでしょうか?
もしあるなら、申し訳ありませんが教えてください(>_<)

156:155
09/06/04 01:46:27
すみません補足です。。
一部コンパイラ→コンパイルですね

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

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

ということです。
よろしくお願いします。。

157:デフォルトの名無しさん
09/06/04 02:27:13
使い方を見るじゃなくて、先に

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

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

それを設定すれば、どこからでもbcc32が呼び出せるようになる。
あとは好きなところにディレクトリを作って、その中でコンパイルすればいい。

158:デフォルトの名無しさん
09/06/04 02:29:08
そこの説明どおりにやればどこでもコンパイルできるはずだけど?

159:156
09/06/04 11:46:59
>>157,158

ありがとうございます。
OSはVistaで、ここに書いてある通り環境変数も設定したつもりなのですが
できないんです。。
;c:\borland\bcc55\bin
ですよね?
これだとここで指定したディレクトリじゃないとできないってことでしょうか?
ローカルディスク(C)の中ならどこでもコンパイルできるようにするには、設定を
c:\
にすればいいということでしょうか?

160:デフォルトの名無しさん
09/06/04 11:52:18
>>159
コマンドラインで、path と打って出てくる文字列に c:\borland\bcc55\bin はあるか?
ちなみにシステム変数の設定をしたあとで開いたコマンドプロンプトじゃないと
有効じゃないぞ

161:デフォルトの名無しさん
09/06/04 12:06:53
>>160
コマンドプロンプトでpathを打つとちゃんと出てきます。
それで、確認用ファイルを
c:\Emacs\C\test.c
という風に作ったディレクトリに保存して、Cディレクトリ内で
c:\Emacs\C\>bcc32 test.c
というようにコマンドしても操作可能なプログラムとして…
というメッセージが返ってきます。。。

162:デフォルトの名無しさん
09/06/04 12:28:01
bcc32 test.c
これを、
c:\borland\bcc55\bin\bcc32 test.c
と打つとどうなるよ。

163:デフォルトの名無しさん
09/06/04 12:29:09
あと環境変数の最後に書いてある?
最初と最後以外は ; で区切ってないと前後とくっつくぞ

164:デフォルトの名無しさん
09/06/04 13:16:59
WindowsでWinSockのプログラムを書くとき、C++ではなくCを使うのでしょうか?
どうしてもC++で書きたかったら、
struct sockaddr_in
とかそういうのは、上手く自作のクラスにまとめてしまえばいいのでしょうか?


165:デフォルトの名無しさん
09/06/04 13:25:45
別にC++でもstruct sockaddr_in とかそういうのは書けるだろ

166:デフォルトの名無しさん
09/06/04 13:38:12
でもネットワーク関係の例題プログラムを見てると、参照は使わないし、クラスもなし、マクロ使いまくり、
とかそういう感じのプログラムばかりだったので、みんなそんな感じなのかなと。


167:デフォルトの名無しさん
09/06/04 14:03:34
>>162
そうコマンドすればコンパイルできます。
ただし、"コマンド'ilink32.exe'を実行できない"とエラーが出ます。
やはりbinディレクトリの中でやりくりするしかないのでしょうか?

>>163
そこは大丈夫です。ちゃんと; ;で挟んであります。

168:デフォルトの名無しさん
09/06/04 14:07:11
>>167
リンカがパス通ってないからな。
それでコンパイルできるなら、PATHがおかしいんだよ。
どこかタイプミスがあるはず。その部分コピペして貼り付けてみ。
コマンドプロンプトのコピーのしかたはわかるよな?

169:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/04 14:33:55
>>169
>c\borland\bcc55\bin
コロンが抜けてる
c:\borland\bcc55\bin


171:デフォルトの名無しさん
09/06/04 14:37:58
このすれ優しい人が多いね。
感動した!

172:169
09/06/04 15:36:42
>>170
おぉ!!できました!
親切にありがとうございます!!
171じゃないですが、本当に優しい人が多くて助かりました!

あと、ついでと言ってはなんですがコマンドプロンプトについて質問です。
コマンドプロンプトを開いたときの最初の位置が
C:\Users\kei
になってます。(keiは僕の名前です)
開いたとき一番最初は C:\ になってると一番都合がいいのですが、そのように設定できますか?
プロパティとかいろんなトコからやろうとしても見当たらないので…。

173:デフォルトの名無しさん
09/06/04 15:39:15
\usr\local\bin
何に使うんだろう

174:デフォルトの名無しさん
09/06/04 15:39:16
ショートカット作っとけばいいべ。
プログラムはcmdで、作業フォルダはC:|

175:174
09/06/04 15:40:16
C:\だった、、、シフト押しっぱなしだった

176:デフォルトの名無しさん
09/06/04 16:21:59
作業フォルダの設定はどうするんですか?
どう開いても変なディレクトリから入っちゃいます。。
cd ../../
を毎回やるのは億劫なので。。。

177:デフォルトの名無しさん
09/06/04 16:37:32
右クリックでプロパティ出せばいいだろう。
cd \ でいいじゃない

178:デフォルトの名無しさん
09/06/04 16:40:04
そろそろスレ違いだな

179:デフォルトの名無しさん
09/06/05 08:08:41
クラスをグローバルにしたいんだけど、
extern AClass a;
でいいの?

180:デフォルトの名無しさん
09/06/05 08:22:59
バッチファイル書けば楽にならないか?

cd ..\...\
bcc32 %1

とか。

181:デフォルトの名無しさん
09/06/05 09:58:57
ルートで作業するのは論外。

182:デフォルトの名無しさん
09/06/05 11:16:18
ネットワークのプログラムを書いてると、「Windowsのファイヤーウォールがブロックしました」
みたいなメッセージが最初の動作時に一回だけ出るときがありますが、出ても最初の一回だけで
その後は出ません。これってプロパティのどこかにアンブロックしたという記録が残っている
のでしょうか?


183:デフォルトの名無しさん
09/06/05 17:56:01
板違い

184:デフォルトの名無しさん
09/06/05 19:23:36
>>182
レジストリのどこかは知らないが、設定の閲覧・変更は
コントロールパネルのWindowsファイアウォールのところを見ればいい。

185:デフォルトの名無しさん
09/06/05 20:44:54
>>183-184
ありがとうございます。コントロールパネルに見つかりました。
あともう1つだけ。(板違いといわれそうなのですが…一応C++で書いているので)
TCPで複数のコネクションを同時に保持するサーバーを書きたいのですが、サーバ側から
みた通信先はどうやって区別すればよいですか?適当にIDとかを割り振ってそこをみるように
すればいいんでしょうか?
××のソースをみろとかでもいいです。どうかお願いします。


186:デフォルトの名無しさん
09/06/05 20:48:43
>>185
ソケットなら接続してきたクライアントの情報を得られる。
ネットワークプログラミング相談室なんてスレがなかったかな?

187:デフォルトの名無しさん
09/06/05 21:10:01
>>186
ありがとうございます。
ということは、accept()で得られたクライアント情報のIPアドレス+ポート番号
の組でクライアントを識別するということですか?

>ネットワークプログラミング相談室なんてスレがなかったかな?
次からはそっちで聞いてみます。


188:質問
09/06/05 23:03:36
VC++2008です
textBox1に自由に入力させ、「眼鏡」という文字列が入力された瞬間に
メッセージボックスを表示するにはどうしたらいいでしょうか

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

よろしくお願いします

189:デフォルトの名無しさん
09/06/05 23:57:40
strstr

190:デフォルトの名無しさん
09/06/06 01:25:52
VisualC++2008EEです

引数としてクラスのポインタを受け取り、そのポインタにnewでクラスのインスタンスを作る関数は作れますか?
また、どのように作るのでしょうか?
そうして作ったインスタンスを関数の外でdeleteしたいのです
よろしくお願いします

191:デフォルトの名無しさん
09/06/06 01:33:14
>>190
void f(int*& rp)
{
rp = new int;
}

int main()
{
int *p;
f(p);
delete p;
}

192:デフォルトの名無しさん
09/06/06 01:45:09
キモイ設計だな

193:デフォルトの名無しさん
09/06/06 01:51:18
メリット皆無だし

194:デフォルトの名無しさん
09/06/06 03:34:30
普通のメンバ変数を初期化するときって、
コンストラクタの後ろに付加、コンストラクタの中で代入、初期化用メンバ関数を用意してコンストラクタの中で呼び出し
……とかいろいろ考えられると思うけど、使い分けってある?

あと、特に理由がない限り、コピーコンストラクタに初期化処理ってしなくても大丈夫よね?

195:デフォルトの名無しさん
09/06/06 03:48:26
なるべく初期化リストで全部済ませる
初期化で済む物を代入にするメリットは全くない

196:デフォルトの名無しさん
09/06/06 03:50:05
使い分けというか、言語やプログラムの仕様から制約されるってかんじジャね?

const なメンバ変数
 => 初期化リストでしか初期化できない。
初期化のために手続きが必要
 => 初期化リストでは無理
初期化のタイミングがコンストラクション時以外にもある
 => じゃ、別関数にしておくか

197:デフォルトの名無しさん
09/06/06 03:51:05
意地でも例外を送出したくない場合。

198:デフォルトの名無しさん
09/06/06 04:17:00
const以外でも初期化リスト結構みんな使ってるのかー。

途中でリセットする場合以外でも、お婆ロードでコンストラクタが複数あるときは
別関数の方が楽そう……かな?


199:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/06 06:47:24
>>198
Effective C++は読んだかい?
まだなら定額給付金を片手に今すぐ本屋に行くんだ。

201:デフォルトの名無しさん
09/06/06 06:48:32
typeid(type).name()はLPCTSTRじゃないから

MessageBoxA(NULL, typeid(type).name(), NULL, MB_OK)

202:デフォルトの名無しさん
09/06/06 06:57:13
>200
おや なぜか めのまえの ほんだなに おいてあるぞ!

203:199
09/06/06 15:31:21
>>201
MessageBoxAとMessageBoxWがあって
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
こんなんなってるんですね

だからMessageBoxAを強制的に呼び出してやると
氷解しました。ありがとうございます。

204:デフォルトの名無しさん
09/06/06 17:26:42
>>199
TCHAR type[255] = _T("ちんこ");
MessageBox(NULL, type, NULL, MB_OK);

205:デフォルトの名無しさん
09/06/07 13:03:16
dummy

206:デフォルトの名無しさん
09/06/07 14:01:55
int org_i = 1000;
void *p = &org_i;
int i = *reinterpret_cast<int*>(p);
voidへのポインタからINTの値を取り出そうとして上のようにしたのですが、
reinterpret_castの前に*があったりしてなんとなくいやです。
ほかに方法はないでしょうか?


207:デフォルトの名無しさん
09/06/07 14:04:28
それが正しい方法だからそれでいい

208:デフォルトの名無しさん
09/06/07 14:05:17
voidのポインタをやめる

209:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/07 14:56:13
テンプレートは分からないので禁止

211:デフォルトの名無しさん
09/06/07 17:15:04
>>210
お前が勉強しろ

212:デフォルトの名無しさん
09/06/07 18:35:31
テンプレートはわからないので禁止

213:デフォルトの名無しさん
09/06/07 18:46:18
ポインタはわからないので禁止

214:デフォルトの名無しさん
09/06/07 18:56:05
C++はわからないので禁止

215:デフォルトの名無しさん
09/06/07 19:20:16
クラスAがクラスBに所持されてる関係になってるとして

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

常にAが1個のBから参照されるような関係を作るにはどうしたら良いでしょうか?

216:デフォルトの名無しさん
09/06/07 19:37:11
所有を譲渡するメソッドをBに作る

217:デフォルトの名無しさん
09/06/07 20:04:47
逆にAがBを参照するように変更できないか検討する

218:デフォルトの名無しさん
09/06/07 23:29:49
>>216
B同士で所有の移動をするメソッドを、ということでしょうか?

>>217
BがAに更新通知してAがBの値を読みに行くので
Aへの更新通知を別の方法で実現できればそれでもいいのですが・・


219:デフォルトの名無しさん
09/06/08 00:37:33
Aを触れないし値も引き出せない状態になったB1・B2の挙動をどうするつもりかに因るな

220:デフォルトの名無しさん
09/06/08 00:38:58
AからBにコールバックでも登録させればいいんでない。

221:デフォルトの名無しさん
09/06/08 00:41:57
AがB1に参照されたり、B2に参照されたりってのを決めるのはだれだ?

222:デフォルトの名無しさん
09/06/08 01:43:02
> BがAに更新通知してAがBの値を読みに行くので

Aに"今からお前の相手するBインスタンスはわしじゃ"通知メソッドを作れば?
その際に元彼Bに"もう私のことは放っておいて"通知メソッドをAから呼んでもらう

223:デフォルトの名無しさん
09/06/08 11:43:40
C++では、戻り値だけが違う関数は同じものとされますが、
戻り値だけが違う関数を複数作りたい場合どうするべきでしょうか?
class C1;
class C2;
というのがあって、
C1 create();
C2 create();
という感じにやりたいときです。
お願いします。



224:デフォルトの名無しさん
09/06/08 12:11:13
>>223
無理です。だいたい呼び出せません。
名前空間を使いましょう。

225:デフォルトの名無しさん
09/06/08 12:17:56
ファイルの開け方、閉じ方はわかったのですが読み取って処理するところがよくわかりません
,で区切られて1行に並んでるファイル内の行列から数値を配列に入れる方法を教えてください!

226:デフォルトの名無しさん
09/06/08 12:23:49
やりかたはいろいろありすぎて、、、
とりあえず手始めに、fgets()とsscanf()使ってみるのはどうか?
まあ配列に入れるならループで回してstrtokとatoi使う手もあるけど、
最後はstrtok+atoiみたいな関数を自分で作るのがいいかもね。

227:デフォルトの名無しさん
09/06/08 12:24:30
今回初めてマルチスレッドな処理を行う必要があるのですが
注意点、スレッドセーフな処理にするための方法などを詳しく扱った書籍やサイトはないでしょうか?

228:デフォルトの名無しさん
09/06/08 12:25:39
>>226
ありがとうございます
,の除き方を詳しく教えてください

229:デフォルトの名無しさん
09/06/08 12:26:37
>>228
csvデータの読み込みでぐぐった方がいいかも

230:デフォルトの名無しさん
09/06/08 12:27:37
>>228
sscanf()もstrtok()も , の処理はやってくれるだろ。
自前でやるならstrchr()で場所調べて切り出していけばいいと思うよ。

231:デフォルトの名無しさん
09/06/08 12:32:12
そうなんですが
全然知りませんでした
ありがとうございました

232:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/08 14:14:40
C99より前の規格では、nanやinfを検出することってできないのでしょうか?

234:デフォルトの名無しさん
09/06/08 14:19:51
修正 dmyC で弄った方が潰しが利くね
dmyC{operator C1(){~return c1;}operator C2(){~return c2;}};

235:デフォルトの名無しさん
09/06/08 14:50:49
floatで数字をいろいろ処理して,でつないでcharに直してfputsで書き出したいんですけど方法を教えてください!

236:デフォルトの名無しさん
09/06/08 15:39:06
fscantfとかsscanfとかそういうことか
わかったぽ

237:デフォルトの名無しさん
09/06/08 19:01:54
.netはC++では扱えないんですか

238:デフォルトの名無しさん
09/06/08 19:06:26
はい

239:デフォルトの名無しさん
09/06/08 19:10:15
C#でしかやれないということですか?
GUIアプリを楽につくりたいならC#ですかね?

240:デフォルトの名無しさん
09/06/08 19:11:14
その通り!

241:デフォルトの名無しさん
09/06/08 19:18:42
テンプレートの話は禁止だって言ってんだろ

242:デフォルトの名無しさん
09/06/09 01:07:44
int array[x][y];
があるとき、
array[10] == &array[10][0]
でしょうか?


243:デフォルトの名無しさん
09/06/09 01:14:00
よく考えたら分かると思うが頭痛が悪くなるようなコードは書くな

244:デフォルトの名無しさん
09/06/09 01:14:19
配列は分からないので禁止

245:デフォルトの名無しさん
09/06/09 01:17:52
>>242
気になるならポインタがさしてるアドレスを比べてみなよ

246:デフォルトの名無しさん
09/06/09 01:20:47
>>245
型は配列なので注意が必要、多分等しいだとは思うんだが。(両方とも配列)
配列はポインタに自動変換だが、逆はそうではない、やっぱ頭痛い。

247:デフォルトの名無しさん
09/06/09 01:23:22
ああ違う、右はポインタ、左は配列、そして左が自動変換だ
うぜぇぇ

248:デフォルトの名無しさん
09/06/09 01:24:56
int a[10]; は、int10個の配列aで分かりやすいのに。
int a[10][20]; は、int10この配列が20個、ではないところがややこしい。


249:デフォルトの名無しさん
09/06/09 01:26:48
>>248
Cの規則ですから
int func()[10]
{
return 配列;
}
おらよ、これでも喰らえってなもんだ

250:デフォルトの名無しさん
09/06/09 01:26:53
ポインタ本を読むと出てくる(K&Rでもかかれてる)けど
配列や関数の型は、外側からはがしていく感じで解釈するんだよね。

251:デフォルトの名無しさん
09/06/09 01:49:26
>>249
関数は配列を返せない

252:デフォルトの名無しさん
09/06/09 01:53:52
>>251
ANSIでは使えない事になっているが、返せる処理系もっあってだな、
アホな開発者がそれを返している糞ライブラリがあるんだ
どこのかって?S○Eとか○CEとかSC○とか、まあそんなところ、死ねます。

253:デフォルトの名無しさん
09/06/09 01:56:17
>>251
ポインターは返せるからできなくはないんじゃね?
ただサイズの問題とかあるけど

254:デフォルトの名無しさん
09/06/09 02:27:31
CのコードをC++に書き直してます。
Cのコードの中に大量の構造体を使ってるところがあって、malloc()でメモリを
取らずに、自分でメモリプールを管理する割り当て関数を使ってます。これを生かすため
placement_new()というのを使おうと思っているのですが、この場合delete()が使えない
(使う必要がない)と聞いたのですが、placement_new()の使い心地はどうでしょうか?
使いやすいですか?



255:デフォルトの名無しさん
09/06/09 03:16:28
構造体に配列突っ込めば、ポインタじゃなくても直接返せるよ! よ!

256:デフォルトの名無しさん
09/06/09 03:24:55
>>254
使う必要がない、ではなく使えないだな。
URLリンク(www.fides.dti.ne.jp)
placement newの文字通り引数を取る形式new(hoge) Tにたいして、delete(hoge) pという構文がないという話。

メモリ確保処理を自前でやるとしたら、
クラス・構造体にnew/deleteなどを定義するか、
アロケータクラスを作って、確保解放はvectorとかに任せる
という形態のほうが多いと思う。ほかの人はどう考えているか分からないけど。

257:デフォルトの名無しさん
09/06/09 04:13:45
placement newを使いにくいとは思わないけど、むやみに使うものでもない。
>>256の言うように、クラス・構造体にnew/deleteを定義するとか
アロケータとコンテナを組み合わせるのがいいと思う。

258:デフォルトの名無しさん
09/06/09 05:16:07
c++で複数のクラスからの継承ってできますか?

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

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

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

みたいなことってできるの?

259:デフォルトの名無しさん
09/06/09 05:18:52
>>258
URLリンク(www.geocities.jp)

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

自由度高そうなのに。
ごにょごにょしてやる方法あります?

261:デフォルトの名無しさん
09/06/09 09:46:39
>>260
Smalltalkみたいな使い物にならないインタープリタと一緒にすんな

262:デフォルトの名無しさん
09/06/09 09:50:30
>>260
こういう話か?
std::map<std::string, boost::shared_ptr>

263:デフォルトの名無しさん
09/06/09 09:56:44
インタプリタ村の村民らしい要望だな
だな

264:デフォルトの名無しさん
09/06/09 10:05:56
クラスの動的生成ではないがC++にリフレクション機能は
あってもよかったと思う

265:デフォルトの名無しさん
09/06/09 10:18:47
オーバーヘッドが好きな奴が多いな。

266:デフォルトの名無しさん
09/06/09 10:36:38
>>260
やろうと思えばなんだってできるよ、コンパイラ呼び出しDLLにコンパイル、出来上がったDLL動的にリンク、そして呼び出す。
面倒くさくてやらないけど。

267:デフォルトの名無しさん
09/06/09 10:40:41
.NETを見ていると、標準ライブラリにコンパイラコレクションが入っていると便利なのだがと思う事はあるな・・・
ターゲットの環境にコンパイラをインストールなんて余りやりたくないからね

268:デフォルトの名無しさん
09/06/09 11:40:29
fscanfの引数の場合分けがうまくいかないんだけどどうして?
引数がfloatとcharで20こあって"%d%f・・・・・",hairetu,&suuji・・・・とあるんだけど返り値=1にした時しかうまくいかない
switchにしてcase20はおkだけどcase 2とかdefaultにはcaseが正しくありませんってなる


269:デフォルトの名無しさん
09/06/09 11:44:10
>>268
C言語でおk

270:デフォルトの名無しさん
09/06/09 11:47:18
swichの方はswith{}←のカッコを忘れてただけでした

271:デフォルトの名無しさん
09/06/09 11:51:27
fscanfの感じがわからん
fscanfした時点で一行バッファに入ってそこから指定した型の順で前から取っていく感じでしょ?
3つ目で型が合わないことがわかったらどうなるの?

272:デフォルトの名無しさん
09/06/09 12:42:01
>>271
行は関係ないよ
合う型を探して改行関係なしにファイルの最後まで行ったら終わり
3個目が見つからなかったら戻り値で2を返すだけ

273:デフォルトの名無しさん
09/06/09 12:59:17
サンクス
行関係無いのか
どっかのページ1行読み込むって書いてあったのに

274:デフォルトの名無しさん
09/06/09 13:25:48
scanfのほうの使用を思い出すんだ

275:デフォルトの名無しさん
09/06/09 14:29:48
caseってcase(1||2||3||4):って使えますか?
なんか使ってないのに違う行のcaseの所でcaseの値"1"は既に使用されていますって出るんだけど

276:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/09 14:44:09
ありがとうございました!
あんまり載って無いですね、初心者ならやってしまいがちだとおもうのですが

278:デフォルトの名無しさん
09/06/09 14:51:46
習得順的には
if { } ~ else if { } ~ else { }
の羅列のほうが先にじゃねーかな?

break しない case を持つ switch 文って個人的にはあまり好きじゃない。
見直したときに 「あれ? break 忘れてるんじゃね?」 って勘違いしちゃう可能性があるもの

279:デフォルトの名無しさん
09/06/09 14:57:11
むしろcase で || 使うというのをはじめてみた

280:デフォルトの名無しさん
09/06/09 15:21:52
他言語から来た人とか?

281:デフォルトの名無しさん
09/06/09 15:24:57
普通の初心者でつ

282:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/09 16:40:14
string が色変わらないんだけどなんで?ちゃんとインクルードしてるのに

285:デフォルトの名無しさん
09/06/09 16:49:42
>>284
メモ帳で書いてろ

286:デフォルトの名無しさん
09/06/09 16:56:58
他の関数でもポップアップが出なくなった
なんでだろう

287:デフォルトの名無しさん
09/06/09 17:09:35
>>286
{}とかが上手くいってないと出ないよ

288:デフォルトの名無しさん
09/06/09 17:41:44
>>287
ありがとうございました

289:デフォルトの名無しさん
09/06/09 19:53:26
caseに式を使えたらいいのにぁ
else ifの梯子なんてダサすぎる…

290:デフォルトの名無しさん
09/06/09 19:55:40
制限は多いけど、その条件を満たす場合はパフォーマンスを発揮できると考えるべき。

291:デフォルトの名無しさん
09/06/09 20:21:01
switch case のコンパイルコードに期待を持つなんてオールドタイプのバッドノウハウ

292:デフォルトの名無しさん
09/06/09 20:37:30
>>289
条件演算子を使えば似たような書き方で好きな式を条件に出来る。
C++だけだったかも知れんが。


293:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/09 22:26:09
あ、カッコ不足だった

295:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/09 23:08:01
>291
でもブレイクスルーとdefaultの機能って、状況さえ許せば凄く便利じゃね?

297:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/09 23:32:38
>>295
friend

299:デフォルトの名無しさん
09/06/09 23:35:43
>>296
Duff's Deviceくらいしか使い道なくね?

300:デフォルトの名無しさん
09/06/10 01:17:05
>>296
ブレイクスルーちゃう
fall through

301:デフォルトの名無しさん
09/06/10 01:18:14
ブレイクするんちゃう?

302:デフォルトの名無しさん
09/06/10 01:23:48
std::coutとかstd::endl;って
スレッドセーフですか?


303:デフォルトの名無しさん
09/06/10 01:29:06
コンパイラごとに違うので、コンパイラの仕様書を読んでください。
っていうか、C++の規約にはスレッドセーフに関する記述はないんじゃなかったっけ?

304:デフォルトの名無しさん
09/06/10 08:28:30
ライブラリによるしな

305:デフォルトの名無しさん
09/06/10 09:04:54
>300
失礼、別のと混ざった

306:デフォルトの名無しさん
09/06/10 14:23:36
class A{ public: void A( void ); virtual void ~A( void ); };
と書きたい今日この頃
なぜこの書き方でエラーがでるのかがわからない

307:デフォルトの名無しさん
09/06/10 14:28:13
気持ちは分かるけどさ。
「もともと戻り値は存在しないもの」と、「戻り値は使わないことを宣言する」の違いじゃない?

308:デフォルトの名無しさん
09/06/10 14:28:38
void

309:デフォルトの名無しさん
09/06/10 14:47:46
sprintf関数について質問です。
strcatとかstrcpyを使うよりも、便利だと教えられたのですが、いまいちどこが便利なのかわかりません。
教えてください。

310:デフォルトの名無しさん
09/06/10 14:53:53
具体的にstrcatとかstrcpyを使ったコード書いてみて
それをsprintfに置き換えてみりゃわかるだろ。

もちろん、strcatとかstrcpy一発で済むような例はstrcatとかstrcpy使えばいいのはわかるよな。

311:デフォルトの名無しさん
09/06/10 15:54:06
HOGE_01、HOGE_02 …… みたいな文字列を生成するときは、sprintfじゃないとやってらんないと思う

312:デフォルトの名無しさん
09/06/10 21:29:14
sprintfなんてキケンな物使っちゃいけません

313:デフォルトの名無しさん
09/06/10 21:33:01
sprintf_sがあるから無問題

314:デフォルトの名無しさん
09/06/10 22:03:03
>>312
#pragma warning (disable : 4996)

315:デフォルトの名無しさん
09/06/10 22:06:52
ltoaで小数点以下の数値を文字にするにはどうするの?

316:デフォルトの名無しさん
09/06/10 22:06:59
sprintf_sにしろsnprintfにしろ標準じゃないし、こいつらはこいつらで危なかったりするし(ヌル終端しないとか)
いずれにせよsprintf一族はロクなもんじゃないから書き捨てコード以外には使うべきでない

317:デフォルトの名無しさん
09/06/10 22:08:06
>>316
安全な使い方をすればいいだろ

318:デフォルトの名無しさん
09/06/10 22:11:26
sprintf系を使って本当に安全なコードを書こうとすると#ifdef地獄だぞ
挙動バラバラだし、本当にクソみたいなsnprintfとかがいるから
ヌル終端しないくらいならカワイイもんで、例えば
一昔前のLinuxはnをガン無視してsprintfにブン投げるようになってることがある
本当に死ねばいいと思う

319:デフォルトの名無しさん
09/06/10 22:13:28
C/C++にしろJavaにしろ安全は保障されないし、こいつらはこいつらで危なかったりするし(すぐに暴走するし)
いずれにせよプログラミング言語一族はロクなもんじゃないから書き捨てコード以外には使うべきでない


320:デフォルトの名無しさん
09/06/10 22:20:16
snprintfはC99標準……。
ま、糞実装なsnprintfの存在以前にC99自体アレだが。

321:デフォルトの名無しさん
09/06/10 23:44:16
C99の仕様以前に、C99の対応率が。。。

322:デフォルトの名無しさん
09/06/10 23:50:11
C99の方が便利なのに、どうしてC99に移行しないんだろうね?
異なるプラットフォーム間で利用されるソフトを開発しているならともかく
そうでない、小さなプロジェクト(おそらく世のプロジェクトの大部分)は
C89よりC99で開発したほうが(わずかだろうけど)コスト削減になりそうなものだが。

323:デフォルトの名無しさん
09/06/10 23:52:42
世の中Cじゃ無くてC++方向に走ったからね。いまさら感があるよ

324:デフォルトの名無しさん
09/06/10 23:59:07
便利な物だけつまみ食いしとけばいいんだよ
__func__とか__VA_ARGS__とか_Pragmaとか<stdint.h>とか

restrictやら可変長配列やらはいりません

325:デフォルトの名無しさん
09/06/11 00:53:03
僕は複合リテラルだけ居てくれればそれでいい。

326:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/11 01:53:50
template<X>unsigned is(hoge[X]&){return X;}

kazu=is(h);

328:デフォルトの名無しさん
09/06/11 02:00:41
class Hoge
{
int a
}

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

またHogeインスタンスとintを比較することも考えてますがこういう場合はどうでしょうか?

329:デフォルトの名無しさん
09/06/11 02:02:44
>>326
いやそれであっている。
うまくいかないならほかに原因がある。

330:デフォルトの名無しさん
09/06/11 02:37:59
>>328
Hoge同士の比較方法がそれ以外にあり得ないなら演算子オーバーロードでいいんじゃね?

331:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/11 03:10:02
コンパイラ何使ってる?
あと、どんな結果が出たのかも書いて欲しいかなかな。

333:デフォルトの名無しさん
09/06/11 03:35:46
hoge{1,2,3,4,5} ←なにこれ?

334:デフォルトの名無しさん
09/06/11 08:03:30
新しいコンストラクタの呼び方

335:デフォルトの名無しさん
09/06/11 09:35:48
デタラメ書くなカス

336:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/11 19:58:37
gcc4.3以上なら通るな
initializer_listだろ

338:デフォルトの名無しさん
09/06/11 20:57:57
C99の機能をC++に持ち込むなクズ

339:デフォルトの名無しさん
09/06/11 21:22:27
C++0xではC99の一部機能が採用されるよ。
委員会の人たちにクズと言わないと意味ない。

340:デフォルトの名無しさん
09/06/11 21:37:51
restrictとか_Complexとか可変長配列みたいな
本当にしょうもない物は入らないから大丈夫だと思うけどね

341:デフォルトの名無しさん
09/06/11 21:53:38
>>339
ここはC++0xのスレじゃないよ

342:デフォルトの名無しさん
09/06/11 23:20:40
>>340
特に、restrictはC++89のときに否決された過去があるから、
今回も入れられるわけないw

343:デフォルトの名無しさん
09/06/11 23:22:51
restrictは入れると一つだけ利点があるんだよなあ

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

それ以外には取り立てて利点はない

344:デフォルトの名無しさん
09/06/12 06:13:12
>>341
ここがC++0xのスレかどうかなんて、>>338-339の流れには関係ないよ。

345:デフォルトの名無しさん
09/06/12 09:08:43
>>344
スレ違いだクズ

346:デフォルトの名無しさん
09/06/12 09:24:45
いいえ。

347:デフォルトの名無しさん
09/06/12 09:52:32
いいえ。

348:デフォルトの名無しさん
09/06/12 09:56:38
iccでもオプション指定さえすればrestrictが使えるんだよね。
メモリのアクセスパターンががらっと変わる可能性があるから入れて欲しいけどねぇ。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch