[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 06/02 12:37 / Filesize : 89 KB / Number-of Response : 349
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 01:08:48 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.65【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1239326399/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

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

2 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 11:44:52 ]
間に自前の関数かましては

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

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

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

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

10 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 17:46:36 ]
unsigned 同士の演算の最小値はどんな場合でも 0 でいいの?

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

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

18 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 23:01:59 ]
void*??

19 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 23:12:16 ]
>>18
すげえこんな便利なのがあったのか

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



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

22 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 03:26:20 ]
項目名とその値の組み合わせを複数渡す必要があるとき
構造体のlistを渡すのとmapを利用するのはどっちが無難でしょうか?

33 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 03:37:51 ]
>>32
map の方が楽

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

35 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 05:07:28 ]
はい

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

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

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

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

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

39 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 11:43:01 ]
起こりませんよ!!!

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



41 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 13:18:00 ]
ポンタか
なるほどね

42 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 13:57:13 ]
ぬるぽんた

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

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

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

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

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

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


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

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

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

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



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

62 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:06:10 ]
int* p_data[][];

もしくは

int* p_data[100][200];

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

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

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


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

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

return p_data[70];

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

70 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 13:23:04 ]
いいえ

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


78 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:30:23 ]
>>81
多分無い

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

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

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


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

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

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


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


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


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

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


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

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

96 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:24:42 ]
funini.com/kei/mmap/mmap_api.shtml

97 名前:デフォルトの名無しさん mailto:sage [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使う意味あるのか。




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

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

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

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




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

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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<89KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef