C++相談室 part93

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part92
http://toro.2ch.net/test/read.cgi/tech/1320339482/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1323692486/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
2デフォルトの名無しさん:2011/12/27(火) 03:01:07.68
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://en.cppreference.com/w/cpp (英語)
 http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2011/12/27(火) 03:01:21.80
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4デフォルトの名無しさん:2011/12/27(火) 03:01:36.34
5デフォルトの名無しさん:2011/12/27(火) 03:01:46.07
6デフォルトの名無しさん:2011/12/27(火) 03:02:14.47
テンプレここまで。あと続けたい人は好きにして。
7デフォルトの名無しさん:2011/12/27(火) 03:02:44.67
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
8デフォルトの名無しさん:2011/12/27(火) 03:06:49.86
>>6
まだ終わってないぞ

壁紙にしてね!
ttp://www2.research.att.com/~bs/Bjarne.jpg
9デフォルトの名無しさん:2011/12/27(火) 03:21:31.15
おつ
10デフォルトの名無しさん:2011/12/27(火) 07:33:10.63
>>7は根強い人気だな

そう言えばランタイムライブラリのDLLって
テンプレートでも std::vector<int> とか基本的なものくらいは
含んでたりするんだろうか?
11デフォルトの名無しさん:2011/12/27(火) 07:59:16.56
テンプレートはないだろ
12デフォルトの名無しさん:2011/12/27(火) 08:42:33.23
本当にテンプレートを使ったことがあれば、
exportが無謀って事はすぐにわかるだろ。
13デフォルトの名無しさん:2011/12/27(火) 09:33:16.13
friendクラスとクラス内クラスってどういった違いがあるんでしょうか
class Hoge {
friend class FactoryA;
class FactoryB;
private:
Hoge(int init);
// ry
};

class FactoryA {
private:
int i;
public:
FactoryA(void) : i(0) { }
Hoge * Create(void) { return new Hoge(++i); }
};


class FactoryB {
private:
int i;
public:
FactoryB(void) : i(0) { }
Hoge * Create(void) { return new Hoge(++i); }
};

パッと見どちらとも同じような気がするのですが
14デフォルトの名無しさん:2011/12/27(火) 09:39:18.43
コンパイル通らんだろそれ
15デフォルトの名無しさん:2011/12/27(火) 11:41:47.45
静的に関数を呼びだせば体が空の関数は最適化によって
何も無いようになりますか?
16デフォルトの名無しさん:2011/12/27(火) 11:57:27.42
>>15 コンパイラの実装や設定次第。試せ。
17デフォルトの名無しさん:2011/12/27(火) 12:13:57.34
C++0xに関数を定数にする機能あったじゃないですか?
それ使えば出来ませんか?
factoryをテンプレート型として
体が空のときはその機能を使い
factory.a()は右辺値の定数だから
何もすることが無いみたいなこと
なりませんか?
18デフォルトの名無しさん:2011/12/27(火) 12:19:30.84
constexprはコンパイルタイムにガーッと計算して結果を埋め込む機能だけど。

小さい関数はインライン展開を期待したほうがいいんじゃないか?
19デフォルトの名無しさん:2011/12/27(火) 12:25:12.63
>>15,17
最適化するもなにも、空の関数はそもそも何もしないので、
ちょっと何言ってるかわからないですね。
20デフォルトの名無しさん:2011/12/27(火) 12:29:47.59
空の関数はスタックに引数を詰んだりするんですよ?
21デフォルトの名無しさん:2011/12/27(火) 12:34:07.58
22デフォルトの名無しさん:2011/12/27(火) 12:50:46.39
くだらないこと言ってないでさっさとアセンブラコード見ればいいと思うの

tmp> g++ -S test.cc && cat test.s
23デフォルトの名無しさん:2011/12/27(火) 13:39:49.61
struct A{
typedef int type;
};
struct B : A{
type a;
} b;

&bと&(b.a)が同じアドレスをさしてほしいのですが
データメンバのないクラスを継承したときに
サイズが増えないようにする方法はありませんか?
2423:2011/12/27(火) 13:55:22.69
データメンバがなく
関数だけが定義してあるクラスを複数継承したら
サイズがどんどん増えていってしまいました。

ttp://sites.google.com/site/boostjp/tips/operators
これとは少し違うのですが、これも演算子だけが定義してある
クラスを継承していると思うのですが
この場合はサイズが増えてしまうのでしょうか?
それとも増えないようにする方法があるのでしょうか?
25デフォルトの名無しさん:2011/12/27(火) 15:18:15.80
>>23
Aは空クラスなのでサイズ1
Bは変数があるからそのサイズになる

なのでサイズは必ず増える
26デフォルトの名無しさん:2011/12/27(火) 15:25:55.72
あと、Aは継承時にはサイズ0として扱われるはずなので、
&b == &b.a
になると思うんだが
27デフォルトの名無しさん:2011/12/27(火) 15:28:35.33
0にするかどうかはコンパイラの最適化次第じゃなかったか
28デフォルトの名無しさん:2011/12/27(火) 15:32:00.59
>>23
template <class Derived> class A {
protected:
~A(void) { }
public:
typedef int type ;
} ;

class B : public A<B> {
public:
type a ;
} ;

とりあえずこう書いてあとはコンパイラの気分しだい
2923:2011/12/27(火) 15:34:12.73
空クラスであるにもかかわらず
継承時にサイズが0として扱われない条件というのがあるのでしょうか。

情報の後出しになってしまい申し訳ないのですが

template<typename T>
struct ptr_convertable{
operator T*(){
return *(T**)this;
}
};

struct my_int_ptr : ptr_convertable<int>{
int *p;
};

int a;
my_int_ptr b;
b.p = &a;
int *c = b;

こういう感じのことをやろうとしています。
3023:2011/12/27(火) 15:47:37.76
struct A{};
struct B : A{};
struct C{ operator int(){} };
struct D : C{};
struct E : B, D{};
struct F{int a;};
struct G : F{};
struct H : E, G{};
struct I : G, E{};

int a = sizeof(A); //1
int b = sizeof(B); //1
int c = sizeof(C); //1
int d = sizeof(D); //1
int e = sizeof(E); //1
int f = sizeof(F); //4
int g = sizeof(G); //4
int h = sizeof(H); //5
int i = sizeof(I); //5

クラスの内容にはあまり関係ないようです。
3123:2011/12/27(火) 15:55:00.89
すいません、更新せずに書き込んでしまいました。

>>27 >>28
protectedデストラクタを書いてみましたが結果は変わりませんでした。

変換対象のクラスが多いので、こうすれば1行で書けるかと思ったのですが
なんか別の方法はないでしょうか。

マクロであきらめようかな。
32デフォルトの名無しさん:2011/12/27(火) 17:11:35.93
>>31
多重継承で親が重なる場合に増えてるね。
33デフォルトの名無しさん:2011/12/27(火) 17:39:37.10
まさか関数ってvirtualの?
それだと仮想関数テーブルの分どんどん増えると思うけど。
34デフォルトの名無しさん:2011/12/27(火) 19:30:47.70
>>20
最適化してバックトレースとってみ。
リンケージが同じなら消失するから。
35デフォルトの名無しさん:2011/12/27(火) 19:34:47.21
>>29
つかアドレス一緒にして何するつもりよ
36デフォルトの名無しさん:2011/12/27(火) 20:19:02.71
>>32
> 多重継承で親が重なる場合に増えてるね
全ての基底クラス部分を区別できる形で表現できる必要があるからな。

struct B {};
struct D1 : B {};
struct D2 : B {};
struct D12 : D1, D2 {};

D12 * pd12 = new D12; // 1
D1 * pd1 = pd12; // 2
D2 * pd2 = pd12; // 3
B * pbd1 = static_cast<D1 *>(pd12); // 4
B * pbd2 = static_cast<D2 *>(pd12); // 5

1と2,3は型が違う。4,5は型が同じなのでアドレスを変えて違いを出す。
37デフォルトの名無しさん:2011/12/27(火) 20:19:50.47
何かトリッキーな事でもしたいんじゃね

C++はどうしてもCより抽象度が高くなるからアドレス関係をいじると
あまり無茶は出来ないよな
38デフォルトの名無しさん:2011/12/27(火) 20:34:58.10
平松邦夫/民主党
大阪市役所・自治労・大阪市労働組合・日教組・大阪市教育委員会・自民党・共産党・社民党・関西電力・住友グループ
・毎日放送・毎日新聞・関西経済連合・日本原子力発電株式会社 ・ 週刊文春・週刊新潮・NHK・朝日新聞・読売新聞
・部落解放同盟・朝鮮総連・在日本大韓民国民団・日本遊技関連事業協会・全日本遊技事業協同組合連合会・日本弁護士連合会・生活保護受給者・反日左翼・9条の会・革マル派・中核派

VS

橋下徹/維新の会
大阪市民・みんなの党・国民新党・亀井静香・石原慎太郎・東国原英夫
 様子見:公明
39デフォルトの名無しさん:2011/12/27(火) 21:12:02.53
>>12
exportじゃなくて明示的実体化の話だよ
40デフォルトの名無しさん:2011/12/27(火) 22:50:38.50
>>39
それとDLLだけとじゃさっぱり分からんのですけど。
41デフォルトの名無しさん:2011/12/28(水) 01:26:43.45
>>40
明示的な実体化を行うと、別リンケージに関数の実体が生成される。
DLLでも同じ話。実体がある以上他のDLLやEXEで使用できる。

てか、このへんは初歩的な話じゃ・・・
42デフォルトの名無しさん:2011/12/28(水) 01:41:31.98
>>29
それ、結局派生側の指定位置に生の T* をメンバで持つことを強要してんじゃん。
ptr_convertable が T* 持てば全て自然に解決する話じゃないの?
43デフォルトの名無しさん:2011/12/28(水) 01:42:13.22
>>37
CにできてC++にできないアドレス操作なんて無いだろ。
44デフォルトの名無しさん:2011/12/28(水) 05:14:11.43
>>43
いやそういう意味じゃない
Cだと構造体の中に何かを入れて後から伸ばすとか割りと見えやすかったけど
C++のクラスで同じ事をしようとすると仮想関数やら大きさ最低1バイトの縛りやら
あと継承なんかしていたら伸ばそうとした途端に他のメンバが壊れたり
いろいろ気を使うという事を言いたかった
45デフォルトの名無しさん:2011/12/28(水) 06:28:37.89
>>44
配列以外のアドレス(ポインタ)加減算がCなら安全なことがあると思ってるんなら
おおかたただの勘違い。規格上認められる操作は大差ない。

たまたまプログラマの間違った期待どおりに動いてしまうことがCのほうがいくらか
多い(C++のほうがいくらか少ない)というだけのこと。

実際の違いと言えるところとして可変長配列と構造体中の 0 長配列メンバがあるけど、
それらも「抽象度」がどうのこうのではない。
http://seclan.dll.jp/c99d/c99d04.htm
46デフォルトの名無しさん:2011/12/28(水) 06:38:56.59
そうなのか
vtableとかどこにくっついているか実装依存なので扱いにくいのではと思ったんだけど
47デフォルトの名無しさん:2011/12/28(水) 07:06:16.11
>>46
vtable以外にも、オブジェクトのレイアウトに関して実装依存なことはパディングやら
アライメントやらCの範囲でもいくらでも考えられるからね。

http://www.kouno.jp/home/c_faq/c16.html#5
> 16.5: このプログラム、あるマシンではうまく走るのに、別のマシンだと変 な結果を返す。もっと変なことに、デバッグ用の出力を付けたり外し たりすると症状が違ってくる。
> A: おかしくなる可能性のあるものはたくさんある。以下に可能性の高い ものをいくつか示す。
...
> 対象となる具体的なシステムで コードの生成されかたを決 め付けて、こういう使いかたを考え付くとは俺って頭がいい なと思っていることはなんでも
48デフォルトの名無しさん:2011/12/28(水) 07:09:56.13
Cは継承や仮想継承、仮想関数がないからそれだけでもC++よりは扱いやすい
構造体だと思ったんだが

>>47のリンクは知ってる
トリッキーな事をすると必ずリスクは付いて回る
しかしC++はそのトリッキーな事が致命的な結果をもたらす率が高いと思う
49デフォルトの名無しさん:2011/12/28(水) 07:31:04.25
>>45
反応する所が違うだろ
クラスに対してトリッキーな事(強制キャストが必要な操作)を
すんなってのが要点なんだから。
別にPODなコードは絶対安全とかそんな話を
してるわけじゃないだろ。
50デフォルトの名無しさん:2011/12/28(水) 07:43:35.04
>>49
まあいいだろ
俺は前スレからの流れで書いたつもりだったんだが汲んでもらえなかったようなので
クラスはPODにいろいろ厄介な物が(もちろんメリットの方が遥かに大きいが)付いているので
あまり変な事はしない方がいいよって意味で書いた

PODも規格外の事をすれば当然危ない
当たり前の事だよな
51デフォルトの名無しさん:2011/12/28(水) 07:45:26.57
無茶なキャストやアドレス操作をすることを前提にして
問題を起こす率の高い低いを考える意味がわからんな。
まぁ「思う」のは自由だよね。
52デフォルトの名無しさん:2011/12/28(水) 08:44:15.45
>>10
文字列関係は大体入ってた。complexやnumeric_limitsなんかも入ってることはあるな。
53デフォルトの名無しさん:2011/12/28(水) 09:00:15.72
>>51
いやだから「規格外」である事は承知で、Cで無茶をして動かしている例はいくらでもある
プログラム組んだ事ないのか?
でもC++でそれをやろうとするとほとんど不可能になると言いたいだけの話
お前アスペだろ
54デフォルトの名無しさん:2011/12/28(水) 09:09:48.07
C++でも規格外なコードは書けるし書かれまくってるだろ
ラップするから見えないだけで
55デフォルトの名無しさん:2011/12/28(水) 12:33:24.42
駄目だこいつ
相手しないでおこう
56デフォルトの名無しさん:2011/12/28(水) 12:35:38.71
57デフォルトの名無しさん:2011/12/28(水) 13:24:02.68
56 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
58デフォルトの名無しさん:2011/12/28(水) 13:38:54.97
57 名前:チンカス[sage] 投稿日:臭い
59デフォルトの名無しさん:2011/12/28(水) 15:31:31.63
>>47
そういや、vtableなんてポインタじゃ無くても実装できるしな。
動的リンクを考えなきゃ、コンパイラが全てのクラスのvtableを
直列した配列にして、オブジェクトには、その配列のオフセットを
持たせるだけってのでもいいわけだしな。
60デフォルトの名無しさん:2011/12/28(水) 17:35:07.64
仮想関数のテンプレート化はできないんでしょうか?
class Hoge {
public:
template <class Iterator>
virtual void Func1(Iterator begin, Iterator end) = 0 ;
template <class Inserter>
virtual void Func2(Inserter inserter) const = 0 ;
} ;
class HogeEx : public Hoge {
std::vector<int> v;
public:
template <class Iterator>
void Func1(Iterator begin, Iterator end) { v.assign(begin, end); }
template <class Inserter>
void Func2(Inserter inserter) { inserter = v.front(); }
}
みたいな感じで主にイテレーター関係やファンクタを引数に取る関数で使いたいんですけど
61デフォルトの名無しさん:2011/12/28(水) 17:41:09.06
ああそれね。そういうのウチはやってないから。
62デフォルトの名無しさん:2011/12/28(水) 17:54:03.06
何か朝から頭のおかしい粘着がいるなあ

>>60
標準C++の仕様では出来ないけど、boostを使うとそれらしいのは出来るみたい

http://d.hatena.ne.jp/moriyoshi/20090727/1248697647
63デフォルトの名無しさん:2011/12/28(水) 18:27:38.15
>>62
それっぽくできました
ありがとうございます
64デフォルトの名無しさん:2011/12/29(木) 01:17:05.61
相談
C++(C)でdllのリソースファイルとして.txtファイルを埋め込んで、そこから文字列を取り出すにはどうしたらよいですか?
検索しても出てこないのはもしかして当たり前のこと過ぎるからでしょうか・・・
65デフォルトの名無しさん:2011/12/29(木) 01:37:47.41
C/C++にそのような機能はないのでなんらかのAPIを使う
66デフォルトの名無しさん:2011/12/29(木) 01:41:34.87
>>64

ID_SAMPLE     TEXT_DATA         DISCARDABLE     "text.txt"
リソース名       リソースグループ  DISCARDABLE      "ファイル名"

http://www.sm.rim.or.jp/~shishido/rctest.html
67デフォルトの名無しさん:2011/12/29(木) 02:01:52.43
WindowsならWin32スレいけ、っていえるほどあそこいいところじゃないからとりあえずはっとく

BOOL CALLBACK 探すコールバック( HMODULE hModule, LPCWSTR lpType, LPWSTR lpName, LONG_PTR lParam )
{
 HRSRC hrsrc = FindResource( hModule, lpName, lpType );
 if( hrsrc ) {
   void* data = LoadResource( hModule, hrsrc );

   if( data ) {
     hoge* pwork = (hoge*)lParam;
     strcpy( pwork->hage, data );
   }
 }
 return TRUE;
}

void 探す関数()
{
 hoge work;

 HMODULE hModule = LoadLibrary( "dllのパス" );
 if( hModule ) {
   EnumResourceNames( hModule, RT_STRING, 探すコールバック, (LONG_PTR)&work );

   FreeLibrary( hModule );
 }
}

あぁ、ファイル埋め込みならRT_STRINGじゃなくてRCDATAか
68デフォルトの名無しさん:2011/12/29(木) 02:13:11.19
ありがとう
69デフォルトの名無しさん:2011/12/29(木) 06:17:59.89
>>65
分からないのなら黙ってろよカス
70デフォルトの名無しさん:2011/12/29(木) 09:08:42.19
>>65-67
ありがとうございます
なるほど、やはり一発でポンというのはないのですね
またわからないことが出来たらよろしくお願いします
71デフォルトの名無しさん:2011/12/29(木) 09:25:50.01
複数の配列を合併してひとつの配列をつくりだすことに
もっとも適したデータ構造をおしえてください。
72デフォルトの名無しさん:2011/12/29(木) 10:19:04.72
配列とそのポインタの配列。
73デフォルトの名無しさん:2011/12/29(木) 10:20:11.71
RopeかFingerTreeあたりか
74デフォルトの名無しさん:2011/12/29(木) 11:43:51.93
std::vector<std::vector<>>
75デフォルトの名無しさん:2011/12/29(木) 11:50:20.64
2重配列のやつだと同じ要素が2つあるやつの合併は処理が困っちゃいますよね。
76デフォルトの名無しさん:2011/12/29(木) 11:50:43.96
それは重くなる。

std::vector<std::vector<>*>にしとくべき。
ポインタだけならサイズ変更しても負荷は小さい。
77デフォルトの名無しさん:2011/12/29(木) 11:52:02.05
普通、連結と言ったら要素は重複しても、単に前か後ろにつなげるだけだ。
78デフォルトの名無しさん:2011/12/29(木) 12:05:26.22
>>71
vectorのリストがいいよ
先頭のベクタの長さをNとする
先頭を除いたベクタのリストの長さが合計で2Nに達したら
先頭を倍+αに伸ばしてそこに先頭を除いたベクタの内容をコピーして先頭以外を解放する
79デフォルトの名無しさん:2011/12/29(木) 12:09:31.82
union-find木
80デフォルトの名無しさん:2011/12/29(木) 12:29:23.89
要素の重複は削り、順序は無視して良いならstd::setに入れとけ。
81デフォルトの名無しさん:2011/12/29(木) 13:07:34.03
mapで使えるやつがないな。
メモリ食いすぎる。
STLportがマシだが。
Googleとか頻繁に更新してるのにSTLportのメモリと速度に追いつけず。
82デフォルトの名無しさん:2011/12/29(木) 13:20:46.52
同条件で比較したmapの性能。stlport_std::hash_mapが全てにおいて優れて他のやつ使う余地がないな。

stlport_std::hash_map
Insert Time: 8.859 sec. Search Time: 2.875 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB

stlport_std::map
Insert Time: 12.265 sec. Search Time: 14.953 sec.
ページフォールト数: 11422 最大ワーキングセットサイズ: 46846.0KB

std::map VC9
Insert Time: 14.078 sec. Search Time: 13.953 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB

stdext::hash_map VC9
Insert Time: 10.109 sec. Search Time: 7.5 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB

google::sparse_hash_map ver.1.12
Insert Time: 51.921 sec. Search Time: 9.407 sec.
ページフォールト数: 11949 最大ワーキングセットサイズ: 48664.6KB

google::dense_hash_map ver.1.12
Insert Time: 10.14 sec. Search Time: 5.375 sec.
ページフォールト数: 29635 最大ワーキングセットサイズ: 82599.9KB
83デフォルトの名無しさん:2011/12/29(木) 13:24:36.39
自分の環境はスペックであることは書いておかなければいけなかった。物理メモリが1ギガしかない。
消費メモリサイズには影響は無いと思うが、ページフォールトによる速度低下はあり得る。
google::dense_hash_mapなどはメモリ食うから、容量が大きいマシンでつかったら速度は一番になり得る。
84デフォルトの名無しさん:2011/12/29(木) 14:16:07.33
これがコピペだと気付くのに時間かかった
85デフォルトの名無しさん:2011/12/29(木) 14:42:32.01
コピペだけど自作データだが。
86デフォルトの名無しさん:2011/12/29(木) 15:10:51.18
再試+テストコード公開よろ
ここに貼るのが無理でもblogの方にでも貼っていただければ
87デフォルトの名無しさん:2011/12/29(木) 15:35:18.00
こんなのだが。map部分は書き換える。
#include <string>
#include <time.h>
#include <unordered_map>
#include <windows.h>
#include <psapi.h>
#pragma comment (lib, "psapi.lib")
using namespace std;
int InsertNum=500000, SearchNum=4000000; double timer();string strgen();void meminfo();
int main() {
tr1::unordered_map<string,int> hmap; int i; timer();
for(i = 0; i < InsertNum; i++) hmap.insert( make_pair( strgen(), i ) );
printf("Insert Time: %fsec.\n", timer());
timer(); for(int n=0; n<100; n++) {
string find = strgen();
for(i = 0; i <= SearchNum/100; i++) hmap.find(find); }
printf("Search Time: %fsec.\n", timer());
meminfo(); }
double timer() { static int n=-1; static unsigned int cl[2];
if(n==-1) { n=0; cl[0]=clock(); return 0; }
n=1-n; cl[n]=clock(); return (cl[n] - cl[1-n]+0.0)/CLOCKS_PER_SEC; }

unsigned int randxor() { static unsigned int t, x=123456789,y=362436069,z=521288629,w=88675123;t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
string strgen() { string str; for(int j = 0; j < 1+randxor()%4; j++) {
int r=randxor(); for(int n=0; n<32; n+=2) str+=(char)('a'+(r>>n)%4); }
return str; }
void meminfo() { PROCESS_MEMORY_COUNTERS memInfo = {0};
GetProcessMemoryInfo( GetCurrentProcess(), &memInfo, sizeof(memInfo) );
printf("ページフォールト数: %d\n", memInfo.PageFaultCount);
printf("最大ワーキングセットサイズ: %0.1fKB\n", 0.001*memInfo.PeakWorkingSetSize);
printf("最大ページングファイル使用サイズ: %0.1fKB\n", 0.001*memInfo.PeakPagefileUsage);}
88デフォルトの名無しさん:2011/12/29(木) 21:58:38.76

| ┏━━━┓   従軍慰安婦は反日朝日新聞の捏造でした。
| ┃借収安┃    デマだらけの報道に注意しよう
| ┃三三婦┃
| ┃○○大┃
| ┃○○募┃
| ┃○圓集┃
| ┃圓以  ┃
| ┃迄上  ┃_
\┃可   ┃ \
  ┗━━━┛  \
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
http://img04.ti-da.net/usr/wishcomestrue/t02200190_0220019010786142693.jpg
89デフォルトの名無しさん:2011/12/30(金) 02:29:27.45
stlportのhash<string>はあんまり質が良くないから気をつけたほうがいいかも
90デフォルトの名無しさん:2011/12/30(金) 22:49:56.84
たまに衝突してもいいというマップだと省メモリ・高速にできるな。
91デフォルトの名無しさん:2011/12/31(土) 09:36:49.83
listのmergeって内部のデータを盗むやつだから
新たにデータをつくりませんよね?
あと順序を維持したままというのはmergeすると
ソートが勝手に行われるということですか?
単純に後ろにくっ付けたいときはどうしたらいいですか?
あとdequeやvectorで2つのやつを新たなデータを作らずにマージできますか?
92デフォルトの名無しさん:2011/12/31(土) 10:04:40.11
listはデータ構造的にたまたまそういうことができるだけ
STLのほかのコンテナでは無理
setやmapならできそうな気もするけどSTLには残念ながらそういう機能はない
ソートせずにくっつけたいだけならspliceを使う
93デフォルトの名無しさん:2011/12/31(土) 10:11:47.79
配列のポインタを保持してそれでつなげ。
そしたら低負荷だ。
94デフォルトの名無しさん:2011/12/31(土) 10:17:15.52
派生クラスのコンストラクタを自動でprotectedにするテクニックってありますか?
派生可能かつ生成関数を通じてのみ生成可能なクラス群を書きたいのだけど
いちいち全クラスにprotectedコンストラクタを書くのが面倒です
(例)
class X {
protected:
// CTORS
virtual ~X(void) {};
public:
static X * Create(void) { return new X; }
};
class Y : public X {
protected:
// CTORS
public:
static Y * Create(void) { return new Y; }
};
class Z : public Y {
private: // final的な意味で
// CTORS
public:
static Z * Create(void) { return new Z; }
};
95デフォルトの名無しさん:2011/12/31(土) 11:32:10.13
配列の配列がdequeってかいてあったからマージできるとおもったけど
出来ないんですね。
おとなしくvector型の配列つくりますね。
96デフォルトの名無しさん:2011/12/31(土) 13:05:16.37
>>94
無理じゃね
そもそも何でコンストラクターはダメで
Createならいいの?
97デフォルトの名無しさん:2011/12/31(土) 13:11:33.81
>>96
enable_shared_from_thisとかその他のフックがついてる時
あるいはCreateでマネージャに登録などの他の処理もしてる時
とかですかね
98デフォルトの名無しさん:2011/12/31(土) 17:24:46.05
99デフォルトの名無しさん:2012/01/01(日) 10:33:04.62
寿命の管理の責任ははっきりしているけれど共有したいポインタがあるから
unique_ptrのweak_ptrみたいなものが欲しいのだけどそういうイディオムとかって有りませんか?
100デフォルトの名無しさん:2012/01/01(日) 11:22:44.36
unique_ptrを参照渡しする
101デフォルトの名無しさん:2012/01/01(日) 13:20:36.24
#include <memory>
#include <iostream>
#include <stdexcept>

template<typename T> void f(std::unique_ptr<T> const& p) {
if (p.get()) {
std::cout << *p << std::endl;
} else {
throw std::invalid_argument("no ownership");
}
}

int main() {
std::unique_ptr<int> p(new int(0));
f(p);
std::unique_ptr<int> q = std::move(p);
try { f(p); }
catch (std::invalid_argument const&) {
std::cerr << "p lost ownership" << std::endl;
}
f(q);
}
こんな使い方していいのだろうか・・・
102デフォルトの名無しさん:2012/01/01(日) 14:08:38.33
参照だけではウニポが無効になったことを検知できない
103デフォルトの名無しさん:2012/01/01(日) 16:37:02.96
unique_ptrがscope outしたらそもそも見えない
std::moveで他のunique_ptrに所有権が移ればget() == nullptrになる
それ以外で無効になるときってどういうのがありますか?
104デフォルトの名無しさん:2012/01/01(日) 16:53:04.58
明示的に開放した場合
105デフォルトの名無しさん:2012/01/01(日) 17:23:22.11
>>104
なるほど明示的な開放ですか、確かに弱参照っぽく使うとなるとそういうケースも当然考えられますね

そこでこの操作をunique_ptrのデストラクタにおける所有権放棄+リソースの解放を手作業で行うものと見做して
rp = p.release();とした後にp.get_deleter()(rp);としましたが、その直後のpはreleaseの仕様よりp.get() == nullptrとなり
unique_ptrの参照から無効となったことを検出できているようですが、これでは駄目なのでしょうか?
これ以外にはdelete p.get();のような対処不可能なものしか考えられないんですが、他にも見落としがあるという気もします
106デフォルトの名無しさん:2012/01/01(日) 17:29:54.06
ユニポに割り当てられていたメモリが最利用されて他のオブジェクトで上書きされた時
107デフォルトの名無しさん:2012/01/01(日) 18:38:38.48
なるほど、やはり排他付きのshared_ptrとweak_ptrでやった方が楽そうですね
108デフォルトの名無しさん:2012/01/02(月) 00:16:22.68
便乗してshared_ptrに関する質問なんだけど、

void SetValue(const shared_ptr<Value> & value) { ... }
みたいな引数のconst参照渡しは認められているけど、

const shared_ptr<Value> & GetValue() const { ... }
みたいなconst参照返しは認められていないのはなぜ?
109デフォルトの名無しさん:2012/01/02(月) 00:20:28.94
べつに認められてないことはないよ
110デフォルトの名無しさん:2012/01/02(月) 00:23:02.84
>>108
それでも、問題ないと思うけど、
shared_ptrは自身のコピーを作るときにカウント増やすのであんまり参照返しにする意味はないと思う。
111デフォルトの名無しさん:2012/01/02(月) 05:22:03.18
なるほど、大丈夫なのか

shared_ptrを参照返しするばあい、
shared_ptrのポインタ(参照)を取得→参照返し→呼び出し側の処理
だから、呼び出し側の処理で参照カウントのインクリメントをする前に、
参照カウントが0になるような処理が他のスレッドとかで発生する(するのか?)とまずいと思ったんだけど・・・

shared_ptrを値返し(shared_ptr<Value> GetValue() const)するばあい、
参照カウントのインクリメント→値返し→呼び出し側の処理
だから、途中でカウントが0になることはあり得ないという考え
112デフォルトの名無しさん:2012/01/02(月) 05:37:37.05
値返しでも
・GetValue呼び出し
・他スレッドで内部スマポを破棄
・GetValueの戻り値コピー(空スマポが返る)
という順番になる可能性はある。
113デフォルトの名無しさん:2012/01/02(月) 07:20:55.20
おお、確かにあるわな
つまるところ微妙に大きい構造体のメンバ変数を値返しするか、参照返しするかの違いか
114デフォルトの名無しさん:2012/01/02(月) 08:52:45.66
スレッドAにスマポを保持
スレッドBにスマポを保持
この時点でカウントは2
スレッドA内のスマポ保持者が同じスレッドにスマポを参照で返そうが値で返そうが問題ない
返してる途中でスレッドB内のスマポが破棄されてもカウントは1以上と保証されてる
やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること
まあそんなことする奴はいないと思うが
115デフォルトの名無しさん:2012/01/02(月) 09:25:55.29
std::list<int[2}>は作れますか?
作れなければどうしたら好いですか
116デフォルトの名無しさん:2012/01/02(月) 09:44:22.44
struct a { int a[2]; }
list<a>
117デフォルトの名無しさん:2012/01/02(月) 12:12:05.55
>>115
なんでstd::list<int[2]>なんですか?
std::list<int>じゃダメなんですか?
118デフォルトの名無しさん:2012/01/02(月) 15:02:12.31
そこはstd::list<std::pair<int, int>>で
119デフォルトの名無しさん:2012/01/02(月) 16:26:27.80
boost::arrayなら入れられる
120デフォルトの名無しさん:2012/01/03(火) 01:03:05.84
>>144
>やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること
参照返しはダメだとして、値返しならスレッドセーフになる?
あと、スレッド間の参照渡しも危ない?

BOOST_SP_DISABLE_THREADSを宣言したばあい、スレッド間での
・値渡し
・参照渡し
・値返し
・参照返し
の動作はどうなりますか?
121デフォルトの名無しさん:2012/01/03(火) 12:16:23.78
class Base{
コンストラクタとデストラクタ
}

class Super:Base{
コンストラクタ1
コンストラクタ2
}

コンストラクタ1:Baseコンストラクタ{
(コンストラクタ2をオーバーロード)
}

コンストラクタ2:Baseコンストラクタ{
...
}

こうすると、コンストラクタ1を呼び出した時、多分そのスコープを抜けるときにBaseのデストラクタを呼び出して
困ったことになるんですが回避方法はありますか?
122121:2012/01/03(火) 12:39:01.09
ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね
コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました
123デフォルトの名無しさん:2012/01/03(火) 13:10:23.46
>122
>コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました
多分、対処はそれで正しい。が、

・オーバーロードって用語、意味間違ってるんじゃね?
・Super→Sub あるいは Base→Derived なので Base、Super って書かれるとはぁ?って感じがする
・コンストラクタの中で他のコンストラクタを呼び出すことは出来ない。多分、一時オブジェクトを生成してるだけ。
struct Derived : Base
{
  Derived() : Base() {}
  Derived(int n) : Base()
  {
    Derived(); // 一時オブジェクトを生成してるだけ
  }
};
・「ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね」
 標準ライブラリでも普通にオーバーロードしてると思うが。
124デフォルトの名無しさん:2012/01/03(火) 14:20:14.86
C++ 11
delegating constructor
125デフォルトの名無しさん:2012/01/03(火) 15:59:58.36
ちょっと質問です。

char c[4] = {'a','\0','*','*'};

c は文字列を表していますが、実際は 4byte 固定のバイナリデータで、\0 の後ろにはゴミが入っています。
3文字以下の場合は \0 終端が保証されていますが、4文字ちょうどの場合は \0 終端されていません。
この c を std::string に変換するにはどうすればいいでしょうか。

案1:
std::string s = std::string(c);

これだと、\0 終端していない場合はうまく変換できません。

案2:
std::string s = std::string(c, 4);

これでうまく行くと思ったのですが、続けて s += "def"; とすると、
s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。
理想では a d e f \0 となってほしいです。

自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。
よろしくお願いします。
126デフォルトの名無しさん:2012/01/03(火) 16:23:21.44
>>125
これくらいしか思いつかん
std::string s = std::string(c, 4);
s.resize(strlen(s.c_str()));
127デフォルトの名無しさん:2012/01/03(火) 17:32:43.18
string s(string(c, 4).c_str());
128デフォルトの名無しさん:2012/01/03(火) 17:41:00.83
>>127
ああーーそれだ!
うまく行きましたありがとうございます!!
129デフォルトの名無しさん:2012/01/03(火) 21:44:10.55
>>125
std::string s(c, std::find(c, c + 4, '\0'));
130デフォルトの名無しさん:2012/01/03(火) 22:17:51.09
string自体に超最適化されたfindメンバがあるのに、どうして効率の低いアルゴリズムをわざわざ使いまんのや。
131デフォルトの名無しさん:2012/01/03(火) 22:44:30.53
stringのfindメンバとやらで>129をもっと効率よくできるの?
132デフォルトの名無しさん:2012/01/03(火) 22:47:03.31
C++ Coding Standards
「時期尚早の最不適化をしてはならない」原則に反する。
要するに糞コードを書くなってことだろ。
133デフォルトの名無しさん:2012/01/03(火) 22:50:13.20
それとも Effective STL の「アルゴリズムより同名のメンバ関数を優先して使おう」だろうか。
どっちにしてもそんな初心者向けのルールすら無視して糞コード書いちゃだめだな。
134デフォルトの名無しさん:2012/01/03(火) 23:30:38.66
どれを指して糞コードって言ってるの?良いコードはどんなの?
135デフォルトの名無しさん:2012/01/03(火) 23:35:34.78
同名とはいえ可換じゃない関数でそんなこと言われても
136デフォルトの名無しさん:2012/01/03(火) 23:48:31.98
当たり前すぎて議論するようなレベルの話じゃないが
理由を知りたいなら Effctive STL にも C++ Coding Standards にも載ってるからそれ読めれ。
っていうか、回答者なんだから知ってて当然だと思うんだけどどーなの?
137デフォルトの名無しさん:2012/01/03(火) 23:56:50.99
>>131
大して変わらないと思うけど例えば

char c[4] = {'a', '\0', '*', '*'};

std::string s = std::string(c, 4);

std::cout << s << " length: " << s.size() << std::endl;

s.resize(s.find('\0'));

std::cout << s << " length: " << s.size() << std::endl;
138デフォルトの名無しさん:2012/01/04(水) 00:09:20.40
それじゃ\0が含まれないとき死ぬだろ
139デフォルトの名無しさん:2012/01/04(水) 00:16:29.56
あそっか、string::nposをチェックしないと行けないのか

s.resize((s.find('\0') == std::string::npos) ? s.size() : s.find('\0'));

なんか格好悪いなあ
140デフォルトの名無しさん:2012/01/04(水) 00:18:31.63
if文で単純に分岐させた方がいいな

std::string::size_type si = s.find('\0');

if (si != std::string::npos)
s.resize(si);
141デフォルトの名無しさん:2012/01/04(水) 00:39:53.13
すみません。以前こちらで仮想デストラクタについて質問したものです。
簡単な参照カウンタつきnew/delete を実装したく、Web ページをあさっていたのですが、delete/new の演算子オーバーロードのサンプルをみるかぎり、
class A {
static void *operator new(size_t size) { malloc(size); }
static void operator delete(void *p) { free(p) }
};
という感じで、new/delete の中身は malloc()/free() になっているものしか見当たりませんでした。
これを <cstdlib> を使わずに c++ だけで完結させたいのですが、どうすればいいでしょうか。new/delete をオーバーロードした以上、malloc()/free() 呼び出しは不可避なのでしょうか。
キーワードをいただければありがたいです。よろしくお願いいたします。
142デフォルトの名無しさん:2012/01/04(水) 00:43:19.71
::newとか
143デフォルトの名無しさん:2012/01/04(水) 01:10:59.02
プログラム系の質問とは若干離れてますが、
ここで議論してる事ってかなり高度な事ですよね
プログラマ目指したいのですがここの話に参加できる位にならないと話にならない感じですか?
144デフォルトの名無しさん:2012/01/04(水) 01:27:17.42
>>141
OSのメモリ関連のAPIを直接呼び出してもいいし(WinならVirtualAllocとかHeapAllocとか)
そんなに大きな領域が必要でないならstatic char mempool[10000]とか確保しといてメモリプールとして少しずつ割り当てていくとかある
145デフォルトの名無しさん:2012/01/04(水) 01:27:42.98
>>143
そうかもしれないしそうでないかもしれない精進あるのみ
146デフォルトの名無しさん:2012/01/04(水) 01:34:47.30
>>145
そうですね
学校で無双して気持ち良くなってるレベルじゃダメですねw
精進しないとダメだとわからされました><
147デフォルトの名無しさん:2012/01/04(水) 01:46:22.97
>>141
boost::poolは?
148デフォルトの名無しさん:2012/01/04(水) 01:50:11.58
あ、今docのバグを発見した
boost::poolのリンクが間違ってる

boost/libs/pool/doc/index.html

じゃなくて

boost/libs/pool/doc/html/boost_pool/pool.html

149デフォルトの名無しさん:2012/01/04(水) 01:50:44.55
boost/libs/pool/doc/html/index.html

だった
150デフォルトの名無しさん:2012/01/04(水) 09:36:17.54
>>143
できないと話にならないブラック企業もあるし
ずぶのド素人でも研修でちゃんと使い物にしてくれる優良企業もある
151デフォルトの名無しさん:2012/01/04(水) 11:45:44.45
しかし、3ヶ月でC++が物になるとはちょっと思えんなぁ…
Javaなら3ヶ月でも十分だけど。
152デフォルトの名無しさん:2012/01/04(水) 11:55:40.49
3日で経験3年とかいって放り込むのはよくあることでした
153デフォルトの名無しさん:2012/01/04(水) 12:40:00.82
デストラクタでメモリを解放するとき、まだ参照しているところが残っていたら削除しないようにすねにはどうしたらできますか。
vector<クラス> a(100,クラス(5));
とすると初期化時に呼び出したクラスが解放処理してしまいます。
154デフォルトの名無しさん:2012/01/04(水) 12:45:27.37
つ[コピーコンストラクタ]
155デフォルトの名無しさん:2012/01/04(水) 13:02:12.39
サンクス
156片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 13:30:50.40
難しいよぉ。助けてよ。。。
http://codepad.org/rn3cpaZh
157デフォルトの名無しさん:2012/01/04(水) 13:31:16.58
http://codepad.org/BYwy3H3K

Deep Copyの問題だよな
代入演算子を書いておけばなおよし
158デフォルトの名無しさん:2012/01/04(水) 13:58:37.74
>>156
名前空間内でoperator newなどを定義するなと言ってくるんだが

..\New_test2.cpp:26:82: error: 'void* mzc::operator new(size_t, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:43:62: error: 'void* mzc::operator new [](size_t, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:47:34: error: 'void mzc::operator delete(void*)' may not be declared within a namespace
..\New_test2.cpp:70:36: error: 'void mzc::operator delete [](void*)' may not be declared within a namespace
..\New_test2.cpp:74:58: error: 'void mzc::operator delete(void*, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:91:60: error: 'void mzc::operator delete [](void*, const mzc_debug_t&)' may not be declared within a namespace

規格票は§3.6.2だな
159片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 14:12:04.44
>>156 >>158
http://codepad.org/y4kz6D2y
今度はBorland C++で失敗する。
160デフォルトの名無しさん:2012/01/04(水) 14:17:26.14
>>159
..\New_test3.cpp: In function 'void* operator new(size_t, const mzc_debug_t&)':
..\New_test3.cpp:26:37: error: 'malloc' was not declared in this scope
..\New_test3.cpp: In function 'void operator delete(void*)':
..\New_test3.cpp:56:11: error: 'free' was not declared in this scope
..\New_test3.cpp: In function 'void operator delete(void*, const mzc_debug_t&)':
..\New_test3.cpp:66:11: error: 'free' was not declared in this scope
..\New_test3.cpp: In function 'mzc_debug_t MzcNew(const char*, int)':
..\New_test3.cpp:77:26: error: 'strcpy' was not declared in this scope

std:: と <cstdlib> <cstring> を忘れているだけだと思うが
161デフォルトの名無しさん:2012/01/04(水) 14:21:03.91
>>137-140
効率悪くなってんじゃねーか。読みやすくもないし。どこも良くなっるように見えない。
162デフォルトの名無しさん:2012/01/04(水) 14:23:24.64
>>161
だからどれでもいいんだって
find()を使えと言われたから使っただけの話
163デフォルトの名無しさん:2012/01/04(水) 14:27:24.47
stringはメモリ効率悪いよ。
char*なら終端は1バイトだけ。
stringは最低でも長さを表すのに4バイト(32ビット)使っている。
それ以上に無駄がある可能性あり。
164デフォルトの名無しさん:2012/01/04(水) 14:28:52.98
stringに変換するなら、

string s = ch; もしくは string s = (string) ch; 

でいいだろ。
165片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 14:29:41.72
MinGWではOKだが、BCC55ではダメ。原因不明。
http://codepad.org/u5gfzDHk
166デフォルトの名無しさん:2012/01/04(水) 14:30:28.96
>>164
お前さあ
>>125を良く読んでないだろ

>案1:
>std::string s = std::string(c);

>これだと、\0 終端していない場合はうまく変換できません。

これを回避したいと言っているんだけど
167デフォルトの名無しさん:2012/01/04(水) 14:30:37.40
stringはサイズの他にcapacityも持ってるんじゃないかなあ?
168デフォルトの名無しさん:2012/01/04(水) 14:33:12.95
>>166
char*を渡されたとき終端は\0で判別するしかないだろう。
それかchar*と一緒にサイズを渡せば解決。

string(ch, size);
169デフォルトの名無しさん:2012/01/04(水) 14:33:50.95
>>165
BCCのバージョンは?
俺のは最新のEmbarcadero6.43で問題なし
ところでバグあるんじゃね?このソース
CodeGuard掛けると何か言ってくるぞ

Error 00003. 0x400000 (r) (Thread 0x1200):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new1.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new1.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new1.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new1.exe:0x01:0016F4) operator_new1.cpp#49
0x00403535(=operator_new1.exe:0x01:002535) operator_new1.cpp#62
0x0040D19F(=operator_new1.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new1.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
170デフォルトの名無しさん:2012/01/04(水) 14:35:30.76
>>168
だからそれは>>125に既に書いてあるから
ちゃんと読んでから書け

>案2:
>std::string s = std::string(c, 4);

>これでうまく行くと思ったのですが、続けて s += "def"; とすると、
>s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。
>理想では a d e f \0 となってほしいです。

>自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。
>よろしくお願いします。
171デフォルトの名無しさん:2012/01/04(水) 14:35:35.76
>>162
なんだ>>129が書いたんじゃないのか。
お題はfind()を使って効率よく、だよ。
172デフォルトの名無しさん:2012/01/04(水) 14:36:51.77
stringの一時オブジェクト作ってる時点でどうやっても>>129より効率よくなんてならないよ。
173デフォルトの名無しさん:2012/01/04(水) 14:37:00.55
テンプレートでTemplate N、 char[N]のようにサイズとれるか?無理だったか?
174170:2012/01/04(水) 14:37:32.23
アンカー間違えた。
> なんだ>>129が書いたんじゃないのか。
ここ>>130ね。
175デフォルトの名無しさん:2012/01/04(水) 14:39:45.29
>>170
それはゴミも渡しているんだよ。サイズは1だろが。
176片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 14:40:01.43
>>169
どうやらmainの初期化処理と終了処理の内部で::newが使われて
いるのが原因らしい。bool g_initを付けてフラグで指定すると
うまく動くようだ。でもこれって余分なコードだよね?
http://codepad.org/xCEvYC2p
177デフォルトの名無しさん:2012/01/04(水) 14:40:32.54
>>173

template <int N>
void func(double (&a)[N]);

みたいな奴か?
178デフォルトの名無しさん:2012/01/04(水) 14:41:27.31
>>175
だからゴミを取り除く議論をしてるだろうが
お前全然人のレス読まないのな
179デフォルトの名無しさん:2012/01/04(水) 14:43:56.89
>>176
いやそれは関係ないと思う
まだエラーが出るぞ

Error 00003. 0x400000 (r) (Thread 0x0E18):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new2.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new2.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new2.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new2.exe:0x01:0016F4) operator_new2.cpp#49
0x00403535(=operator_new2.exe:0x01:002535) operator_new2.cpp#62
0x0040D19F(=operator_new2.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new2.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
180デフォルトの名無しさん:2012/01/04(水) 14:47:40.15
>>178
ゴミを取り除くためにはstring s = ch;でいいだろ。
charのポインタを渡されたらサイズ不明で処理して\0を終端と見なすしかない。
それを自動でやってくれるのがstring s = ch;
181デフォルトの名無しさん:2012/01/04(水) 14:48:10.94
もういい、しゃべるな。
182デフォルトの名無しさん:2012/01/04(水) 14:49:16.16
>>180 >>125
> 4文字ちょうどの場合は \0 終端されていません。
183片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 14:51:58.17
g_mapのメソッドとnewとdeleteがどこからどういう順番で
呼ばれてくるかが分からない。
184デフォルトの名無しさん:2012/01/04(水) 14:52:38.16
自作関数に限らず、標準関数でも終端は\0として処理するぞ。
4バイト以内に\0が現れなければそれ以降に\0が出るところまでを一文と見なす。
これが正常動作。
最初に\0を付加しないのがバグ。
185デフォルトの名無しさん:2012/01/04(水) 14:55:21.43
いまは固定長でサイズが4だと判明してるから、min( \0が現れる位置、4 )でいいがサイズ不明なら、\0が現れる位置という情報しか取れない。
186片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 14:56:48.54
g_mapのメソッドがコンストラクタよりも前に呼び出される
ということ? どうすればいいんだ。。。
187片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 15:05:47.49
やった!できたー!皆様、有難うございます!
http://codepad.org/Qz23i49K
188片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 15:13:30.05
>>187 このコードを見て皆様はどう思いますか?
189デフォルトの名無しさん:2012/01/04(水) 15:22:46.37
>>184
バグじゃなくて、わざと'\0'終端でない場合どうするかって話をしてるんだが・・・文盲?
190デフォルトの名無しさん:2012/01/04(水) 15:23:17.62
>>185
sizeof()でいいだろ
191デフォルトの名無しさん:2012/01/04(水) 15:28:53.09
>>187
何これ

Error 00001. 0x350010 (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECC0)

| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()

The object array (0x00BAECC0) [size: 1 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)
192デフォルトの名無しさん:2012/01/04(水) 15:29:40.55
Error 00003. 0x350010 (r) (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECE0)

| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()

The object array (0x00BAECE0) [size: 5 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)

Error 00004. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xBA05A0) was never freed

The memory block (0x00BA05A0) [size: 48 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;
193デフォルトの名無しさん:2012/01/04(水) 15:29:51.56
Error 00005. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xB99270) was never freed

The memory block (0x00B99270) [size: 540 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;
194デフォルトの名無しさん:2012/01/04(水) 15:53:35.70

           ______
          r〃〃〃 f7⌒ろ)
           l‖‖‖ ||   f灯
            |‖‖‖ ||   | |
            |儿儿儿._」⊥厶
           〔__o____o_≦ト、
.          i / ⌒  ⌒  ヽ )
          !゙ (・ )` ´( ・)   i/
          |  (_人__)    | \
          \  `ー'    /  / ー- 、
.          ,ィ(⊆≧リ≦⊇)〃   /     rク\
.       /   | ̄r少}¨ ̄〃   /    /′ ヽ
      〃 l   |  l| | l| 〃    /     /    └ヽ
     /    l  |l | |l/″   /      !  厂    \
    く,  Y   ! l」fレト!    /       | /        1
    丿  |   | 丿} じ’  /      | /         |
   /     l   | `¨      /      レ′        |

             真の思考停
    (在位 2009年9月16日〜2010年6月8日)

   民主朝の初代考停、言行不一致、虚言、脱税、
   そして外交において巨大な負の遺産を築いた。
195片山博文MZ ◆0lBZNi.Q7evd :2012/01/04(水) 15:55:12.76
できた。これで帰れるぞぉ、はあ。
http://codepad.org/3Rwidmma
196デフォルトの名無しさん:2012/01/04(水) 15:57:12.60
>>195
今度こそエラー無しだな
おつかれ
197デフォルトの名無しさん:2012/01/04(水) 17:22:52.87
>>190
関数の引数ではchar[]を渡せずchar*になることが多い。サイズ不明になる。
198デフォルトの名無しさん:2012/01/04(水) 17:41:34.06
>>197
話をそらすなよ
関数の引数の話なら別パラメータでsize_tを渡せばいいし
199141:2012/01/04(水) 21:02:54.35
>>195
感謝です
200デフォルトの名無しさん:2012/01/04(水) 21:49:07.46
class Object {
ObjectManager * pObjMng;
// ry
};

class ObjectManager {
Container<Object *> cpObj;
// ry
};

こんな感じの相互参照があるんだけど
スマポにするならどっちがshared_ptrでどっちがweak_ptrにするのが一般的ですか?
201デフォルトの名無しさん:2012/01/04(水) 22:08:30.42
所有権を持たない場合にweak_ptrを使う
202デフォルトの名無しさん:2012/01/04(水) 22:15:03.46
集約してるならsp
参照しているならwp
ということでしょうか
203デフォルトの名無しさん:2012/01/04(水) 22:34:57.06
戻り値にするようなモノはsp
というか削除する責任者が
居なくなりそうならsp
自分は削除に感知しないと思う
オブジェクトはwpだろ
204デフォルトの名無しさん:2012/01/05(木) 06:45:42.41
STLの安全性は保障されていないということでよろしいでしょうか?
205デフォルトの名無しさん:2012/01/05(木) 08:46:48.44
C系列で保証なんて何も無いよ
206デフォルトの名無しさん:2012/01/05(木) 15:36:00.48
中身の短いメンバ関数って、積極的にヘッダでインライン化するべきですか?
それとも、大した恩恵は無く、ソース内に入れておくべきですか?
207デフォルトの名無しさん:2012/01/05(木) 15:41:12.11
>>206
呼び出す回数に凄く依存する。
インライン化されずに時間掛かったとして、全体0.01%だったらしなくても変わらず。
出来上がってから実測。
208デフォルトの名無しさん:2012/01/05(木) 15:42:46.14
>>206
自分はコンパイラさんにお任せするのでinlineキーワードを使ったことがない。
209デフォルトの名無しさん:2012/01/05(木) 15:52:54.35
クラス定義内に書いたらinline付いてるのと同じ。

どんなに短くても、ループ内で何回呼び出されようと
自動的にインライン化されることはほとんどないので
自分でインラインにするべきかどうか判断した方がいい。

短ければ関数呼び出しよりもサイズ小さくなる場合もあるし。
210208:2012/01/05(木) 15:57:58.20
>>209
あれ?そうなの??
昔最適化で勝手にインラインになるから気にするなって言われたのをずーっと信じてたんだけど。
まー、個人的にはカリカリチューンはきらいだからねぇ。。。
むむむ・・・。
211デフォルトの名無しさん:2012/01/05(木) 16:14:54.06
ボトルネックが確定してから変更すれば良い。
それまでは自分の書きやすい方法で。
212208:2012/01/05(木) 16:17:14.64
おk!
213デフォルトの名無しさん:2012/01/05(木) 16:49:01.18
昔はコンパイル単位をまたがる最適化とか一般的じゃなかったけど
GCCは4.5からVCは8から出来たと思う
だから今は関数に別名を付けたいときやヘッダで完結させたいときしかinline使わないな
214デフォルトの名無しさん:2012/01/05(木) 16:52:25.27
インライン使うと、同じ関数が他所に分断され配置されキャッシュの効果が薄まる。
なるべく使わない方がメモリと速度に良い。
215デフォルトの名無しさん:2012/01/05(木) 16:58:37.20
AMDがVC++ならO2よりO1使ってキャッシュに詰め込めと言ったり大変な世界だな
216デフォルトの名無しさん:2012/01/05(木) 17:07:24.77
プライベートメンバのラッパとか
関数呼び出しよりも軽い処理は積極的に
インラインにすればいいんじゃねーの
217デフォルトの名無しさん:2012/01/05(木) 17:12:01.61
Javaとc++どっちやろうか迷ってます。
プログラミングは初めてです。
両方やったことある人に聞きます。
最初はどっちから手を出した方がいいですか?
218デフォルトの名無しさん:2012/01/05(木) 17:14:25.52
>>217
初見でC++は死ぬと思うがな
割と適当でもなんとかなるJavaにしたら?
まぁホント言うならC#(ry
219デフォルトの名無しさん:2012/01/05(木) 17:18:43.63
C++はマルチパラダイムかつ値のセマンティクスがある言語だから、初心者がやると(プログラムが)爆死しやすい。
オブジェクト指向一本に絞ってるJavaのが無難。
メモリ上の扱いとか覚える気ならC++。
220デフォルトの名無しさん:2012/01/05(木) 17:20:22.01
>>217
マルチPOSTすんなカス
221デフォルトの名無しさん:2012/01/05(木) 17:31:58.83
実用面で、PHP(C++のスクリプト言語化のようなもの)
Groovy(JAVAのスクリプト言語化のようなもの)
C#
をすすめてみた。
222デフォルトの名無しさん:2012/01/05(木) 17:37:58.84
Groovyってどんな言語? JavaプログラマのためのGroovy入門(2/7):CodeZine
http://codezine.jp/article/detail/3757?p=2
223デフォルトの名無しさん:2012/01/05(木) 17:42:28.04
>>213
ヘッダだけで完結させるならstaticじゃね
どちらでも内部結合になるし、
そんな場合は大して長くない処理を書くことが多いからinlineでも
全然問題ないと思うけど
224デフォルトの名無しさん:2012/01/05(木) 17:45:02.44
C++からやれよ。AOJとかの結果見ると、Javaがどんだけメモリバカ食いで実行速度遅いか、がく然とするぞ。
225デフォルトの名無しさん:2012/01/05(木) 17:48:40.31
>>223
下駄雪駄もstaticで書くのか?w
226デフォルトの名無しさん:2012/01/05(木) 17:49:15.64
>>223
下駄雪駄もstaticで書くのか?w
227デフォルトの名無しさん:2012/01/05(木) 17:53:10.30
>>225
普通の関数の話だった
セッターゲッターはstaticの意味が変わってしまうがな
てか下駄雪駄の意味がわからずしばらく考えたじゃないか
228デフォルトの名無しさん:2012/01/05(木) 18:56:59.60
内部結合のstaticはC++11で廃止されたから使わない
229206:2012/01/05(木) 19:03:11.22
みなさんどうもです。
セッタやゲッタの中にも数行必要なものもありますし、
そうなるとますますソースとヘッダどちらに書くかの境界線が判断できない上に、
「このセッタはヘッダ」「このセッタはソース」みたいになると、
個人的には読みにくいと感じるため、>>211さんの言われるように、
ボトルネックだと感じるまではすべてソースに書いておこうと思います。
230デフォルトの名無しさん:2012/01/05(木) 20:34:46.07
>>218
べつにC++からでいいだろ。
Java勉強しなくても、C++知ってりゃ書ける。
その逆はない。
231デフォルトの名無しさん:2012/01/05(木) 20:38:36.01
オブジェクト指向言語からやるとC++の変なところを学習しにくい
C++を便利に使ってしまう
232デフォルトの名無しさん:2012/01/05(木) 20:44:00.84
>>214
それはない。インライン展開しまくったとしても、
今時のキャッシュメモリなら1次キャッシュに収まるからな。
それと、96bit画像の描画したときは、インライン展開した方が、
関数外と関数内の式が結合され7割まし早かった。
233デフォルトの名無しさん:2012/01/05(木) 20:51:23.46
OO勉強したいなら、PythonやSmalltalkから入ったほうがマシだろ。
参考書の大半が引数書き換えを邪気に扱ってるし、
オブジェクトの委譲によって、オブジェクトを組み立て、
オブジェクトの振る舞いを作ることによりプログラムの動作を
決めるというOOの基本を実践してるサンプルが少ない。

SwingでGUIをつくるのにJFrameを継承するとかバカな解説ばっか。
234デフォルトの名無しさん:2012/01/05(木) 21:12:28.04
実はオブジェクト指向ってしっくりこないんです!
235デフォルトの名無しさん:2012/01/05(木) 21:13:37.27
そうですか。それはスパゲティですね。
236デフォルトの名無しさん:2012/01/05(木) 21:33:57.78
私はIS部門の人間なんです。SIerの客なんですよ。私に嫌われたらどうなりますか?
皆さん生きていけないですよ!
237デフォルトの名無しさん:2012/01/05(木) 21:38:35.52
優柔不断なのが悪い
他の女とどうなるか解からんが
素直にシャルルを選んどけ
238デフォルトの名無しさん:2012/01/05(木) 21:39:08.77
>>236
>私に嫌われたらどうなりますか?

おまえの仕事をする奴がいなくなるだけじゃない?
239デフォルトの名無しさん:2012/01/05(木) 21:42:45.09
みながわさんはいまだにオブジェクト指向の話で持ち出されるのか
240デフォルトの名無しさん:2012/01/06(金) 02:02:23.80
>>223
inline に内部結合にするなんて効果は無いよ。
241デフォルトの名無しさん:2012/01/06(金) 02:07:20.94
すみません、C++初心者です
例えば、Objクラス型のオブジェクトを、引数なしで作成・初期かする場合、

Obj obj;

とするだけで、デフォルトコンストラクタがよばれるのでしたっけ?

それとも、

Obj obj();


でないといけないのでしょうか。
242デフォルトの名無しさん:2012/01/06(金) 02:08:53.29
>>241
なんで試さないんだよ

ちなみに前者が正解。後者はアウト。
243241:2012/01/06(金) 02:12:05.64
>>242
すみません。。
どうもありがとうございます。

デフォルトコンストラクタに、適当なpublicメンバ変数aに定数を代入する
操作が入ったHogeクラスを作って、

Hoge obj;


のあと、obj.aの内容をみて確かめてみます。
244デフォルトの名無しさん:2012/01/06(金) 07:22:00.98
>>228
見たけど別に廃止されてなかったが (3.5-3)
245デフォルトの名無しさん:2012/01/06(金) 10:15:13.53
>>244 deprecatedじゃね
246デフォルトの名無しさん:2012/01/06(金) 10:30:20.35
C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
247デフォルトの名無しさん:2012/01/06(金) 11:02:49.28
>ある程度アクセス制御されたグローバル変数
具体例頼む。
248デフォルトの名無しさん:2012/01/06(金) 11:33:20.05
class shared {
protected:
static int n;
};

class hoge : public shared {};
class fuga : public shared {};

みたいに丸出しよりましかな程度のものだけど
249デフォルトの名無しさん:2012/01/06(金) 11:36:26.76
関係ないけどこれの方がnをcppで定義しなくていいから楽。

class shared{
protected:
static int &n(){ static int value; return value; }
};
250デフォルトの名無しさん:2012/01/06(金) 11:37:03.63
>C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
どっちでもいいんじゃない?マルチパラダイムなんだし。
251デフォルトの名無しさん:2012/01/06(金) 11:56:25.41
>>246 「いい」の基準が不明だな。どっちにも文句を付けられるだろう。
252デフォルトの名無しさん:2012/01/06(金) 13:25:32.88
>>248
どっちも無し。

int n;
new hoge( &n );
new fuga( &n );
で十分
253デフォルトの名無しさん:2012/01/06(金) 13:41:32.84
template<typename T>
struct temp_type{ typedef const T &t; };

template<typename T>
struct temp_type<T*>{ typedef T *t; };

template<>
struct temp_type<int>{ typedef int t; };

template<typename T>
void hoge(typename temp_type<T>::t v){}

int a = 1;
int *b = &a;
struct HOGE{} h = {};
//C2783
hoge(a);
hoge(b);
hoge(h);

テンプレートで指定された型に応じて
値を渡すか、const参照を渡すかを決めたいのですが
「テンプレート 引数を 'T' に対して減少できませんでした」
となります。

関数hogeでは引数を書き換える予定はないです。
テンプレートでない関数の場合は
例えばconst int &やint *const &など渡さないと思うし
参照を関数内でデリファレンスするのも無駄だと思うので
アドレスとおなじサイズの整数やポインタを渡す場合は
値渡し選択したいのですが、どのように書いたらいいですか?
254デフォルトの名無しさん:2012/01/06(金) 13:47:54.36
hoge<int>( 10 ); // おそらくOK

255デフォルトの名無しさん:2012/01/06(金) 13:51:12.06
>>253
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
template<typename T> void hoge(int v);
これでは何故ダメなのか?
256デフォルトの名無しさん:2012/01/06(金) 14:25:35.67
257デフォルトの名無しさん:2012/01/06(金) 14:29:15.48
複数のクラスが互いに参照しあって連携してるケースは難しいね
メディエーターパターンを使ってシステムの連絡路を一本化するのがいいと言われてやってみたけど
メディエーターのインターフェースが凄まじく大きくなってしまった
258デフォルトの名無しさん:2012/01/06(金) 14:30:20.02
それはどういう意味があるコードなの?
オーバーロードとは何が違うの?
259デフォルトの名無しさん:2012/01/06(金) 14:31:41.96
>>254 型を書けばいけました。でも呼び出し側の書き方は変えたくないです。
>>255 hogeの処理は共通なので定義は1つにしたいです。

hogeのような関数がたくさんあって、呼び出しも多いので
関数を型の個数分書いたり、呼び出し部分の記述量を増やすことなく
実現するにはどのようにしたらよいですか?

条件後出しですいません。
260デフォルトの名無しさん:2012/01/06(金) 14:38:49.00
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
処理の内容が同じならこの2つでいいよ。
後者は、前者を呼び出すだけでいい。

速度はコンパイラが勝手に最適化するから気にすんな。
うんな事より、プログラムを1つ完成させることに力を入れろ。
どうしても気になるなら最適化後のアセンブリコード見て確認してみ。
261デフォルトの名無しさん:2012/01/06(金) 14:41:42.27
>>257
Mediatorを分割すりゃよかったんじゃね。
別に1つの依頼者クラスが1種類の調停者にだけ
依頼せにゃならんわけでもないだろう。

そもそも何をしてるのか知らんから
Mediatorが適した課題かどうか怪しいが
262デフォルトの名無しさん:2012/01/06(金) 20:41:49.47
@
bool Load()
{
return false;
}

A
void Load()
{
new throw Exception()
}

関数のエラーをboolかthrowどっちで検知すればいいのだろうか
263デフォルトの名無しさん:2012/01/06(金) 20:44:12.88
264デフォルトの名無しさん:2012/01/06(金) 20:48:23.09
正解: optional
265デフォルトの名無しさん:2012/01/06(金) 20:55:09.37
>>241

C++11からは、一様な初期化構文を使って、デフォルトコンストラクタ呼び出しを明示できるよ
ttp://d.hatena.ne.jp/faith_and_brave/20111221/1324394299

X x; // ok

X x(); // error

X x{}; // ok (C++11)
266デフォルトの名無しさん:2012/01/06(金) 20:57:37.01
X x {} って気色悪いな
267デフォルトの名無しさん:2012/01/06(金) 20:58:50.74
C#ではよくある事。
268デフォルトの名無しさん:2012/01/06(金) 21:17:49.32
class IHoge {
public:
virtual ~IHoge(void) { }
virtual void Method(void) = 0;
};

class HogeBase : public IHoge {
public:
void Method(void) { }
};

class HogeEx : public HogeBase { };

こうやっていちいち分けるのが流行ってるのはなんで?
どうせポリモーフィックなクラスはほぼ全てがHogeBaseを継承するんだし

class HogeBase {
public:
virtual ~HogeBase(void) { }
virtual void Method(void) { }
};

class HogeEx : public HogeBase { };

でいいじゃないですか?
269デフォルトの名無しさん:2012/01/06(金) 21:30:19.69
>>268
IHogeって事はCOMか?COMは実体を持てないからな。

それは別として、最上位に完全抽象化クラスを置いとくのは、
HogeBaseの全てをオーバーライドするクラスを作ったとき、
HogeBaseの実装がデッドウエイト(容量食うだけのゴミ)になるから。
270デフォルトの名無しさん:2012/01/06(金) 21:32:37.36
>>262
Function( source.Load() ); // Loadはsourceから読み出した情報を返す
こういうコードを書こうとしたとき、どっちを取るべきが正しいか考えろ。
271デフォルトの名無しさん:2012/01/06(金) 21:39:14.50
>>269
なるほど
272デフォルトの名無しさん:2012/01/06(金) 21:48:34.28
>>262
Loadが失敗する状況がふつうにありえそうなら1。
(プログラムの実行自体が怪しくなるような)ハードやOSの異常による状況でしか失敗しないようなら2。
273デフォルトの名無しさん:2012/01/06(金) 21:51:30.44
bool Load(...) {
// ファイルフォーマットエラーなど
return false;
// ハードウェアエラーなど
throw unko();
// 成功
return true;
}

これで決まりや
274デフォルトの名無しさん:2012/01/06(金) 22:01:26.36


 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける
275デフォルトの名無しさん:2012/01/06(金) 22:03:02.69
例外とはまさしく例外であり必ずキャッチされなければプログラムを終了するしかないものに対して使うのがいいだろう。
一方、返却値は返却値。失敗してもいかなるリソースの破壊、開放忘れも発生しない場合に使える。
276デフォルトの名無しさん:2012/01/06(金) 22:05:46.18
事前に書いたフローチャートに書いてないことは例外
277デフォルトの名無しさん:2012/01/06(金) 22:07:59.24
例外ってフローチャートに書いてないの?
278デフォルトの名無しさん:2012/01/06(金) 22:13:05.48
普通は書かない
書いてあるならどんなエラーでも想定の範囲内だから例外ではなく返り値などで判断
279デフォルトの名無しさん:2012/01/06(金) 23:42:39.91
二重キャストって意味あるんだね
はまって痛い目見たよ
こんなん

template<class T> struct Base {
  Base(){ unko = reinterpret_cast<__int64>(this); }
  void OK(){ T *t = static_cast<T *>(reinterpret_cast<Base<T> *>(unko); }
  void NG(){ T *t = reinterpret_cast<T *>(unko); }
  __int64 unko;
};

struct Derived : Base<Derived> {};

int main()
{
  Derived d;
}
280デフォルトの名無しさん:2012/01/07(土) 00:19:45.06
void NG(){ T *t = reinterpret_cast<Base<T> *>(unko); } これだけで十分そうだが?
reinterpret_castで直接reinterpret_cast<T*>してんのが引っかかっただけじゃないの?
void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
オフセットが違うから位置がずれて異常が起きる。
281デフォルトの名無しさん:2012/01/07(土) 00:54:17.62
>>280
>void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
>オフセットが違うから位置がずれて異常が起きる。
ありがとう、目から鱗だわ
ポインタ値とアドレス値は同じものだと思ってたけど違うのか
282デフォルトの名無しさん:2012/01/07(土) 01:39:13.10
>>245
廃止ってのはexportみたいなのを言うんだ
283デフォルトの名無しさん:2012/01/07(土) 09:56:11.27
C++の関数のポインター型は参照渡しですよね?
では仮引数の型がA*&は何を表しますか?
284デフォルトの名無しさん:2012/01/07(土) 10:03:40.38
言葉が足りなすぎて意味が解らない
285デフォルトの名無しさん:2012/01/07(土) 10:03:44.72
>>283
ポインタだろうが値渡しです
A*&はポインタの参照になる
286 ◆QZaw55cn4c :2012/01/07(土) 10:06:51.81
>>283
参照渡し。だたし、参照で渡す変数の型が A *
いろいろ書いてみてお手ごろ感を試していたことがあります。

http://toro.2ch.net/test/read.cgi/tech/1277860967/504
>出題内容:http://hibari.2ch.net/test/read.cgi/tech/1280653311/615
>ポインタのポインタを使って書いたもの:http://codepad.org/MpmPDEc3
>参照を使ったもの:http://codepad.org/nHqWWH51
287デフォルトの名無しさん:2012/01/07(土) 10:08:43.05
void f(A *x){
delete x;
A* c=new A;
x=c
}
void main(){
A* a=new A;
f(a);
delete a;
}
上みたいなコード書いて実験したんですよ。
そうしたらmain関数の最後のところでaはcになってました。
これはC++の関数が参照渡しというしょうこじゃないんですか?
仮引数の型ををA*&に変えてみても同様の結果になりました。
288デフォルトの名無しさん:2012/01/07(土) 10:20:43.44
>>287
それは f内でdelete xをして new Aしたときにたまたま同じメモリ空間を使用しただけにすぎない
fの中でdeleteされてaの示す先のメモリ空間がなくなったので fを呼び出した後はaのポインタを使ってはいけない
289 ◆QZaw55cn4c :2012/01/07(土) 10:37:03.68
>>287
それでうまくいったのは、端的にいえば「たまたま」。
こういうのでは失敗する。
http://codepad.org/WQUBJJak

>>287 では delete x したあと、new A でえたポインタ c が、たまたま x = c だったからうまくいったように見えたと予想する。
290デフォルトの名無しさん:2012/01/07(土) 11:07:45.21
有難うございました。
291デフォルトの名無しさん:2012/01/07(土) 11:12:21.09
日本語でおk
292デフォルトの名無しさん:2012/01/07(土) 12:51:29.47
286 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
289 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
293デフォルトの名無しさん:2012/01/07(土) 13:13:50.88
ウィンドウやコントロールなどのクラスを作ってるんだけど、
子コントロールのクリッピング領域の設定は親がするべき?
それとも、子が必要に応じて設定するべき?
294デフォルトの名無しさん:2012/01/07(土) 15:00:48.58
>>292
どんな専ブラ使えばいいの?
295デフォルトの名無しさん:2012/01/07(土) 20:09:11.41
>>262
例外が発生するParseの後にbool TryParseメソッドができた
つまり分かるな?例外は糞だってことよ
296デフォルトの名無しさん:2012/01/07(土) 20:36:38.84
C++によるWindowsプログラミングで、送出した例外をコールバック関数内で処理せず流すと死ぬんだよな
最高に使いづらえめんどくせえもう使うなってことだろう
ワイド文字に対応していないところからも、やる気のなさが感じられる
297デフォルトの名無しさん:2012/01/07(土) 20:40:38.43
使いこなせない人間にとっては毒となる
298デフォルトの名無しさん:2012/01/07(土) 21:09:27.10
例外を正しく使えないプログラマ多いね。 その7
http://kohada.2ch.net/test/read.cgi/prog/1306646249/
299デフォルトの名無しさん:2012/01/07(土) 21:28:38.70
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩

この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?


300デフォルトの名無しさん:2012/01/07(土) 22:26:26.09
>>296
例外をC++の枠組みの外に流すなよアホが
301 ◆QZaw55cn4c :2012/01/07(土) 22:27:52.42
>>297
例外は C の setjmp()/longjmp() の焼き直しだという珍説を読んだことがあるがいまいち
302デフォルトの名無しさん:2012/01/07(土) 22:38:16.98
例外はCでは完全に実装出来ないというのが常識
303デフォルトの名無しさん:2012/01/07(土) 22:51:38.54
効率を度外視すれば実装できるんでね?
304デフォルトの名無しさん:2012/01/07(土) 22:57:32.00
むしろ実装できない例が知りたい。
305デフォルトの名無しさん:2012/01/07(土) 22:59:53.18
C#のInnerExceptionみたいなのは欲しいな
二重例外で即死亡ってのどうにかならんのか
306デフォルトの名無しさん:2012/01/07(土) 23:44:04.29
>>301
馬鹿は引っ込んでろ
setjmp()/longjmp()だけで例外が書けるならトランスレータで十分なはず
例外は基本的に違うんだよ
知ったかで物を語るな
307デフォルトの名無しさん:2012/01/08(日) 00:07:17.57
トランスレータ無理だねって事になったのが例外だったのは周知の事実だが
トランスレータが書ける事とトランスレータで十分な事はイコールではないと思うの
308デフォルトの名無しさん:2012/01/08(日) 01:12:11.92
例外処理はCで可能。というか例外というもの
自体C以前からある概念なので当然可能。
ただしtry-catchはC単体で実装できない。
正常系実行時にはゼロコストになるよう、
例外ハンドラのアドレス埋め込みが
必要になるからな。
アセンブリを使えばできるが、それは最早Cの範疇じゃない
309デフォルトの名無しさん:2012/01/08(日) 02:15:52.53
try-catchも例外処理の一部じゃないか
ボケてんの?
310 ◆QZaw55cn4c :2012/01/08(日) 09:42:49.34
>>306
トランスレータが書ける事とトランスレータで十分な事はイコールではないと思うの
311デフォルトの名無しさん:2012/01/08(日) 09:59:05.53
>>308
バカはホントに人の書き込み見ないのな。

>正常系実行時にはゼロコストになるよう、

>>303
312デフォルトの名無しさん:2012/01/08(日) 11:54:26.99
>>309
実装と概念を混同する馬鹿?
313デフォルトの名無しさん:2012/01/08(日) 12:05:17.82
>>309
例外処理じゃなくただの構文だろ
例外処理に使わなきゃならんという義務も無い
そう使うかどうかは別として初期の使用例として
qsortの脱出とかあったしな
314デフォルトの名無しさん:2012/01/08(日) 12:56:58.89
>>310
Qはまだ馬鹿言ってるよ
トランスレータが書けないという事はCで実現出来ない機能が例外処理にはあるわけだ
QはC万能だと思いたいんだろうけど実はそうではない
315 ◆QZaw55cn4c :2012/01/08(日) 13:01:00.82
>>314
>>301
>珍説を読んだことがあるがいまいち
316デフォルトの名無しさん:2012/01/08(日) 13:01:25.23
windowsに限るならOSの機能として構造化例外というC++標準の例外より遥かに強力な仕組みがあるから
それを叩くならCに限定しても例外処理機構に関してはC++と同等のものがあるといえないことも無い
317デフォルトの名無しさん:2012/01/08(日) 13:01:35.82
>>314
> Cで実現出来ない機能が例外処理にはあるわけだ

具体的にどういう機能?
318デフォルトの名無しさん:2012/01/08(日) 13:02:44.12
>>314
否定したいなら、トランスレータが書ける事とトランスレータで十分な事がイコールだと示せばいい。
319デフォルトの名無しさん:2012/01/08(日) 13:30:17.58
この話はもう結論出てるから終了
320デフォルトの名無しさん:2012/01/08(日) 13:35:02.57
イコールで示せない>>314は馬鹿ということで、結論
321デフォルトの名無しさん:2012/01/08(日) 13:51:34.95
>>316
言えない。
言語拡張を言い出せばきりがなくなる。
322デフォルトの名無しさん:2012/01/08(日) 13:54:44.12
>>317
Cの呼び出し規約を維持したまま
スタックを巻き戻す機能
323デフォルトの名無しさん:2012/01/08(日) 13:56:30.72
>>321
言語拡張じゃないよ単にAPI呼び出すだけだから
324デフォルトの名無しさん:2012/01/08(日) 13:58:25.14
コールバックの方か
325デフォルトの名無しさん:2012/01/08(日) 13:58:49.05
Qがコテを外して必死です
物凄く保守しにくくて読みにくく、パフォーマンスも低くてもいいならCで出来ない事もないだろうが
実用に耐える物ではない
少なくとも業務用には使える代物ではとてもない
326デフォルトの名無しさん:2012/01/08(日) 14:07:14.68
よく知らないんだけど、
例外への対応って具体的に何やってんの?
昔逆アセンブルしてみると
関数先頭でfsかgsかのレジスタ使ってた気がするけど
327デフォルトの名無しさん:2012/01/08(日) 14:20:54.12
CでOOPやったり仮想関数まで実現している例はWeb上にいくらでも転がっている
でもとても仕事に使える物ではない
趣味の範囲を超えない
328デフォルトの名無しさん:2012/01/08(日) 14:22:21.07
まあ実際C++トランスレータでは仮想関数やclassは楽々実現出来るんだけどな
とにかくvtableの部分がまともにソース上に出てきているので危険極まりない
どんなイタズラをされるか分かったもんじゃない
329デフォルトの名無しさん:2012/01/08(日) 14:26:09.53
>>325
>Qがコテを外して必死です
被害妄想乙
330デフォルトの名無しさん:2012/01/08(日) 14:33:39.13
>>329
ようQ
お前はC言語だけ触ってろ
C++は素人同然
331デフォルトの名無しさん:2012/01/08(日) 14:37:15.78
>>330
Qにやっつけられた恨みって怖いね?
332デフォルトの名無しさん:2012/01/08(日) 14:43:14.06
>>331
やっつけられた事は一度もないが?
Qが醜態を晒して馬鹿みたいに見えた事は何回でもあるけど
333デフォルトの名無しさん:2012/01/08(日) 14:47:56.07
>>332
その馬鹿にやっつけられた馬鹿がいてね。
すっごい粘着なんだ。醜態ばかり晒してる。
今でもいるんじゃないかな?
馬鹿みたいに見えるなんてものじゃなく、馬鹿そのもの。
334デフォルトの名無しさん:2012/01/08(日) 14:49:08.28
香ばしいなお前ら。。
335デフォルトの名無しさん:2012/01/08(日) 14:52:15.07
>>332
自覚もないんだ‥‥‥
336デフォルトの名無しさん:2012/01/08(日) 14:55:01.28
>>328
吐き出したコードなんて見ないだろ
プリプロセス済みコードと同じだぞ
C++のコードを書き換える度処分されるんだぞ
337デフォルトの名無しさん:2012/01/08(日) 14:57:20.03
>>330
Q の C を認めるのか?頭沸いてない?
338デフォルトの名無しさん:2012/01/08(日) 14:58:42.01
setjmp()/longjmp()の存在が消えてなくなればいいのに
339デフォルトの名無しさん:2012/01/08(日) 15:14:24.18
>>337
QのCを認めちゃいけないな
ありゃ仕事でCをやってない素人のコードだとすぐに分かる
340デフォルトの名無しさん:2012/01/08(日) 15:43:43.72
てか2chのコードの大半が仕事じゃ使えんだろ
templateはおろか、ハンドリング目的のクラスすら作らせちゃもらえん
構造体の延長線みたいな使い方ばかりさせられるのが仕事
341デフォルトの名無しさん:2012/01/08(日) 15:46:11.86
vectorすら禁止だからなw
STLのアルゴリズムとか以ての外
342デフォルトの名無しさん:2012/01/08(日) 17:06:00.55
仕事レベルのコードを2chに書かれたら質問者も迷惑だろ。
343デフォルトの名無しさん:2012/01/08(日) 17:09:04.87
便所の落書きの横に、お前らのコードは云々って書き足す方もその程度ってことだな。
344デフォルトの名無しさん:2012/01/08(日) 17:19:44.27
つまり、ここでの話は仕事とは何の関係もないってことだね?
何でことさら「仕事」って言葉を使いたがるんだろうか?
345デフォルトの名無しさん:2012/01/08(日) 17:32:59.44
>>344
そりゃ無職の奴が書いたコードが一目で分かるからさ
Qみたいにな
346デフォルトの名無しさん:2012/01/08(日) 17:34:10.21
ステマ()
347デフォルトの名無しさん:2012/01/08(日) 17:34:22.18
企業内失業者も大して変わらないけどな
348デフォルトの名無しさん:2012/01/08(日) 17:50:30.21
>>347
いや全然違うから世間の見る目が

Qみたいに無職でしかも性格がねじれ切っていると、誰でも「あいつは変質者だ」と思う罠
349デフォルトの名無しさん:2012/01/08(日) 17:54:09.73
>>348
おまえが企業内失業者だからか?
無職と何処が違うんだ?
350デフォルトの名無しさん:2012/01/08(日) 17:55:42.00
Qにつきまとっている奴も、性格がねじ曲がった変質者だぞ。
351デフォルトの名無しさん:2012/01/08(日) 18:04:07.26
せっかくNGにしてるんだからQZって呼んでください。お願いします
352デフォルトの名無しさん:2012/01/08(日) 18:28:02.50
>>322
setjmp( ) / longjmp( ) でダメな理由は?
353デフォルトの名無しさん:2012/01/08(日) 18:49:46.93
>>349
給料もらってる
職質された時に堂々と仕事先を言える

無職とは違うんだよ
354デフォルトの名無しさん:2012/01/08(日) 19:09:17.93
職質は職務質問であって
職業を質問される事とは違うんだよ
355デフォルトの名無しさん:2012/01/08(日) 19:13:09.26
震災前

     /::::::::::::::::::::::::::::::;;::ノ ヽ;::\
    /::::::::;;;;;;;;;,,,;;...-‐''"~    ヽ:;::l
     |:::::::::::|    岡田 異音    |ミ|
     |:::::::/     ,,,  ヽ,、   '|ミ|  
     '|:::::::l    '''""   ゙゙゙゙`   |ミ|
       |:::::|.  ,,r ‐、   ,, - 、  |/
     ,/⌒|  ノ ・ _), (. ・ `つ|
     | (   "''''"    |"'''''"  | 
      ヽ,,.        ヽ    |
       |       ^-^_,, -、   |   
         |    _,, --‐''~    ) |  マニフェストもう守れない。どうしよう・・・・ 
         'ヽ  (   ,r''''''‐-‐′ / 


震災後

     |:::::::::/            |ミ|
     |::::::::|   ,,,,,    ,,,,,   |ミ|
     |彡|.  '''"""''   ''"""'' |/
     /⌒|  -=・=‐,   =・=-  |
     | (    "''''"   | "''''"  |  
     .ヽ,,         ヽ    .|  キリッ
        |       ^-^    |
   .     |     ‐-===-   |   大震災が起こったのだからマニフェストの破綻も致し方ありません
         ,\.    "'''''''"   / 
朝鮮民主党
     おわり
356141 ◆QZaw55cn4c :2012/01/08(日) 19:15:07.85
>>340,>>341
なぜ業務では、STL ですら使わせてもらえないのでしょうか?

>>353
もう気がすんだでしょう?そろそろあきらめたら‥‥‥。
357デフォルトの名無しさん:2012/01/08(日) 19:24:40.33
全員が使えるものでないといけないからな
358デフォルトの名無しさん:2012/01/08(日) 19:45:59.51
他の言語との最大公約数的な使い方ばかりさせられる
担当代わっても潰しが効くからだそうな
ただ、無駄だと思うがな。C++詳しくない人間が
C++を求められる案件なんてできない。
必然的にC++の案件担当者はC++経験者になる。
359デフォルトの名無しさん:2012/01/08(日) 19:46:54.53
変な相談所みつけた

http://nanndemosoudann.jimdo.com/
360デフォルトの名無しさん:2012/01/08(日) 19:49:25.16
参入障壁素晴らしい
361デフォルトの名無しさん:2012/01/08(日) 19:58:25.04
>>354
同じ事
無職だといろいろ質問攻めに遭うだろ

>>356
無職のジジイは就職しろよ
362デフォルトの名無しさん:2012/01/08(日) 20:24:02.52
C++のSTLは、サイズがでかくなったりする
363デフォルトの名無しさん:2012/01/08(日) 20:24:46.28
テンプレート
364デフォルトの名無しさん:2012/01/08(日) 20:27:08.69
STLはメモリの断片化が致命的
365デフォルトの名無しさん:2012/01/08(日) 20:28:56.33
>>362,364 何年前からタイムスリップしてきたんだw
366デフォルトの名無しさん:2012/01/08(日) 20:30:26.34
>>365
またいつものPC前提の人?
367デフォルトの名無しさん:2012/01/08(日) 20:31:03.26
テンプレのサイズなんて大して問題にならねえよ
単にジェネリックな使い方だと未使用テンプレートが
実体化されずむしろ軽くなることもある
テンプレの問題は他の言語ユーザが
うわっつらしか理解できない事。
368デフォルトの名無しさん:2012/01/08(日) 20:32:23.89
>>361
ジジイ、ジジイか
それじゃあお前は何だ、このガキが
俺はお前さんがこの世に落っこってくる前からコードを書いてんだ
369デフォルトの名無しさん:2012/01/08(日) 20:33:14.48
>>366
またいつもの組込みの人?
370デフォルトの名無しさん:2012/01/08(日) 20:35:17.93
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
371デフォルトの名無しさん:2012/01/08(日) 20:36:22.56
使い方次第でパフォーマンスは悪くならない。
たとえばファイルから改行区切りでvector<string>へ格納するのは効率が悪い。
ファイル内容が一度にメモリに乗せられるとして、char *bufやstring bufへ一括で読み込んでから
行頭のポインタをvector<char*>へ格納すれば読み込みも書き換えも速く済む。
372デフォルトの名無しさん:2012/01/08(日) 20:36:22.65
>>366
PCじゃないがRAMは32KBぐらいはある環境でしか仕事したこと無いな。
標準ライブラリは普通に使えるだけ使うが。

断片化が致命的ってのは、RAMが8KBとか4KBとか?
373デフォルトの名無しさん:2012/01/08(日) 20:39:05.03
そんな環境でC++とか・・・
Cかアセンブラだろ普通
374デフォルトの名無しさん:2012/01/08(日) 20:39:38.95
>>373
C++使うと何が変わると思ってるの?
375デフォルトの名無しさん:2012/01/08(日) 20:40:14.06
STLがメモリ容量を拡張するとき、工夫なくメモリ大移動を起こすから効率は悪い。
376デフォルトの名無しさん:2012/01/08(日) 20:44:17.23
メモリーが少なくてテンプレが重い重いって
言う人ってよく出てくるけど怪しいんだよな
まずJavaすら動かない環境なら大抵開発環境は
Cで提供中されるじゃん。
逆にJavaも実行可能な環境ならg++改造したような
C++環境が提供される。こういう環境だと
実行コードのサイズなんて微々たるもんで気にされないだろ。
377デフォルトの名無しさん:2012/01/08(日) 20:44:44.21
>>375
そりゃstd::vectorの話だな。
工夫が必要ならreserve()なりstd::dequeなり使う選択肢がある状況で
そんな効率の悪いことをしてるならプログラマの責任だろ。
378デフォルトの名無しさん:2012/01/08(日) 20:44:53.52
stringなどメモリ拡張するとき必要容量の倍を確保して、余裕を持たせて再確保を起こしにくくするだろ。
STLは必要容量の倍のメモリを消費する可能性があるというだ。
379デフォルトの名無しさん:2012/01/08(日) 20:48:03.11
なんでこいつPC環境の処理系で組み込み語ってんの
380デフォルトの名無しさん:2012/01/08(日) 20:48:10.79
>>374
コンパイラの改変が手前。っうか殆ど機能しないC++のために
コンパイラを保守すんのがオーバースペック。
381デフォルトの名無しさん:2012/01/08(日) 20:48:20.73
>>378
必要量が分かってるならそんなことする必要ないから、質の良い実装ではそんなことにはならない。
余裕を持たせた再確保が必要なのは push_back() だけ。計算量の要求のためね。

なんで"STL"とか十把一絡げにしたがるの?
382デフォルトの名無しさん:2012/01/08(日) 20:49:41.04
>>380
へぇそりゃ大変だね。でもそれって「普通」なのかい?
383デフォルトの名無しさん:2012/01/08(日) 20:50:11.49
組み込みだとよくある事
384デフォルトの名無しさん:2012/01/08(日) 20:51:21.67
そんな非効率なことしてないで、もうみんなg++使おうぜ・・・
385デフォルトの名無しさん:2012/01/08(日) 20:53:23.04
allocaterという概念がありましてですね、貴方の任意に沿ったアロケータ書けばいいじゃない。
386デフォルトの名無しさん:2012/01/08(日) 21:00:16.67
>>382
picやRX向けに作ってる
コンパイラベンダーの姿勢としちゃ普通だろ
C++も提供してるという変わり種も居るが
実装不十分でC++と呼べるもんじゃないし
387デフォルトの名無しさん:2012/01/08(日) 21:00:48.10
>>361
同じことってw
お前社会経験がないの?
388デフォルトの名無しさん:2012/01/08(日) 21:05:12.86
Embedded C++とかテンプレートないしな
389デフォルトの名無しさん:2012/01/08(日) 21:06:36.31
>>387
職質の内容に詳しい方が異常だと思うの
390デフォルトの名無しさん:2012/01/08(日) 21:11:28.62
>>389
職質って何だか位は誰でも知っているが。
職業に関しての質問だと思う人はまずいない。
391デフォルトの名無しさん:2012/01/08(日) 21:13:27.54
>>388
それだとSTLもいれれないじゃない。
392デフォルトの名無しさん:2012/01/08(日) 21:21:38.12
そもそも組み込み環境でテンプレをマトモに実装してる
とこ少ないからな、組み込み屋がテンプレの話に
食らいついて来る事自体変なんだよな
393 ◆QZaw55cn4c :2012/01/08(日) 21:22:49.61
>>388
embedded c++ は黒歴史
394デフォルトの名無しさん:2012/01/08(日) 21:24:15.65
>>390
職質って言う名前は知ってるけど、具体的になにを聞かれるかは知らないよ。
まあ、名前・職業あたりは聞かれると想像するが。
395デフォルトの名無しさん:2012/01/08(日) 21:24:38.70
STLはテンプレだけじゃなく
std::bad_alloc例外も前提だな
396デフォルトの名無しさん:2012/01/08(日) 21:25:59.43
>>394
俺もそんな感じ
職質されたことないと具体的な内容なんて分からないよね
397デフォルトの名無しさん:2012/01/08(日) 21:29:25.37
>>361 は無職で職務質問でひどい目にあったのだろう、がんばって就職してね
398デフォルトの名無しさん:2012/01/08(日) 21:30:03.26
むしろ>>387じゃないの?
399デフォルトの名無しさん:2012/01/08(日) 21:31:24.76
>>394
職業を聞かれることはないよ。
400デフォルトの名無しさん:2012/01/08(日) 21:34:21.45
>>399
経験者か
401デフォルトの名無しさん:2012/01/08(日) 21:40:06.40
おい自称貧困メモリプログラマはどこ行ったんだよ
リアルな話が出てきたからって職質で話題濁してんじゃねぇぞ
402デフォルトの名無しさん:2012/01/08(日) 21:51:15.77
>職務質問を適法に行うことのできる要件は、以下のとおり、警察官職務執行法2条1項に細かく定められている。
>1.異常な挙動その他周囲の事情から合理的に判断して何らかの犯罪を犯し、若しくは犯そうとしていると疑うに足りる相当な理由のある者
>2.既に行われた犯罪について、若しくは犯罪が行われようとしていることについて知っていると認められる者

職質する相手に、「お勤め先は?」なんてより、もっと重要な質問をするだろ。
403デフォルトの名無しさん:2012/01/08(日) 21:52:43.11
勤め先が犯行現場なんだよ
404デフォルトの名無しさん:2012/01/08(日) 22:02:53.71
>>403
職場内で失業してるの?
405デフォルトの名無しさん:2012/01/08(日) 22:17:42.55
昼間うろついてたらまず職業聞くと思う
406デフォルトの名無しさん:2012/01/08(日) 22:22:09.27
>>405
聞かれたの?
407デフォルトの名無しさん:2012/01/08(日) 22:28:53.23
スレ違いな話はよそでやってくれないか?
408デフォルトの名無しさん:2012/01/08(日) 23:38:31.66
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩

この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?

409デフォルトの名無しさん:2012/01/08(日) 23:59:41.06
ところでQは今PhenomU6とCore2Duoを使ってるらしいんだけど、CPU-Zのスクショを
貼れと言うと頑なに拒否するんだなよあww

嘘がバレバレですよQさん

まだPenVの850MHzで頑張ってるんだろ
見栄は良くないね
410 ◆QZaw55cn4c :2012/01/09(月) 00:06:18.77
411 ◆QZaw55cn4c :2012/01/09(月) 05:27:56.78
412デフォルトの名無しさん:2012/01/09(月) 09:08:01.63
テンプレはメモリーガー、メモリーガーって言ってた奴
結局どんな環境で開発してたんだ?
なんちゃって業界人くさいし、
せめてマイコンの種類とメモリー容量、
成果物の種別を書いてもらわんとな。
413 忍法帖【Lv=21,xxxPT】 :2012/01/10(火) 09:09:00.20
もうやだこの流れ
414デフォルトの名無しさん:2012/01/10(火) 09:40:13.07
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している

野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は
415デフォルトの名無しさん:2012/01/10(火) 18:15:27.41
どのスレに行っても害しかもたらさないQ
416デフォルトの名無しさん:2012/01/10(火) 19:00:29.37
また金魚とその糞かよ…
417デフォルトの名無しさん:2012/01/11(水) 00:24:49.64
金魚じゃなくて腐った水死体
418デフォルトの名無しさん:2012/01/11(水) 00:35:07.28
ソースコードのコメント欄に「おまんこ」って書いてチェックインしてみたい。
419デフォルトの名無しさん:2012/01/11(水) 00:37:46.05
やるだけならいくらでもできますよ?
その後のことは知らないけどね。
420デフォルトの名無しさん:2012/01/11(水) 00:59:51.93
デザイナーなかじまかおるは関係ないだろ
421デフォルトの名無しさん:2012/01/11(水) 04:41:02.69
>>418
DBのカラム名にしろ
INSERT INTO
422デフォルトの名無しさん:2012/01/11(水) 07:15:35.62
チェックインしてすぐにコメント修正すればいい
423デフォルトの名無しさん:2012/01/11(水) 14:18:37.72
         __________       |  見ろよ!                 |
       ./::::::::::::::::::ノ、ヽ     |  民主党支持者がいるよ!w  |
      ./:::::::;;;-‐‐''"´  |:::|     \____  ________/
      |:::::::|   。   .|:::|        ノ´⌒ V        _____
      .|::::/ ⌒   ⌒ ヽ:|     γ⌒´      ヽ,     / _____)
       |:::| /・\ /・\||    // ""⌒⌒\  )    | /        ヽ
げひひw .|´  ⌒_ ヽ⌒  |  .   i /   ⌒   ⌒ヽ )     | 〉 ⌒   ⌒  |
      .| :::⌒(__人_)⌒|    !゙   /・\ /・\i/      |/. /・\ /・\ヽ
⊂ ̄ヽ___ ヽ   \__| ⊂ ̄ヽ_ |  :::⌒(__人_)⌒⊂ ̄ヽ_ | ::::⌒(__人_)⌒:: |
  <_ノ_    ヽ_    _/ <_ノ_. \     \__|  / .<_ノ_ \ ´ \__|  ノ  い〜ひっひw
   
424デフォルトの名無しさん:2012/01/11(水) 19:04:45.66
listでvectorのようにreserve的なことをしたいのだけど解決法はあるだろうか

static list<sumapo<X> > XL;
static list<sumapo<Y> > YL;
static list<sumapo<Z> > ZL;

void Func(void) {

sumapo<X> x(new X);
sumapo<Y> y(new Y);
sumapo<Z> z(new Z);

XL.push_back(x);
try { YL.push_back(y); } catch(...) { XL.pop_back(); throw; }
try { ZL.push_back(z); } catch(...) { YL.pop_back(); XL.pop_back(); throw(); }

}

↑こういう処理があるんだけど、せっかくスマポにしたのにtry-catchが乱立してうっとおしい
425デフォルトの名無しさん:2012/01/11(水) 19:35:14.73
try-catchを一つにしてみた
size_t sizeX = XL.size(), sizeY = YL.size(), sizeZ = ZL.size();
try {
XL.push_back(x); YL.push_back(y); ZL.push_back(z);
} catch (...) {
if (XL.size() != sizeX) XL.pop_back();
if (YL.size() != sizeY) YL.pop_back();
if (ZL.size() != sizeZ) ZL.pop_back();
throw;
}
426デフォルトの名無しさん:2012/01/11(水) 20:17:07.40
spliceは例外投げないので

void Func(void) {
sumapo<X> x(new X);
sumapo<Y> y(new Y);
sumapo<Z> z(new Z);
list< sumapo<X> > tmpx(1, x);
list< sumapo<Y> > tmpy(1, y);
list< sumapo<Z> > tmpz(1, z);

XL.splice(XL.end(), tmpx);
YL.splice(YL.end(), tmpy);
ZL.splice(ZL.end(), tmpz);
}
427デフォルトの名無しさん:2012/01/11(水) 20:23:20.70
ついでにXL,YL,ZLをメンバーとしてまとめあげた一つのオブジェクトを用意すりゃいい
428デフォルトの名無しさん:2012/01/11(水) 20:25:25.15
なるほどサンクス
429デフォルトの名無しさん:2012/01/11(水) 21:08:43.03
>>425
分岐は増えるしきもちわるっ
430デフォルトの名無しさん:2012/01/11(水) 21:12:15.37
>>424
中身はどうでもいいが、
マクロ以外で全大文字の名前を使うな
全大文字は、マクロと他のシンボルが衝突しないよう
マクロのみで使うものと予約されてる
詳しくはハゲのFAQ読んでこい
431デフォルトの名無しさん:2012/01/11(水) 21:19:20.59
>>424
エラー復帰目的じゃないなら
全体をTryすれば良いじゃん
432デフォルトの名無しさん:2012/01/11(水) 21:55:09.11
>>430
余計なお世話だな
433デフォルトの名無しさん:2012/01/11(水) 22:03:39.63
>>430
MSの悪口はヤメロ
434デフォルトの名無しさん:2012/01/11(水) 22:07:38.76
MSはわざとやってる確信犯だからな
435デフォルトの名無しさん:2012/01/11(水) 22:21:03.90

800 自分:名無し募集中。。。[] 投稿日:2012/01/08(日) 22:00:50.04 0
AKBブーム捏造の裏

サウンドスキャンの売り上げでさえほとんどが業者の自社買い他社買いで
資金洗浄した金額がオリコンの枚数×CDの価格って感じかね
http://livedoor.blogimg.jp/dqnplus/imgs/f/f/fff69a26.jpg

436デフォルトの名無しさん:2012/01/11(水) 22:29:13.73
確信犯の使い方が間違ってる件。
437デフォルトの名無しさん:2012/01/11(水) 22:36:45.18
>>436
正しいと思ってやってるんだから
使い方おかしい分けじゃないと思う
438デフォルトの名無しさん:2012/01/11(水) 22:38:14.09
FAQさらっと読んだけど「予約」はされてなかったYO
単なる「慣習」だったYO
JISのサイトは見れない(くそっ!)から
規格票でどうなってるかは不明

http://www2.research.att.com/~bs/bs_faq.html
http://www.libjingu.jp/trans/bs_faq2-j.html
439デフォルトの名無しさん:2012/01/11(水) 22:42:12.71
いやでも

マクロは全部キャピタルで書いた方が良いと思う
つか、

マクロなんか使うな
440デフォルトの名無しさん:2012/01/11(水) 22:42:49.40
確信犯(確信犯罪)とは、「自分が行うことは良心に照らし合わせて正しく、周囲(社会)や政府の命令、議会の立法こそが
間違っていると信じて」行った犯罪である。本人は自らの正当性を確信していることがポイントであり、立法や命令に違犯
(「違反」ではない)しているとの認識を持っているかどうか、あるいは処罰を予想しているかどうかは関係ない。

「確信犯」という語は、「倫理的に非難されるべき行為を、意図的に行う」という故意犯罪や常習犯罪の意味で一般化して
用いられがちだが、これは誤用である。社会正義や良心といった内心の動機部分が確信犯を理解する上で重要である。
441デフォルトの名無しさん:2012/01/11(水) 22:43:51.97
規格上は特に予約とかされてない
442デフォルトの名無しさん:2012/01/11(水) 22:46:27.41
いい加減スコープ持ったマクロ規格に入れろよ糞標準委員ドモ
443デフォルトの名無しさん:2012/01/11(水) 22:50:32.37
>>442
テンプレート使え、カス
444デフォルトの名無しさん:2012/01/11(水) 23:29:51.31
マクロは出来る限り使うなと言う事なのだろう
445デフォルトの名無しさん:2012/01/11(水) 23:48:23.56
http://www2.research.att.com/~bs/bs_faq2.html#Hungarian

> Never use names with all capital letter (e.g., BEGIN_TRANSACTION)
> because that's conventionally reserved for macros.
> Even if you don't use macros, someone might have littered
> your header files with them.

規格上は知らんが、禿的には全部大文字の名前は
マクロのために予約されてるので使うなってさ

446デフォルトの名無しさん:2012/01/12(木) 00:00:34.44
規格上は知らんがと言う前に規格を読め
447デフォルトの名無しさん:2012/01/12(木) 00:07:56.32
C++では_で始まる名前と__を含む名前が予約されてたはず
448デフォルトの名無しさん:2012/01/12(木) 00:59:15.98
質問失礼します。
デザインパターンの勉強をしているのですが、
下記のコードがよく分かりません。
http://www.netobjectives.com/resources/books/design-patterns-explained/cpp-code-examples/chapter10/#10-3Client

●質問1
CircleとRectangleは、Shapeを継承していますが、
継承先でCircle::drawCircle()およびRectangle::drawLine()が純粋仮想関数にされています。
これらはShapeには実装があります。
継承先で純粋仮想関数としてオーバーライドするものをはじめて見たのですが
これによって何を実現することができるのですか?
使用不可にするために純粋仮想関数にしているのでしょうか?

●質問2
サンプルコードなので仕方が無いですが、
Factory::getShapes()はほとんど空です。
ここにはどのようなコードが書かれることを期待しているのでしょうか?

ちゃんとデータを入れて返してやろうと思って次のコードを書きましたが、
Circleが抽象クラスなのでうまくいきません。
Shape **myShapes = new Shape*;
 *myShapes = new Circle[10];
449デフォルトの名無しさん:2012/01/12(木) 01:00:32.72
長くなってしまって申し訳ありませんが、
よろしくお願いします。
450デフォルトの名無しさん:2012/01/12(木) 01:24:22.66
クラスのポインタ配列をreallocで動的に拡張して代入していきたいのですが、実行時に
0 [0xbf8ba364] size=12
1 [0xbf8ba364] size=12
2 [0xbf8ba364] size=12
3 [0xbf8ba364] size=12
*** glibc detected *** ./a.out: realloc(): invalid next size: 0x08776008 ***
と表示され、停止してしまいます。途中まではうまく動いているようなんですが、
どうしたらいいでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
class hoge { };
int main(int c,char** v)
{
hoge** p = NULL;
int i;
for (i=0; i<10; i++) {
if ( (p = (hoge**)realloc( p, sizeof(hoge*)*i )) == NULL) return 1;
printf("% 2d [0x%08x] size=%d\n", i, &p, malloc_usable_size(p));
hoge* ptr_hoge = new hoge();
p[i] = ptr_hoge;
}
free(p);
return 0;
}
451デフォルトの名無しさん:2012/01/12(木) 01:39:51.94
newとmallocを混ぜるな
452デフォルトの名無しさん:2012/01/12(木) 01:50:40.70
おいおい、C++なのになんでnewつこうとるんや
たこるぞほんまに
453450:2012/01/12(木) 01:51:28.49
>>450
ありがとうございます。ご指摘のとおり、以下のようにしてみるとうまく行きました。
- hoge* ptr_hoge = new hoge();
- p[i] = ptr_hoge;
+ *p[i] = hoge();
454デフォルトの名無しさん:2012/01/12(木) 01:53:22.29
newつかうのは、C#とJavaだけにしとけ
455450:2012/01/12(木) 01:55:26.10
>>452
すみませんでした。たこるのだけはかんべん

>>454
勉強になりました。肝に命じておきます。
456デフォルトの名無しさん:2012/01/12(木) 02:01:36.77
>>450
#include <vector>
class hoge { };
int main(int c,char** v)
try
{
std::vector<hoge> p;
for (int i=0; i<10; i++) {
p.push_back(hoge());
}
return 0;
}
catch (...)
{
return 1;
}
457デフォルトの名無しさん:2012/01/12(木) 02:08:00.50
>>447
グローバル スコープを持ち、_ で始まる名前
_ で始まり、その次が大文字の名前
__ を含む名前
の3種類か。グローバルは小文字も駄目だったんだな、知らなかった。
458450:2012/01/12(木) 02:13:25.61
>>456
ありがとうございます。std::vectorを一通り調べ使ってみて覚えることができました。
459デフォルトの名無しさん:2012/01/12(木) 07:11:11.38
>>447
あくまでコンパイラ屋のためにな
460デフォルトの名無しさん:2012/01/12(木) 08:23:17.01
>>448
他のサイトに変えたら?
そのサイトのコードが高尚すぎるのか
単に間違ってんのか分からんが、
デザパタの分かりやすい例なら他のサイトにも色々あるし、
他を調べて後で見直すのも手よ。

個人的には、不審な点が多々あるんで
単に間違ってるだけだと思う
461デフォルトの名無しさん:2012/01/12(木) 10:23:17.47
仮想関数の存在を忘れた訳じゃないです中身が空なんですよってことを後で読んだ人にアッピルするためじゃないかな
462デフォルトの名無しさん:2012/01/12(木) 16:09:02.20


2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた
463デフォルトの名無しさん:2012/01/13(金) 01:23:39.91
>>460,461
レスありがとうございます。
CircleとRectangleはそのまま使うものではなかったみたいです。
純粋仮想関数にしているのはCircleとRectangleを更に継承させるためのようです。
・質問1について
純粋仮想関数した方を使用不可にするのではなく、
されなかった方が使用不可になります。
Circleでいうと、Circleを継承したクラスではdrawCircleを実装しなければならず、
drawLineが使用不可になります。
Shapeを限定した使い方になります。
Shapeは一般的な「形」を定義した側面になります。
・質問2について
これも同じく、Circle、Recltangleを継承したクラスのインスタンスをnewすることになります。
ただしgetShapeはShape**なので、これを使うクラスからは
drawCircleを直接使うことはできず、drawのみ使うことができます。
drawの内容はCircleクラスにあるので、
インスタンスの型によってdrawの実装が与えられます。

Bridgeパターンを説明するよいコードだという印象を受けました。
464デフォルトの名無しさん:2012/01/13(金) 08:14:02.47
>>463
納得してるのに言う事でもないか知れないけど、
このサンプルは変だよ。
完全仮想関数によってCircleで有れば、
ShapeのdrawCircle実装が使われなくなる。
使おうと思えば使えるが、C++でも滅多に
使わない機能だし、それを読む人が使用することを
期待して書いてるとも考えられない。
なので、Shapeの内容はdraw関数以外存在意義がなくおかしい。

そもそもShapeにdrawCircleや、
drawLine、
myDrawingがあるのが変だし。
myDrawingはCircleとRectangleが個々に持ってりゃ済む。
465デフォルトの名無しさん:2012/01/13(金) 08:29:29.05
これあれだろ。デザインパターンで学ぶオブジェクト指向のこころに出てきた奴。
2つの描画システムDP1とDP2が存在していて、それぞれに円と四角形の描画機能が乗っかってる。
この2つのシステムを一つのインタフェースで使うために
アダプタとファサードとブリッジの3つのパターンを使う。
Circleクラスに純粋仮想関数があるのはそのため。

本書を読んでるとつるっと入ってくるけど、そうでないならわかりにくっ。
466デフォルトの名無しさん:2012/01/13(金) 08:59:11.27
段階を経て説明してくれるからな
467デフォルトの名無しさん:2012/01/13(金) 17:11:43.08
オブジェクトの差分を表現するクラスはどんなふうに書くの?
468デフォルトの名無しさん:2012/01/13(金) 20:23:14.38
class this_is_sabun{};
469デフォルトの名無しさん:2012/01/13(金) 20:38:58.28
class Diff_A_And_B{}:
470デフォルトの名無しさん:2012/01/13(金) 22:07:16.56
>>439
#ifdef __cplusplus
#error hasta la vista baby!
#endif
471デフォルトの名無しさん:2012/01/13(金) 22:12:12.20
例えば char bur[100] となる構造体を使って、この構造体に含まれる数字の
四則演算をするときに、小数を扱うにはどうしたらいいんでしょうか?

472デフォルトの名無しさん:2012/01/13(金) 22:17:06.71
どこが構造体なんだ?
473デフォルトの名無しさん:2012/01/13(金) 22:20:28.83
すいません、配列だったかも
474デフォルトの名無しさん:2012/01/13(金) 22:26:50.92
まず他人に分かるように詳細に説明してくれ
何がやりたいのか全く分からん
475デフォルトの名無しさん:2012/01/13(金) 22:38:03.58
nishio 90
yamada 68
shimizu 100
yoshioka 74
hosaka 28

のように名前と得点が書かれたテキストファイルがあって、この平均点を求めたいです
それでhttp://codepad.org/WHKCSHqPを元にしてコードをつくってみたのでが
テキストの得点部分が小数になるとどうも上手く機能しません。
いろいろいじってみたんですが結局できませんでした。
アドバイスお願いします
476デフォルトの名無しさん:2012/01/13(金) 22:43:03.16
>>471
文字型(char)の配列では、少数は使えません

477デフォルトの名無しさん:2012/01/13(金) 22:47:13.02
>>476
やっぱそこですか・・・
charを小数に変換するような関数使うんですか?
478デフォルトの名無しさん:2012/01/13(金) 22:49:11.86
なんで小数なのにintで受けてんだ
doubleで受けろよ
479デフォルトの名無しさん:2012/01/13(金) 22:51:24.67
>>478
貼ったのは元のコードでdoubleにしたりlfにしてみたんですがやっぱり上手くいきませんでした・・・
480デフォルトの名無しさん:2012/01/13(金) 22:58:12.03
intをdoubleにするだけで普通に動くけど
stdio.hとstdlib.hをインクルードはしてるんだろうね?
481デフォルトの名無しさん:2012/01/13(金) 23:00:59.64
atof()とかも知らんようなCがまだの童貞が、C++に入ってくるなよ。

atof()は、Anal to Fuckの略な、
482デフォルトの名無しさん:2012/01/13(金) 23:03:55.04
ああああああ、やっとできました!ありがとうございます
素人童貞ですいません
483デフォルトの名無しさん:2012/01/13(金) 23:15:13.00
>>481
手ほどきしてやれ
484デフォルトの名無しさん:2012/01/13(金) 23:28:22.58
>>470
アンダーバー付きならコンパイラ屋の領域だから
ユーザーは使えないし、小文字使おうが何使おうが問題ない
485デフォルトの名無しさん:2012/01/13(金) 23:57:33.02
野田改造内閣に早速疑惑浮上

@aritayoshifu 有田芳生
捜査当局が内偵を続けている農水疑惑。詳細な怪文書まで出回っている。3億円の
行方はどこに?

@minorucchu ジャーナリスト 田中稔
野田改造内閣を揺るがす、農水省3億円スキャンダルの怪文書。二人の議員名が浮上。
34分前 webから
https://twitter.com/#!/minorucchu/status/157687110562881537

鹿野と筒井らしい
自公は問責も視野に調査開始だって
486デフォルトの名無しさん:2012/01/14(土) 17:00:21.07
ユーザーは使えないし、
ユーザーは使えないし、
ユーザーは使えないし、
487デフォルトの名無しさん:2012/01/14(土) 17:25:39.26
>>486
使えないだろ。使っちゃいけない。
488デフォルトの名無しさん:2012/01/14(土) 18:12:31.09
ちょっと質問で悪いんだけど、
http://codepad.org/N8er8eMm
8行目が4,3,2,1,0,になって欲しいんだけどなんでこうなっちゃうか教えて欲しい
コピーコンストラクタが悪いんだろうけど何がおかしいのかわからなくて困ってる
489デフォルトの名無しさん:2012/01/14(土) 18:13:45.88
ところ構わず政治の話する奴は社会人失格
490デフォルトの名無しさん:2012/01/14(土) 18:51:01.55
>>488
デバッガとか使えばすぐ分かると思うが

× for(int i=0;i<size;i++){
○ for(int i=1;i<=size;i++){
491デフォルトの名無しさん:2012/01/14(土) 18:53:33.18
>>488
いろいろ突っ込みたいところはあるが、とりあえず動くようにした
http://codepad.org/eQBwEsze
492デフォルトの名無しさん:2012/01/14(土) 18:55:15.35
>>490
あーなるほど勘違いしてた
ありがとう
493デフォルトの名無しさん:2012/01/14(土) 18:58:56.43
>>491
突っ込み所満載でごめん
わざわざありがとう
494デフォルトの名無しさん:2012/01/14(土) 22:54:33.77
コンパイラ屋は「自らの領域」を守らないけどね
で、禿をしばきにでも行くのか? がんばれなw
495デフォルトの名無しさん:2012/01/15(日) 12:30:10.58
民主党が惨敗した参院選直前の政党支持率(2010年7月11日投票)

FNN 2010年7月4日
民主党 29.9% 自民党 16.3%
ttp://sankei.jp.msn.com/politics/policy/100706/plc1007060530003-n1.htm
ttp://www.fnn-news.com/archives/yoron/inquiry100705.html

マスコミに、ダマされるなよ。

496デフォルトの名無しさん:2012/01/15(日) 15:37:43.17
>>494
なんでpragmaとか使わず
拡張キーワード使うんだろうな
MSは死ねばいいのに
497デフォルトの名無しさん:2012/01/15(日) 15:47:46.56
#pragmaは文法上出来る事限られてるし
498デフォルトの名無しさん:2012/01/15(日) 15:51:51.72
>>497
omp みたいなやり方でいくらでも出来るじゃん
499デフォルトの名無しさん:2012/01/15(日) 15:54:40.72
ちゃんと先頭に __ つけてんだから処理系の好きにさせてくれ
500デフォルトの名無しさん:2012/01/15(日) 16:06:40.03
やだよpragmaみたいに他のコンパイラに持って行ったら
勝手に消えてくれる訳じゃないし
501デフォルトの名無しさん:2012/01/15(日) 17:28:30.03
その手のものに依存した処理は
どっちみち他のコンパイラにそのまま持って行けないんじゃないのか
あと#pragmaだと#defineに含められないのがな
(_Pragma演算子で解決はされるけど、
 _Pragma演算子の無いコンパイラに持って行けないな)
502デフォルトの名無しさん:2012/01/15(日) 19:22:16.97
pragmaってどういう英語から来てるの?
plug的なものを連想したが関係ないよね
503デフォルトの名無しさん:2012/01/15(日) 19:30:36.82
504デフォルトの名無しさん:2012/01/15(日) 23:54:54.27
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は

首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな

505デフォルトの名無しさん:2012/01/16(月) 16:11:18.68
条件分けして処理を行う場合、テンプレートを使ってうまい事書くことはできますか?
たとえば以下のようなコードで、Unko はクラステンプレートにせず、
処理部のみをテンプレート化する、といった具合です

struct Unko {
  void Func() {
    if(条件) 処理A;
    else 処理B;
  }
  処理A用データ dataA;
  処理B用データ dataB;
};
506デフォルトの名無しさん:2012/01/16(月) 16:13:22.73
template<bool b>
void Func() {
507デフォルトの名無しさん:2012/01/16(月) 16:13:54.63
if (b) A;
else B;
ってこと?
508デフォルトの名無しさん:2012/01/16(月) 16:26:14.33
>>506
条件は内部で生成でき、且つ外部では同じコードで記述したいため、Unko のみで操作できるのが望ましいです

>>507
そうです。
AやBは関数でもメンバ関数でも何でも
509デフォルトの名無しさん:2012/01/16(月) 16:45:03.71
テンプレートに渡せる引数は定数のみだが
条件は定数でいいのか?
510デフォルトの名無しさん:2012/01/16(月) 16:50:49.51
条件は非定数です
やはりテンプレート化するにはハードコーディングするしかないのでしょうか
511デフォルトの名無しさん:2012/01/16(月) 17:05:20.16
そらそうじゃろ。
512デフォルトの名無しさん:2012/01/16(月) 17:13:10.03
そうですか、そうですよね
513デフォルトの名無しさん:2012/01/18(水) 12:48:59.79
今まで
class X { static const whcar_t A = L"a"; };
ができると思っていたのですが CGG 4.5 だとリンク時に A
が無いと言われました。

whcar_t を int にするとリンクできたのですが static const
メンバ変数をクラス内で初期化できるのは int 型だけですか?
514デフォルトの名無しさん:2012/01/18(水) 12:56:03.11
intだけです
515デフォルトの名無しさん:2012/01/18(水) 14:25:45.62
そもそも型がまちがってるんじゃ
516デフォルトの名無しさん:2012/01/18(水) 15:04:24.74
>>515
すみません。whcar_t ではなく wchar_t でした。
>>514
bool を使用しているのをよく見かけるのですがそれは間違いでしょうか?
517デフォルトの名無しさん:2012/01/18(水) 15:11:47.02
くそVC++ではbool及びBOOLは中身intだからねー。でも規格違反。まぁ、マイコリソフトに何を言っても無駄。
518デフォルトの名無しさん:2012/01/18(水) 15:25:11.42
intに限らず整数型ならクラス内で初期化出来なかったっけ?
519デフォルトの名無しさん:2012/01/18(水) 15:25:21.71
>>516
L'a'の間違いじゃね?
520デフォルトの名無しさん:2012/01/18(水) 15:28:45.19
>>517
あれ?boolの規格は1Byte以上じゃなかったっけ?
しかも2008からは1Byteになってたと思うんだけど
521デフォルトの名無しさん:2012/01/18(水) 15:38:43.35
VC++5から既に1バイト
http://msdn.microsoft.com/library/tf4dy80a
規格違反だとほざくならちゃんと規格読めバカ


5.3.3 Sizeof
[Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.(69)]

69) sizeof(bool) is not required to be 1
522デフォルトの名無しさん:2012/01/18(水) 16:02:39.92
>>519
すみません。これも間違っていました。L"a" ではなく L'a' でした。
boost 1.42.0 のソースを見ても普通にクラス定義の中で
static const bool value = false のように初期化していますね。
523デフォルトの名無しさん:2012/01/18(水) 16:39:11.74
static const wchar_t A = L'a';
ならvcではコンパイルできた。
L"a"じゃintでもリンクの以前にコンパイルできないだろ。

よく見たらCGGってなんだ。
突っ込みどころが多くて釣りの練習に見えてきた。
524デフォルトの名無しさん:2012/01/18(水) 17:19:46.86
リテラル文字列と一般的なchar配列の区別ってつかないの?
525デフォルトの名無しさん:2012/01/18(水) 18:02:12.68
アドレスみてヒープ領域か判断すればいけるんじゃね
526デフォルトの名無しさん:2012/01/18(水) 18:32:51.49
>>523
すみません。CGG ではなく GCC の間違いでした。

以下のコードを g++ main.cpp でコンパイルすると undefined reference to `X::Y'
が出ますが、wchar_t を int に変えるとエラーが出ません。
----
#include <vector>
class X { public: static const wchar_t Y = L'a'; };
int main() {
std::vector<wchar_t> v;
v.push_back( X::Y );
return 0;
}
527デフォルトの名無しさん:2012/01/18(水) 18:43:39.17
だからintしか無理つってんだろが
528デフォルトの名無しさん:2012/01/18(水) 19:05:06.21
>>527
JIS X3014:2003 の 9.4.2 静的データメンバの 4 段落目に

静的データメンバが const 付き汎整数型又は const 付き列挙型の場合、
クラス定義内の静的データ宣言には、《定数初期化子》を指定することができる。

とあるので int 型以外でもできるのではないでしょうか?
529デフォルトの名無しさん:2012/01/18(水) 19:13:29.22
wchar_tが汎整数型だとは書いてない
530デフォルトの名無しさん:2012/01/18(水) 19:34:25.18
>>529
JIS X3014:2003 の 3.9.1 基本型の 7 段落目に

bool 型, char 型, wchar_t 型, 符号付き整数型及び符号なし整数型をまとめて、
汎整数型と呼ぶ。

とあるので wchar_t 型も汎整数型ではないでしょうか?
531デフォルトの名無しさん:2012/01/18(水) 20:05:08.67
v.push_back( wchar_t(X::Y));
532デフォルトの名無しさん:2012/01/18(水) 21:02:51.23
凡変数だろ
533デフォルトの名無しさん:2012/01/19(木) 01:16:00.80



 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける
534デフォルトの名無しさん:2012/01/19(木) 01:19:13.72
NHKか
535デフォルトの名無しさん:2012/01/19(木) 02:27:34.72
>>526
push_back() の引数 wchar_t const& で Y への直接の参照が使われてるから、
定義が必要になってる。

↓の定義を追加すればおk。
const wchar_t X::Y;

int にしてエラーが出なくなるのは、 push_back() の引数として wchar_t const& に
暗黙変換の結果が使われることで Y への直接の参照が使われなくなるからだね。
536デフォルトの名無しさん:2012/01/19(木) 10:10:33.24
>>535
なるほど。

仕様書をよく読んだら JIS X3014:2003 の 9.4.2 静的データメンバの 4 段落目の最後に

そのメンバは、それがプログラム内で使われるとき、やはり名前空間有効範囲内で定義し
なければならないし、名前空間有効範囲内の定義の中に《初期化子》を含んではならない。

とあるので、その static const 変数を使用するときは参照やポインタを得るかどうかに
かかわらず定義も追加しないとダメなようですね。
537デフォルトの名無しさん:2012/01/19(木) 12:31:29.57
ただ、その場合はコンパイル時定数ではなくなるから
かなり意味変わってくるんだがな。
538デフォルトの名無しさん:2012/01/19(木) 17:40:41.12
マクロをマスターしたいんですけど
なんでもいいのでマクロに詳しいやつ教えてください。
539デフォルトの名無しさん:2012/01/19(木) 17:46:49.36
マクロの極意を教えてやろう
マクロを使わずに書く方法を考えることだ
540デフォルトの名無しさん:2012/01/19(木) 17:54:10.15
gccのマニュアルにマクロについて書いてあるよ。
gcc拡張についても触れてるから注意ね。

プリプロセッサっつーかコンパイラのマニュアルが一番詳しいと思う。
541デフォルトの名無しさん:2012/01/19(木) 18:04:12.72
マクロマスターの終着点は、マクロ無しだ。
それを目指してマクロを大量に使うことから始めよう。
542デフォルトの名無しさん:2012/01/19(木) 18:27:15.02
使わない関数をソースから消さないで消去するときとかどうするんだ?
コンパイルしたら使わない関数のためにメモリーが消費されるんだぞ。
543デフォルトの名無しさん:2012/01/19(木) 18:29:18.97
ばーかそういう時はDLL使うんだよ
544デフォルトの名無しさん:2012/01/19(木) 18:30:48.15
定数とかは変数にしたほうが効率いいよな。static constの。
マクロだと定数はマジックナンバーと同等の感じで埋め込まれるから微妙すぎる。
545デフォルトの名無しさん:2012/01/19(木) 19:01:03.72
>>542
リンカーに削除してもらう
546デフォルトの名無しさん:2012/01/19(木) 19:28:06.80
enum と マクロは真の定数になるけどstaic constはならないんじゃなかったっけ?ぬんぱら。
547デフォルトの名無しさん:2012/01/19(木) 19:30:54.91
キャストして普通の変数にできるし
548デフォルトの名無しさん:2012/01/19(木) 19:56:19.20
>>546
7.1.5.1 The cv-qualifiers
2 An object declared in namespace scope with a const-qualified type has internal linkage unless it is explic-
itly declared extern or unless it was previously declared to have external linkage. A variable of non-
volatile const-qualified integral or enumeration type initialized by an integral constant expression can be
used in integral constant expressions (5.19). [Note: as described in 8.5, the definition of an object or subob-
ject of const-qualified type must specify an initializer or be subject to default-initialization. ]
549デフォルトの名無しさん:2012/01/19(木) 21:51:49.95
日本語でよろ
550デフォルトの名無しさん:2012/01/19(木) 21:59:11.40
constにstaticは要らん
551デフォルトの名無しさん:2012/01/20(金) 00:09:01.06
staticを外すと所属が変わるよ
552デフォルトの名無しさん:2012/01/20(金) 00:11:06.61
linuxでマルチプロセス間の同期がしたいのですが,
windowsのCreateEvent&WaitFor...Object的な
簡単なものはありませんか.
共有メモリにmutexとかセマフォを乗っけるしかないのでしょうか.
553デフォルトの名無しさん:2012/01/20(金) 00:26:54.11
554552:2012/01/20(金) 00:37:01.92
> 553
質問が適切ではなかったです.
起動順等が不定で,異なるアプリケーション同士のプロセス間通信が必要です.
あと,これらのアプリではそれぞれ別の仕事をしてるので,
プロセスを勝手に終了するわけにもいきません.
WaitforSingle…みたいに許可が出るまでsleepしたいのですが…
(各プロセス内ではマルチスレッドになっています^^;)
555デフォルトの名無しさん:2012/01/20(金) 00:49:01.80
556デフォルトの名無しさん:2012/01/20(金) 01:14:51.87
プロセス間ならパイプかソケット
557デフォルトの名無しさん:2012/01/20(金) 07:20:26.88
>>551
所属?
558デフォルトの名無しさん:2012/01/20(金) 08:05:42.97
>>557
グローバルの場合はconstだけでいいが
クラスメンバーの場合、staticを付けないと、
オブジェクトのメンバーとみなされ、
外部からアクセスできないし、定数扱いもされない。
559デフォルトの名無しさん:2012/01/20(金) 08:18:33.22
>>544
static constで定義したマジックナンバーが埋め込まれるのと
変数のアドレスというマジックナンバーが埋め込まれるのの
どっちが効率いいか考えてみろ。

static constはファイルスコープで初期化後変更できない変数なのか
コンパイル時定数なのか区別が付かないからめんどいな。
560デフォルトの名無しさん:2012/01/20(金) 08:36:05.99
“韓国大統領は人間のくず”

北朝鮮の国営メディアは、韓国のイ・ミョンバク大統領が、キム・ジョンイル総書記の死去後初めて、韓国軍の最前線の部隊を視察し、
北朝鮮に対する警戒を緩めないよう指示したことについて、「悲しみのなかにあるわが国の人民に対する許し難い冒とくだ」として、
大統領を「人間のくず」と呼んで厳しく非難しました。
http://www3.nhk.or.jp/news/html/20120120/t10015405461000.html
561デフォルトの名無しさん:2012/01/20(金) 09:29:28.77
>544も>559も何を言いたいのか判らない。
もしかして、static constな整数は定数と同じ扱いをされるから最適化によって消えることさえあるのを知らないのだろうか。
562デフォルトの名無しさん:2012/01/20(金) 11:00:36.69
>>561
>整数は定数と同じ扱いをされるから
されない場合があるのを知らないのか?

static const int hoge1 = 1 + 1;

のように書くとコンパイル時定数になって、アセンブリには2が埋め込まれる。

static const int hoge2 = func();

のように書くと、ただのconst変数になって、配列の添字などにも使えない。
アセンブリにはhoge2のアドレスが埋め込まれる。

>消えることさえある
どちらの場合も、数値が消えたらプログラムの動作かわるから、消えるわけないだろ。
563デフォルトの名無しさん:2012/01/20(金) 11:32:43.19
class Hoge {
 Hoge(int v) : v(v) {}

 const int v;
};
564デフォルトの名無しさん:2012/01/20(金) 11:51:32.89
>>544,550の頭をスリッパで叩きたい
565デフォルトの名無しさん:2012/01/20(金) 12:00:41.09
>>563 引数とメンバの名前がおなじでも、ちゃんと意図通りに動いてびっくり
566デフォルトの名無しさん:2012/01/20(金) 12:08:16.08
static const int foo = 1;
if (foo) {
...;
}
こんなのだと1は消え去るな。
567デフォルトの名無しさん:2012/01/20(金) 12:57:07.21
>>559,562
initialized by an integral constant expression が読めないバカはお帰りください
568デフォルトの名無しさん:2012/01/20(金) 13:29:37.72
constexprもっと広まれ
569デフォルトの名無しさん:2012/01/20(金) 13:50:10.60
C++11 なら constexpr 使えば const 変数がコンパイル時定数か実行時定数かなんてことは気にする必要がなくなる。
570デフォルトの名無しさん:2012/01/20(金) 16:13:22.08
VC++10はもちろんVC++11でも実装されない予定じゃなかったっけ?>constexpr
571デフォルトの名無しさん:2012/01/20(金) 16:19:07.50
VCは当分ダメだろうな
572デフォルトの名無しさん:2012/01/20(金) 17:48:42.36
2chにC++プログラミング実況スレとかないですか?
573デフォルトの名無しさん:2012/01/20(金) 18:15:43.40
>>570
まだまだいろいろ時間がかかりそうなんだな
ttp://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
574デフォルトの名無しさん:2012/01/20(金) 18:22:31.29
>>572
VIPにたまに立ってるよ。
575デフォルトの名無しさん:2012/01/20(金) 19:23:30.66
VisualStudioは次のWindows8で大幅に強化される.NETの方に大きく開発リソース咲いてるから
VCのC++2011対応は遅れ気味になるのも仕方ないんじゃないか、と。
代わりにC#はさらに使いやすくなって窓プログラム開発は一層のRAD化が進行すると期待される
576デフォルトの名無しさん:2012/01/20(金) 19:30:36.68
MSから見捨てられたWinForms
糞重いWPF
オワコンのSilverlight
Windows8でしか使えないWinRT
C#ってこんなんしかないんだけど
577デフォルトの名無しさん:2012/01/20(金) 19:58:47.14
>>570
clangとgccさえ対応してくれりゃ問題ない
いつまでゴミを使う気だ?
578デフォルトの名無しさん:2012/01/20(金) 20:03:43.09
gccさんもそろそろ隠居しないかな
579デフォルトの名無しさん:2012/01/20(金) 20:10:12.45
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?
580デフォルトの名無しさん:2012/01/20(金) 20:17:40.29
以下のスレを発見したのだが、停滞してるかも。

くだすれC++/CLI(初心者用)part2
http://toro.2ch.net/test/read.cgi/tech/1268613679/l50
581デフォルトの名無しさん:2012/01/20(金) 20:17:42.57
>>569
バカ言え
気にするからこそ使うものだよ
582デフォルトの名無しさん:2012/01/20(金) 20:23:28.16
やっぱり、現在の const は final に置き換えて、新しい const は関数とか何が書いてあっても
強引にコンパイル時解決 (できなければコンパイルエラー) にするべきだよ
583デフォルトの名無しさん:2012/01/20(金) 20:28:41.74
>>582
>強引にコンパイル時解決 (できなければコンパイルエラー) にするべきだよ
それがconstexprでは?
584デフォルトの名無しさん:2012/01/20(金) 20:38:33.10
何のために定数と不変変数を区別しなきゃならんのか解からん
定数になれるならなる、なれないなら、ならないって方が
テンプレートの融通が効くのに
585デフォルトの名無しさん:2012/01/20(金) 20:50:11.80
>>582
はやくC++11に来いよ
586デフォルトの名無しさん:2012/01/20(金) 21:38:03.49
>>580
ありがとうございます。
それとは別スレになりますが、VC++の質問板見つけたのでそっちいって質問してみます。
紹介有難うございます。
587デフォルトの名無しさん:2012/01/20(金) 22:13:41.39
C++の最新仕様ってもうみんな仕事で使ってんの?
588デフォルトの名無しさん:2012/01/20(金) 22:47:13.83
>>558
ああ、メンバの時の話ね
そらそうだわ
589デフォルトの名無しさん:2012/01/21(土) 01:34:37.14
>>581
constexpr 理解できてる?
コンパイル時定数は constexpr,実行時定数は const を使う、と明確に使い分ければ
const int i = func(); // コンパイル時定数? 実行時定数?
↑のような文脈依存の違いを気にする必要がなくなるってこと。
constexpr int j = func(); // コンパイル時定数

ちなみに上の例の i は、func() が constexpr 指定されていればコンパイル時定数、でなければ実行時定数になる。
590デフォルトの名無しさん:2012/01/21(土) 01:42:31.79
お前が文脈を理解してない
591デフォルトの名無しさん:2012/01/21(土) 01:47:15.28
誰も聞いちゃいないのに覚えたての知識を披露したがる人っているよね
592デフォルトの名無しさん:2012/01/21(土) 03:38:30.18
だってしょうがなーいじゃなーい。
ニートだもん。
うすっぺらい知識で上から目線になるくらいしか
自尊心保てないんだもーん。
ぷげらっちょー。
593デフォルトの名無しさん:2012/01/21(土) 09:26:08.03
const time_t hoge = std::time();
static const time_t piyo = std::time();
594デフォルトの名無しさん:2012/01/21(土) 10:24:33.67
time_t も std のにしようz
595デフォルトの名無しさん:2012/01/21(土) 22:03:50.17
>>589
ほう、では
const int i = 5;
は実行時定数なんだな?

constexprt と、その点で使い分けるんだったな
どうなんだ?
596デフォルトの名無しさん:2012/01/21(土) 22:04:40.63
>>589
ほう、では
const int i = 5;
は実行時定数なんだな?

constexprt と、その点で使い分けるんだったな
どうなんだ?
597デフォルトの名無しさん:2012/01/21(土) 22:45:19.79
どうでもいいけど、
const DWORD WM_MY_MESSAGE = WM_APP + 1;
が実行時定数になるのは勘弁して欲しかったな
#define から離れられない理由だった
598デフォルトの名無しさん:2012/01/21(土) 22:55:01.42
template <class T, T val> struct const_integer { static T const value = val ; } ;
typedef const_integer<DWORD, WM_APP + 1> MyMessage;

これでいいじゃん
599デフォルトの名無しさん:2012/01/21(土) 22:58:14.04
>>598
それswitchに食わせられるのかい?
600デフォルトの名無しさん:2012/01/21(土) 23:05:18.69
>>599
ったりめーだろ
常識だ
601デフォルトの名無しさん:2012/01/21(土) 23:09:55.51
間違ってたな
const DWORD WM_MY_MESSAGE1 = WM_APP;
const DWORD WM_MY_MESSAGE2 = WM_MY_MESSAGE1 + 1;
だった

いずれにせよ、switch に書けないのは問題だったな
602デフォルトの名無しさん:2012/01/21(土) 23:10:24.98
>>598
それ VC6 で通る?
603デフォルトの名無しさん:2012/01/21(土) 23:15:56.52
VC6とか最早C++でもなんでもないし。
604デフォルトの名無しさん:2012/01/21(土) 23:49:07.51
>>603
もはやじゃなくて昔の話をしてたんだが

あと、このコード VC2008 で通らないから何とかしてくれ

#include <stdio.h>
#include <windows.h>

const DWORD WM_MY_MESSAGE1 = WM_APP;
const DWORD WM_MY_MESSAGE2 = WM_MY_MESSAGE1 + 1;

template <class T, T val> struct const_integer { static T const value = val ; };
typedef const_integer<DWORD, WM_MY_MESSAGE1 + 1> MyMessage2;

int main(void)
{
DWORD msg = 0;
switch(msg)
{
case WM_MY_MESSAGE1:
break;
case WM_MY_MESSAGE2:
break;
case MyMessage2.value: // C2226
break;
}
printf("%u\n", MyMessage2.value); // これは OK
getchar();
return 0;
}
605デフォルトの名無しさん:2012/01/21(土) 23:55:52.19
typedef const_integer<DWORD, WM_APP> MyMessage1;
typedef const_integer<DWORD, MyMessage1::value + 1> MyMessage2;

switch(msg) {
case MyMessage1::value: fack(); break;
case MyMessage2::value: fuck(); break;
}
606デフォルトの名無しさん:2012/01/21(土) 23:56:18.49
VC6とかVC2010とかは主にIDEを指す言葉だろ。
VC6のコンパイラにMSVCの最新コンパイラを使うことも可能では。やってはない。
しかしVC6まではコンパイラの内部バージョンも6で一緒だから違うかもしれんが。
VC6以降ではこのようにバージョンアップしてる。一部動作しなくなるかもしれないがコンパイラの基本的動作は変わってないはず。

Visual C++.NET2002 付属コンパイラバージョン7.0
Visual C++.NET2003 付属コンパイラバージョン7.1
Visual C++ 2010 付属コンパイラバージョン10.0
607デフォルトの名無しさん:2012/01/22(日) 00:30:07.96
enum {
 MyMessage1 = WM_APP,
 MyMessage2,
};
608デフォルトの名無しさん:2012/01/22(日) 00:31:17.61
> Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
> Copyright (C) Microsoft Corporation. All rights reserved.

えっ
609デフォルトの名無しさん:2012/01/22(日) 00:39:34.29
w
610デフォルトの名無しさん:2012/01/22(日) 00:39:59.85
>>608
MS-Cからの通し番号


Visual C++の製品バージョンは、バージョン6.0までは内部バージョンと同じ番号が付けられていたが、
2002以降は内部バージョンではなくリリース予定年を冠するようになった。
なお、Visual C++にはコンパイラのバージョンを表す _MSC_VER というプリプロセッサ シンボルが存在するが、
これはVisual C++の前身であるMS-DOS用C/C++コンパイラ(通称MS-C)からの通し番号となっており、
コンパイラ本体である cl.exe のファイルバージョンを表している。
(このようにユーザーを混乱させかねない複数のバージョン表記は、Windowsと共通するものがある。)
Microsoft Visual C++ - Wikipedia
611デフォルトの名無しさん:2012/01/22(日) 00:42:17.81
>>606
VC6 とか VC2010 とかは主にコンパイラの名前だろ
VC6 でコンパイルしろとか、よく言うだろ
その時 CL.EXE のバージョンが違ってたら 「VC6 でコンパイル」 の意味無いだろうよ
それとも、普通は 「Visual C++ 6 付属コンパイラバージョン6.0 でコンパイル」 とでも言うのか
IDE を指すのは VC じゃなくて VS だと思うが
612デフォルトの名無しさん:2012/01/22(日) 00:43:33.86
>>608
VC6で同じ表示をしてみればver 12.0くらいになってるはず。


Visual C++ 6.0 製品バージョン 6.0 内部バージョン 6.0 _MSC_VER 1200 リリース 1998年
Microsoft Visual C++ - Wikipedia
613デフォルトの名無しさん:2012/01/22(日) 00:47:19.75
>>611
いやそれは統合環境、製品名だよ。
VCではコンパイラだけすげ替えるやつが滅多にいないだけ。
他では、コンパイラとIDEは別個で、コンパイラだけ入れ替えとか普通にできる物もある。
614デフォルトの名無しさん:2012/01/22(日) 00:51:14.02
Windows SDK 、Platform SDKでコンパイラ本体だけをインストールできるが
そのコンパイラ名をVC2010などとは言わないだろ。
615デフォルトの名無しさん:2012/01/22(日) 00:57:40.86
Microsoft Visual C++ Compilers 2010 Standard - enu - x86
616デフォルトの名無しさん:2012/01/22(日) 10:07:04.74
GCC環境とVC++環境で切り替えたいコードがあるため、
GCCであるのか、またはVC++であるのかをマクロによって判断したいと思うのですが、
そのようなマクロはありますか?
例えば、_VCPP_ 、_GCC_ のような。

よろしくお願いいたします。
617デフォルトの名無しさん:2012/01/22(日) 10:16:30.03
_MSC_VER
618デフォルトの名無しさん:2012/01/22(日) 10:29:52.09
__GNUC__
__GNUG__ (C++で使ったときに定義)
619デフォルトの名無しさん:2012/01/22(日) 11:31:50.64
boostのヘッダとか見ると詳しいな
620デフォルトの名無しさん:2012/01/22(日) 11:37:07.63
flacのタグの取得の仕方教えろください
621デフォルトの名無しさん:2012/01/22(日) 13:35:23.84
libFLAC++使えよ色々と捗るぞ
622616:2012/01/22(日) 16:33:49.34
>>617
>>618
ありがとうございます。
623デフォルトの名無しさん:2012/01/22(日) 17:04:22.52
こういう言語仕様外の知識を集めた本とかないのかな
624デフォルトの名無しさん:2012/01/22(日) 19:03:28.01
業種によって求められる知識が違いすぎるからなあ
http://d.hatena.ne.jp/gothedistance/20120122/1327208557
富士通、余剰SE変身作戦
富士通がグループで抱える約3万人のシステムエンジニア(SE)の大がかりな職務転換に乗り出した。
一つのシステムを複数の企業などが利用するクラウドサービスがこのまま普及すれば、顧客の要望を
聞いて個別システムを作り込むSEは仕事がなくなり、余剰人員問題が顕在化するからだ。野副州旦元
社長の急進的な改革路線を修正した富士通はSE余剰問題で軟着陸を目指すが、クラウドの奔流にの
み込まれる危うさもはらむ。

--
↑クラウドのせいでSE三万人が職務転換だってよ。
自分の見る目の無さを恥じろ!
626デフォルトの名無しさん:2012/01/22(日) 19:24:42.26
>>625
すごい誤爆したわ。
すまん。
627デフォルトの名無しさん:2012/01/22(日) 19:27:07.97
この業界って頑張れば頑張るほど全体の仕事少なくなっていってね?
628デフォルトの名無しさん:2012/01/22(日) 19:28:23.41
クラウドって自社の機密リソースを他社サーバに保管するシステムの事でしょ!
629デフォルトの名無しさん:2012/01/22(日) 19:30:56.49
クラウディアちゃんかわいすぎる
630デフォルトの名無しさん:2012/01/22(日) 19:33:53.60
それは外部データサーバ
クラウドってのは機密を外部が指定したフォーマットに整形して渡し外部がこねくり回す仕組み
631デフォルトの名無しさん:2012/01/22(日) 19:46:58.91
例えばGmailのメールの中身はローカルには置かれとらんで
632デフォルトの名無しさん:2012/01/22(日) 20:10:19.96
クラウド関係なし。
そういう名目で余剰人員整理なだけ。
いままでも既製品のマイクロソフトオフィスとかが存在していて
それを使う企業ではソフト開発は必要なかった。
クラウドのGoogle docsに切り替えたところで、シェアには差はない。
ソフト開発を必要とする会社ではクラウドが進んでも依然として必要。
633デフォルトの名無しさん:2012/01/22(日) 20:13:09.08
そう考えると大幅削減になるのは、サーバーの保守・点検をしている人では。
これがクラウドになれば要らなくなる。
ソフトウェア開発者はたいした被害はないだろう。
634デフォルトの名無しさん:2012/01/22(日) 20:55:55.54
プログラミングとサーバーの保守・点検を兼務しているおいらが来たよ
635デフォルトの名無しさん:2012/01/22(日) 20:57:38.55
従量制課金になったらクラウドなんて海のもずく
636デフォルトの名無しさん:2012/01/22(日) 21:21:32.82
ロックインしたら値上げだよー
637デフォルトの名無しさん:2012/01/22(日) 21:23:23.39
日本ではオンラインの需要はもうなくなるよ
政府がネット潰そうとしてるからね
638デフォルトの名無しさん:2012/01/22(日) 21:54:13.81

就活中
(p)http://livedoor.blogimg.jp/jin115/imgs/3/1/31a6f8e6.jpg

就職後
(p)http://livedoor.blogimg.jp/jin115/imgs/2/b/2b790359.jpg

街の人(やらせ業者)募集中です

639デフォルトの名無しさん:2012/01/23(月) 04:05:23.64
ロベール読んでいたら以下のコードに出会ったのですが…

int iostream::* null = 0;
cout << (ptrdiff_t&)null << endl;

これは、ヌルポインタは必ずしもアドレスが0にはならないよっていう
確認のコードのようですが、キャストの部分(ptrdiff_t&)の&はどういう
意味ですか?こんなキャストは見たことありません。普通にアドレスを
表示させるなら(ptrdiff_t)で良いような気もしますが、&を取るとエラーが
出てしまいますね。
640デフォルトの名無しさん:2012/01/23(月) 04:06:44.00
参照
641デフォルトの名無しさん:2012/01/23(月) 04:36:40.74
参照型にキャストするってのはどういうこと?
642デフォルトの名無しさん:2012/01/23(月) 04:52:50.86
coutに対応したoperator overloadについてptrdiff_tのコピーを発生させずに引数に渡す事
643デフォルトの名無しさん:2012/01/23(月) 05:13:17.81
つまり&を外すとコピーを生成して引数に渡すんですよね?
しかし、このケースでそれをやるとエラーが出るのはなぜですか?
644デフォルトの名無しさん:2012/01/23(月) 06:01:23.79
>>639
式中に現れた null は(略)メンバへのポインタへの参照となる。

(略)メンバへのポインタから ptrdiff_t への変換は、エラーが出るとおり、
できない。

参照から参照へのCスタイルキャストなら、 reinterpret_cast と同様に大抵の
型を無視して変換できる。変換の結果を使って実際にアクセスしちゃうと、
そのコードを含めてほぼ未定義動作になるんだけどね。
645デフォルトの名無しさん:2012/01/23(月) 07:26:31.65
(ptrdiff_t&)null == *((ptrdiff_t*)&null)
646デフォルトの名無しさん:2012/01/23(月) 07:39:10.40
解説どうもです。
おぼろげながら理屈はわかったような気がしますが
完全に理解するには、もう少しC++の理解が必要だと
思いますた。
647デフォルトの名無しさん:2012/01/23(月) 07:39:21.98
メンバへのポインタから整数型への直接変換は
行えないと規格で決まっているから
環境によってはメンバへのポインタって多重継承や仮想継承の有無で
サイズが変わる事もあるし
648デフォルトの名無しさん:2012/01/23(月) 07:54:46.82
○○型の参照へのキャストというのは、対象値を無理矢理○○型で再解釈するというテクニックの1つということかな?
649デフォルトの名無しさん:2012/01/23(月) 08:55:11.67
未定義動作の結果をテクニックというのならそうかもしれない。
650デフォルトの名無しさん:2012/01/23(月) 12:48:43.74
std::mapにはstd::vectorにあるreserveのようなメンバは無いんですか?
あるいは代替する方法はありますか?
651デフォルトの名無しさん:2012/01/23(月) 12:54:05.72
>>650
>std::mapにはstd::vectorにあるreserveのようなメンバは無いんですか?
ありません
>あるいは代替する方法はありますか?
アロケータを自作して下さい
652デフォルトの名無しさん:2012/01/23(月) 17:23:30.28
>>651
比較演算子を向きを反対にしたコンテナを作成して
イテレータでコピーするしかないな

比較演算子が違う時点で別のコンテナとみなされるからoperator=も使えない
653デフォルトの名無しさん:2012/01/23(月) 21:36:57.20
mapをreverseって意味が分からない
reverse_iteratorで逆からアクセスすればいいだけじゃね?
654デフォルトの名無しさん:2012/01/23(月) 21:42:33.12
reverseじゃなくて、reserveな。
あらかじめ必要な領域を確保しておくこと。
655デフォルトの名無しさん:2012/01/23(月) 21:57:56.74
すまん
素で見間違えてた
656デフォルトの名無しさん:2012/01/23(月) 22:01:18.25
mapはノードを追加していく感じだからリザーブないんだろうな。
657デフォルトの名無しさん:2012/01/23(月) 22:03:11.49
>>604
マクロ以外を大文字だけで書くな。
お前や、MSみたいなマクロと、Cの識別子を
ごっちゃにする奴がいるから、
外部ライブラリの導入が面倒になる。
658デフォルトの名無しさん:2012/01/23(月) 22:10:00.24
>>614
Microsoft? C/C++ Optimizing Compilerが正式名称だよな
いまでも、コマンドラインから確認できる
659デフォルトの名無しさん:2012/01/23(月) 22:12:34.04
>>657
なんで面倒になるのさ
660デフォルトの名無しさん:2012/01/23(月) 22:22:38.96
>>656
単純にプールしておけばいいだけではあるけど
普通は削除するとメモリ開放して欲しいからねえ
プールするかどうかのフラグでもあればいいんだが
661デフォルトの名無しさん:2012/01/23(月) 22:27:11.93
このスレでなんどか出てたろ。
マクロと識別子が衝突すると、マクロが勝つんだよ。
んで、例え名前空間に識別子が入ってても問答無用でマクロが勝つ。
だから、マクロとの衝突を避けるために、マクロは全て大文字で書き、
識別子は、小文字を混ぜることがマナーになってる。言語設計者も、
絶対に識別子を全て大文字で書くのはヤメロと言っている。

この決まりを破ってトラブった有名な例に、MSのmin,maxマクロがある。
このマクロのせいで、std::min, std::maxを使ったコードが
コンパイルエラーを起こす。
662デフォルトの名無しさん:2012/01/23(月) 22:31:00.62
(std::min)(a, b) でいいだろ
663デフォルトの名無しさん:2012/01/23(月) 22:34:33.57
そういう問題じゃないだろ
そこまでして大文字で書きたいのか?
あと、boostとか外部ライブラリに飛び火してたら、全部直すのか?
664デフォルトの名無しさん:2012/01/23(月) 22:37:46.89
例としては不適切だろと言っただけ
665デフォルトの名無しさん:2012/01/23(月) 22:38:43.94
あっそ
666デフォルトの名無しさん:2012/01/23(月) 23:41:05.84
>>663
よくわかった。ありがとう。
667デフォルトの名無しさん:2012/01/24(火) 12:04:58.56
struct v{int x,y,z;};
v a=(v){0,0,0};

こういう書き方を見たのですが標準なんですか?
668デフォルトの名無しさん:2012/01/24(火) 12:22:59.67
(v)が気になるの?
キャストだよ。
explicitなコンストラクタではないので引数が合ってればキャストできるよ。
669デフォルトの名無しさん:2012/01/24(火) 20:15:44.70
いやいや
C99の複合リテラルだから
C++じゃ無理
670デフォルトの名無しさん:2012/01/25(水) 03:09:38.07
C++ 2011 なら v{0,0,0} でいけるだろ。
671デフォルトの名無しさん:2012/01/25(水) 07:01:02.50
デフォルトコンストラクタしかないから無理じゃね
672デフォルトの名無しさん:2012/01/25(水) 08:48:17.87
initializer_listを取るコンストラクタ持ってないと>>667って出来なかったような
PODだから出来るのか?
673デフォルトの名無しさん:2012/01/25(水) 18:52:31.99
C++の式じゃないって指摘もう出てるじゃん
c99や独自拡張を並存させて667 を通すコンパイラはあるけどさ
674デフォルトの名無しさん:2012/01/25(水) 22:16:51.99
下記の()内のようなvector型の配列を使っているのですが
(std::vector test[6][6][6]; このようなもの)
vector内の指定した位置の要素の値を書き換えたいときはどうすればいいのでしょうか?
普通なら位置の添え字を[]内に書けばいいと思いますが、配列の場合は単純に配列の添え字の後にもうひとつ[]をつければいいんですか?
例えば配列test[1][2][1]のvectorの13番目の要素ならtest[1][2][1][12]でいいんでしょうか?

675デフォルトの名無しさん:2012/01/25(水) 22:34:16.30
できるけどそんなコード書いた時点で終わってるな
676デフォルトの名無しさん:2012/01/25(水) 23:07:42.29
既存データ構造が配列だったの?大変だね。
お互い頑張ろう。
677デフォルトの名無しさん:2012/01/25(水) 23:29:20.16
こんなコードを見た瞬間に俺なら捨てて1から実装し直す。
678デフォルトの名無しさん:2012/01/25(水) 23:49:27.18
毎回128個のvector組み立てて壊してんのか・・・
スゲーコスト高なスコープだな
679デフォルトの名無しさん:2012/01/25(水) 23:50:45.70
216
680674:2012/01/26(木) 00:23:17.62
みなさんレスありがとうございます.
そんなひどいんですね、これ・・・
私が書いたコードではないんですが、私もこのひどさに気付かないほどの初心者です.

ちなみに一般的にvectorの集合を管理する場合はどういったものを使うのでしょうか?
681デフォルトの名無しさん:2012/01/26(木) 01:15:23.61
集合ってのが分からないけどvector<vector>とか、
要素数が変わらないなら配列とかreserve遣って決めうちにする。

データ構造を見直す。
3次元以上は使わない。
もちろん必要なら使うことになるが・・・
3次元テンソルでも扱ってんのかい?

きっとそれ遅いから計測してホットスポット見つけたりでアルゴリズムの見直しも必要だろう。
682デフォルトの名無しさん:2012/01/26(木) 01:34:12.90
実測しろ。基本的に実データをvectorに配置して更新すると遅い。
vector処理側ではメモリ大移動が起こりまくる。
683デフォルトの名無しさん:2012/01/26(木) 01:37:06.46
ベクトル使うならこれ使え。
C++行列ライブラリ Eigen
684デフォルトの名無しさん:2012/01/26(木) 07:22:36.37
多多次元配列を動的に確保する場合、
実際には一次元配列を確保して、
添字を自分で求めて使う場合が多いかな

std::vector<double> test(6 * 6 * 6 * size); と作って、
test[i][j][k][l] じゃなく、

inline int Index(int i, int j, int k, int l, int size) {
 return (((i * 6) + j) * 6 + k) * size + l;
}

とした上で test[Index(i, j, k, l, size)] と使う

return i * 6 * 6 * size + j * 6 * size + k * size + l;
とどちらが速いかは実測してくれ
(バラにした方が同時計算可能になるので速くなるかもしれないし、
 size が複数出ると遅くなるかもしれない)
685デフォルトの名無しさん:2012/01/26(木) 11:00:00.68
・・・まずstd::vectorがどういうものか理解していないんじゃね
686デフォルトの名無しさん:2012/01/26(木) 11:37:52.04
a=1, b=2みたいな文字列から1とか2を抜き出すsscanfみたいな操作ってC++だと何を使うべき?
687デフォルトの名無しさん:2012/01/26(木) 11:59:50.79
>>686
boost::spirit
688デフォルトの名無しさん:2012/01/26(木) 13:06:14.62
>>687
thx
689デフォルトの名無しさん:2012/01/26(木) 15:24:18.71
boost::spiritもそうだけどboost::lexical_castも必要じゃね?
690デフォルトの名無しさん:2012/01/28(土) 01:34:24.94
int xに対するint yの割合を計算する必要があるとき、何も考えずに
double r = static_cast<double>(x) / static_cast<double>(y);
って書いてたんですが、キャストを使わない方法なんてあります?

Casts really are mostly avoidable in modern C++.
というビャーネ先生からすると避けられるものなのかとふと思いまして。
691デフォルトの名無しさん:2012/01/28(土) 01:36:23.26
分数クラスを作る
692デフォルトの名無しさん:2012/01/28(土) 01:44:21.50
>>690 double r = 1.0 * x / y;
693デフォルトの名無しさん:2012/01/28(土) 02:12:55.83
そう思うと演算子に対する単元とかtraitsでほしいよねー。
694デフォルトの名無しさん:2012/01/28(土) 03:05:35.84
分数クラスはちょっと大げさすぎないすかね・・・。
1.0 * x / y はそれ明示してないだけでキャストしてるじゃないですかー。
とはいえどうもありがとう。

>演算子に対する単元とかtraitsでほしいよねー。
ほしいですね。あってもよさそうに思うけど無いって事はなんか問題
あるんでしょうけど。
695デフォルトの名無しさん:2012/01/28(土) 03:11:42.13
禅問答か
696デフォルトの名無しさん:2012/01/28(土) 03:13:09.16
アップキャストは安全だから無問題
697デフォルトの名無しさん:2012/01/28(土) 03:17:49.75
>>696
つキャストを使わない方法
698デフォルトの名無しさん:2012/01/28(土) 06:38:33.46
・インラインアセンブラで書く
・固定少数点で計算してからdoubleを作る
・xyと答えの変換テーブルを用意する
・xとy全組み合わせのif文を書く
699デフォルトの名無しさん:2012/01/28(土) 09:14:55.11
xとyの組み合わせのテーブルを作つっておく
r=d[x][y];
700デフォルトの名無しさん:2012/01/28(土) 12:17:33.92
発送の転換で
・x,yを最初からdoubleにする
701デフォルトの名無しさん:2012/01/28(土) 12:41:31.28
お前らってほんとに無駄な議論すきだよな
702デフォルトの名無しさん:2012/01/28(土) 13:35:28.60
重要な部分だと思うぜ
703デフォルトの名無しさん:2012/01/28(土) 14:16:52.51
初心者な質問ですみません.
string型で X = "文字列"; を格納し,
その文字列をif文に使うことってできますか?

たとえば本来
if(a>0 && b=0) というのを

std::string X="a>0 && b=0";
if(X) としても大丈夫ですか?
704デフォルトの名無しさん:2012/01/28(土) 14:24:31.78
大丈夫なわけがない
705デフォルトの名無しさん:2012/01/28(土) 14:29:11.35
stringじゃなくてインタープリタだったらいいんじゃないかな
706デフォルトの名無しさん:2012/01/28(土) 14:49:38.39
evalのある言語を使っとけ
707デフォルトの名無しさん:2012/01/28(土) 15:12:21.69
お前ら不親切だな。コンパイル型言語とスクリプトの違いから説明してやればいいのに。
俺は面倒だからやだ。
708デフォルトの名無しさん:2012/01/28(土) 15:35:49.81
>>703
そういう処理がしたいなら、文字列として入力された条件式を構文解析して解釈するコードを書かねばならない。
boost::spiritあたりで割と簡単に実装出来るっぽいからやってみたら?
709デフォルトの名無しさん:2012/01/28(土) 15:39:28.86
lua使おうぜlua
まじluaちゃんかわいい
710デフォルトの名無しさん:2012/01/28(土) 15:41:04.10
1.luaスレでやれ。
2.コンパイラ・スクリプトエンジンスレでどうぞ
 http://toro.2ch.net/test/read.cgi/tech/1296214398/
3.氏ね
711デフォルトの名無しさん:2012/01/28(土) 19:39:21.25
質問するバカは死ぬべき。
712デフォルトの名無しさん:2012/01/28(土) 21:00:09.17
>>690
少数桁(1の位置)を100とか1000という事にしとけば、
intだけでも小数点演算は出来る。

713デフォルトの名無しさん:2012/01/28(土) 21:21:11.20
オーバーフローを考慮すれば
余に限って適用すべきだな
714デフォルトの名無しさん:2012/01/28(土) 22:13:17.11
std::string型の"123"をint型に変換するにはどうすれば良いんでしょうか?
また、std::string型の"false"をbool型に変換するにはどうすれば良いんですか?
715デフォルトの名無しさん:2012/01/28(土) 22:15:17.93
>>714
boost::lexical_cast
716デフォルトの名無しさん:2012/01/28(土) 22:27:45.56
文字列から数値なら以下のものから好きなのを選べ
atoi
strtol
sscanf
istringstream
717デフォルトの名無しさん:2012/01/28(土) 22:47:45.99
>>715-716 ありがとうございます。

boolに変換することは不可能なんでしょうか・・・
718デフォルトの名無しさん:2012/01/28(土) 23:02:41.38
>>714
それ位自分で関数作れなくない?

bool Tobool (std::string str) {
if (str == "false") {
return false;
} else if (str == "true") {
return true;
} else {
return false; //バグ止め
}

標準関数にありそうな気もするが…
719デフォルトの名無しさん:2012/01/28(土) 23:06:02.59
連レスすまん
上のに1と0がきた時の処理もいれといたらより汎用的になるかもね。
720デフォルトの名無しさん:2012/01/28(土) 23:18:25.19
721デフォルトの名無しさん:2012/01/28(土) 23:43:56.55
>>720
boolまで解釈してくれるんだ
722デフォルトの名無しさん:2012/01/29(日) 00:01:33.90
ソースコード中にnewせずにクラスをインスタンス化したオブジェクトがあるんですけど
こいつも逐一削除したほうが良いんでしょうか?

こういったオブジェクトってdeleteじゃ消せないんですか?
723デフォルトの名無しさん:2012/01/29(日) 00:02:41.85
消したら死ぬぞ
724デフォルトの名無しさん:2012/01/29(日) 00:09:19.48
自動変数と同様にスコープから外れれば自動的にデストラクタが呼ばれて解放される
725デフォルトの名無しさん:2012/01/29(日) 01:14:11.81
>>724
あざっすw
726デフォルトの名無しさん:2012/01/29(日) 01:57:17.91
自動変数と同様にというか、自動変数そのものなんじゃないの?
727デフォルトの名無しさん:2012/01/30(月) 08:34:14.39
これで実は
Class *obj = Class.Create();
みたいなことだったりして
728デフォルトの名無しさん:2012/01/30(月) 11:14:12.70
>727がClass::Create()と言いたいのなら、
そいつを作った奴に聞けとしか。
729デフォルトの名無しさん:2012/01/30(月) 20:00:30.81
Class::Deleteを呼ばせる場合もあるしな
730デフォルトの名無しさん:2012/01/30(月) 20:03:08.20
シェアポ返せばNoMore悩み無用
731デフォルトの名無しさん:2012/01/30(月) 20:59:13.52
悩み無用がNoMoreなのか。大変だな。
732デフォルトの名無しさん:2012/01/30(月) 21:41:04.62
C++/CLIから使う場合はあまり役に立たない事もあるシャアポ
ref classではメンバに直接持てないのでシェアポをnewするという意味の無い事に
(自動変数として使う分には役に立つけど)
733デフォルトの名無しさん:2012/01/30(月) 22:26:22.25
>>728
いや単にクラスオブジェクトなんだろ。
734デフォルトの名無しさん:2012/01/31(火) 00:13:03.22
>>732
>シャアポ
シャア専用ポインタ?
735デフォルトの名無しさん:2012/01/31(火) 00:38:12.31
CreateServiceでサービス停止を制御するためのイベントを
非シグナル状態で作成しましたが、
その直後にイベントがシグナル状態になってます。

ほんとにCreateService直後にはシグナル状態になるんですが。
なぜでしょーか??
736デフォルトの名無しさん:2012/01/31(火) 00:57:47.86
C++の標準ライブラリにCreateServiceなんてあったか?
737デフォルトの名無しさん:2012/01/31(火) 23:49:14.73
>>735
スレ違いだし、そもそも「CreateServiceでイベントを作成しました」が意味不明。
738デフォルトの名無しさん:2012/02/01(水) 18:05:05.08
ふと疑問に思ったんだが、
setter,getterを書くのめんどくさくなったので、
BigData & getRef(){
return &mNum;
}
でよくね。大してめんどくささは変わらないか

メリット
publicよりはカプセル化してる
コピーのコスト化からない。

デメリット
使い方間違うといやらしいバグが起きそう

他に何かある?
739デフォルトの名無しさん:2012/02/01(水) 18:20:25.67
>>738
アドレス返してどうすんの?w
それはまぁ冗談として、値の範囲チェックとかが仕込みにくくなるんじゃないかな
740デフォルトの名無しさん:2012/02/01(水) 18:31:21.24
>>739
バグの特定がしづらいってのが最大にして最高の欠点だな。
セッターでチェックしてない関数が大半とはいえ、
この実装にすると、後々実装の変更もしにくいね。

あと結局、const メンバー関数も欲しくなるだろうから手間は変わらないか。
まあ、パブリックよりはましって程度か
741デフォルトの名無しさん:2012/02/01(水) 19:03:32.49
パブリックの方がまだましだろ
742デフォルトの名無しさん:2012/02/01(水) 19:36:39.49
>>738
オーバーライドを活かせないのが最悪。
743デフォルトの名無しさん:2012/02/01(水) 19:51:30.88
>>740
別にメンバ野ざらしでも拡張するのに問題はないでしょ
744デフォルトの名無しさん:2012/02/01(水) 20:04:32.35
>>743
getRefの中身を他のオブジェクトの関数呼出に
変えたくなったらどうすんの?
特にオーバーライドによって子クラスでの実装が違う場合。
745デフォルトの名無しさん:2012/02/01(水) 20:19:24.48
>>744
もっと具体的に何をどう変えたいのか
746デフォルトの名無しさん:2012/02/01(水) 20:27:21.45
Tの2次元配列から、T**への変換が失敗する理由を教えて下さい

どうして、↓の6行目でエラーになるんでしょうか?
どのように書けば(できればスマートに)、意図したとおりに動くんでしょうか。。
ttp://ideone.com/IDuWo
747デフォルトの名無しさん:2012/02/01(水) 20:39:31.33
>>746
理由はおまえさんが [] と * が同じだと思い込み強力なバイアスを持っていることだよ
C++ じゃなく C ネタだな
748デフォルトの名無しさん:2012/02/01(水) 20:50:24.33
>>745
getRefじゃ説明しづらいんで、
仮にGetPriceとしておく。
GetPriceをクラスAは、連想配列から値を取り出す形で実装する。
クラスBは、DBのレコードセットから値を取り出す形で実装する。

変数外出しじゃこんな事できん。
749デフォルトの名無しさん:2012/02/01(水) 20:57:22.66
単にDBと相性悪いだけでは?
750デフォルトの名無しさん:2012/02/01(水) 21:00:48.91
>>748
void Print(int i) ;

// 古いコード
struct Hoge {
int price ;
} ;

// 古いクライアントコード
Hoge hoge ;
Print(hoge.price) ;

// 新しいコード
struct IPrice {
virtual int Get(void) const = 0 ; // 継承して連想配列やDBを扱うように実装
} ;
class Price {
SP<IPrice> body ;
public:
Price(SP<IPrice> body) : body(body) { }
operator int (void) const { return body->Get() ; }
} ;
struct Hoge {
Price price ;
Hoge(void) : price(CreateDefaultPrice()) { }
Hoge(Price price) : price(price) { }
} ;

// 新しいクライアントコード(変更なしで動く。拡張は成功だ!)
Hoge hoge ;
Print(hoge.price) ;
751738:2012/02/01(水) 21:02:07.31
>>748
thx
すいません。そこまで考えてませんでした。
関数でラップしてある分だけ何か出来るってことか

自分が考えてたメリットとしてはコピー時のコストぐらいしか考えてなかった
752738:2012/02/01(水) 21:10:07.01
>>746
たぶん意図した実装と違うような?
ヒープでもスタックでもいいからメモリを確保してmemcpyだ

#include <iostream>

int main()
{
int ia[ 2 ][ 4 ] = { { 1, 3, 5, 7 }, { 2, 4, 6, 8 } };
int* ip;
ip=reinterpret_cast<int*>(ia);


for ( int i = 0 ; i < 2 ; ++i )
{
for ( int j = 0 ; j < 4 ; ++j )
{
std::cout << *(ip+i*j+j) << ' ';
}
std::cout << std::endl;
}

return 0;
}
753デフォルトの名無しさん:2012/02/01(水) 21:17:02.84
>>750
冗長なネタだなぁー
754デフォルトの名無しさん:2012/02/01(水) 21:43:47.24
>>750
Cash &operator = (const Base &source)
{
price = source.GetPrice();
label = source.GetLabel();
}

こういう関数がある時どうすんの?
テンプレートである程度何とかなるけど、
operator=が抽象化された関数だったら詰むよね。
755デフォルトの名無しさん:2012/02/01(水) 21:47:40.97
>>754
struct IPrice {
virtual int Get(void) const = 0 ;
virtual void Set(int value) = 0 ;
} ;
class Prince {
756デフォルトの名無しさん:2012/02/01(水) 21:50:01.92
SP<IPrice> body ;
public:
Price(SP<IPrice> body) : body(body) { }
operator int (void) const { return body->Get(); }
Price & operator = (int value) { body->Set(value) ; return *this ; }
} ;
// 以下略
757746:2012/02/01(水) 21:50:35.60
int ia[ 2 ][ 4 ]; をどのような配置で、コンパイラがスタックに配置するのか
一般的なルールはあるんでしょうか?

ia

ia[0] → ia[0][0] … ia[0][1] … ia[0][2] … ia[0][3]
 :
ia[1] → ia[1][0] … ia[1][1] … ia[1][2] … ia[1][3]

みたいな、配置とは異なる?
a[ i ] が *( a + i ) の糖衣構文である辺りが、妙に突っかかって分かりません…

int** ip = reinterpret_cast<int**>( ia );
した後に、逆参照するとセグメ違反で落ちるし、よく分かりません…

ia[ 2 ][ 4 ] ⇒ *( ia + 2 )[ 4 ] ⇒ *( *( ia + 2 ) + 4 )
ip[ 2 ][ 4 ] ⇒ *( ip + 2 )[ 4 ] ⇒ *( *( ip + 2 ) + 4 )

ia の型が int (*)[ 4 ] … 最も外側の添え字以外は固定
ip の型が int**

どうして、ia ⇒ ip の型変換が規格で許可されていないんでしょうか?
やはり、コンパイラによるメモリ確保とその配置ルールに関係があるんでしょうか…
758デフォルトの名無しさん:2012/02/01(水) 22:01:14.41
>>757
ttp://kmaebashi.com/programmer/pointer.html
の多次元配列見ればわかるかな
759デフォルトの名無しさん:2012/02/01(水) 22:01:48.43
>>752にバグがあることに気づく
jが4ね。
ia[2][4]とia[8]はメモリ上は同じだ

ここで聞くよりぐぐるか本見たほうが早いよ
760デフォルトの名無しさん:2012/02/01(水) 22:06:17.02
>>756
ん?どうやって使う気だ?
例えば下のコードはどう置き換わる?

Cash cash;
DBSource db(略);
MapSource map(略);

cash = db;
cash = map;
761デフォルトの名無しさん:2012/02/01(水) 22:09:47.33
int** ip = (int**)ia;
762デフォルトの名無しさん:2012/02/01(水) 22:13:46.73
>>757
int a[8];とメモリー上は全く同じ。
763デフォルトの名無しさん:2012/02/01(水) 22:18:45.74
>>760
struct ICash {
virtual void Set(DBSource const & db) = 0 ;
virtual void Set(MapSource const & map) = 0 ;
} ;
struct Cash {
Cash & operator = (DBSource const & db) { body->Set(db) ; return *this ; }
Cash & operator = (MapSource const & map) { body->Set(map) ; return *this ; }
// 以下略
764デフォルトの名無しさん:2012/02/01(水) 22:25:33.97
何が有難いのかわからん
765746:2012/02/01(水) 22:26:36.30
ttp://ideone.com/R8ENM

スタックに詰まれた2次元配列は、配列の配列として1次元状に並べられるんですね
だから、最も外側以外の添え字は固定じゃないといけないのか…

ia の型が、要素数4の配列へのポインタだから、a[ i ] と *( a + i ) の糖衣構文のうち
( a + i ) では sizeof(int) * 4 * i だけポインタが進むんですね

sizeof( ia ) == 20
sizeof( ip ) == 4

ここが、異なるんですね!

>>758
リンク先にある多次元配列の解説が、分かりやすかったです
ありがとうございます
766デフォルトの名無しさん:2012/02/01(水) 22:27:16.59
>>764
おとなになればわかる
767746:2012/02/01(水) 23:43:04.96
>>765 の一部訂正

std::cout の出力が16進のままになっていました
誤:sizeof( ia ) == 20
正:sizeof( ia ) == 32

int ia[ 2 ][ 4 ]; の ia の型は int (*)[ 4 ] つまり、要素数4のint型配列へのポインタ、なので
素直にこの型の変数を使うと、スマートに書けることに気づきました

初期の目的を達成できました!みなさんありがとうございます!

int (*)[N] とか int (&)[N] とかの使い道って結構おもしろいかも…

ttp://ideone.com/21MPf
768デフォルトの名無しさん:2012/02/01(水) 23:50:31.85
実際はa[x + y * width];てな手動管理の
2次元配列の使用が多くて、あんまり固定2次元は使わないけどね。
769デフォルトの名無しさん:2012/02/02(木) 14:45:33.84
数学のベクトルの内積なんですが

Vector3 v1, v2 ;
float dot = <v1, v2> ;

こういうオペレーターは定義できないんですか?
あるいはdot = (v1, v2);とか
770デフォルトの名無しさん:2012/02/02(木) 14:58:54.21
言語仕様的に無理だろ
771デフォルトの名無しさん:2012/02/02(木) 16:30:07.47
1月末で会社やめて、昨日一昨日からC++勉強して、再起を図るつもり。
C++ってどのくらいで就業できるレベルになるの?
前は社内のシステム管理とミドルウェアでエクセルいじっていた程度。
772デフォルトの名無しさん:2012/02/02(木) 16:42:28.93
いくら言語単体で覚えても開発未経験を中途では採らんだろ。
派遣でベテランと抱き合わせならわからんけど。
773デフォルトの名無しさん:2012/02/02(木) 17:07:54.38
年齢次第じゃね?若ければ第二新卒扱いで就職できるかも
C++覚えてる暇があったら就活した方が良さそうだけど
774デフォルトの名無しさん:2012/02/02(木) 17:32:13.58
そんなものか
つんだ、おわた、ってやつだな
775デフォルトの名無しさん:2012/02/02(木) 17:40:00.28
おれ、>>711

ベテランが年下になりそうだな。もう40間近だ。
障害者枠で採用してもらえないかと思っている。
合同説明会が来月あるからね。
21歳くらいからずっと病気を抱えていて、
去年良くなってきてようやく就業できた感じ。
776デフォルトの名無しさん:2012/02/02(木) 17:40:35.98
すまん、>>771 だった。
777デフォルトの名無しさん:2012/02/02(木) 18:52:16.73
>>771
C++使う所は大抵言語知識はC+クラスレベルでよくて、
数学知識やOSの知識を求めてる。
言語知識が有ったって
名前空間すら使わせてくれない環境にイラつくだけ。
778デフォルトの名無しさん:2012/02/02(木) 19:18:52.53
35までに上級職に昇格できてないと厳しいんだろ。
40の未経験のオッサンには向いてない。
もし才能あると思ってるなら、商業的な成功は別にして
フリーでもシェアでも良いから作ってアピールすれば。
ただし自分はプログラマーでない。
779デフォルトの名無しさん:2012/02/02(木) 19:31:29.07

プログラミング技術は進歩が激しく、技術の陳腐化も著しいため、常に新しい技術に目を向け習得していくバイタリティや、
場合によっては永年の努力によって培ってきた技術を捨て去る柔軟性が必要である。
また、年功序列的賃金体系のもとでは、高年齢のプログラマはコストが高すぎると考える企業がある。
俗にIT土方とも呼ばれデスマーチとなった場合は徹夜が続いたり体力が必要となってくる。

現在では経験豊かなプログラマにも一定の需要があり、プログラマ定年説はもはや過去のものとなっているが、
コストの観点からは、一定年齢に至ったプログラマに、より単価の高いシステムエンジニアや営業へ転向がすすめられることがある。

労働者たるプログラマ
如何なる職業に就いた経緯があろうとも、資本家によって頭数の一つとして利用されるがままに生涯を終える。
頭数として利用される立場である以上、プログラマ自身のアイデンティティに対する価値は最初から全く期待されておらず、
肉体の能力や精神的な意欲の低下が顕著となる30代後半以降の局面を以って職業を継続する事が困難な状況に陥る傾向がある。

本来は知的労働者であるべきプログラマが、そのアイデンティティを無視されたままに、年齢や怪我による主に肉体的な能力の低下を理由として
簡単に使い捨てられる日本の常識的な産業構造を揶揄する意味でIT土方という言葉や新3Kという言葉はあまりにも有名である。
プログラマ - Wikipedia
780デフォルトの名無しさん:2012/02/02(木) 19:37:12.19
>>777,778
わざわざ40間際のおっさんにありがとね。

コンピュータは好きなんだよね。飽きが来ない。
フリーソフト世界に飛び込むかな。死ぬまでの趣味として。

収入が必要なので、寒いけど郵便局の配達でもしているか。
乗りたいクルマナンバーワンのスカイラインとか、一生買えない・乗れないだろうな。

C++は使いこなせればかっこいいだろうなと思うから、
エリック・レイモンドが一にPython、二にJAVAと言っても、初めからC++で始めたわけですよ。

あと数学やOS(カーネルとかファイルシステムとかデバイスドライバかな?)が必要なら、また勉強か。
まあLinuxでもイジるしかないと思うけども、
Ubuntuとか仕掛けを見せないようにしているから、Debianでもインストールするかな。

長くなってすまない。御返事有難う。
781デフォルトの名無しさん:2012/02/02(木) 19:37:21.72
C++使いこなすような高度な仕事は
IT後進国の日本にはありません
782デフォルトの名無しさん:2012/02/02(木) 19:37:41.25
C++ ⇒ C言語 ⇒ アセンブラ と進むほど重労働になるのでないか。年齢いってたら逆方向の言語をねらっていけば。
783デフォルトの名無しさん:2012/02/02(木) 19:38:49.74
>>779
なんだか大学時代のアジ演説みたいだな。
784デフォルトの名無しさん:2012/02/02(木) 19:40:36.11
>>781
日本ってIT後進国だったのか。
ソフトのインターフェイスがださいとは思っていたが。
785デフォルトの名無しさん:2012/02/02(木) 19:40:56.55
>>782
それはその逆が進化の過程では?
786デフォルトの名無しさん:2012/02/02(木) 19:43:48.76
親戚が来て、思わず酒呑んだ。
ちょっとクラスまでは今日の勉強は進めないな。
787デフォルトの名無しさん:2012/02/02(木) 19:44:35.81
一部のPGを除けば職業PGになるのは不幸だよ
ほかの仕事探して趣味で書いてるほうが幸せになれる
788デフォルトの名無しさん:2012/02/02(木) 19:49:36.27
>>787
なるほどねぇ。趣味か。
プログラミングじゃなくて、ネットワークとかデータベースを狙うかな。
経験とかを問う前に、年齢聞かれそうだけども。
789デフォルトの名無しさん:2012/02/02(木) 19:52:15.75
職歴の方が問題だろ
スカイラインは宝くじで狙って下さい
790デフォルトの名無しさん:2012/02/02(木) 19:55:12.87
幸せになれる職業PGの仕事は
IT後進国の日本にはありません
791デフォルトの名無しさん:2012/02/02(木) 19:57:28.15
インドから出張、出稼ぎにくる技術者よりメリット無いと駄目だな。
792デフォルトの名無しさん:2012/02/02(木) 20:52:48.23
日本人がやることに意味のある仕事を知らないアフォは勝手に消えてくれ、そのほうが楽だ
793デフォルトの名無しさん:2012/02/02(木) 21:01:50.21
市場規模が小さくて外国企業が参入しないニッチな市場だけだろ
IT後進国の日本人が通用する仕事は
794デフォルトの名無しさん:2012/02/02(木) 21:22:27.45
自己紹介しなくていいよ
おまえのスコープは先刻見通したうえで言ってるんだから
795デフォルトの名無しさん:2012/02/02(木) 22:04:57.79
そもそも日本人がやった意味ある仕事なんてないだろ
796デフォルトの名無しさん:2012/02/02(木) 22:12:22.78
ですね
797デフォルトの名無しさん:2012/02/02(木) 22:13:42.43
どうせガラパゴス的な仕事だろ
世界的には何の意味もない
798デフォルトの名無しさん:2012/02/02(木) 22:14:05.12
FEP
799デフォルトの名無しさん:2012/02/02(木) 22:14:19.71
よく言われる半導体や車なども、別に日本がいなくても市場規模は同じだったし
実際、今のトップ3に日本は入っていない
たとえ日本が今すぐに消えてなくなっても、明日も世界は何も変わらない
800デフォルトの名無しさん:2012/02/02(木) 22:17:03.42
日本のニッチ市場でちょっと売れただけで
勘違いした人たちが海外に進出してたりしたけど
数年で日本に逃げ帰ってきてるよな
801デフォルトの名無しさん:2012/02/02(木) 22:18:21.15
半導体も車も過去には売れていた時期があったろ
ソフトウェアは一度もそういう時期がない
802デフォルトの名無しさん:2012/02/02(木) 22:19:07.38
ゲームもソフトウェアだろ
売れてるじゃん
昔は
803デフォルトの名無しさん:2012/02/02(木) 22:25:18.20
エロゲの海外ファンは確実に増えているが、売れる気配は全く無いな
804デフォルトの名無しさん:2012/02/02(木) 22:28:10.82
HENTAI外人は割れが基本だからなぁ
805デフォルトの名無しさん:2012/02/03(金) 03:20:45.73
どうも病気持ちです。
C++から始まって、業界情報を提供してくれてありがとう。

思うんですよ。学部は化学だったから情報とは関係がない。
じゃあ、技術をみっちり教えてくれるオーストラリア大学大学院留学とかどうかなって。
40間際ではもう無理だ、詰んだ・オワタ、社会の落伍者の貧困層で生きろとか言われるかもしれません。
学費・生活費も1000万かかるでしょう。

それで留学するカネがないのですよね。
前ネットゲームやっていた時に、人の嫌がる仕事を日に3件入れて2年で2000万貯めた人がいた。
その人は当時FXの種金2000万からスタートしたれしい。
俺にFXの種金はないけども、コンピュータをみっちりやりたいなぁ。
40間際にして人生賭けてみるか。
体を動かす仕事なら、気が楽で良いかなってね。。。
806デフォルトの名無しさん:2012/02/03(金) 03:47:55.76
オーストラリア大学って何ぞ?
コンピュータの勉強なんざ大学いかないでも出来ると思うけど
807デフォルトの名無しさん:2012/02/03(金) 03:54:20.96
ここ人生相談室ちゃうで
808デフォルトの名無しさん:2012/02/03(金) 04:46:45.96
というか
とりあえずsageろや
809デフォルトの名無しさん:2012/02/03(金) 06:12:54.30
>>805
宿題スレにすでに終わった奴がいるよ
勉強とやらをしてるみたいだが迷惑でみんな困ってる
いま暴れてる
810デフォルトの名無しさん:2012/02/03(金) 06:50:57.48
PC教室でパソコンマスターするぞと意気込む中年とおなじ原理だな。
811デフォルトの名無しさん:2012/02/03(金) 08:31:19.95
ぶっちゃけ、歳行ってから新たに始めようという時に、まず学校という人は、そこ以外で学ぼうとしてこなかった、学び方を知らない人間だろう
そんな人は、もう今世は諦めて、来世に学ぶしかない気がするわ

ネットも参考書も溢れてるこの時代、自分からやろうという気概のないやつに、新たなことが学べるかっての
812デフォルトの名無しさん:2012/02/03(金) 08:42:04.19
C++なんてtemplateとかメタい事をし始めるくらいまでは参考書とか定番書揃ってるんだから自力で勉強するのが一番早いよな……
813デフォルトの名無しさん:2012/02/03(金) 09:48:03.41
>>805
C++の設計者のホームページ見てみたら?
814デフォルトの名無しさん:2012/02/03(金) 11:38:19.62
>>805
海外の大学を金銭的な面で諦めるってことは英語できるの?
そっち方面で就職したら?
815デフォルトの名無しさん:2012/02/03(金) 12:43:57.89
>>812
C++だけ出来るようになってもしょうがないだろ
日本語覚えたら物書きで食ってけますか?ってのと同じだぞ
>>777の言うように言語以外の知識の方が重要なんだよ
ソフト作れと言われてから、下調べに何ヶ月もかかったり
分からないので作れませんでしたじゃマズイだろ。特に中途採用者は
816デフォルトの名無しさん:2012/02/03(金) 13:21:46.67
プログラマとしての実用レベルと、言語研究やコンパイラ開発のレベルは全く違うな。
817デフォルトの名無しさん:2012/02/03(金) 15:09:29.09
とりあえずThrun教授のネット講義でも受けてみたら
Pythonだけど
818デフォルトの名無しさん:2012/02/03(金) 21:17:24.62
if (x == 0 && y == 0) z = 0;
else if (x == 0 && y == 1) z = 2;
...
というひたすら条件を羅列する処理が続くのだけれど、
条件の抜け漏れが見つけにくいし良くないと思って、
map[make_pair(0, 0)] = 0;
map[make_pair(0, 1)] = 2;
z = map.at(make_pair(x, y));
としてみた。
ただ、この処理を行うオブジェクトが何度も生成されるので、
そのたびにmapが作成されるのは非効率だな、と。
mapをstaticにするか、とか短絡的に考えたんだが、一方で、

auto lambda = [&](int a, int b, int c) -> bool {
if (x == a && y == b) { z = c; return true; }
return false;
};
lambda(0, 0, 0) ||
lambda(0, 1, 2) ||
...;

というのを考えたんだが、どうだろうか?
なんか結局最初のif, else ifが一番見やすいような気がしてきて・・・
自分ならこうする、とかあれば是非お願いします。
819デフォルトの名無しさん:2012/02/03(金) 21:30:56.11
配列や関数のよびだしよりも、実値をifしたほうが高速。
多分岐するんだったら、自分はこれ使うが。

do {
if() { ・・・ break; }
if() { ・・・ break; }
・・・
} while(1);
820デフォルトの名無しさん:2012/02/03(金) 21:35:08.99
elseを何度もつづけたり、カッコの中にカッコがいくつも入ってくると自分はわかりにくい。
インデントも好きでない。
breakやらreturnを有効活用したら便利だ。
>>81の do { } while(1);全体を関数化して、分岐が確定したらreturnで戻すというのもある。
821デフォルトの名無しさん:2012/02/03(金) 21:38:40.64
>>818
コードをスクリプトで生成が正解
822デフォルトの名無しさん:2012/02/03(金) 21:43:14.01
xとyとzには、どの様な規則性があるの?
823デフォルトの名無しさん:2012/02/03(金) 21:44:30.54
変に工夫するより、if () else if() ・・・ってシンプルにやったほうが、
後で見たとき分かりやすいかもしれない。
824デフォルトの名無しさん:2012/02/03(金) 21:53:28.99
2次元の表をルックアップ出来ないの?
825デフォルトの名無しさん:2012/02/03(金) 21:53:48.49
うむ。 整数値に収まるなら
switch (x+y*X_MAX){
#define PAIR(a,b) a+b*X_MAX
case PAIR(0,0):break;
case PAIT(0,1):break; }
だな
826デフォルトの名無しさん:2012/02/03(金) 22:12:11.60
const int table[2][3] = {
 {
  1, // x=0 y=0
  5, // x=0 y=1
  3, // x=0 y=2
 },
 {
  9, // x=1 y=0
  2, // x=1 y=1
  6, // x=1 y=2
 },
};
int z = table[x][y];
827818:2012/02/03(金) 22:20:12.25
xやyは実際にはenumで、zもまた別のenumによるステータスコードです。
xがこの状態でyがこの状態ならzは「待機中」みたいな。
なので、xとyの値から一定の規則性に従ってzを自動計算させる、というのは
ちょっと難しいです。

819,820氏のシンプルさがやはり可読性の観点からも良いと思いましたので、
821氏指摘も加えてスクリプトで生成させることにしたいと思います。

825氏の方法はなるほどと思いましたがマクロはなるべく避けたいなぁ、
ということで・・・。

826氏のは・・・あとで拡張しようとしたときにtable[2][3]の部分の
変更ミスとかやりそうなので、自分にはまだ早いようです。

ともあれ皆さん色々と回答ありがとうございました。
828デフォルトの名無しさん:2012/02/04(土) 10:43:48.49
struct Hoge {
Hoge(/* 引数たくさん */);
};

// A
struct HogeEx : Hoge {
HogeEx(void) : Hoge(/* 引数固定 */) {}
};

// B
Hoge HogeEx(void) { return Hoge(/* 引数固定 */); }


Hoge hoge(HogeEx());


コンストラクタの引数を利用ケースに合わせて固定省略したい場合にはAとBどっちを使うべき?
829デフォルトの名無しさん:2012/02/04(土) 12:20:47.34
Hogeそのものは弄れんのか
830デフォルトの名無しさん:2012/02/04(土) 12:22:46.30
>>829
いじれるんですが
あくまで文脈に依存したパラメーターなのでHogeクラスには書きたくないんです
831デフォルトの名無しさん:2012/02/04(土) 13:14:34.76
B
どうせExのパターンが増えるんだろ
引数なしのコンストラクタは下手に意味を持たせるより未設定状態になるようにしたほうがいいんじゃないか?
832デフォルトの名無しさん:2012/02/04(土) 13:28:03.34
>>828
型である必要があるかを考えりゃいい

結果が型でないならジェネレータークラスでもいいし

class gen_hoge {
Hoge operator()();
あとわかるよな?
}
833デフォルトの名無しさん:2012/02/04(土) 14:45:16.46
コンストラクタである必要性ないよな
834デフォルトの名無しさん:2012/02/04(土) 15:37:36.46

{
ObjectManager om;
om.add(new Object());
om.add(new Object());
// 以下略
} // ObjectManagerのデストラクタでObjectをdelete

このように生成と破棄の場所が異なるようなコードは避けるべきなんですか?

{
Object o;
ObjectManager om;
om.add(&o);
}

みたいに書かれると問題ですし
そもそも、引数にnewを直に書くのが問題?
835デフォルトの名無しさん:2012/02/04(土) 15:57:38.05
あまり良くないね
それでは内部でdeleteしているという実装の都合で利用者にnewを強制してしまう
オブジェクトの寿命は外部で管理してManager内では削除する代わりにNULLポインタの代入か内部コンテナの縮小で済ませるべき
836834:2012/02/04(土) 16:26:16.21
>>835
ありがとうございます
やはりそうですよね。
ただManagerは、プログラム中にけっこう現れるので
できれば全部任せたいんですよね

そこで、
add(Object* obj) {
// list は list<Object*>
list.push_back(obj);
}

add(const Object& obj) {
// list は list<Object>
list.push_back(obj); // 代入
}
または
add(const Object& obj) {
// list は list<Object*>
list.push_back(new Object(obj)); // コピーコンストラクタ
}
にしてコピーするようにして
{
ObjectManager om;
om.add(Object());
}
のように利用するのはどうでしょう
コピーのコストがかかる場合が心配ですけど
837デフォルトの名無しさん:2012/02/04(土) 16:42:43.19
コンテナに元の型以外で突っ込む場合は、
あくまでも、参照させてやってるだけ
という捉え方が良いと思う。
役割によって複数のコンテナを用意し、
一つのオブジェクトを複数のコンテナに所属させる
なんてよくある事だから。
838デフォルトの名無しさん:2012/02/04(土) 16:47:19.62
>>836
そもそもObjectManagerってなにするクラスよ。
オブジェクト管理つって言われても、
どういう結果を得るために作ってんのか分からん。
839834:2012/02/04(土) 17:19:14.29
>>838
ObjectManagerというのは適当につけた名前で
実際はAnimationGraphicというクラス名です

役割として、画像とそのアニメーション(パラパラアニメ)を管理させてます
時間経過による変化を考慮して、描画すべき画像を返す。または描画する

管理しているオブジェクトについては、
画像:
画像。IDをつけてmapに入れてます(map<id,graphic>)
アニメーション:
どの画像をどのタイミングで切り替えるかを定義します。
今回の質問はこの管理。

アニメーション自体はAnimationGraphicクラスだけでしか
使われることがないと予想されるので、
アニメーションの仕方だけを通知させればよいと考えています(>>836 の add(obj))
840デフォルトの名無しさん:2012/02/04(土) 17:25:31.54
>>839
add(std::shared_ptr<Object> obj)
で寿命管理はシェアポに投げることを明示したらいかんの?
841デフォルトの名無しさん:2012/02/04(土) 17:28:30.17
そういう場合はモデルへの共有ポインタと姿勢・時刻をもたせて一つのオブジェクトにする
842デフォルトの名無しさん:2012/02/04(土) 17:38:17.50
ポインタを受け入れるインターフェースにスマポを使うのに抵抗感を感じる
管理クラスの実装の都合でスマポを使ってるだけなのにそれを利用者に押し付けて特定のスマポを強制するのがいやだ
>>837のようなケースで管理クラス間で使うポインタの互換性が厳しく制限されるのも困るし
843834:2012/02/04(土) 17:54:37.68
>>840
スマポは勉強中でして、よくわかってなかったので…
特に使ってはいけないわけではないので、検討してみます。

>>841
アニメーションは複数持つことができ、場面に応じて切り替えて使おうと考えています
同じ画像に対して、アニメーションが定義されることもあるので
結局 >>841 のオブジェクトでも管理が必要に感じるのですが
(といいますかAnimationGraphicがそれに当たるような)

解釈間違ってたらすいません。

844デフォルトの名無しさん:2012/02/04(土) 18:03:59.38
>>843
イマイチアニメーションがどう画像に作用するのか分からん。
アニメーション自体がどう言うものかも分からん。
アニメーションが画像に対する操作を格納しており、
多態によって操作を切り替え用途するなら
コピーしちゃいかんだろ。
あと、マップのidって誰が何をするタイミングで使うの?
845デフォルトの名無しさん:2012/02/04(土) 18:19:40.30
時系列でAnimationがAnimationGrphicsに格納されてて、
Animationが画像の入ったmapを参照してるとか?
846834:2012/02/04(土) 18:42:24.46
>>844
アニメーション(Animationクラス)は
listで 画像IDの変化パターン と 切り替えタイミング をもっている
変化パターン{3,4,5,6}切り替えタイミング{12,12,24,12}であれば

画像3―12fおいて→画像4―12f→画像5―24f→画像6―12f→ループ

画像とは直接やり取りはなく
AnimationGraphicが橋渡しに

anime.tick(); // 時間経過

// 描画タイミングで
int id = currentAnimation->getDrawGraphID(); // 描画すべき画像のIDを受け取る
Graphic* g = graphList.at(id); // 画像と結びづけて
g->draw(x,y); // 描画。または上の階層にGraphicを返す

アニメの切り替えは↑のcurrentAnimationに割り当てるだけで
多態性を使ったものは考えていなかったので
コピーしてもいいやと(保守、拡張性に乏しいですが)

847834:2012/02/04(土) 18:51:38.43
今思えば、Animationに画像(Graphic)の参照を持たせてもよかったのかも
無駄にIDで管理しようとしてますね
(あまりいろんな所で参照をもたせるのが嫌だったのでしょう)

出なおしてきます。
848デフォルトの名無しさん:2012/02/04(土) 19:00:20.65
メモリ管理を統合するか、メモリ管理をしないかまず決めろ。
stringなどは動的なメモリ管理するクラスだ。
849デフォルトの名無しさん:2012/02/05(日) 19:36:21.35
namespace AAA{
int bbb;
}
こんな感じのをグローバルで作った時に、これを他のファイルでも使いたいときは
extern namespace AAA;
でちゃんと中の変数が全部使えるようになるんでしょうか?
namespace AAA{
extern int bbb;
}
こっちみたいにするんでしょうか?
それともnamespaceはextern不要でしょうか?
850デフォルトの名無しさん:2012/02/05(日) 19:38:10.03
自分の想定する使い方ができるのかテストしろ
851デフォルトの名無しさん:2012/02/05(日) 19:48:12.58
namespace AAA{ extern int bbb; }
ですよ。
852デフォルトの名無しさん:2012/02/05(日) 19:51:26.90
何故試さないのか
間違えても爆発したりせんぞ
853デフォルトの名無しさん:2012/02/05(日) 19:53:13.08
知識として知っておきたいなら試しても無駄。
なんせC++の規格に合致するコンパイラなんかこの世に一つも存在しないから
己が今作っているプログラムで動けばいいというのなら試すのもひとつの手

でも、一番簡単なのはリファレンス読むこと
854デフォルトの名無しさん:2012/02/05(日) 20:00:21.92
ラムダクラスみたいなのがあればいいのに
855デフォルトの名無しさん:2012/02/05(日) 20:04:04.09
std::function<T>?
856デフォルトの名無しさん:2012/02/05(日) 20:05:05.68
>>853
どのコンパイラでもOSでも同一機能が実現できるように作成するといい。
857デフォルトの名無しさん:2012/02/06(月) 01:24:16.90
if (map.count(key)) process(map[key]);
と書いてきたんですが、

try {
process(map.at(key));
} catch(...) { }

のような記述の方がいいんでしょうか?
keyがmap内に存在しないことをロジック上想定していない、
というのであればまさしく「例外」だと思いますが、
keyがmap内にあってもなくてもいい、というのであれば
「例外」ではないような。
ロジック上の条件分岐を実現するのに例外を持ち出すのは
なんとなく間違った使い方な気がしていますが、どうでしょうか?
858デフォルトの名無しさん:2012/02/06(月) 01:43:19.43
>>857
何が例外で何が例外でないか、なんて基準は時と場合によるから人に聞いても無駄だよ。

その2択で言うと値が存在したときの効率は後者のほうがいいんだけど、
例外無しで同等の効率にしたければ find() を使えばいいわけで、おそらくそれが
一番やりたいことを素直に表現できるんじゃないかな?
859デフォルトの名無しさん:2012/02/06(月) 21:59:04.44
>>858
確かにfind使えば検索は一度で済みますね。
了解です。どうもありがとう。
860デフォルトの名無しさん:2012/02/08(水) 22:06:49.35
DWORD dwNumber = 0x00000000;
BYTE *pPtr = (BYTE*)&dwNumber + 3;
*pPtr = 0xFF;

(BYTE*)とか使ってて何か気持ち悪いです
良い書き方ありませんか?
861デフォルトの名無しさん:2012/02/08(水) 22:11:59.35
BYTE dwNumber = 0x00000000;
BYTE *pPtr = &dwNumber + 3;
862デフォルトの名無しさん:2012/02/08(水) 22:23:57.27
>>860
エンディアンに依存するような気持ち悪いコード書いてるからしょうがない、諦めろ。

>>861
それ、pPtr が全然関係ない情報指してたりするかもよ。
863デフォルトの名無しさん:2012/02/08(水) 22:33:28.71
っていうか、C++的になしだろ^^;
864デフォルトの名無しさん:2012/02/08(水) 22:47:37.13
BYTEがキモいのかCキャストがキモいのか
はたまたMSBを書き換えてるのがキモいのか
865デフォルトの名無しさん:2012/02/08(水) 23:02:30.24
static_cast
866デフォルトの名無しさん:2012/02/08(水) 23:05:00.57
まずリビルドって単語をぐぐってこいよ
867デフォルトの名無しさん:2012/02/08(水) 23:23:39.95
いきなり、どうした?
868デフォルトの名無しさん:2012/02/08(水) 23:26:38.58
float(a/b)と(float)a/bって同じなの?
869デフォルトの名無しさん:2012/02/08(水) 23:27:30.11
ちがうだろ
aの型による。
870デフォルトの名無しさん:2012/02/08(水) 23:34:39.56
>>860
匿名共用体おすすめ
union {
 DWORD d;
 BYTE b[4];
};
d = 0x00000000;
b[3] = 0xFF;
871デフォルトの名無しさん:2012/02/08(水) 23:35:21.08
なるほど
872デフォルトの名無しさん:2012/02/09(木) 00:12:42.14
そのunionあまり意味ないよ。
キャスト使いなさい
873デフォルトの名無しさん:2012/02/09(木) 00:14:22.70
気持ち悪いと思うことと同じ処理をしているのに
気持ち悪さが緩和されるのは怖いね。
874デフォルトの名無しさん:2012/02/09(木) 00:23:17.03
カプセル化しろよ胸糞悪い
875デフォルトの名無しさん:2012/02/09(木) 01:01:49.98
こういう時に共用体使うのは常道だろ?
876デフォルトの名無しさん:2012/02/09(木) 01:40:52.17
>>875
DWORDのサイズを確信してるなら意味ないね。
877デフォルトの名無しさん:2012/02/09(木) 01:44:45.12
共用体以外の方法で済むときはわざわざ共用体にしなくていい。
共用体が混ざると継承や委譲が発展していくうちに、
初期化子の書きにくさが後々余計な束縛になる。
C++でないならどうでもいいが。
878デフォルトの名無しさん:2012/02/09(木) 01:55:20.97
共用体は文字通りメモリ領域を共用したいときに使う
それ以外ではあまり使わない(使うことが全く無い訳でもない)
879デフォルトの名無しさん:2012/02/09(木) 01:56:36.63
>860
何がしたいのか分からんけど
dwNumberの特定のバイトだけを0xFFで埋めたいなら
dwNumber |= 0x0000ff00;
特定のバイトを任意の値(例えば0xa3)にしたいなら
dw = dwNumber & 0xffff00ff;
dwNumber = dw ^ 0x0000a300;

880デフォルトの名無しさん:2012/02/09(木) 01:59:29.82
[&](size_t a,BYTE b)->{assert(a<sizeof(DWORD));reinterpert_cast<BYTE*>(&dwNumber)[a]=b;}(3,0xff);
881デフォルトの名無しさん:2012/02/09(木) 05:29:51.06
何でこのスレはゴミしかいないの?
882デフォルトの名無しさん:2012/02/09(木) 05:34:37.01
むしろ外面重視のこれで
auto dw2b4=[&]()->char(&)[sizeof(DWORD)]{return*reinterpret_cast<char(*)[sizeof(DWORD)]>(&dwNumber);};
dw2b4()[3]=0xff;
883デフォルトの名無しさん:2012/02/09(木) 05:36:37.39
くだらない
884デフォルトの名無しさん:2012/02/09(木) 06:24:41.21
やっぱ括弧バカ言語だな
885デフォルトの名無しさん:2012/02/09(木) 07:15:36.40
>>878
確かに規格で動作保証はされてなかった気はするけど
実際には開発環境側がそういった共用体を提供していたりする
(レジスタ共用体やら、LARGE_INTEGER やら)
886デフォルトの名無しさん:2012/02/09(木) 08:28:46.51
だからなに?
887デフォルトの名無しさん:2012/02/09(木) 10:36:31.56
馬鹿には無理
888デフォルトの名無しさん:2012/02/09(木) 10:42:04.81
class my_uint32_t {
DWORD d ;
public:
my_uint32_t() {}
my_uint32_t(DWORD d) : d(d) {}
operator DWORD const & () const { return d; }
BYTE get(int i) { assert(0 <= i && i < 4); return (d & (0xFF << (i * 8))) >> (i * 8) ; }
void set(int i, BYTE b) { assert(0 <= i && i < 4); d = (d & ~(0xFF << (i * 8))) || (b << (i * 8)) ; }
} ;
889デフォルトの名無しさん:2012/02/09(木) 11:46:30.38
特定のnamespace内の型のみを受け入れるテンプレート関数を書くことは出来ますか?

namespace A { class Hoge {}; class Fuga {}; class Piyo {}; }
template <class X> void func(X const & obj);
// A::Hoge, A::Fuga, A::Piyo以外の型をエラーにしたい
// 実際には3つの型だけでなく非常に多くの型があるのでオーバーロードで解決することは難しい

890デフォルトの名無しさん:2012/02/09(木) 11:49:02.43
馬脚には無理
891デフォルトの名無しさん:2012/02/09(木) 12:04:46.68
>>889
funcをそのnamespaceの中に置けばいいんじゃないの

namespace N {
class X {};
template<class T> void func(T t) {};
}

int main(int argc, char **argv) {
N::X x;
func(x); // ok
func(0); // error
return 0;
}
892デフォルトの名無しさん:2012/02/09(木) 15:12:01.55
namespace A { class Hoge {}; class Fuga {}; class Piyo {};template<typename T>void ck_habitant_A(T&){} }
template <class X> void func(X const & obj){ck_habitant_A(obj);…};
893デフォルトの名無しさん:2012/02/10(金) 01:13:22.93
馬鹿には無理ゆうてるやつには無理なのはわかった
894デフォルトの名無しさん:2012/02/10(金) 03:29:05.26
日本語で
895デフォルトの名無しさん:2012/02/10(金) 09:26:28.52
初めてnamespaceを使ってみようと試行錯誤してるけど、
理解する能力が非常に欠落してる模様。

こんな事は出来ますか?
//B.cpp
namespace A{#include "a.h"}
namespace B{
B::B(){A::a();}
B::z(A::z());
}
896デフォルトの名無しさん:2012/02/10(金) 09:45:22.03
>>895
a.h
の中身は?
897デフォルトの名無しさん:2012/02/10(金) 09:58:03.46
//a.h
class a{
public:
a(){val=0};
int z(){return val+1;};

private:
int val;
protected:
};


同じ名前のメソッドがあった場合、どれを呼び出すかを
指示してやるのがnamespaceですよねぇ。。
898デフォルトの名無しさん:2012/02/10(金) 10:34:23.67
>>897
その中身は
> namespace B{
> B::B(){A::a();}
> B::z(A::z());
> }
となんら関係ないよねw

スコープの概念すら分かってないみたいだから
Cから始めたほうがいいかも
899デフォルトの名無しさん:2012/02/10(金) 10:35:56.13
ありがとうございます。
900デフォルトの名無しさん:2012/02/10(金) 19:58:34.56
すれ違いだったら、誘導してください。

#include <GameLib/Framework.h>
namespace GameLib{
void Framework::configure( Configuration* c ){
}
void Framework::update(){
}
}
void f(){
//int *p=new int;
}
void main(){}

エラー 2 error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
エラー 1 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に LIBCMTD.lib(dbgdel.obj) で定義されています。GameLib_d.lib(MemoryManager.obj)

コメント取るとエラーがでるんですが、何が原因と推測します?
後学のため教えてください。
ちなみに、リンカ→システム→サブシステム コンソールに変更した場合、コメント取らなくてもコンパイルできます。
/verbose:lib オプションで見る限り、両方ともLibcmtd.libはリンクしてると思うのですが…

再現させようと自分で何もしない void operator delete(void*);のlib作ったけど、再現出来ませんでした。
901デフォルトの名無しさん:2012/02/10(金) 20:03:30.12
C/C++→コード生成→ランタイムライブラリ
902デフォルトの名無しさん:2012/02/10(金) 20:04:20.47
>900
>コメント取るとエラーがでるんですが、何が原因と推測します?
間違えました。
コメントを取るとエラーが消えるんですが、何が原因と推測しますか?
903デフォルトの名無しさん:2012/02/10(金) 20:10:01.23
>>901
GameLib_d.libはマルチスレッドデバッグ(MTd)で作ってあって、合わせたほうがいいと思うのですが
MDDに変えると、
警告 11 warning LNK4098: defaultlib 'libcmtd.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。MSVCRTD.lib(cinitexe.obj)
やエラーが山ほど出てきます。

ちなみにリリースビルドだと上手くいきます。
904デフォルトの名無しさん:2012/02/10(金) 20:28:22.04
MSVCRTD.libを無効にすればいい。
905デフォルトの名無しさん:2012/02/10(金) 21:01:19.84
>>904
ランタイムライブラリをMDd、特定ライブラリを無視 MSVCRTD.lib にするとこんな感じです
エラー 2 error LNK2001: 外部シンボル "__RTC_InitBase" は未解決です。 main.obj
エラー 1 error LNK2001: 外部シンボル "__RTC_Shutdown" は未解決です。 main.obj
エラー 3 error LNK2001: 外部シンボル "_WinMainCRTStartup" は未解決です。

GameLib_d.libのなかにWinMainが入っているので、MTdかMDd、どちらかのランタイムのlibは欲しいと思われます。


自分はこの現象が起こる原因はlibの読み込み順序にある気がしてるのですが、
なんでnewとかdeleteといったmemoryManager.hの中にある関数使うと、リンク順序が正しくなるのか謎です。
なんで、delete演算子オーバーロードがコンソールにすると上手くいくのかはCRTとMFCの関係性がなくなるからの気がします。

自分で再現できないのが非常に気持ち悪い 。
バグだとしても、たいしたバグではないんだけど、何時間も苦しめられたのでむかつくというか…
もしかして、lib内にwinMainのエントリポイントもなければ、再現できないのか?

とにかく、レスくれた人、ありがとうございました。
906デフォルトの名無しさん:2012/02/11(土) 11:31:48.18
ストリームの状態を調べる関数に、eof()やfail()がありますが
関数の仕様を確認したところ、EOFを入力ストリームが検出した場合
eof()は真になりますが、fail()は真にはならないとのことでした。
しかしVC++2010で以下のコードを試してみると

int i;
cin >> i; //ここでCtrl+Zを押してEOFを入力
if( cin.eof() ) cout << "eof" << endl;
if( cin.fail() ) cout << "fail" << endl;

出力は

eof
fail

となり、EOFを検出するとfailbitも立ってしまっているようなのですが
これはなぜでしょうか?
907デフォルトの名無しさん:2012/02/11(土) 11:56:18.15
>>906
> eof()は真になりますが、fail()は真にはならないとのことでした。

仕様って、どこ見たの?

指定した入力が得られなければ failbit は当然立つよ。
failbit 無しで eofbit だけ立つ状況はかなり限られている(あるいは存在しない)と思う。
908デフォルトの名無しさん:2012/02/11(土) 12:04:06.99
レスどうもです。
どうやら勘違いしたようです。
EOFの検出と、入力が得られなかったことが同時に起こるために
eofbitとfailbitが立つという解釈だと、仕様通りみたいですね。
909デフォルトの名無しさん:2012/02/11(土) 12:37:46.92
いろいろやっていたら、eofbitだけを立てる方法を見つけました。
先ほどのコードを変更して

string s;
cin >> s;
if( cin.eof() ) cout << "eof" << endl;
if( cin.fail() ) cout << "fail" << endl;

とします。
そしてcin>>sのところで次のように入力してリターンを押します。

abc[Ctrl+Z]

そうすると、読み取りは1回のはずなのに、なぜかまだ入力が促されるので再度

[Ctrl+Z]

と入力すると、出力は
eof
だけとなりました。いったい何が起きてるんかちんぷんかんぷんです。

910デフォルトの名無しさん:2012/02/11(土) 12:55:54.08
>>909
string の入力は EOF を読んだ時点で入力語の終わりとして成立するから、
eofbit が立って入力は成功する( failbit は立たない)んだろう。
911デフォルトの名無しさん:2012/02/11(土) 21:08:33.82
なるほど、そういう意味ではintの入力も同じみたいですね。
912デフォルトの名無しさん:2012/02/12(日) 17:07:02.11
@コンテナに入れた順序を保っている
Amapのように素早く検索できる

@Aを満たすようなデータ構造ってありますか?
913デフォルトの名無しさん:2012/02/12(日) 17:22:31.01
>>912 class { list<mapped_type>; map<key_type, list<mapped_type>::iterator> }
914デフォルトの名無しさん:2012/02/12(日) 17:30:08.20
>>913
ナルホド!
ありがとうございます!
915デフォルトの名無しさん:2012/02/12(日) 22:17:28.14
メインのアプリケーションから
ファイル移動用のスレッドを生成して、
下記の様なソースで共有フォルダから
ローカルへのファイル移動を行っています。

しかし、大量のファイルを移動中に
アプリを終了すると、ファイル移動失敗時の
ログ出力に失敗し、エラーになります。
アプリを終了したら、ファイルの移動も
止める様にする良い方法はないでしょうか?

CStringList strlFileList;
CString strMoveFileName;
CString strOldFilePath;
CString strNewFilePath;
BOOL bRet = FALSE;

// ファイルリスト取得
GetFileList(strlFileList);
916デフォルトの名無しさん:2012/02/12(日) 22:18:01.66
for(int iCount=0; iCount<strlFileList.GetCount(); iCount++)
{
 // 移動ファイル名取得
 strMoveFile = strlFileList.GetAt(strlFileList.FindIndex(iCount));

 // 移動先
 strNewFilePath = 移動先フォルダ + strMoveFile;
 // 移動元
 strOldFilePath = 移動元フォルダ + strMoveFile;

 for(int iRetry=0; iRetry<リトライ回数; iRetry++)
 {
  //ファイル移動
  bRet = MoveFile(strOldFilePath, strNewFilePath);
  if (bRet == FALSE)
  {
   ログ出力
   Sleep(中断時間);
  }
  else
  {
   // 移動成功
   break;
  }
 }
 if (bRet == FALSE)
 {
  ログ出力
 }
}
917デフォルトの名無しさん:2012/02/12(日) 22:52:02.08
>>915
メインスレッドの方でスレッドが終了するのを待たせないとダメ
918デフォルトの名無しさん:2012/02/13(月) 00:44:54.64
const char* test(const char* s) { return s; }

int main() {
string s = test("abc");
cout << s;
}

試したところ動くのですが、たまたま動いているだけな気もしています。
なんとなく"abc"はtestを抜けたら消滅してもおかしくない気がして・・・
実際には、
const char* x = "abc";
string s = test(x);
と上記のコードは同じなのでしょうか?
919デフォルトの名無しさん:2012/02/13(月) 00:48:51.65
>>918 文字列リテラルの生存期間はプログラム開始から終了まであるから。大丈夫。
920デフォルトの名無しさん:2012/02/13(月) 01:03:10.80
そのコードの変数はスコープ的にはmainの中では死なないような気がする。
で、関数の戻り値はstringに食われるので、sにコピーされてsのスコープに移譲する。

で、あってるかな??あんまり詳しいことは知らないけど、問題ないと思う。
921918:2012/02/13(月) 01:10:06.04
>>919,920
文字列リテラルの生存期間はプログラム開始から終了までなんですね・・・。
基本的な話ですみません。どうもありがとうございました。
922デフォルトの名無しさん:2012/02/13(月) 07:21:02.68
>>920はデタラメだからな?
923デフォルトの名無しさん:2012/02/13(月) 11:36:22.30
>>918
> "abc"はtestを抜けたら消滅してもおかしくない気がして
test()の呼び出しが終了した後に"消滅"するとして、動作に違いが出るとは思えない
924デフォルトの名無しさん:2012/02/13(月) 11:38:58.21
あーそういう勘違いか
>>923は無視してくれ
925デフォルトの名無しさん:2012/02/14(火) 01:50:39.40
非同期プログラミングの設計について書かれた本ありますか?
926デフォルトの名無しさん:2012/02/14(火) 11:09:50.12
コンソール画面にアスキーアートのようなもので書かれたウインドーを
で操作するGUIライブラリーみたいなものありますか?
927デフォルトの名無しさん:2012/02/14(火) 12:10:56.66
TurboC++
928デフォルトの名無しさん:2012/02/14(火) 12:27:52.49
ターボシープラスプラスのようなGUIを作るライブラリーです。
929デフォルトの名無しさん:2012/02/14(火) 12:31:33.76
Qt
930デフォルトの名無しさん:2012/02/14(火) 12:33:23.56
>>928
TurboC++に付いてるOWLのCUI版があるよ
931デフォルトの名無しさん:2012/02/14(火) 12:53:22.35
>>926
定番といえばcursesだけど
それが使えない環境ではAPIに組み込まれていたり
代替えのライブラリがあったりするので
環境明記したほうがいいかも
932デフォルトの名無しさん:2012/02/14(火) 13:32:42.42
管理クラスに渡すポインタの型をどうするか迷ってるんですがなにかいい解決法は無いでしょうか
class Mng1 {
void register(boost::shared_ptr<IObj1> p);
// ry
};
これだと利用者にIObj1インターフェースだけでなくboost::shared_ptrの利用まで押し付ける事になるので利用しづらくなります
さらに
class Mng2 {
void register(boost::intrusive_ptr<IObj2> p);
// ry
};
という管理クラスが存在した場合IObj1とIObj2の両方を継承したクラスがあった場合ポインタの型が競合してしまいます
struct Elem : IObj1, IObj2 { ... };
Mng1 m1;
Mng2 m2;
ElemPtr p; // ElemPtrの型は???
Mng1.register(p);
Mng2.register(p);
また管理クラスはMng1とMng2だけとは限りません
933デフォルトの名無しさん:2012/02/14(火) 13:38:46.04
生ぽにしてunregisterを追加する
934デフォルトの名無しさん:2012/02/14(火) 14:09:15.42
>930
ターボビジョンなんてもう誰もしらねーよ。
おっさんは帰れ!
935デフォルトの名無しさん:2012/02/14(火) 15:08:26.70
ありがとうございます。
色々あると知ってよかったです。
アスキーアートのウインドーは無いみたいですね。
Cライブラリーだけでつくれるものですか?
936デフォルトの名無しさん:2012/02/14(火) 19:05:16.51
実行時にエラー出ます。これって間違ってんの?

void func(char **dst){
  int size=sizeof(int)*8;
  *dst=(char *)malloc(size+1);
  *dst[size]='\0';←ここでエラーでる
  for(int i=size-1;0<=i;i--)*dst[i]='1';
  return;
}
int main(){
  char *dst;
  func(&dst);
  free(dst);
}
937デフォルトの名無しさん:2012/02/14(火) 19:17:20.17
間違ってる
938デフォルトの名無しさん:2012/02/14(火) 19:17:46.25
>>936
sizeはintが8個分。つまり、sizeof(int)が4なら32になる。
* dst[size] は即ち * dst[32]なのだから当然、領域外アクセスになる。
そもそも、何故最後にナル文字を入れようとしているのか理解できない。
939デフォルトの名無しさん:2012/02/14(火) 19:17:51.60
*より[]のほうが優先順位が高いから
(*dst)[size] = '\0';
(*dst)[ i ] = '1';
とするといいかもしれない
940デフォルトの名無しさん:2012/02/14(火) 19:18:15.99
つーか、そもそもC++ならmalloc()なんぞ使うなや。
941デフォルトの名無しさん:2012/02/14(火) 19:19:32.00
>>938
malloc(size+1)で一個大きくとってるじゃん。
942デフォルトの名無しさん:2012/02/14(火) 19:19:32.92
C言語スレに行けという話でFA
943デフォルトの名無しさん:2012/02/14(火) 19:21:01.66
>>941
言葉遣いを直してから聞けアホ
32+1は4で割れるのか?
944デフォルトの名無しさん:2012/02/14(火) 19:23:41.01
ツッコミどころだらけでどこからツッコめばいいんだww
945デフォルトの名無しさん:2012/02/14(火) 19:33:07.95
>>943
お前はなにを言ってるんだ。
正解は>>939だろ?
ろくにコードも読めないのにえらそうに口だけはききたいんだな。
946デフォルトの名無しさん:2012/02/14(火) 20:16:54.19
偉そうに言ったことが間違ってて、引けなくなった人が暴れてますね。
947デフォルトの名無しさん:2012/02/14(火) 21:26:21.99
>>934
それを知っているお前さんも
948デフォルトの名無しさん:2012/02/14(火) 22:07:51.34
>>938
おまえほんとばかだな
949 ◆QZaw55cn4c :2012/02/14(火) 22:11:04.29
>>935
n-cursesは?
950デフォルトの名無しさん:2012/02/14(火) 22:45:14.03
char *にキャストするくらいなら、calloc使えばよかったのに
951デフォルトの名無しさん:2012/02/14(火) 23:02:53.95
メンバにvectorがあるのですが、アクセサをどう書くべきかで悩んでいます。
Getterは問題ないんですが、Setterをどう書いたらいいものかと。
PushBackVector, AtVector等、いちいちvectorのメソッドを書いていたら
きりがないですし・・・。
代入等のリスクを考えるとpublicにvectorを置くのは良くないですし。
どう書くのが無難でしょうか?
952デフォルトの名無しさん:2012/02/14(火) 23:05:46.18
どういう操作をしたいかによるだろそんなもん
953デフォルトの名無しさん:2012/02/14(火) 23:22:04.13
MC使いたい→セッタ無しでアクセッサ(戻り値 vector &)を用意する
push_back()、at()等を使用した設定、size()ぐらいしか使わない→各種メンバ関数を用意する

前者のばあい、俺は
ゲッタ: const vector & Hoge::GetPiyos() const
アクセッサ: vector & Hoge::AccessPiyos()
という、しっかり名前を分けたconst版、非const版の関数を用意する
機密性?お前は何を(ry
954デフォルトの名無しさん:2012/02/14(火) 23:36:42.44
>>952
push_back, find, at, size, empty, clearが最低限必要な操作になります。

>>953
>しっかり名前を分けたconst版、非const版の関数を用意する
非constと明示して公開ですか。了解です。
今回はまだアクセサの数もたかが知れているので、一つずつ関数を用意
してやることにします。
どうもありがとうございました。
955デフォルトの名無しさん:2012/02/15(水) 01:04:02.74
>>932
所有権を共有するなら shared_ptr 強制で妥当だろ。
956デフォルトの名無しさん:2012/02/15(水) 01:33:25.34
struct Wrapper1: IObj{
intrusive_ptr<Elem> p;
Wrapper1(const intrusive_ptr<Elem> &p): p(p){}
// デリゲーターを書く
};

Mng1 m1; Mng2 m2;
intrusive_ptr<Elem> p(new Elem);
m1.register(shared_ptr<Wrapper1>(new Wrapper1(p)));
m2.register(p);

こうだろJK
効率?知るかボケ
957デフォルトの名無しさん:2012/02/15(水) 20:00:13.00
stringstreamの状態でios_base::badbitが立つときってあるのでしょうか?
あるならそれはどういう状況ですか?
958デフォルトの名無しさん:2012/02/15(水) 22:08:23.40
>>939
ありがとう、知らなかった。すごく助かりました
959デフォルトの名無しさん:2012/02/16(木) 18:29:24.00
struct HogeImpl {
HogeImpl(void): c(0) {}
void func(void) { std::cout << "hello: " << c << std::endl; ++c; }
int c;
};

class Hoge {
HogeImpl * pImpl;
public:
Hoge(void) : pImpl(new HogeImpl) {} ~Hoge(void) { delete pImpl; }
void func(void) const { pImpl->func(); }
};

HogeのほうのメソッドはHogeImplのconstに合わせるべきか
それとも基本的に全部constにするべきなのか



960デフォルトの名無しさん:2012/02/16(木) 19:38:18.18
現在キー入力で複数のパターンを選んで動くというプログラム
を組んでいます(switch文)
このキー入力をwindwsFormのbuttonを使ってそれぞれボタンごとに
割り当てたいと考えています

buttonにそれぞれのパターンを割り当てる方法を教えてください
961デフォルトの名無しさん:2012/02/16(木) 21:04:42.83
もうどこからツッコめばいいのかわからなくてめんどくさい
962デフォルトの名無しさん
ケツから突っ込めばいいよ