5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part82

1 :デフォルトの名無しさん:2010/06/02(水) 20:20:13
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part81
http://pc12.2ch.net/test/read.cgi/tech/1273407971/

2 :デフォルトの名無しさん:2010/06/02(水) 20:22:03
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3 :デフォルトの名無しさん:2010/06/02(水) 20:22:54
■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 :デフォルトの名無しさん:2010/06/02(水) 20:23:52
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/

5 :デフォルトの名無しさん:2010/06/02(水) 20:25:24
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/


■長いソースを貼るときはここへ。■
 http://codepad.org/

6 :デフォルトの名無しさん:2010/06/02(水) 21:17:03
>>1

7 :デフォルトの名無しさん:2010/06/02(水) 21:34:29
>>1モツカレー

8 :デフォルトの名無しさん:2010/06/02(水) 22:36:52
相変わらず洋書と訳書ばっk(ry

9 :デフォルトの名無しさん:2010/06/02(水) 23:09:03
関数ポインタより関数リファレンスのほうが中の人は最適化しやすいですか?

10 :デフォルトの名無しさん:2010/06/02(水) 23:34:36
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

11 :デフォルトの名無しさん:2010/06/03(木) 00:11:07
>>10
地鎮祭乙

12 :デフォルトの名無しさん:2010/06/03(木) 01:00:02
>>10は地鎮祭だったのかww

13 :デフォルトの名無しさん:2010/06/03(木) 03:27:30
崇り神の格をみて村人の程度を知る。

14 :デフォルトの名無しさん:2010/06/03(木) 09:41:15
カンマ演算子って使ってる?
Hoge & operator = (const Hoge & h) {
if(this == &h) return *this;
Hoge(h).swap(*this);
return *this;
}

Hoge & operator = (const Hoge & h) { return this = &h ? *this : Hoge(h).swap(*this), *this; }
みたいな感じで行数減らせるようになって俺としては気持がいいんだけど…
あと意味的に連続してるような
a = aa;
b = bb;
c = cc;
みたいなばあいは
a = aa, b = bb, c = cc;
にした方が自然言語っぽくて見やすくない?

15 :デフォルトの名無しさん:2010/06/03(木) 09:47:37
> Hoge & operator = (const Hoge & h) { return this = &h ? *this : Hoge(h).swap(*this), *this; }

これ , *this 要る?
this = &h ? *this : Hoge(h).swap(*this) だけで十分な気が。

> if(this == &h) return *this;
> this = &h ? *this : ...

条件が変わってる気が・・・。

16 :デフォルトの名無しさん:2010/06/03(木) 09:56:28
一行一動作に慣れてて、カンマで処理増やすと混乱するなぁ。
ブーリアンはやいよブーリアン。

17 :デフォルトの名無しさん:2010/06/03(木) 12:21:48
>>9 んなこたーない。

18 :デフォルトの名無しさん:2010/06/03(木) 12:23:39
>>8
前スレから転載。


19 名前:デフォルトの名無しさん[sage] 投稿日:2010/05/09(日) 22:01:32
入門書だけでもこんだけあるんじゃん
ttp://www.amazon.co.jp/dp/4839926050/
ttp://www.amazon.co.jp/dp/4798108936/
ttp://www.amazon.co.jp/dp/4797354542/
ttp://www.amazon.co.jp/dp/4797343672/
ttp://www.amazon.co.jp/dp/4777512096/
ttp://www.amazon.co.jp/dp/477410843X/
ttp://www.amazon.co.jp/dp/4062573318/
ttp://www.amazon.co.jp/dp/4797316144/
ttp://www.amazon.co.jp/dp/4797353686/

あとはBoostの解説書とか
ttp://www.amazon.co.jp/dp/4798017043/
C++ テンプレートテクニックとか
ttp://www.amazon.co.jp/dp/4797354534/

20 名前:デフォルトの名無しさん[sage] 投稿日:2010/05/09(日) 22:18:05
>>19
へぇ。じゃぁあとは■Books(和書)■あたりでテンプレの形にまとめればよさそうだね。

あとはここらへんを■Books■の頭に追加だな。
http://www.amazon.co.jp/gp/bestsellers/books/754384/ref=pd_zg_hrsr_b_1_4_last

19 :デフォルトの名無しさん:2010/06/03(木) 12:36:36
>>9
参照にしとけばヌルチェックが省略できるかもね。

20 :デフォルトの名無しさん:2010/06/03(木) 13:35:36
前にも質問した物ですが。
zipの中のzipの中を探索するライブラリないですか?
解凍をせずに直にzipの中のzipを扱いたいのですが。

21 :デフォルトの名無しさん:2010/06/03(木) 13:38:09
ファイル名か、ファイルポインタを受け取る部分を、
ファイルの範囲を受け取るように拡張したらいいのですが。自前だと大変です。


22 :デフォルトの名無しさん:2010/06/03(木) 14:21:23
時々参照はnullにならないというレスがあるけど

void f( int& i ) { printf( "%p\n", &i ); }

int *p = 0;
f( *p );

VC8, g++3.4.5 で普通に 0 と表示される。
規格ではどうか知らないけど。

23 :デフォルトの名無しさん:2010/06/03(木) 14:23:45
>>22 未定義動作

24 :デフォルトの名無しさん:2010/06/03(木) 14:35:13
>>14
使ってるぜ
while ( c = fgetc(fp), c != EOF )

25 :デフォルトの名無しさん:2010/06/03(木) 14:50:49
template<typename T>struct S0;template<typename T>struct S1;template<typename T>struct S2; // 諸々沢山作るつもり
template<typename T,typename SX=S0<T>>struct A;
template<typename T,typename SX>struct B{
template<typename Tany,typename SXany>B(A<Tany,SXany>const&a); // SX=S0<T>,SXany=S0<Tany> で S0を条件付けるにはどうすればいいんだろう?
};

B<int,S0<int>>::B(A<float,S0<float>>const&){} // ok
B<int,S0<int>>::B(A<float,S2<float>>const&){} // error
B<int,S0<int>>::B(A<int,S1<int>>const&){} // error
みたいな感じで

26 :デフォルトの名無しさん:2010/06/03(木) 16:09:49
>>22
取り敢えず 8.3.2 -4- 注記に、null参照は well-defined なプログラム中には
存在し得ないとある。
まぁ、機械語に直された後で実行時に存在しないようにするのは無理、
というか不合理だろうね

27 :デフォルトの名無しさん:2010/06/03(木) 21:26:30
Intel Threading Building Blocksのバージョン3使っているけと゛
同士アクセスが65-70くらいからバグるな。
それ以下だと正しいロックしているが。
これはwindowsのせいか?

28 :デフォルトの名無しさん:2010/06/03(木) 21:29:37
テストード貼っとくぜ。スレッドが64までは正常動作する。


#include <tbb/concurrent_queue.h>
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;
#define N 64
concurrent_queue<int> que;
int sum[N];

unsigned WINAPI fnc(void *n) {
int x, num=*(int*)n; delete n;
while(1) {
if( !que.try_pop(x) ) { Sleep(10); continue; }
if(x==-1) return 0;
sum[num]+=x; Sleep(rand()%5); }}

int main() {
HANDLE hd[N];
int n;
for(n=0; n<N; n++) sum[n]=0;
for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); }
for(n=0; n<=10000; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitForMultipleObjects(N, hd, TRUE, INFINITE);
for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; }
cout<<"総和 "<<sum[0]<<endl;
getchar(); }

29 :デフォルトの名無しさん:2010/06/03(木) 21:30:50
int *p = 0; ってやった後に *p を参照するのが未定義動作なのか

30 :28:2010/06/03(木) 21:33:32
Thread Safe Template Library
http://en.sourceforge.jp/projects/freshmeat_tstl/

これBCCで動かしてもスレッド数が64超えるとバグるな。
こっちはヘッダ読み込みだけで動作して良い・



31 :28:2010/06/03(木) 21:41:10
Thread Safe Template LibraryはSleep無くすか短くする
とデッドロックになりやすい。
TBBでもなったけど、Sleep(1)を一カ所入れたら平気。
安全度はTBB。

32 :デフォルトの名無しさん:2010/06/03(木) 21:47:29
スレッドってどういう場面で使うの?

33 :デフォルトの名無しさん:2010/06/03(木) 21:50:32
複数CPUを動かすとき
HTTP受信が遅いとき

34 :デフォルトの名無しさん:2010/06/03(木) 22:17:18
Intel Threading Building Blocksはコンパイラを限定されるのがいやだな。
BCCでは動きそうにない。


35 :デフォルトの名無しさん:2010/06/03(木) 22:52:49
なぜassertはASSERTでないのか。小文字のマクロとか気持ち悪いんですけど

36 :デフォルトの名無しさん:2010/06/03(木) 23:08:53
>>28
そのコードなら間違いなくWindowsのせい。
http://msdn.microsoft.com/en-us/library/ms687025.aspx
WaitForMultipleObjectsで渡せる個数は最大MAXIMUM_WAIT_OBJECTS個と書いてあるが、
この値は64と定義されている。

ところで、ちゃんと戻り値やGetLastErrorが返す値を見ようよ。
65個以上渡したときには、どっちもエラーを意味する値になっているから。

37 :デフォルトの名無しさん:2010/06/03(木) 23:16:46
WaitForMultipleObjectsをMAXIMUM_WAIT_OBJECTS個以上に使ってるプログラマのせいだろ

38 :デフォルトの名無しさん:2010/06/03(木) 23:29:12
そうですか。サンクス。訂正版上げておきます。

#include <tbb/concurrent_queue.h>
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;
#define N 100
concurrent_queue<int> que;
int sum[N];

unsigned WINAPI fnc(void *n) {
int x, num=*(int*)n; delete n;
while(1) {
if( !que.try_pop(x) ) { Sleep(1); continue; }
if(x==-1) return 0; sum[num]+=x; Sleep(1); }}

void WaitObject_INFINITE( unsigned int ksu, HANDLE *hd) {
for(unsigned int n=0; n<ksu; n+=64) {
int k=ksu-n; if(k>64) k=64; WaitForMultipleObjects( k, hd, TRUE, INFINITE); }}

int main() {
HANDLE hd[N]; int n;
for(n=0; n<N; n++) sum[n]=0;
for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); }
for(n=0; n<=10000; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitObject_INFINITE( N, hd) ;
for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; }
cout<<"総和 "<<sum[0]<<endl; getchar(); }

39 :デフォルトの名無しさん:2010/06/03(木) 23:33:07
行減らすとき、全角空白まじっちゃったので訂正したのを再うp

#include <tbb/concurrent_queue.h>
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;
#define N 100
concurrent_queue<int> que;
int sum[N];

unsigned WINAPI fnc(void *n) {
int x, num=*(int*)n; delete n;
while(1) {
if( !que.try_pop(x) ) { Sleep(1); continue; }
if(x==-1) return 0; sum[num]+=x; Sleep(1); }}

void WaitObject_INFINITE( unsigned int ksu, HANDLE *hd) {
for(unsigned int n=0; n<ksu; n+=64) {
int k=ksu-n; if(k>64) k=64; WaitForMultipleObjects( k, hd, TRUE, INFINITE); }}

int main() {
HANDLE hd[N]; int n;
for(n=0; n<N; n++) sum[n]=0;
for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); }
for(n=0; n<=10000; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitObject_INFINITE( N, hd) ;
for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; }
cout<<"総和 "<<sum[0]<<endl; getchar(); }

40 :デフォルトの名無しさん:2010/06/03(木) 23:38:33
ミスった。こっちだった。
WaitForMultipleObjects( k, hd, TRUE, INFINITE);



WaitForMultipleObjects( k, &hd[n], TRUE, INFINITE);

41 :デフォルトの名無しさん:2010/06/04(金) 04:55:57
codepad使えよ・・・

42 :デフォルトの名無しさん:2010/06/04(金) 13:13:35
http://ideone.com/aBipc

43 :デフォルトの名無しさん:2010/06/04(金) 17:06:25
^演算子のオーバーロードして、XOR->乗算にしようと思っているのですが、

double operator^( const double lhs, const double rhs )
{
 return pow(lhs,rhs);
}

のコンパイルが通りません。
error: ‘double operator^(double, double)’ must have an argument of class or enumerated type
というエラーが出てきます。
どうしたら良いのでしょうか?

44 :デフォルトの名無しさん:2010/06/04(金) 17:11:25
>>43
なんで引数が二つなの?
一つは自分自身でしょ

45 :デフォルトの名無しさん:2010/06/04(金) 17:17:16
>>43 組み込み型の演算は再定義できないよ。 少なくとも一つのユーザ定義型が必要。

46 :デフォルトの名無しさん:2010/06/04(金) 18:50:13
組み込みのオペレータ定義できないのはちょっと残念な仕様だよね
namespace内のみ定義可能で、ローカルスコープでusingした時のみオーバーロド可能とかなら良かったのに

47 :デフォルトの名無しさん:2010/06/04(金) 21:20:42
関数をインラインにする時の目安ってどんな感じにしてますか?
ヘッダのクラス定義の中に書いちゃいますか?

48 :デフォルトの名無しさん:2010/06/04(金) 21:27:15
inlineの目安は10行以内とはよく言うけど、それってかなりたくさんinlineになっちゃうよね

49 :デフォルトの名無しさん:2010/06/04(金) 21:38:08
それ大して意味ないから書かない方が良いよ
異なる箇所から頻繁に呼ばれる関数が多所に分散することで遅くなることもある。

50 :デフォルトの名無しさん:2010/06/04(金) 21:39:47
へぇ難しいなぁ

51 :デフォルトの名無しさん:2010/06/04(金) 21:41:41
20カ所くらいに埋め込むより、
唯一の関数がレジスタとかにある方が速い。
片っ端に付けまくるとそういった高速アクセスが出来なくなるから遅くなる。
コンパイル時のオプションや実測後に変更すればいい。
はじめから付けると損。

52 :デフォルトの名無しさん:2010/06/04(金) 21:49:30
俺は何行でも全部インラインだぜ!
たまにpimpl

53 :デフォルトの名無しさん:2010/06/04(金) 21:50:59
めんどいので-O2に任せる

54 :デフォルトの名無しさん:2010/06/04(金) 21:57:00
1次キャッシュメモリ32Kに関数が載りまくれば速いって事だ。
インラインして関数が分散すれば、唯一高頻度の関数はなくなりキャッシュされない。


http://www.tzone.com/diy/topics/event/new-core-i7-online-nhl/new-core-i7-online-nhl.jsp
内蔵キャッシュメモリーをL3まで搭載

Core i7ではCPUコア個々に
1次キャッシュメモリ:命令用32KB+データ用32KB

2次キャッシュメモリ:256KBが搭載れさており、

さらに複数のCPUコアで共有する3次キャッシュメモリーが
8MBが搭載されています。
これによりプログラムから頻繁にアクセスされても
従来のCPUよりもシステム全体の速度を円滑に管理できます。



55 :デフォルトの名無しさん:2010/06/04(金) 22:01:53
キャッシュの効果。大差が付く。

PC雑記帳「CPUキャッシュの効果」
http://www7a.biglobe.ne.jp/~znotl/zakki/021102d.png
http://www7a.biglobe.ne.jp/~znotl/zakki/021102.html

56 :デフォルトの名無しさん:2010/06/04(金) 22:04:09
フーン

57 :デフォルトの名無しさん:2010/06/04(金) 22:04:33
ベンチマークかよ。
ボタン押してから画面に結果が表示されるまでのレスポンスがそんなに変わんのかよ

58 :デフォルトの名無しさん:2010/06/04(金) 22:08:11
L1キャッシュだのお前はOSのカーネルでも作ってんのかよと

59 :デフォルトの名無しさん:2010/06/04(金) 22:10:30
複数箇所から呼ばれる関数は付けない方が速いことが多い。
埋め込みで効果あるのは、使われるところが一緒のみの場合。
コードの見やすさの為に関数化した場合だけ有効。

60 :デフォルトの名無しさん:2010/06/04(金) 22:10:57
通常の関数にinline指定子つけることはまずないかな
以前は小物にはつけるようにしてたけど、ライブラリで間に合う事が多いから
そういったものを自分で定義することがなくなった
メンバ関数のインラインは通常1行で最大3行くらい。主にアクセッサ。
ただアクセッサを用意する設計はなるべく避けてるのであまり定義することはない

割と初学者やJavaやC#から流れてきた人ほどインラインしたがると思うんだけど偏見かなw

61 :デフォルトの名無しさん:2010/06/04(金) 22:13:25
swapとか代入とか

templateクラスのメンバとかどうすんべ

62 :デフォルトの名無しさん:2010/06/04(金) 22:13:54
ある程度、プログラム経験あれば
最終的なコードサイズが小さい方が速いことは気づくはずだが。
L1でもL2でもメモリでも速い方に収まっていた方が良いに決まってるが。

63 :デフォルトの名無しさん:2010/06/04(金) 22:17:52
ただのベンチマーク厨か

64 :デフォルトの名無しさん:2010/06/04(金) 22:20:43
JavaやC#など、ハードと密着してない言語だと埋め込んだ方が速いかもね。
C++だとまず遅くなるがな。
メモリに読みに行くより、関数コールと復帰のコストが高い場合。
C++、アセンブラだとそう複雑な手続き無いから、メモリ読む方が遅い。

65 :デフォルトの名無しさん:2010/06/04(金) 22:35:25
>>62
> 最終的なコードサイズが小さい方が速いことは気づくはずだが。

コードサイズは全く考えず、コードの読みやすさ・保守性だけ考えてます。速さなんぞ二の次

66 :デフォルトの名無しさん:2010/06/04(金) 22:39:09
シンプルは速いよ

67 :デフォルトの名無しさん:2010/06/04(金) 23:52:31
シンプルなヤツ程強いって承太郎が言ってた

68 :デフォルトの名無しさん:2010/06/05(土) 00:34:53
C/C++言語、アセンブラはやるべきではないな。
これは蓄積・経験がないとプログラム出来ないようになっている。
経験少ないやつは太刀打ちできない仕組みになっている。
速度を求めるために書き換えるなら良いが。
第一言語にすべきではない。

69 :デフォルトの名無しさん:2010/06/05(土) 00:37:02
C++勉強中のつやつにいいやつ教えてやるぜ。
PHP、C#、HSP。
これだけあれば事足りる。
C言語より生産性は、10倍はいいな。
C言語で1ソフト開発している間に10個は出来る。

70 :デフォルトの名無しさん:2010/06/05(土) 01:02:15
>>69
でも10倍遅かったりバグったりしたら元も子もないよね

71 :デフォルトの名無しさん:2010/06/05(土) 01:05:41
>>70
10倍遅いくらいなら全然許容範囲。
むしろ、プログラムがシンプルになるのでバグが減る。

72 :デフォルトの名無しさん:2010/06/05(土) 01:07:45
>>71
なるほど。
では10倍が許容できない要件の場合はどうするの?

73 :デフォルトの名無しさん:2010/06/05(土) 01:13:00
roadsendPHP

これつかっとけ。PHP -> C言語 -> バイナリ
とコンパイルするコンパイラ。
速度はうまくやればC言語と変わらない。


74 :デフォルトの名無しさん:2010/06/05(土) 01:14:33
ほぇ〜。そんなのあるんだ。
使わないけど。

75 :デフォルトの名無しさん:2010/06/05(土) 03:15:28
C#をネイティブ化さえできれば。
GUI中心にC++を捨て去れると思うが

76 :デフォルトの名無しさん:2010/06/05(土) 03:29:55
ネイティブじゃないからあんなに高機能なんじゃないの?

77 :デフォルトの名無しさん:2010/06/05(土) 03:39:49
実行前には、ネイティブ化しているわけだが。
ただし配布できる形にはなっていない。

78 :デフォルトの名無しさん:2010/06/05(土) 03:41:55
windowsディレクトリにコンパイルされたイメージが入っているが。
単体のexeではなくて持ち運びが出来ない。

79 :デフォルトの名無しさん:2010/06/05(土) 04:50:11
すいません、質問させてください。
外部txtファイルを複数回読み込むfunctionを作っているのですが、二回目以降が上手く読み込めません。

(Header省略)
void readfile (string &FileName, ifstream &inFile)
{
ifstream infile;
string FileName;
(中略)
for (int i = 0; i <3; i++)
{
cin >>FileName;
inFile.open(FileName.c_str());
while (inFile.fail())
{
inFile.clear();
cout << "invalid file name, re-enter:";
cin >> FileName;
inFile.open(FileName.c_str());
}

}


}

80 :デフォルトの名無しさん:2010/06/05(土) 04:51:32
みなさんの意見を聞きたいのですが、
http://codepad.org/txrScMGg
上記のように、グローバルな位置にenumを置くのはタブーなのでしょうか?
それとも、あっても障害にはならないからどうでもいいのでしょうか?

81 :79:2010/06/05(土) 04:54:21
おわあ、途中でエンター間違えて押してしまった
すいません。正しくは以下

(Header省略)
void readfile (string &FileName, ifstream &inFile)
{
for (int i = 0; i <3; i++)
{
cin >>FileName;
inFile.open(FileName.c_str());
while (inFile.fail())
{
inFile.clear();
cout << "invalid file name, re-enter:";
cin >> FileName;
inFile.open(FileName.c_str());
}
(中略・各種データ操作)
inFile.clear();
}
}

ソフトはMSVisual Studio2008
これ実行すると二回目以降、ファイルの名前指定すると必ずファイル名が違います言われるんです……何が悪いんでしょう

82 :デフォルトの名無しさん:2010/06/05(土) 05:17:38
>>80
unscoped enumは、その宣言されたスコープに、名前を導入するから、
その例のように、グローバル名前空間で、あまりにも簡単すぎる名前だと、
何かと面倒だな。

C++0xから導入される、scoped enumでは、そういう問題もなくなる。


83 :デフォルトの名無しさん:2010/06/05(土) 05:45:27
>>81
inFile.close(); してないから。

84 :デフォルトの名無しさん:2010/06/05(土) 06:14:24
>>81
違うなら、(中略・各種データ操作)の中にカレントディレクトリを変更する操作があるとか。

85 :デフォルトの名無しさん:2010/06/05(土) 06:41:37
C++と他の言語比べて嬉しいのってエラー修正しやすいところだと思う

86 :デフォルトの名無しさん:2010/06/05(土) 06:42:25
>>83
最後のinFile.clearの後にinFile.close()入れても上手くいかないです・・

>>84
いや、txtから数列読み取って計算とかするだけでディレクトリ移動とかはしないです

87 :79:2010/06/05(土) 06:58:45
100%まったく関係ないところを修正してからrunしなおしたら上手くいくようになりました
(coutいくつか追加しただけ)
セーブせずにrunしたわけでもないのになんでよ。訳わからん

お騒がせしました・・・・

88 :デフォルトの名無しさん:2010/06/05(土) 07:10:50
100%無関係なら、そこがバグの原因じゃないわけだから、いつか再発するかもね。

89 :デフォルトの名無しさん:2010/06/05(土) 07:15:18
>>87
> 100%まったく関係ないところを修正してからrunしなおしたら上手くいくようになりました
あるあるwwww



90 :デフォルトの名無しさん:2010/06/07(月) 03:36:47
GDI+について質問です。

Gdiplus::Graphics* g1 = Gdiplus::Graphics::FromHDC(hdc);
Gdiplus::Graphics* g2 = new Gdiplus::Graphics(hdc);
Gdiplus::GdiplusShutdown()
delete g1; //error
delete g2; //error

上記を実行しようとするとdelete部分でエラーが出てきます。
しかし、GdiplusShutdownの前にdeleteするときちんと解放されます。
これはdeleteしなくてもGdiplusShutdownがメモリを解放していると考えていいのでしょうか?
それともdeleteしないとメモリリークが発生するのでしょうか?

91 :デフォルトの名無しさん:2010/06/07(月) 03:52:18
環境依存の内容はスレ違い。

92 :デフォルトの名無しさん:2010/06/07(月) 08:09:42
ありがとうございました(´・ω・`)

93 :デフォルトの名無しさん:2010/06/07(月) 09:00:08
#define DEF_SP_HOGE(type) void hoge<type>() { ・・・}

DEF_SP_HOGE(int)
DEF_SP_HOGE(char)
DEF_SP_HOGE(short)
DEF_SP_HOGE(long)
・・・

#undef DEF_SP_HOGE

みたいな感じで局所的に使うマクロを重複させないテクニックみたいなのってありますか?
DEF_SP_HOGEが定義されてればDEF_SP_HOGE_で同じことをやって
それも定義されてたらDEF_SP_HOGE__・・・みたいな感じで

94 :デフォルトの名無しさん:2010/06/07(月) 09:22:30
>>93
局所的なやつはちゃんと #undef する。局所的じゃないやつはライブラリ名とか含めた
プリフィックス付きにする。これで問題ないだろ。

95 :デフォルトの名無しさん:2010/06/07(月) 09:53:36
ど忘れしてしまった……
setw(X)中に string + int + string を表示させるのってどうやるんだっけか
まぁ具体的には表示の番号割り振りで"[" int "]" みたいな修飾したいだけなんだけど

96 :デフォルトの名無しさん:2010/06/07(月) 11:22:55
>>95
setw()とやらの仕様は知らんが、文字列と数値を連結したいのならsprintf()かstringstreamかboost::format辺りではどうか。
# lexical_castでもできるか。

97 :デフォルトの名無しさん:2010/06/07(月) 13:16:09
setw(20)で20文字分のスペースを確保じゃなかったっけ?
「cout << setw (15) << "etcetc" << "blah"<<endl;」 すると
「etcetc_________blah」
になるみたいな。 解ると思うけどアンダーバーは空白でヨロ。

98 :デフォルトの名無しさん:2010/06/07(月) 13:17:40
つーかsetw(X)でX文字分のスペース、か。
違う数字を同じ例内で使うとかどんだけだ俺。

99 :デフォルトの名無しさん:2010/06/07(月) 13:27:24
言いたいことは判ったが説明が下手だな。先ずは入力と出力をはっきりさせろ。

100 :デフォルトの名無しさん:2010/06/08(火) 19:18:56
Cでerrnoを文字列で出力するのはperrorだけど
C++では何使えばいいの?なんとなくstdio.hはインクルードしたくないんだけど

101 :デフォルトの名無しさん:2010/06/08(火) 19:28:03
cstdio

102 :デフォルトの名無しさん:2010/06/08(火) 20:12:34
iostream を使っていても結局 sync_with_stdio とかあるから一緒
つーか errno は気にならないのか?

103 :デフォルトの名無しさん:2010/06/08(火) 20:34:30
>>101-102
ありがとう
LinuxだとSocketつかうとerrnoにエラー設定するのよね
普通にperrorつかいます

104 :デフォルトの名無しさん:2010/06/08(火) 21:56:03
class Boo
{
public:
  void operator =(const Boo&){}
};
みたいに代入がオーバーロードされてるんですが
普通の代入したい場合はどうすればいいんでしょうか?

105 :103:2010/06/08(火) 22:26:16
今やってて気が付いたんだけどLinuxはperrorで
ソケットのエラー出力してくれるけどWindowsはしてくれないのね
Windowsの場合はFormatMessage使って文字列取得するしかない?
できるだけコードは共通にしたいんだけど、、

106 :デフォルトの名無しさん:2010/06/08(火) 23:40:56
>>104
そのクラスにとってはそれが普通の代入だと思うんだが、明示的にシャローコピーをする方法があるかどうかって話かな。
ま、答えを持ち合わせていないんだけど。

107 :デフォルトの名無しさん:2010/06/08(火) 23:42:32
内部でとりあえず普通の代入行ってから
違う箇所を自分で実装したい、という事な気がする
端的に言うと無理なんだが

108 :デフォルトの名無しさん:2010/06/08(火) 23:47:42
template<class T> class Boo
{
public:
void ZeroMemory(){memset( a, 0, sizeof(a) );}
T a[100];
};
Tがプリミティブ型以外の時にZeroMemory()を読んだらエラーが出るようにしたいんですが可能ですか?

109 :デフォルトの名無しさん:2010/06/08(火) 23:50:34
可能です

それがいい設計かどうかは別の話

110 :デフォルトの名無しさん:2010/06/08(火) 23:56:45
ふつうは特殊化でループ処理も作る

111 :デフォルトの名無しさん:2010/06/08(火) 23:58:58
ループ処理?

112 :デフォルトの名無しさん:2010/06/09(水) 00:05:52


113 :デフォルトの名無しさん:2010/06/09(水) 00:08:20
ていうか、PODでも整数型以外をゼロクリアするなよ。

114 :デフォルトの名無しさん:2010/06/09(水) 00:13:01
そうだな。0を代入するのが賢いやり方。

115 :デフォルトの名無しさん:2010/06/09(水) 00:19:27
ポインタ持っててもPOD?

116 :デフォルトの名無しさん:2010/06/09(水) 00:50:41
>>115
誰もそんなこと言ってないだろ。

117 :デフォルトの名無しさん:2010/06/09(水) 03:20:07
>>116
え?
Cの構造体にポインタが持てないと

118 :デフォルトの名無しさん:2010/06/09(水) 03:29:03
C互換のポインタは当然入れられるとしても
メンバ関数・メンバ変数ポインタはPODに入れられるのかな?
入れても問題はなさそうだが。

119 :デフォルトの名無しさん:2010/06/09(水) 03:37:26
>>117
誰もそんなこと言ってないだろ。

120 :デフォルトの名無しさん:2010/06/09(水) 03:44:22
そも、>113が言いたいのは実数型を0クリアするなってことじゃないの?

121 :デフォルトの名無しさん:2010/06/09(水) 03:47:35
>>120 俺には「整数型以外をゼロクリアするな」と読めるんだが。

122 :デフォルトの名無しさん:2010/06/09(水) 08:15:25
論理型をゼロクリアしてはダメですか

123 :デフォルトの名無しさん:2010/06/09(水) 08:27:15
>>122
ISO C++ (2003) 3.9.1 [basic.fundamental] p7
> Types bool, char, wchar_t, and the signed and unsigned integer types are collectively
> called integral types. A synonym for integral type is integer type.

124 :デフォルトの名無しさん:2010/06/09(水) 08:53:54
PODはmemcpyしてもおkな構造体のこと
ポインタが入ってたらmemcpyでバグるだろ
だからPODはポインタもっちゃダメ

125 :デフォルトの名無しさん:2010/06/09(水) 08:58:25
浮動小数点数型とポインタ型は、0.0やヌルポインタの内部表現が全ビット0であるという保証はない。
(ただし、どちらもリテラルの0から変換できることは保証されている)
それらを含む集成体も同様。だから「整数型以外」で間違ってないだろう。

126 :デフォルトの名無しさん:2010/06/09(水) 09:00:19
誰かPODについてまとめてくれ。ぐぐってもそこかしこで違う定義の仕方されてて困る

127 :デフォルトの名無しさん:2010/06/09(水) 09:08:48
>>124
なんか誤解する人が出てきそうなんで突っ込み入れとくね。

POD がポインタを持つことはできる。
ポインタが所有権をあらわすものでない限り memcpy しても問題ない。
memcpy してバグとなるかどうかと POD の要件とは関係ない。

128 :デフォルトの名無しさん:2010/06/09(水) 09:13:45
>>126 規格嫁

129 :デフォルトの名無しさん:2010/06/09(水) 15:35:00
C#での参照型の値渡しみたいなことってC++でできますか?
メンバ関数を通してメンバの書き換えが可能だけど、呼び出し元の実体は書き換えられない、という感じです。
valueをmutable、Setをconstにしてconst Test&で受けとれば実現できますが、mutableの使用方法としてはよくないと思いますし。

class Test {
int value;
public:
void Set(int v) {
this->value = v;
}
};

void func(Test& test) {
test = Test(); //これは禁止したいけど、
test.Set(1); //これは許可したい。
}

void main() {
Test test;
func(test);
}

もう一つ。
テンプレートクラスで特定のテンプレート引数の時に呼んではいけない関数が存在するとします。
その時に関数を呼んでしまうと関数内でエラーが起きるので原因がわかりにくいのですが、何かわかりやすくする方法はありませんか?
static_ifを利用して無効な時にインスタンス化できない型を引数に取るようにして、
呼び出し元でエラーを起こすなんてことはできますけど、エラーメッセージの意味が若干変わりますよね。

130 :デフォルトの名無しさん:2010/06/09(水) 15:41:15
void func(Test & const test)
って無理だっけ?

131 :デフォルトの名無しさん:2010/06/09(水) 15:42:39
2個目の質問は特殊化して何もしないようにするか、そもそもの設計を見直すかのどっちかで対応できそうに思う。

132 :デフォルトの名無しさん:2010/06/09(水) 15:50:56
>>130
C++の参照は、参照先のすげ替えができない。つまり、元々int&はconstであると言える。
従って、int&にconstをつけることはできない。


133 :デフォルトの名無しさん:2010/06/09(水) 16:05:49
>>129
何がしたいのかよく解らんけどoperator = をprivateに持っていけば代入は禁止できるよ

134 :デフォルトの名無しさん:2010/06/09(水) 17:20:37
回答ありがとう。
やりたいことはC#風のイベントです。
delegateもどきを作ったところまではよかったものの、上記2点で詰まりました。

>>130,>>132
最初に考えましたが、const無視するよという警告がでました。

>>131
delegateの引数の数分オーバーロードしてるので、特殊化クラスが10個になるのとどっちがマシかって話になりますね…
今回の場合は引数が間違っているというメッセージでも大体意味が通るので、とりあえずこれでいきます。

>>133
これもイベントの話なのですが、イベント送信者を受信側で操作できるようにするにはどうすればいいかなと。
代入禁止は別のところにまで影響するので避けたいです。

135 :デフォルトの名無しさん:2010/06/09(水) 18:31:10
クラスを変更せずに特定のメンバを封印したいということか?
めんどくさいけどそのクラスをラップして代入以外をpublicにすればおk
http://codepad.org/FfSqsZlq

136 :デフォルトの名無しさん:2010/06/10(木) 10:47:31
libtcmallocはかならずしも速くなるとは限らないな。
メモリプールを自動で行うライブラリのような物だが。
標準のメモリ管理(free、newとか)より遅くなることをある。
プールよりstaticやグローバルで確保しておいた方が良いかもしれない。

137 :デフォルトの名無しさん:2010/06/10(木) 19:39:21
PHPやJscriptのように任意の型の変化できる変数ないですか。
anyは、たとえばvector<string>入れたら全ての操作可能ですか。resize(n)とか。

138 :デフォルトの名無しさん:2010/06/10(木) 20:14:02
C++なめてんのか?
一生スクリプト言語いじってなw

139 :デフォルトの名無しさん:2010/06/10(木) 20:22:39
動的型の言語って書いててすごい不安になってくるからC++で一回書いて安心してから移植してるわ。おかげで生産性向上性皆無

140 :デフォルトの名無しさん:2010/06/10(木) 21:51:32
>>137
安全にキャストできるから心配すんな
ダックタイピングしたけりゃboost::variant使え

141 :デフォルトの名無しさん:2010/06/10(木) 22:08:58
数年前はJavaのこれこれみたいな書き方したいんですけど
みたいな質問を時々見たが、最近はスクリプトだな

142 :デフォルトの名無しさん:2010/06/11(金) 13:13:20
char* 型の文字列を、wchar*型の文字列に変換するのによい方法はございますでしょうか?

143 :デフォルトの名無しさん:2010/06/11(金) 13:21:53
#include <string>

std::string wchar2char(const std::wstring x){
int m=x.size(); if(m<=0) return 0;
std::string y(3*m,'\0');
m=WideCharToMultiByte(CP_ACP, 0, &x[0], m, &y[0], 3*m, NULL, NULL);
y.resize(m); return y; }
std::string wchar2char(wchar_t x){ return wchar2char( std::wstring(x,1) ); }
//
std::wstring char2wchar(const std::string x){
int m=x.size(); if(m<=0)return 0;
std::wstring y(m, L'\0');
m=MultiByteToWideChar(CP_ACP, 0, &x[0], m, &y[0], m);
y.resize(m); return y;}
std::wstring char2wchar(char x){ return char2wchar( std::string(x,1) ); }


144 :デフォルトの名無しさん:2010/06/11(金) 14:08:19
サンキュス。

145 :デフォルトの名無しさん:2010/06/11(金) 14:10:24
boostのソースみるとoperator==とか<の引数を2個取ってる場合があるけどアレはどういうことなの?

146 :デフォルトの名無しさん:2010/06/11(金) 14:24:18
左辺と右辺

147 :デフォルトの名無しさん:2010/06/11(金) 14:40:11
namespace boo
{
static const int BOO = 100;
}
この場合、staticは付けない方がいいんですか?

148 :デフォルトの名無しさん:2010/06/11(金) 15:56:49
>>147場合による。

149 :デフォルトの名無しさん:2010/06/11(金) 17:41:58
質問です。

同一の名のメソッドを持っているインターフェースを、
多重継した場合の記述の方法がわかりません。

それぞれのインターフェースのメソッドには、
別の挙動を記述できたらと思っております。

現在は、下記のように記述したところ、
コンパイルエラーとなっております。

よろしければ記述方法を教えていただけますでしょうか・・・

ヘッダ側--------------------------------------
class interfaceA {
public : virtual void exec() = 0;
}
class interfaceB {
public : virtual void exec() = 0;
}
class C : A, public B {
public : virtual void A::exec();
public : virtual void B::exec();
};
ソース側--------------------------------------
public : virtual void A :: exec(){
}
public : virtual void B :: exec(){
}



150 :デフォルトの名無しさん:2010/06/11(金) 17:57:36
無理っていうかインターフェースの意味からしてそんな設計は早く投げ捨てるべき

151 :デフォルトの名無しさん:2010/06/11(金) 18:03:18
>>149
同一名のメソッドはprivateにしてラッパーかませろ
設計段階でそうするべき
後から分かってリファクタリングしても遅い

152 :デフォルトの名無しさん:2010/06/11(金) 18:25:21
継承は初心者が思ってるほど便利なもんじゃない
大抵他の方法がある

153 :デフォルトの名無しさん:2010/06/11(金) 18:28:11
多重継承なんていらなかったんや

154 :デフォルトの名無しさん:2010/06/11(金) 19:46:13
ソース側が間違っていました。

void C :: A :: exec(){
}
void C :: void B :: exec(){
}

でした。

また、下記のようにヘッダ側に処理を記述した場合はコンパイルはとおりました。

class C : A, public B {
public : virtual void A::exec() { //A向けの処理 }
public : virtual void B::exec() { B向けの処置 }
};

できればソース側に記述したいところです。

C#では別インターフェースの同名メソッドを、
明示的に指定してそれぞれて別の挙動を実装できておりました。

C#の元になったC++では出来るのかなと思い質問してみました。


155 :デフォルトの名無しさん:2010/06/11(金) 19:58:38
>>151
A B をそれぞれ private継承し A' B' などのラッパーを作成、
メソッド名は execA や execB などのかぶらない物をを用意しておく。

その A' B' を継承して Cを作成という流れ出よろしいのでしょうか・・・。

156 :デフォルトの名無しさん:2010/06/11(金) 20:00:45
ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E5%86%85%E9%83%A8%E3%82%AF%E3%83%A9%E3%82%B9(Inner_Class)

157 :デフォルトの名無しさん:2010/06/11(金) 20:04:10
>>143
return 0; はダメ

158 :デフォルトの名無しさん:2010/06/11(金) 20:04:49
ヒント: インターフェースは必ずしも継承を使う必要はない

159 :デフォルトの名無しさん:2010/06/11(金) 20:12:32
むしろできるなら使わない方が効率がいい

160 :デフォルトの名無しさん:2010/06/11(金) 20:27:03
いや使った方がいい

161 :デフォルトの名無しさん:2010/06/11(金) 20:39:50
実行効率か、プログラミング効率か、そこが問題だ。

162 :デフォルトの名無しさん:2010/06/11(金) 23:00:14
再帰回数がそんなに大きくならないとわかっている関数があったとして(例えば多くても100回)
下のように書いたら関数ポインタを使わずにinline展開してもらえるかな?

template <unsigned int N> inline void func_impl(...)
{
if(再帰するなら) func<N + 1>func_impl(...); else // ...
}

template <> inline void func_impl<100>(...)
{
assert(false);
}

inline void func(...)
{
func<0>(...);
}

int main(void) { func(...); return 0; }

163 :デフォルトの名無しさん:2010/06/11(金) 23:08:59
>>162
そのコードの意味がよく判らんが、テンプレートでの再帰はきちんと展開するよ。
例えば、階上を計算するテンプレート関数は定数になってくれる。
アセンブリ出力見れば判るべさ。

164 :デフォルトの名無しさん:2010/06/12(土) 07:46:03
>>162 停止条件を0にしたほうが楽じゃね?
template<int N>void func()
{
func<N-1>();
}
template<>void func<0>()
{
}
int main()
{
func<100>();


165 :デフォルトの名無しさん:2010/06/12(土) 14:11:09
テンプレート相談室になってるな

166 :デフォルトの名無しさん:2010/06/12(土) 22:08:45
このようなクラスがあったとき、class Aのメンバ関数から
class B のV[n]を参照することは出来ますか? V[n]は自分以外のもので。

class A { public: int n; string s; };

class B { public: vector<A> V; };





167 :デフォルトの名無しさん:2010/06/12(土) 22:10:23
public:だから普通にできますよ

168 :デフォルトの名無しさん:2010/06/12(土) 22:21:06
アクセス方法が分からないんですが。
クラスの定義の時点で可能ですか?
B b;と変数宣言してあればアクセス可能ですが。

169 :デフォルトの名無しさん:2010/06/12(土) 22:26:34
Bの中からVにアクセスは出来るでしょ。

170 :デフォルトの名無しさん:2010/06/12(土) 22:35:31
>>168 引数で渡せ。

171 :デフォルトの名無しさん:2010/06/12(土) 23:02:54
サンクス。こんな風にしてやりたいことが出来ました。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class A { public: int ban; string name; A( int a, string b ){ ban=a; name=b; } };
class B;
class C { public: B *b; int num; string fullpath(); };
class B { public: vector<A> V; C operator [] ( int n ) { C c; c.b=this; c.num=n; return c; } };

string C::fullpath() {
string s; int k=num;
do { s = (b->V[k]).name + "/" + s; k=b->V[k].ban; } while( k!=-1 );
return s; }

int main(){
B b;
b.V.push_back(A(-1,"C:/one"));
b.V.push_back(A(0,"two"));
b.V.push_back(A(1,"three"));
cout<< b[2].fullpath()<<endl; }

172 :デフォルトの名無しさん:2010/06/12(土) 23:17:09
なんかoperator[]の実装が自然じゃないぞ。
安易に演算子オーバーロードしても読みにくくなるだけだと思う。

173 :デフォルトの名無しさん:2010/06/12(土) 23:25:04
A& operator [] ( int n ) { return V[n]; }

としたいところを手を加えたんですよ。
A&から他のAにアクセス出来ないので。

174 :デフォルトの名無しさん:2010/06/12(土) 23:28:06
Vの元のクラスB(のポインタ)と位置をリターンすることで、
V[n]のみのリターンでは出来なかったVへのアクセスを実現します。

175 :デフォルトの名無しさん:2010/06/12(土) 23:30:53
だから、「他のAにアクセスする」というのは角カッコ演算子の役割ではない、と言ってるの。
普通 b[2]って言ったら2に対応付けられた値だけ返ってくることを期待するでしょうが。

176 :デフォルトの名無しさん:2010/06/13(日) 06:27:24
B::operator[](int)とC::fullpath()の機能をまとめて、
string B::path(int n)みたいな関数にしたほうがいいと思う。

177 :デフォルトの名無しさん:2010/06/13(日) 11:39:03
そうすることにする
[]が先の方が良かったけど複雑だしな

178 :デフォルトの名無しさん:2010/06/13(日) 11:46:31
operator[]ってプログラマの自己満程度の意味しかないよね
こんなもの全くいらないし
fortran的に考えて

179 :デフォルトの名無しさん:2010/06/13(日) 12:19:12
>>174
その役目はイテレータだけどな。

180 :デフォルトの名無しさん:2010/06/13(日) 12:19:56
>>178
オペレーターオーバーロードは、それで記述が簡潔になる場合にしか使わないし。

181 :デフォルトの名無しさん:2010/06/13(日) 12:22:35
多次元[]実装するために必死になってtemplateいじってるやつ見ると笑いがこみ上げてくるoperator()とat()でいいのにね

182 :デフォルトの名無しさん:2010/06/13(日) 12:26:48
>>181
一次元のコンテナがあれば[]で何次元でも作れるのに?

183 :デフォルトの名無しさん:2010/06/13(日) 12:28:20
>>182
それじゃあ生成・破棄の効率がクソ悪いだろ

184 :129:2010/06/14(月) 16:23:42
>>135 遅くなったけどありがとう。

いまいち伝わってないというか、上手く説明ができてなかったようなので言い方変えると、

class Test {
int value;
public:
void Set(int v) {
this->value = v;
}
};

void func(Test* t) {
t->Set(1); //これでfunc()の呼び出し元のtest.valueを変更したいけど、
//*t = Test(); //これができると呼び出し元のtest自体が書き変わってしまうので禁止できないか?
}

void main() {
Test test;
func(&test);
}

イベントでいうと以下のようなことをやりたいのですが、Senderの実体を書き換えられるのは困りますよね。
ttp://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-018.html
イベントなのでどんなクラスにも対応しなければならず、ラップして代入禁止というのは無理です。
ポインタで渡して実体を書き換えないように気を付けるのが普通なんでしょうか。

185 :デフォルトの名無しさん:2010/06/14(月) 16:45:05
Setでも書き変わってるようにしか見えんが・・・


186 :129:2010/06/14(月) 17:01:59
>>185
Setでは書き換わってもいいんだけど、*t = Test()で全く別のオブジェクトにはなって欲しくないってことです。

187 :デフォルトの名無しさん:2010/06/14(月) 17:19:51
代入しただけでは全く別のオブジェクトにはなりません

188 :129:2010/06/14(月) 18:11:57
ああ、全く別じゃなくてメンバ全部コピーしてるだけですね。
そう考えると、やらないように気を付けるでいいのかな。
言い間違いのつもりだったけど、いまいち理解できてなかったのかも。
ありがとうございました。

189 :デフォルトの名無しさん:2010/06/15(火) 01:18:55
だから>>135はコピーだけ禁止する方法を示してくれてるんだぜ

190 :デフォルトの名無しさん:2010/06/15(火) 09:50:05
高級言語から覚える弊害がこれだよ

191 :デフォルトの名無しさん:2010/06/15(火) 10:27:04
「const参照渡し」で終わりなんじゃないのか……?

192 :デフォルトの名無しさん:2010/06/15(火) 10:32:41
あー、setはしたいのか。
じゃあ代入禁止でおk。boost::noncopyableでもおk

しかし>>190が意味不明だ

193 :デフォルトの名無しさん:2010/06/15(火) 10:37:44
>>184
void __fastcall TForm::ButtonClick(TObject * const Sender)

194 :190:2010/06/15(火) 12:08:46
流れから想像するに代入で参照が切り替わると勘違いしてんじゃねーかなって思ったわけです
ちょっときびしいか?


195 :デフォルトの名無しさん:2010/06/15(火) 13:07:28
>>190はキチガイだと思う

196 :デフォルトの名無しさん:2010/06/15(火) 13:10:09
アセンブラ、C or Lisp、C++ とかがよいと思うな。

x86アセンブラのほうが覚えること少なくてらくでしょ。
基本はmovとcmpとjmpだけでよいし。

197 :デフォルトの名無しさん:2010/06/15(火) 13:37:45
どこの誤爆?

198 :デフォルトの名無しさん:2010/06/15(火) 17:24:46
マって人生誤爆してるよね

199 :デフォルトの名無しさん:2010/06/15(火) 17:38:27
最近再びwindowsプログラムやりはじめたんだけどMFCってクソですね

200 :デフォルトの名無しさん:2010/06/15(火) 17:57:39
スレチとか脳障害なの?

201 :デフォルトの名無しさん:2010/06/15(火) 18:04:52
いやC++にちょっと慣れてきたら改めて思ったっていう独り言です。スレチですねごめんね。。。

202 :デフォルトの名無しさん:2010/06/15(火) 18:37:00
逆に何がお気に入りなんだろ。

203 :デフォルトの名無しさん:2010/06/16(水) 00:02:08
mfcは設計自体は糞だけど、C++で高速なWindowsプログラムを作成する場合
もっとも、いい選択肢だよ

204 :デフォルトの名無しさん:2010/06/16(水) 00:15:53
MFCと速度は関係なくない?

205 :デフォルトの名無しさん:2010/06/16(水) 00:25:28
そんなことはない、BCBやQtなんて使ってみなよ
吐き気がする位遅い

206 :デフォルトの名無しさん:2010/06/16(水) 00:35:24
MFCでウィンドウズプログラム恐怖症になったがC#で救われた

207 :デフォルトの名無しさん:2010/06/16(水) 00:47:38
Qtが遅いのはXwindowだっけ?あれが遅いんじゃないの?

208 :デフォルトの名無しさん:2010/06/16(水) 01:36:11
MFCがここ10年くらいの後発の言語や
フレームワークより使いにくいのは仕方ないだろ
それ以前の負の遺産を引きずってるんだから

209 :デフォルトの名無しさん:2010/06/16(水) 11:33:01
>>206その気持ちよくわかる。

210 :デフォルトの名無しさん:2010/06/16(水) 12:21:55
質問しようとして検証コード書いたり状況説明を考えてる内に下らないチョンボに気が付いたw
元質問は自己解決したんですが、良く分からなかった事があるので教えてください。

多重継承しているクラスがあります。
class Derive : public Base, public Listener{

で、他の関数にthisポインタを渡そうとしてます。
Derive::func(void){
  thread->SendRequest(this, data);
}

SendRequestはこんな感じです。
void SendRequest(Listener *listener, int data);

SendRequestを呼び出す前のthisのアドレスが、
呼ばれたSendRequest内の引数listenerでは+4されていたのは何故でしょうか。
VC++2008です。

すみませんがよろしくお願いいたします。


211 :デフォルトの名無しさん:2010/06/16(水) 12:30:33
>>210 多重継承とはそういうもの。
Derive の中には Base部分と Listener部分が含まれている。
おそらく、先頭4バイトがBase部分で、その後にListener部分が続いていたんだろう。


212 :デフォルトの名無しさん:2010/06/16(水) 12:37:32
なるほど、ありがとうございます。
確かに
class Derive : public Listener, public Base

としたら+4されなくなりました。

213 :デフォルトの名無しさん:2010/06/16(水) 16:24:54
static_castさんは親切だからね

214 :デフォルトの名無しさん:2010/06/16(水) 19:24:22
だが皆から蔑まれてる c style cast さんも親切なのです

215 :デフォルトの名無しさん:2010/06/16(水) 20:42:37 ?2BP(0)
ありがた迷惑

216 :デフォルトの名無しさん:2010/06/16(水) 21:01:58 ?2BP(0)
struct A { };
void foo(const A* const a) { }
void bar() { foo(&A()); }

これはまずい?
const参照使えば大丈夫なのは知ってるんだが
ポインタだとダメ?

217 :デフォルトの名無しさん:2010/06/16(水) 21:10:09
何を以てまずいとか大丈夫とかダメとか言っているのかわかりません。

218 :デフォルトの名無しさん:2010/06/16(水) 21:19:22
>>216
こんぱいるできたか?

219 :デフォルトの名無しさん:2010/06/16(水) 22:23:40
まずい以前にテンポラリオブジェクトのアドレスなど取れないわ

220 :210:2010/06/16(水) 23:48:01
ついでなので>216もコンパイルしてみました。
一応コンパイルは通るし、fooの引数aもスタック上のオブジェクトを指してるっぽい。

…でも出来る出来ない以前にちとダサいと思うw

221 :デフォルトの名無しさん:2010/06/16(水) 23:51:10
VCは独自拡張でアドレスとれた気がする

222 :210:2010/06/16(水) 23:52:29
あ、VC++だったからですか…。

223 :デフォルトの名無しさん:2010/06/17(木) 07:39:57
最近、C++の存在意義に悩んでいます・・・。
PC性能が上がってきて、速度とかあんまり気にする必要がなくなってきてる気がして・・・。

あ、趣味グラマです。

224 :デフォルトの名無しさん:2010/06/17(木) 07:51:35
ま、趣味ですからね

225 :デフォルトの名無しさん:2010/06/17(木) 17:30:41
んなこたーない。速度超重要。

226 :デフォルトの名無しさん:2010/06/17(木) 17:49:34
低レベルの方が自分がなにやってるのかしっかり分かって安心できるしバグも見つけやすいと思う

227 :デフォルトの名無しさん:2010/06/17(木) 17:58:14
MFCが大きくて遅くて不安定だったのはWin16,Win32s,Win32初期あたりの話だな
当時より大きく遅くなっているが今のハードだと問題にならない

228 :デフォルトの名無しさん:2010/06/17(木) 22:58:50
最初に指定要素分配列を確保したら以降は削除するまで要素数が変化しない配列を動的配列といいますか?

229 :デフォルトの名無しさん:2010/06/17(木) 23:00:03
秘密です

230 :デフォルトの名無しさん:2010/06/17(木) 23:02:53
>>228
いいえペンです

231 :デフォルトの名無しさん:2010/06/17(木) 23:06:04
>>228
reallocしないならば静的確保だというのですか?

232 :デフォルトの名無しさん:2010/06/17(木) 23:06:22
ケフィアです。

233 :デフォルトの名無しさん:2010/06/18(金) 11:07:40
>>228
             /)
           ///)
          /,.=゙ ''"/   
   /     i f ,.r='"-‐' つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

234 :デフォルトの名無しさん:2010/06/18(金) 16:50:25
行列の固有値を計算するプログラムをVC++2005とgcc4.4.1でコンパイル実行
すると、全く同じプログラムなのに結果が違う。ちなみにMATLABの結果は
VC++の結果と一致している。

2日ほど悩んでいたが...

原因は、何と自作のライブラリファイルで使っていたabs関数に「std::」をつけて
いないことだったorz。

xをdouble型の変数としてabs(x)を呼べば関数のオーバーロードによって
double abs(double x) が呼び出されると思っていたのにgccではint abs(int i)
が呼び出されていて結果が違っていた。xがdoubleであってもintに型キャスト
されるため整数部(の絶対値)のみが返ってきていた。

これはC++の数学関数が標準名前空間std内にあることによるのだろうが
(ちなみに #include <cmath>としている)、VC++では「std::」をつけなく
ても問題なく、double abs(double x) が呼ばれている。

C++の仕様としては、gccとVC++どちらが正しいでしょうか?

「std::」をつけなくてもコンパイルエラーや警告がでず、意図しない
別のabsが呼ばれるgccの方が怖いですけど。

235 :デフォルトの名無しさん:2010/06/18(金) 17:05:49
template<uint8_t N> class Hoge : public BasicHoge;

BasicHoge * CreateHoge(uint8_t n)
{
    switch(n)
    {
    case 0: return new Hoge<0>;
    case 1: return new Hoge<1>;
    ・・・
    }
}

int main() { BasicHoge *p = CreateHoge(Rand8()); ・・・; }

上のようなことをしたいんだけど
1〜uint8_tの最大まで書くのがめんどいんだけど
うまいこと実行時の整数をコンパイル時の整数にマッピングする方法ってない?

236 :デフォルトの名無しさん:2010/06/18(金) 17:22:54 ?2BP(0)
Boost.Preprocessor

237 :235:2010/06/18(金) 17:37:20
すいません自己解決しました

>>236
マクロ無しでも余裕でした

238 :デフォルトの名無しさん:2010/06/18(金) 19:51:40
>>234
gcc 4.3以降なら-Wconversionで警告出せるよ。
警告出ないと確かに怖いね。

239 :デフォルトの名無しさん:2010/06/19(土) 01:43:51
Windows上のアプリケーションから、直接システムコールを呼び出して、ヘッダーファイルを
インクルードせずにプログラムを作るには、一体どうしたらいいんでしょう?

色々と調べ回ったのですが、大体がLinuxでのことしか書いてないし、Windowsでのもの
も、実際にコードにしたら、Windowsから不正だのなんだのと言われて、プログラムが止まってしま
うんですが…

例えば、int 21hとか

240 :デフォルトの名無しさん:2010/06/19(土) 01:45:35
マシンコードとかアセンブラだろ
常識

241 :デフォルトの名無しさん:2010/06/19(土) 03:28:08
>>239
ヘッダーインクルードを忌避する理由は何?

Windows API (Linux のシステムコールに相当) を呼び出すには call 命令を使うが、その
飛び先 (API を提供している DLL のエントリポイント) をリンクするのはアセンブラでは
煩雑と言うか面倒と言うか忘れたと言うか、使用するアセンブラによる。
API を呼び出すのにかかるコストは、C/C++ の関数形式でもアセンブラの call 命令でも
全く変わらない。
せっかく C++ なのだから、素直に windows.h をインクルードするのが吉。

int 21h で有名なのは MS-DOS ファンクションコールだが、Windows アプリでは (デバイス
ドライバを書いて特権を取得しない限り) そもそも int 命令が禁止されていて、MS-DOS
ファンクションコールは一切使えない (プログラムが不正終了するのはおそらくそのせい)。
MS-DOS アプリが動作するのは、MS-DOS ファンクションコールがエミュレートされている
から (64bit OS では 16bit アプリをサポートしないため MS-DOS アプリは動作しない)。

242 :デフォルトの名無しさん:2010/06/19(土) 04:55:33
windowsAPIも最終的にはCPUやGPU命令呼び出すから
それを直にやりたいんだろ。
アセンブラ。

243 :デフォルトの名無しさん:2010/06/19(土) 05:41:16
APIでできる事を自分でやるって、車輪の再開発をしたいって事?

244 :デフォルトの名無しさん:2010/06/19(土) 07:05:44
>>242
その方法を自分で調べられん奴が一体何をするつもりなんだろうね

245 :デフォルトの名無しさん:2010/06/19(土) 08:44:24
ヘッダをインクルードしたくないだけなら、必要な宣言をコピーすればいいじゃない

246 :デフォルトの名無しさん:2010/06/19(土) 08:50:18
疑問に思ったんですが、関数オブジェクトってどういう使いどころがあるんでしょうか。
STL以外での使い道に心当たりがある方お願いします。

247 :デフォルトの名無しさん:2010/06/19(土) 08:55:18
DOS時代なら特権レベルとかなかったから好き放題だったんだけどねえ
今はintとかin/outとかhaltとか好きに呼べない
ま、安全のためだから仕方がないが

248 :デフォルトの名無しさん:2010/06/19(土) 15:59:10
自作のコンテナのイテレーター作るときに気を付けること(iterator_tagの設定など)をまとめたサイトってありますかね?

249 :デフォルトの名無しさん:2010/06/19(土) 20:30:21
>>248
STLで足りない理由を明確にすることかな

250 :デフォルトの名無しさん:2010/06/20(日) 02:09:03
>>248
作り方: http://msdn.microsoft.com/en-us/magazine/cc301955.aspx
規格(の草案): http://www.kuzbass.ru/docs/isocpp/lib-iterators.html#lib.iterator.requirements

251 :デフォルトの名無しさん:2010/06/20(日) 06:28:27
C++で
#define YAMA 0
#define KAWA 1
#define HAIRETUNOKAZU 20

とかを使いまくってるのですが、これは話にならないくらいの糞コードなんでしょうか?

static const HAIRETUNOKAZU = 20
みたいにするのが業界標準なんでしょうか?

252 :デフォルトの名無しさん:2010/06/20(日) 06:35:44
他にも関数作成時は
void kansuu(int number);
みたいに書きまくってるけど
void kansuu(const int number);

for文も
for( a=0 ; a<10 ; a++ )
みたいに書きまくってるけど
for( a=0 ; a<10 ; ++a )

if文も
if( n=10 )
と書きまくってるけど
if( 10=n )

と書かないと業界では鼻で笑い飛ばされて帰っていいよと言われる糞コードなんでしょうか?

253 :デフォルトの名無しさん:2010/06/20(日) 06:38:42
for文に限ってはほんのほんのほんお少しだけ当てはまる
他については決してそんなことはないというか、
void kansuu(const int number) ってのは void kansuu(int number) と同じシグネチャだから
逆に混乱を招きかねないって意見も多くあるし、
if ( 10 == n ) についても同じ

254 :デフォルトの名無しさん:2010/06/20(日) 06:49:13
なるほど、ありがとうございました。
for文は++aのがデータのメモリ間のコピーだかなんだかの処理がa++より一回少なくて高速だと聞いたのですが、
それほどその程度の速度を意識したことなかったし、大抵の初心者サイトで最初に教えられるのはa++だから惰性で続けてました。

ほかにも構造体を関数へ渡すときは

kansu(KOUZOUTAI)
void kansu(KOUZOUTAI)

kansu(&KOUZOUTAI)
void kansu(*KOUZOUTAI)

kansu(KOUZOUTAI)
void kansu(&KOUZOUTAI)

みたいないろんなやり方があって自分は2番目を常用してますが、これは好みでしょうか?
DirectxのSDKなどでは2番目で使用する前提の関数が多く用意されてるのでこれがプログラマ達の標準だと思ってました。
他の方でも知っておられたら教えてください。

255 :デフォルトの名無しさん:2010/06/20(日) 07:29:42
++aがいい。組み込み型なら別に気にしなくてもいいけど、用がなければ前置でいい。
10=nというその例のようなミスを防ぐためにはいいのかもしれないけど、それは強制しないし
n=10と書いても警告が出るからn=10を推奨。10=nは逆に禁止したいぐらい。
値を変更するなら3番目、kansu(*KOUZOUTAI)のtypoだよね?
変更しないならconst参照で受けるのがいい。
鼻で笑い飛ばして帰っていいよとは言わないけど、上記のようなことを説明をしつつ伝える。

256 :デフォルトの名無しさん:2010/06/20(日) 07:38:26
OpenCVのC++インターフェースとかは入力パラメータがconst参照渡し、出力パラメータが非const参照渡し
Googleのコーディング規約では入力パラメータがconst参照渡し、出力パラメータがポインタ渡しになってるな。
どっちにしろ値を渡す目的ではconst参照渡しを使うのがいいと思う。

257 :デフォルトの名無しさん:2010/06/20(日) 08:00:54
なるほどありがとうございました。
自分で組んでる分にはわざわざconstなんて付けないし、
人との共同でも値変更があるかはプログラム設計書に明記してりゃいいやと思ってたけど、
安全で安心ではありますね。

258 :デフォルトの名無しさん:2010/06/20(日) 08:05:26
コンパイラが勝手にconstチェックしてくれるなんて使わなきゃ損だね

259 :デフォルトの名無しさん:2010/06/20(日) 08:26:34
>>255
1番目は値渡し(コピー)。
2番目はポインタ渡し。
3番目は参照渡し。

のつもりじゃないだろうか。

260 :デフォルトの名無しさん:2010/06/20(日) 08:34:40
ttp://codepad.org/pnRhDYaP

ポインタ派参照派どちらの派閥をとわずご満足いただけます

261 :デフォルトの名無しさん:2010/06/20(日) 08:36:16
たまに他言語使ってconst参照相当の物が無いと不安になって心が押しつぶされそうになる

262 :デフォルトの名無しさん:2010/06/20(日) 09:00:11
C#使っていると、constのような最小限のチェック機構が無いのは何でだろうと悩んでしまう。


263 :デフォルトの名無しさん:2010/06/20(日) 11:58:09
勉強しろw

264 :デフォルトの名無しさん:2010/06/20(日) 12:15:56
Immutable保証するやつはないだろ
そもそもメソッドのパラメータとして記述できるのはparamsとrefとoutだけじゃね

265 :デフォルトの名無しさん:2010/06/20(日) 12:25:40
c#の参照渡しで書込み保護できないとか危険卓

266 :デフォルトの名無しさん:2010/06/20(日) 12:31:13
まぁC#はC++と違って何もつけなくても間接参照できるし
ref使うのは特殊なケースだろう

間接参照でImmutable保証出来ないのはJavaにしろPythonにしろ同じだし

267 :デフォルトの名無しさん:2010/06/20(日) 13:48:19
ポインタが無効かどうか知るには管理者からboost::weak_ptrを渡してもらえばいいですか?

268 :デフォルトの名無しさん:2010/06/20(日) 14:33:30
すまん、const参照渡しって概念は何となく分かるんだが、
const参照渡しが推奨される理由が分からないorz

constポインタ(?)とかじゃダメなの?

269 :デフォルトの名無しさん:2010/06/20(日) 14:38:25
参照ならNULLが無い
const参照ならテンポラリオブジェクトも取れる
そしてクライアントの手間が省ける

270 :デフォルトの名無しさん:2010/06/20(日) 16:44:04
>>259
あわわ。寝ぼけてたみたいでorz
指摘ありがとうです。

>>257でちゃんと伝わってたようで安心した。

271 :デフォルトの名無しさん:2010/06/20(日) 18:36:12
リソースが限られてる組み込みとかって、
templateよりdefine関数の方が一般的?

272 :デフォルトの名無しさん:2010/06/20(日) 18:50:47
と公言していた某プロジェクトが今どうなったか知らぬのか
# defineは関数ではない

273 :デフォルトの名無しさん:2010/06/20(日) 18:54:58
確かにdefine関数っていうのはおかしいか
マクロ展開

274 :デフォルトの名無しさん:2010/06/20(日) 19:49:27
>>270
うむ。orz

275 :デフォルトの名無しさん:2010/06/20(日) 20:16:02
まあ関数型マクロと呼ぶし、
プリプロセッサにとっての関数とも言えるので
いいんじゃない

276 :デフォルトの名無しさん:2010/06/20(日) 20:16:55
ですね

277 :デフォルトの名無しさん:2010/06/20(日) 21:06:04
引数付きマクロのことかい

278 :デフォルトの名無しさん:2010/06/21(月) 00:09:08
>>241
ヘッダーインクルードを忌避しているわけではなくて>>243が言っている通り、車輪の再開発をしたいのです。
まだ学生の身なので、よりハードウェアに近いところを勉強したくて…


CPUをスーパーバイザモードで動かせば、メモリの好きなアドレスに書き込みが出来るかな、と思って、
ハードウェア直叩きで映像を表示出来れば、DirectX等のコンポーネントを使う時も理解が深まると


>>245
関数プロトタイプ宣言を用意してみても、実体が無い関数だからリンクが出来ないと言われております

279 :デフォルトの名無しさん:2010/06/21(月) 01:06:48
へえ

280 :デフォルトの名無しさん:2010/06/21(月) 01:18:57
>>271 template が何か実行時のリソースを浪費するとでも思ってるのか?

281 :デフォルトの名無しさん:2010/06/21(月) 02:18:44
ループがあると関数はinline展開されない事が多いな

282 :デフォルトの名無しさん:2010/06/21(月) 03:45:52
>>280
exeが大きくなるぶん消費量は増えるのでは
浪費というとおかしいけど。

283 :デフォルトの名無しさん:2010/06/21(月) 03:53:19
>>282 マクロだと「exeが大きく」ならないの?どうして?

284 :デフォルトの名無しさん:2010/06/21(月) 04:10:45
>>283
>>280は流れをみれば、defineはリソースを浪費するが、templateは浪費しないだろ、って論調じゃん
そうじゃなきゃそのレスにはならない

285 :デフォルトの名無しさん:2010/06/21(月) 04:12:53
defineとtemplateってどっちが肥大化すんの?
defineの方が大きくなりそうといえばなりそうなんだけど。

286 :デフォルトの名無しさん:2010/06/21(月) 04:13:24
>>284 そんなことは言っていない。それに、質問してるだけなのに「論調」とか言われても困る。

287 :デフォルトの名無しさん:2010/06/21(月) 12:18:33
>>278
残念ながら、Windows は抽象化というものを行っており、デバイスドライバを除くすべての
ソフトはスーパーバイザモードに移行できず、従ってハードウェアに近いコードを書く事は
できない。
ただし、抽象化というのは全く異なるハードウェア上で同一のバイナリが実行できるという
点で歓迎すべきものと同時に、ユーザーモードのアプリに下手な動作をさせずシステムを
クラッシュさせないという安定性の確保の観点から重要なもの。

どうしてもハードウェアを直叩きしたいという場合にはデバイスドライバを書くしかないが、
それはシステムの安全を考慮した高い品質のコードを慎重に書かねばならない上、それ
をするにはそもそもハードウェアの仕様を知らなければならないが大抵の場合メーカーは
ハードウェアの仕様を公開していないため事実上不可能 (メーカーの提供するデバイス
ドライバをリバースエンジニアリングして仕様を解析するという手段も無いではないが、それ
はそれでプログラミングとは別のスキルが要る)。

Windows 上で普通にプログラミングしている限り、ハードウェアに直接触れる事はできない
し、意識する必要も無い。
せいぜいが DirectX を利用したらハードウェアに近い事をした、と思っておく程度。
ミドルウェア・ファームウェア開発者を目指すのでなければ、それ以上の知識は不要だし、
邪魔になる事もある。

これ以上の話はスレ違いかな?

288 :デフォルトの名無しさん:2010/06/21(月) 12:30:24
そしたらアセンブラにCPU命令があるのはなぜだ。

289 :デフォルトの名無しさん:2010/06/21(月) 12:44:09
>>288おまえはOSの勉強からはじめろよ。
あとにどとくんな。

290 :デフォルトの名無しさん:2010/06/21(月) 12:45:55
>>288
アセンブラは基本的に全ての命令をサポートしてるよ。ただそれだけ。
そうじゃなければOSのコア作る人はどうすればよいのかと。

291 :デフォルトの名無しさん:2010/06/21(月) 13:19:35
Linuxつかったほうがいいんじゃね?

292 :デフォルトの名無しさん:2010/06/21(月) 16:02:15
>>288
今流行のマルチコアを活用したプログラムとかSSE2/SSE3/SSE4をバリバリ
使ったプログラムを書くにはインラインアセンブリしかあるまい。

そういう意味ではx86-64でC言語でインラインアセンブリを禁止したのはおかど
違いだと思う

293 :デフォルトの名無しさん:2010/06/21(月) 16:06:50

> 残念ながら、Windows は抽象化というものを行っており、ハードウェアに近いコードを書く事はできない。

294 :デフォルトの名無しさん:2010/06/21(月) 16:07:53

> Windows 上で普通にプログラミングしている限り、ハードウェアに直接触れる事はできないし、意識する必要も無い。

295 :デフォルトの名無しさん:2010/06/21(月) 17:18:15
>>293-294
何ですかコレ

296 :デフォルトの名無しさん:2010/06/21(月) 17:58:16
>>295
触るな
バカがうつるぞ

297 :デフォルトの名無しさん:2010/06/21(月) 17:59:46
>>295
触るな
バカがうつるぞ

298 :デフォルトの名無しさん:2010/06/21(月) 18:06:01
>>296-297
何ですかコレ

299 :デフォルトの名無しさん:2010/06/21(月) 18:13:57
バカがうつるとどうなるのか身をもって教えてくれた>>296-297に感謝

300 :デフォルトの名無しさん:2010/06/21(月) 18:19:14
お断りします。

301 :デフォルトの名無しさん:2010/06/21(月) 21:21:51
特権レベルを知らない馬鹿はスルーしておけば良い

302 :デフォルトの名無しさん:2010/06/21(月) 21:28:38
>>292
インラインアセンブリなんてもともと曲がったものだからな
アセンブラで書く必要のあるものは割り切ってアセンブラで書くべきで
それをまだ asm が予約語だからとしがみついてるアフォが板杉

303 :デフォルトの名無しさん:2010/06/21(月) 21:34:18
それだといちいち何らかのジャンプが発生するだろ
効率悪い

304 :デフォルトの名無しさん:2010/06/21(月) 21:45:44
間に C++ を介在させるからだよ
命令シーケンスの連続性に意味があるコードに高級言語を混ぜる書くアフォは氏んでいい

305 :デフォルトの名無しさん:2010/06/21(月) 21:47:54
触っちゃいけない子だったか

306 :デフォルトの名無しさん:2010/06/21(月) 21:50:00
ノーアンサー?

307 :デフォルトの名無しさん:2010/06/21(月) 21:53:07
WinUSBやったことありますか?


308 :デフォルトの名無しさん:2010/06/21(月) 22:55:45
クラスの依存でつまずきました… orz

class AbstractHoge {
  (略)
};

class A : public AbstractHoge {
public:
  B toB();
};

class B : public AbstractHoge {
public:
  A toA() {
};

これが通らないのは、仕様?


309 :デフォルトの名無しさん:2010/06/21(月) 22:57:04
うん。

310 :デフォルトの名無しさん:2010/06/21(月) 22:58:01
うん。class B;ってClass Aの前に書くといいよ。


311 :デフォルトの名無しさん:2010/06/21(月) 23:24:11
>>285
templateは型ごとに関数が個別に作られる
マクロはその場に展開

後は分かるな?

312 :デフォルトの名無しさん:2010/06/21(月) 23:29:02
templateがインライン化されるような状況だと
どちらでも変わらないかもね
普通は#defineの方が肥大化するだろうけど

313 :デフォルトの名無しさん:2010/06/21(月) 23:30:37
どっちともいえないな。
複数箇所へ埋め込んだらdefineがおおい。
メンバ関数が多くあれば使わない部分まで生成されるテンプレートが大きい。

314 :デフォルトの名無しさん:2010/06/21(月) 23:37:48
いや、使わない部分は生成されないぞ

315 :デフォルトの名無しさん:2010/06/21(月) 23:44:42
gccでテンプレートが展開された後のコードを見ることってできますか?

316 :デフォルトの名無しさん:2010/06/21(月) 23:49:42
>>271
組み込みの場合、引数付きマクロはテンプレートの代りに
用いられるわけではなくて、レジスタやメモリマップドI/Oへの統一的な
アクセスを提供するためとかじゃないかね
他には既存Cシステムからの流れからというのもあるだろうね
それとメーカーの提供してるサンプルがCだったりすることも影響してると思う

317 :デフォルトの名無しさん:2010/06/21(月) 23:57:51
functionつかえ。
defineは複数箇所に展開されたらかさふえる。
サイズがでかくなって良い場合はdefine。
しかし単一箇所にコードがあった方が速度上がるだろうから
define使う利点無し。


318 :デフォルトの名無しさん:2010/06/22(火) 00:01:41
void Foo( int x ){ Boo( x ); }
みたいな関数でもインライン展開しない方がいい?

319 :デフォルトの名無しさん:2010/06/22(火) 00:04:31
何を気にしてるんだかさっぱり分からん

320 :デフォルトの名無しさん:2010/06/22(火) 00:24:10
>>310
ありがとうございます。

321 :デフォルトの名無しさん:2010/06/22(火) 01:12:46
現在、windows 7でレジストリのアクセス許可の設定を行っているんですが、
SeSecurityPrivilegeが有効になっていないためエラーになります。
そのコードがC++からコマンドラインを呼び出して設定しているという形になっています。
コマンドラインで使用しているツールはsubinaclです。
SeSecurityPrivilegeを有効にするための関数などC++であったら
ヒントでもいいので教えていただきたいのですが
何卒よろしくお願いします。


322 :デフォルトの名無しさん:2010/06/22(火) 01:47:53
exec()かなんか使ってsubinaclコマンドを実行しようとしたら、
"SeSecurityPrivilegeが有効になっていない"みたいなエラーが出るって話かな。

C言語レベルの話だし、Windows限定じゃん。WinAPIのスレで質問した方がよくね。
http://pc12.2ch.net/test/read.cgi/tech/1274949734/l50

323 :デフォルトの名無しさん:2010/06/23(水) 01:04:11
演算子のオーバーロードがややこしいのは俺だけ?

324 :デフォルトの名無しさん:2010/06/23(水) 01:05:18
ややこしいからgoogleだと禁止

325 :デフォルトの名無しさん:2010/06/23(水) 03:22:36
operator= もだめなのか

326 :デフォルトの名無しさん:2010/06/23(水) 05:30:22
>>323
関数オブジェクトとかコピーコンストラクタとかfriendなoperatorとか、お前のノーミソはパニックだろw

327 :デフォルトの名無しさん:2010/06/23(水) 11:48:23
ぶっちゃけそんなにややこしいとは思わないけど
交換則が成り立たない加法演算子とか、反対称則の成り立たない比較演算子とか定義して、
テンプレートあたりで意図せず使ってしまい、破錠しないかってのはすごい気になる……。

328 :デフォルトの名無しさん:2010/06/23(水) 11:53:56
演算子の文法で呼び出せるだけで、何をするかはユーザーの勝手だ。

329 :デフォルトの名無しさん:2010/06/23(水) 12:24:28
>>327
おまえはC++をちゃんと勉強してきたのか?

330 :デフォルトの名無しさん:2010/06/23(水) 13:24:17
>>327
overloaded operators for classes should behave like operators for builtin types

331 :デフォルトの名無しさん:2010/06/23(水) 13:36:12
spiritがなかまになりたそうなめでこちらをみている

332 :デフォルトの名無しさん:2010/06/23(水) 20:04:55
>>327
が言いたいのは
 >>329-330
 > overloaded operators for classes should behave like operators for builtin types
 shouldなだけで守られるとは限らないじゃないか。
 stdのiostreamを思いだそう!
ってことじゃないのかな?

そして>>327が言う問題って、Conceptさんの力があれば解決できるの?
C++0xはよーしらんのだが。


333 :デフォルトの名無しさん:2010/06/23(水) 20:13:24
>>327
int+hoge が hoge::operator+(int)に一致するようなことを危惧してるの?そんなことはないから。

334 :デフォルトの名無しさん:2010/06/23(水) 20:14:59
>>333
???

335 :デフォルトの名無しさん:2010/06/23(水) 21:39:22
>>333
int+hoge
hoge+int
が同じにならない可能性があることを危惧しているのではないのか

336 :デフォルトの名無しさん:2010/06/23(水) 22:04:21
>>332
Yes
iostreamをはじめ、std::string、boost::format、spiritはいわずもがな。
便利だから使うけど、C++って>>330のようなコンベンションが黙殺される傾向にあるのは確かで……
まぁそれだけなら問題ないわけだが、呼び出す関数側で交換法則が成り立つと思って処理したら
結果は未定義になってしまうんじゃないか?

Conceptはこういうメソッドを持ってるということは認識できるけど、
「正しく」実装されているかについては知ることはできないし、不可能だと思うよ。

337 :デフォルトの名無しさん:2010/06/23(水) 22:11:25
std::chrono::system_clock::now()
で現在時刻を取得した後に、年、月、日、時、分、秒、m秒
をそれぞれ取得するにはどのクラス or 関数を使用するれば良いのでしょうか


338 :デフォルトの名無しさん:2010/06/23(水) 22:22:57
>>335
そう、同じにならないのなら別々の定義にするか、片方だけ定義すればいいのになぜ危惧してるのか疑問に思った。
それが一方の定義だけで自動で両方対応すると思ってるのかと思った。

339 :デフォルトの名無しさん:2010/06/23(水) 22:28:04
>>338
なんか意図が汲み取れないが、交換法則が成り立たないのをよしとしている?

340 :デフォルトの名無しさん:2010/06/23(水) 22:48:13
>>339
+演算子をオーバーロードするときは交換法則が成り立つのが理想だと思うけど、>>327は何を危惧してるのかが掴みきれない。

341 :デフォルトの名無しさん:2010/06/23(水) 23:01:38
>>336
なぜ黙殺される傾向にあると思ったの?

342 :デフォルトの名無しさん:2010/06/23(水) 23:01:45
operator+ は終わってる

343 :デフォルトの名無しさん:2010/06/23(水) 23:05:26
"a"+"b"="ab"みたいなのは許さないってことじゃ

344 :デフォルトの名無しさん:2010/06/23(水) 23:07:31
他の言語でも文字列の連結とか普通にやってるけど
そんなにやばいの?

345 :デフォルトの名無しさん:2010/06/23(水) 23:10:46
演算子のオーバーロードってSTL使うときとベクトルクラスとかにしか使わないな。
他にどんな用途に使ってるの?

346 :デフォルトの名無しさん:2010/06/23(水) 23:11:24
コンパイラが交換法則を勝手に適用した最適化をして”ba"になることを危惧してるのか?そんなことおきないけど

347 :デフォルトの名無しさん:2010/06/23(水) 23:13:31
>>343
確かに文字列の連結は交換則成り立たないな
あまり意識していなかったが

348 :332:2010/06/23(水) 23:14:11
あ、意味が分かった。
要するに
>>327は、テンプレート作っているやつが
template<class T>
void foo(const T& a, const T& b)
{
a+bでなきゃならない部分まで
b+aと特に注意しないで書いちゃう
}

ってのを心配しているのかな!!

349 :デフォルトの名無しさん:2010/06/23(水) 23:16:31
そんなこと言ってたら何だってありえると思うけど

350 :デフォルトの名無しさん:2010/06/24(木) 02:13:25
演算子に限った話じゃないな

351 :デフォルトの名無しさん:2010/06/24(木) 12:37:43
この混乱見るとやっぱ演算子のオーバーロードは禁止すべきだな
特に自分がクラスを作る場合

352 :デフォルトの名無しさん:2010/06/24(木) 13:00:07
>>351
混乱する人が演算子のオーバーロードを使わなければいいだけの話。
中には必要としている人もいるのだから俺様的価値観を押しつけるな。

353 :デフォルトの名無しさん:2010/06/24(木) 13:13:10
C#は = のオーバーロードをさせるべきである!

354 :デフォルトの名無しさん:2010/06/24(木) 17:36:12
STLのstd::vectorを使う利点って何?

もしかしたら自前で可変長配列作ったほうがいい場合ってあるの?

355 :デフォルトの名無しさん:2010/06/24(木) 17:39:35
標準ライブラリとして存在しているので直ぐに使うことが出来ます。
またイテレーターを使用しての繰り返し作業や、ソートなどがとても楽に行えます。

てか自前コンテナなんて作ってんじゃねーよカス。
いちいちオレオレコンテナを読む身になれよクソが!

356 :デフォルトの名無しさん:2010/06/24(木) 17:41:55
>>354
むしろ使わない利点って何?
組み込みとかDSソフト開発とか以外で。

357 :デフォルトの名無しさん:2010/06/24(木) 17:42:54
いい場合?ねーよ

358 :デフォルトの名無しさん:2010/06/24(木) 17:46:01
演算子を作れるようにすれば***streamとかstringとかformatとかは多少マシになるかも
しれないが、場合によってはさらなる混乱を生むかもな

359 :デフォルトの名無しさん:2010/06/24(木) 18:04:30
ユーザ定義リテラルだけでもさんざん紆余曲折のすえ糞仕様に落ち着いたんだから、
ユーザ定義演算子なんざ考えるまでもない。

360 :デフォルトの名無しさん:2010/06/24(木) 18:05:26
STLのmapとかとlistとかとvectorの順繰りアクセスの速度実測したいんだけど、
なんか気を付けること有る?
こうやるとコンパイラが最適化しちゃう、とか。

361 :デフォルトの名無しさん:2010/06/24(木) 18:18:47
ユーザー定義リテラルは、たぶん真面目に実装するコンパイラないんじゃないかな。

362 :デフォルトの名無しさん:2010/06/24(木) 19:12:54
>>360
何のためにそんなことするのかわからないけど
普通は最適化もSTLを利用するアプリケーションコードもコミコミでの実測だし
何も気にせずプロファイラかければいいよ

363 :デフォルトの名無しさん:2010/06/24(木) 19:40:46
何もしないループが最適化されて消えちゃうってやつは
イテレータ使ってるとそうそう起きないのかな?

364 :デフォルトの名無しさん:2010/06/24(木) 19:55:06
>>363
そうそう起きることが期待されてる。

365 :デフォルトの名無しさん:2010/06/24(木) 19:56:14
>>360
最適化せずに実測する意味がないと思われ

366 :デフォルトの名無しさん:2010/06/24(木) 20:14:58
>>364
期待はしてるけど、どこまで最適化されるのかな、と
テンプレートで実装丸見えだから最適化されるのが普通なのかね

367 :デフォルトの名無しさん:2010/06/25(金) 01:24:32
ごちゃごちゃ考えずに実際のアプリケーションでプロファイルするか、ポイント間で時間測れ。

368 :デフォルトの名無しさん:2010/06/25(金) 08:21:57
なんで拡張メンバー関数のイディオムはしばしば|を使うんですか?


369 :デフォルトの名無しさん:2010/06/25(金) 09:20:15
パイプ演算子の模倣じゃないの?

370 :デフォルトの名無しさん:2010/06/25(金) 21:16:53
>>368
本来の意味と違う演算子の使い方をするので、こんな条件が必要でしょう。
なんとなく意味が伝わる。
あまり使われない演算子。
副作用や変な罠が無い。



371 :デフォルトの名無しさん:2010/06/25(金) 22:10:44
悪い演算子オーバーロード

^演算子をべき乗演算子にしちゃうぞ

凝りすぎの演算子オーバーロード

<- 逆アロー演算子を作りました。

372 :デフォルトの名無しさん:2010/06/25(金) 22:20:53
逆アロー演算子の方が本当はオブジェクトにメッセージを送ると
読めるのでよりOOPらしいと思うんだよね。

でもC++はあくまでもCの後継パワーアップ言語なので、アロー演算子->
を使わないと行けず、最初は「メッセージの向きが逆じゃないか」と
頭が混乱していましたが、もうOOPとかそういう考え方をするのを
やめて「こういう物なんだ」と諦めてから楽になりました。

373 :デフォルトの名無しさん:2010/06/25(金) 22:31:54
<- 逆アロー演算子
なんてどうやって作るの?
operator < (l, r)
に単項演算子operator -を使うのか!?

374 :デフォルトの名無しさん:2010/06/25(金) 22:34:02
>>373
それしかねーだろ

375 :デフォルトの名無しさん:2010/06/25(金) 22:35:03
・演算子と×演算子が欲しいなあ

376 :デフォルトの名無しさん:2010/06/25(金) 22:38:47
APLモドキにでもするつもりかw

377 :デフォルトの名無しさん:2010/06/26(土) 02:25:30
配列定数はExcelをOLEで貼るのね

378 :デフォルトの名無しさん:2010/06/26(土) 10:30:14
>>372
C++はSmalltalkを参考にしてないから
メッセージとかそういう概念はないよ

379 :デフォルトの名無しさん:2010/06/26(土) 12:27:21
Smalltalkを参考にしたのはObjective-Cだが
あの文法は酷い

380 :デフォルトの名無しさん:2010/06/26(土) 12:43:19
>>379
C++/CLIぐらい酷いのか?

381 :デフォルトの名無しさん:2010/06/26(土) 13:04:44
Objective-Cの部分は敢えて別言語っぽく見えるように作られてるので
2つの言語が混在しているような違和感がある

382 :デフォルトの名無しさん:2010/06/26(土) 13:36:17
CLL/CLIって何が酷いの?

383 :デフォルトの名無しさん:2010/06/26(土) 13:37:27
寝ぼけてた。C++/CLIね。

384 :デフォルトの名無しさん:2010/06/26(土) 14:34:14
>>382
>>381っぽくいうと、
マネージド部をあえてを同じ言語っぽくしてぜんぜん混在できないところ

385 :デフォルトの名無しさん:2010/06/26(土) 14:48:57
>>384
よく分からないな。
どういう形に実現していれば良いことになるの?
JNIみたいにC/C++のI/F用意しました、なら良いってこと?

386 :デフォルトの名無しさん:2010/06/26(土) 14:51:28
DLLで十分じゃなイカ

387 :デフォルトの名無しさん:2010/06/26(土) 23:10:11
boost::pythonみたいだったら良かった?

388 :デフォルトの名無しさん:2010/06/27(日) 09:01:43
テンプレートが全く理解できないんだけど、お前らはプログラミングで使ってるの?

389 :デフォルトの名無しさん:2010/06/27(日) 09:10:01
普通に使うよ
最初はとまどったけど参考書も結構でてるし、boostっていう無料で質量最高のサンプルもあるし勉強はしやすい

390 :デフォルトの名無しさん:2010/06/27(日) 09:25:00
テンプレートのないC++はintしかないCみたいなもん

391 :388:2010/06/27(日) 09:25:47
テンプレートって黒魔術じゃないんですか?

392 :デフォルトの名無しさん:2010/06/27(日) 09:42:42
黒魔術上等、テンプレートは必須科目だね。

393 :デフォルトの名無しさん:2010/06/27(日) 10:37:54
template禁止なC++なんて魅力半減ですわ。


394 :デフォルトの名無しさん:2010/06/27(日) 10:58:21
>>388
その理解できないというテンプレートって何?
spiritだったら許す

395 :デフォルトの名無しさん:2010/06/27(日) 13:05:41
テンプレートライブラリはよく使用するけど
自分ではあまり定義したりしないかな

396 :デフォルトの名無しさん:2010/06/27(日) 13:22:01
traitsの概念を理解するのが難しかったな

397 :デフォルトの名無しさん:2010/06/27(日) 13:24:19
もうBoostは当たり前なのか。

398 :デフォルトの名無しさん:2010/06/27(日) 13:43:15
個人的には当たり前だけど、仕事ではboostは禁止されている
STLの使用も最初は禁止されていて、俺が熱弁を振るってようやく
使用許可が出た位だ

399 :デフォルトの名無しさん:2010/06/27(日) 13:44:33
つーかshared_ptrがtr1に入ってよかったわ
これがないとスマポをコンテナに入れられない
カタワになっちまう

400 :デフォルトの名無しさん:2010/06/27(日) 13:54:49
>>322
返信遅れて本当に大変申し訳ない。
わざわざ誘導ありがとうございました。

401 :デフォルトの名無しさん:2010/06/27(日) 14:28:32
新規格にはテンプラテク用途に使えそうなものも多いし黒魔術どころか順標準といっもよくなってきた感じはする

402 :デフォルトの名無しさん:2010/06/27(日) 17:07:30
>>398
なんで禁止されそうになったの?

403 :デフォルトの名無しさん:2010/06/27(日) 17:29:10
「禁止されていた」と書いてあるが

404 :デフォルトの名無しさん:2010/06/27(日) 17:54:58
google先生もSTL禁止だな

405 :デフォルトの名無しさん:2010/06/27(日) 17:56:54
万一 STL にバグがあっても特定できないし。

406 :デフォルトの名無しさん:2010/06/27(日) 18:12:11
万一 コンパイラにバグがあっても特定できないし。

407 :デフォルトの名無しさん:2010/06/27(日) 18:16:18
万が一 OSにバグがあっても特定できないし。

408 :デフォルトの名無しさん:2010/06/27(日) 18:37:45
万が一 HWにバグがあっても特定できないし。

409 :デフォルトの名無しさん:2010/06/27(日) 18:44:21
万が一地球にバグがあっても特定できないし。

410 :デフォルトの名無しさん:2010/06/27(日) 18:45:17
HWのバグは経験したことないけどOSのバグとかライブラリのバグは特定できるでしょ

411 :デフォルトの名無しさん:2010/06/27(日) 19:35:01
散々悩んだ挙句にな

412 :デフォルトの名無しさん:2010/06/27(日) 19:41:49
ジョークにマジレスする男の人って…

413 :デフォルトの名無しさん:2010/06/27(日) 19:55:37
横マジレスすると、テンプレートも理解できない糞職場だからだろうな

414 :デフォルトの名無しさん:2010/06/27(日) 19:57:49
PHP C++で共通に使えるシリアライズありますか

415 :414:2010/06/27(日) 20:02:32
php関数 serialize unserializeを
C++で読み書きする方法でもいいです。

416 :デフォルトの名無しさん:2010/06/27(日) 20:04:45
あきらめました。
そのつど独自形式で読み書きします。

417 :デフォルトの名無しさん:2010/06/27(日) 20:06:49
その間10分wwww

418 :デフォルトの名無しさん:2010/06/27(日) 21:04:19
>>417
phpは型とデータを一緒にシリアル化して、ロードに動的に変数確保出来るけど。
C++はそれができないからあきらめた。
phpはどんな型でもserialize関数に渡せるけど、C++でその復元が無理。

419 :デフォルトの名無しさん:2010/06/27(日) 21:04:35
配列の添字って0からsize-1じゃなくて1からsizeのほうがアルゴリズム書きやすくね?


420 :デフォルトの名無しさん:2010/06/27(日) 21:06:02
for(n=0; n<size; n++) A[n];

421 :デフォルトの名無しさん:2010/06/27(日) 21:11:51
>>419
その1が添え字のずれを生じさせて面倒なんだよな。

422 :デフォルトの名無しさん:2010/06/27(日) 21:13:27
配列の添字だけならそうかも知れないが、ポインタとの兼ね合いを考えると0からのほうがいい

423 :デフォルトの名無しさん:2010/06/27(日) 21:16:58
> ここで剰余の問題に行き着きました.
> 1-origin で 1, 2, 3, 4, 5 だと,5 の剰余をとると 1, 2, 3, 4, "0" になってしまいます.
> この不整合には困りました…

こんな問題もあるってさ

424 :デフォルトの名無しさん:2010/06/27(日) 21:17:53
0からsize-1の場合、

for( int i = 0 ; 1 != size ; ++i ) A[i] ;

!=で終端を判断できるというのは、イテレーターを汎用化させるために一役買っているんじゃないか。

425 :デフォルトの名無しさん:2010/06/27(日) 21:22:30
ん?バッファオーバーランの実演?

426 :デフォルトの名無しさん:2010/06/27(日) 21:31:29
配列を後ろから走査するときが不便

427 :デフォルトの名無しさん:2010/06/27(日) 21:35:38
配列の場合はrbegin()とrend()とbase()がないからな

428 :デフォルトの名無しさん:2010/06/27(日) 21:39:41
逆順の場合イテレータのように考えると-1との比較だけど添字は普通非負整数だから困るよね



429 :デフォルトの名無しさん:2010/06/27(日) 22:42:24
>>427
boost::Arrayの出番ではないの?

430 :デフォルトの名無しさん:2010/06/27(日) 22:53:33
イテレータ反転させると一つズレるってのが設計者のあたまおかしい

431 :デフォルトの名無しさん:2010/06/27(日) 22:59:55
>>430
そうしないとfor文を書き換えなければならず、余計な思考が必要になる

432 :デフォルトの名無しさん:2010/06/28(月) 19:33:55
>>427
int a[] = { 1, 2, 3, 4, 5 };
typedef std::reverse_iterator<int*> rit;
rit begin(a + _countof(a));
rit end(a);
for (rit it = begin; it != end; ++it) {
  std::cout << *it << std::endl;
}

433 :デフォルトの名無しさん:2010/06/28(月) 19:46:26
>>431
それ以前に、有効なイテレータが作れないんだよね
ずらさないと、対応するrendに対応するイテレータが無くなってしまう

434 :デフォルトの名無しさん:2010/06/28(月) 20:19:34
プロフェッショナルは皆やってるけどdoubleをイテレータにすればいいよ
負も持てるし符号無しlongよりながいし整数程度の精度なら誤差もない

435 :デフォルトの名無しさん:2010/06/28(月) 20:22:47
おれはつられないぞ

436 :デフォルトの名無しさん:2010/06/28(月) 20:40:27
Luaとかインデックスも含めて数値は全部実数だよね
気持ち悪いけど解決法と言えないことはないかもね

437 :デフォルトの名無しさん:2010/06/28(月) 20:44:55
>>434
糞BCCめ

438 :デフォルトの名無しさん:2010/06/28(月) 20:54:09
>>432
これは目から鱗でした

439 :デフォルトの名無しさん:2010/06/28(月) 21:49:39
WindowsでPHP to C++ するやつ作ってくれ。
C++は既に時代後れ気味。
PHPを主流にした方が良い。
C++をアセンブラを弄くるみたいな立場に持っていく。

440 :デフォルトの名無しさん:2010/06/28(月) 21:53:10
そんなに好きならPHPでそのコンバータを書けばいいじゃない
こんなところで乞食するよりよっぽど早く完成するぞ

441 :デフォルトの名無しさん:2010/06/28(月) 21:53:32
時代遅れというのになぜコンバータを使ってまで使う。それは使う価値があるからだろ。

442 :デフォルトの名無しさん:2010/06/28(月) 21:53:57
これwindowsに対応させてくれよ。


PHPをC++に変換して高速化する「HipHop for PHP」をFacebookが公開
過去6年間にわたって、PHPが提供する高速な開発ペースによって多くを成し遂げてきました。
プログラミング言語としてみると、PHPはシンプルです。
簡単に習得し、簡単に書き、簡単に読み、簡単にデバッグする事ができます。

HipHopにより私たちはページによっては、Webサーバー上で約50パーセントのCPU使用量を削減できました。
CPUの使用量の少なさは、サーバー台数の削減につながり、それはより少ないオーバーヘッドを意味します。
私たちはHipHopがウェブに大きな利益をもたらすと感じ、
オープンソースとしてリリースしPHPによる大規模WEBサイトのスケーリングに新たな方向性が提示されると期待します。

HipHopはあなたのPHPのソースコードをC++に最適化された形に機械的に変換します。
HipHopコード変換機は、PHPランタイムの再実装であり、また多くのパフォーマンス向上の為のPHPエクステンションを書き直したものです。

http://blog.candycane.jp/archives/275

443 :デフォルトの名無しさん:2010/06/28(月) 21:57:03
なんだ、モノはすでにあるのか、C++で書かれてるみたいだが。
じゃぁ自分でビルドすればいいじゃない、
凄く問題が簡単になったね!

444 :デフォルトの名無しさん:2010/06/28(月) 21:58:30


ビルドとインストール
HipHopはCentOSとFedora向けに開発されており、
他のオペレーティングシステム上でのビルドは現在のところ機能しません。
他のオペレーティングシステム向けのサポートは準備ができ次第追加されます。


http://blog.candycane.jp/archives/295


445 :デフォルトの名無しさん:2010/06/28(月) 22:12:56
PHPのスレでやれば問題ないでしょう。

446 :デフォルトの名無しさん:2010/06/28(月) 22:13:05
簡単に作れて動くことがスクリプトとしての価値だからな
もしスクリプトがC++と同じ使い勝手だったら
誰もスクリプトなんか使わないよね

447 :デフォルトの名無しさん:2010/06/28(月) 22:22:18
簡単に作れてC++と同等の速度なら
だれもC++使わないよね。

448 :デフォルトの名無しさん:2010/06/28(月) 22:36:10
たしかにな

449 :デフォルトの名無しさん:2010/06/28(月) 22:53:35
ぶっちゃけスクリプトよりC++のほうが生産性高くね?
他の言語に比べてC++ってエラー修正がしやすいから結局スクリプトで書くより早く出来上がることが多い気がする


450 :デフォルトの名無しさん:2010/06/29(火) 00:22:59
>>449
プログラマ全員から「どこがやねん!」というツッコミあるで〜

451 :デフォルトの名無しさん:2010/06/29(火) 00:32:52
>>450
目を合わせちゃダメだって

452 :デフォルトの名無しさん:2010/06/29(火) 03:14:11
C++をずいぶん使える代わりにスクリプト言語初心者なんだろう。
それなら十分ありえる

453 :デフォルトの名無しさん:2010/06/29(火) 09:03:08
スクリプトだと適当なコードでも動いてしまうのが怖い
規模が大きくなると特に

454 :デフォルトの名無しさん:2010/06/29(火) 09:43:56
C++だって適当なコードで動く。
だからバッファオーバランがそこら中で起こってパッチが出まくっている。
規模が大きくなると特にな。

455 :デフォルトの名無しさん:2010/06/29(火) 09:46:17
constや型チェックを性的に解決できるかは大きな違い。

456 :デフォルトの名無しさん:2010/06/29(火) 10:00:02
>>453
そのためにPHPをコンパイルできるようにする。文法エラーなどは動かす前に判明出来る。


457 :デフォルトの名無しさん:2010/06/29(火) 10:00:33
適当に書こうと思えば、どんな言語でも適当に書ける。
一所懸命に一つ一つ違いを挙げていったところで、根本的な事実は変わらないよ。

458 :デフォルトの名無しさん:2010/06/29(火) 10:04:18
>>457
動作しないコードが混じっていても、
スクリプトはそこが実行されなければ正常動作する。
C++は文法エラーや範囲チェックなどあって実行しなくてもエラーになる。

459 :デフォルトの名無しさん:2010/06/29(火) 10:07:52
>>458
だから、言語によって個々の仕様はあるんだから利点欠点はいくらでもあるだろう。
その事実を踏まえた上で、
「適当に書こうと思えば、どんな言語でも適当に書ける。」
と言っているんだが、日本語が通じないのか?

460 :デフォルトの名無しさん:2010/06/29(火) 10:18:32
適当に書いけるのはどれだってそうだけど、その内のどれだけを見逃さずにエラーあるは警告にしてくれるかってことだろ
その点では当然C++のが賢い

461 :デフォルトの名無しさん:2010/06/29(火) 10:23:52
だめだ話が通じない。

462 :デフォルトの名無しさん:2010/06/29(火) 10:29:01
phpは文法的なエラーがあっても動くとでも勘違いしてるんじゃねーの

463 :デフォルトの名無しさん:2010/06/29(火) 10:33:36
そもそも「適当に書こう」なんて考えるのがなにかおかしい


464 :デフォルトの名無しさん:2010/06/29(火) 10:34:16
互いの利点や欠点を無視して、特定分野の表面的な仕様を薄っぺらく主張することに何の意味があるんだろう?
両方の有用な部分と駄目な部分を考えていくならともかく、
自分の主張する部分のみをひたすら押し通そうとする姿勢で望む意味が分からない。

465 :デフォルトの名無しさん:2010/06/29(火) 10:39:47
そもそも用途が違う。
駄目な奴に書かせたC++のCGIとPHPのプログラム、
どっちが怖いかと言ったらC++の方が怖い。
よい子は目的に応じて使い分けろ。

466 :デフォルトの名無しさん:2010/06/29(火) 10:43:23
開発の主流をPHPに移行させるべき。
スクリプトでもコンパイルも可能で、GUIや3Dも出来るようにする。
ホットスーププロセッサーでさえ、GUIや3Dが出来るんだ。
PHPに出来ないわけがない。
開発者がいるかどうだ。

467 :デフォルトの名無しさん:2010/06/29(火) 10:47:58
やりたければ自分で開発すればいい。
なんでお客様目線なんだよ。

468 :デフォルトの名無しさん:2010/06/29(火) 11:05:55
>>460
それはC++がではなくて、コンパイラが、じゃないのか?

469 :デフォルトの名無しさん:2010/06/29(火) 11:09:04
>>468
C++のコンパイラなんだから、C++がということに他ならん

470 :デフォルトの名無しさん:2010/06/29(火) 11:14:57
言語としての仕様とコンパイラの仕様は別だろ。

471 :デフォルトの名無しさん:2010/06/29(火) 11:25:32
ローカル型nameはテンプレート引数に使用できません
とエラー出るんですがVC++2008では通ります。
どっちが正しいですか?
template <typename T> void f(T);
int main()
{
struct X { int x; } x = { 0 };
f(x); //<<< エラー
}



472 :デフォルトの名無しさん:2010/06/29(火) 11:28:30
エラー

473 :デフォルトの名無しさん:2010/06/29(火) 11:44:21
>>468
ほとんどの警告やエラーは標準C++の仕様で決まってるやつだろ?
とするとC++が賢い、で合ってる


474 :デフォルトの名無しさん:2010/06/29(火) 11:50:25
>>470
そんなコンパイラ使えるか

475 :デフォルトの名無しさん:2010/06/29(火) 11:52:00
何故どうでもいい話を必死に主張するんだろう?

476 :デフォルトの名無しさん:2010/06/29(火) 11:55:46
今度は標準仕様に準拠していないコンパイラがあるのはC++の仕様が悪いからだという話になって、
コンパイラが悪いだけで仕様は別問題になって、
以下どうでもいい話がぐるぐる回るのか?

477 :デフォルトの名無しさん:2010/06/29(火) 12:10:44
>>471
ローカルな構造体やクラスをテンプレート引数に渡すのは、現標準(C++03)までは対応してない、
つまりコンパイラ依存。
次期標準では対応するらしい

478 :デフォルトの名無しさん:2010/06/29(火) 12:47:49
>>476
そんな事を言い出すとC++0xはなおさらしんどくなるんだが?

479 :デフォルトの名無しさん:2010/06/29(火) 13:55:54
質問!これって何ソート??

template<class FwdIt>
void Sort(FwdIt Fst,FwdIt Lst){//O(N*((1+N)/2))??

for(FwdIt i=Fst; i != Lst; i++){
for(FwdIt j=i; j != Lst;j++){
if((*i)>(*j)){
std::iter_swap(i,j);
}
}
}
return;
}

480 :デフォルトの名無しさん:2010/06/29(火) 14:04:36
スワップソートだよ。

481 :デフォルトの名無しさん:2010/06/29(火) 14:04:47
選択(selection)ソートだろ

482 :デフォルトの名無しさん:2010/06/29(火) 14:22:51
>>479
バブルソードでFA

483 :デフォルトの名無しさん:2010/06/29(火) 14:28:28
>>480-482
どれだろう。

ウィキペディア検索してみたら、バブルソートが同じっぽい実装になってた。
というわけでバブルソートということにしておきます。
回答感謝!

484 :デフォルトの名無しさん:2010/06/29(火) 16:02:44
本当のこと教えんなよw

485 :デフォルトの名無しさん:2010/06/29(火) 19:20:17
>>482
なんか弱そうな剣だな

486 :デフォルトの名無しさん:2010/06/29(火) 22:34:43
自分で作ったソフトウェアに、JscriptやVBSを組み込む方法ありますか。
スクリプトを実行する互換DLLやLIBなど配布されてますか。

487 :デフォルトの名無しさん:2010/06/29(火) 22:41:43
EmedtorとかマクロでJscript使えますがこれはwindowsの
Jscript.DLLを起動しているんですか。

488 :デフォルトの名無しさん:2010/06/29(火) 22:51:38
>>486
やった事はないがその手の記事はCodeZineあたりで見た事があったと思う
たしかCOMベースだったような

それとスレ違いだからWin系のスレに移動しろ

489 :デフォルトの名無しさん:2010/06/29(火) 23:09:03
ここにフリーの実装のソースコードありました。

http://ja.wikipedia.org/wiki/ECMAScript

490 :デフォルトの名無しさん:2010/06/30(水) 00:31:38
依存しているヘッダファイルをまとめて一ファイルにする方法ないですか?

491 :デフォルトの名無しさん:2010/06/30(水) 00:53:23
>>490
includeするincludeファイル

492 :デフォルトの名無しさん:2010/06/30(水) 06:38:46
>>490 プリプロセッサの出力をファイルに保存。

493 :デフォルトの名無しさん:2010/06/30(水) 12:50:01
互いに依存するヘッダファイルをばらのまま放置するとお仕置きされるんだが

494 :デフォルトの名無しさん:2010/06/30(水) 13:52:00
まあね

495 :490:2010/06/30(水) 22:23:23
サンクス。 ヘッダファイル一枚化できました。
こんなパラメータです。

g++ -E -P -nostdinc -nostdinc++ a.cpp > a.txt

496 :490:2010/06/30(水) 22:25:33
http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html

一枚化はここみて設定しました。

497 :デフォルトの名無しさん:2010/07/01(木) 19:38:13
ヘッダをお互いに依存するようにする実装設計こそ責められるべきじゃ…

498 :デフォルトの名無しさん:2010/07/01(木) 20:04:29
親子構造なモデルだと多発しますけどね。
親は子を、子は親を知りたがるし。

499 :デフォルトの名無しさん:2010/07/01(木) 20:29:32
ですね

500 :デフォルトの名無しさん:2010/07/01(木) 20:31:22
<new> や <typeinfo> まで禁止かよ

501 :490:2010/07/01(木) 21:59:04
defineはそのまま残して一枚化できますか。

502 :デフォルトの名無しさん:2010/07/01(木) 22:07:20
そのままうめ込まれると、あとでユーザーが標準で使われる#defineを
使えなくなるんですが。
有効な#defineだけを抽出するコマンドもあるのですが
それを使うと別のコードに影響でます。

503 :デフォルトの名無しさん:2010/07/02(金) 03:47:09
1個にする意味がわからないんだが。。

504 :デフォルトの名無しさん:2010/07/02(金) 04:58:09
インポートライブラリでは成功するんですが
スタティックリンクにすると次のエラーが出ます。
このなおし方分かりますか。

error.obj : error LNK2001: 外部シンボル "__imp__***" は未解決です。

505 :デフォルトの名無しさん:2010/07/02(金) 05:21:57
うわぁ…

506 :デフォルトの名無しさん:2010/07/02(金) 05:25:09
>>505
予想ではインポートライブラリには、__imp__関数名になっていて
スタティックライブラリは関数名だと思うんですが。
シンボルの強制に__imp__いれても直せないんです。

507 :デフォルトの名無しさん:2010/07/02(金) 06:14:01
環境依存OKなスレで聞きなおすよろし
使用コンパイラとライブラリも明記した上でな

508 :デフォルトの名無しさん:2010/07/02(金) 06:53:04
mo

509 :デフォルトの名無しさん:2010/07/02(金) 06:57:01
te

510 :504:2010/07/02(金) 07:28:06
ソースコードからビルドし直して出来ました。
スタティックライブラリの組み込みは、微妙な型の違いでも動かないらしいので。
他のコンパイラのビルド済みライブラリでは駄目かと思います。(の場合もあるかと思います)

511 :デフォルトの名無しさん:2010/07/02(金) 07:42:14
次からはチラシの裏へ書くように

512 :デフォルトの名無しさん:2010/07/02(金) 08:03:01
               _,. -‐1    ,. - ‐:‐:‐:‐:‐- 、
          _,. -‐:'´: : : : : |  , :'´::.::.::.::.::.::.::.::.::.::.::.::.丶
     ,.イ ,.-:'´: : : : : : : : : : : ! /::.::.::.;.ィ::; ヘ::.::.::.::.::.::.::.::.::.:\
      /: ∨: : : : : : : : : : : : : : :l'/l:/::./ ,':/  i::.:ト、::.l、::.:!::.::.::.::.',
  ,. -:' : : : : : : : : : : : : : : : : : : : -┴-'.._l/    l:| i::| i::l::.::.::.::.::i
 ー‐ァ: : : : : : : : : : : : : : : : : : : : : : : : : : :`ーァ  l|  l|  l:|::.::.::.::.::|
   /: : : : : : : : : : : : : : : : : : : : : : : : : : : : :/  ー‐‐---、!ヘ::.::.::.::|
  ,': : : : : : : : : : : : : : : : : : : : : : : : : : : : :/    ┬--、  }::.:/::.!
  ! : : : : : : : : : : : : : : : : : : : : : : : : : : ;.イj     {辷リ ′/::/!::/ここは貴方の日記帳じゃないわ。
 ノ: : : : : : : : : : : : : : : : : : :.:.:.:.:.. : :、/     ;         /〃ノ:/
´. .:.:.:.:.:.:.:.: : : .:.: : : .:.:.:.. : : :.:.:.:.:.:.:__:.:.ヽ   r―-,    /-:'´::;′ チラシの裏にでも書いてなさい。
`ー---;.:.:.:..:.:.:.:.:..:.:.:.:.:.:.:.:...:.:.:.:.:.:.:.V ̄`ヽ、 `ー‐'   ィ;、:::∧:{
    /:.:.:.:._:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.|'´ヽ  rく` ト、. -‐'´ | `:く `   ね!
   厶-‐'´ |:.:.:.:.:.:.:.:.:.:.:.:.:ト、:.:.:.|  _,.-‐! \  __,,. -‐''´ }‐:、
       _l;.ィ´ヽ:./ヽ:|'´ ,>‐'´: : く    ∨       > \
   _,r{`7  ̄{ ̄} ̄¨`‐く__ヽ_;,: -‐; :\       _,.-:'´: : : : : :>、
 ,.イ | 〉´ ̄ ̄ ̄:  ̄`ー‘v'´>‐_く : : : \___,,. -‐:'´: : :ト-、_;,.-'´  ヽ
r'l ! ,し′: : : : : : : : :}_ノ/ __,,.ヽ: : : : : : : : : : : : : : V       l
,Jー'´: : : : : : : : : : :`辷'_,,、 '; : : ∧: : : : : :_; -'´         |
  l´: : : : : : : : : : : : }´   l  l`ー':.:.:`ー:.'"´:〈         v'


513 :デフォルトの名無しさん:2010/07/02(金) 13:54:49
マングリングってコンパイラ依存だったような

514 :デフォルトの名無しさん:2010/07/04(日) 17:42:58
伝達関数の零点と極を求めたいのですが、
・分母分子の多項式を因数分解する方法
・複素数を次々に代入して分母分子の値がそれぞれ0になる点を探す方法
これ以外に良い方法があれば教えてください。

515 :デフォルトの名無しさん:2010/07/04(日) 18:57:38
何でそれじゃいかんの?

516 :デフォルトの名無しさん:2010/07/05(月) 00:27:15
聞き方が悪かったです

領域総当たりよりは多項式を解く方法を使いたいので、
複数の係数から解く方法があれば教えていただきたいのです。

517 :デフォルトの名無しさん:2010/07/05(月) 00:36:23
そもそもそれを何故このスレで聞くのかがわからん。

518 :デフォルトの名無しさん:2010/07/05(月) 01:12:08
数学板とかそっち行った方がいいんじゃね

519 :デフォルトの名無しさん:2010/07/05(月) 10:48:43
ようするにn次方程式を(複素数の範囲で)解く方法だろ?
俺は知らないけどありそうなもんだけどね

520 :デフォルトの名無しさん:2010/07/05(月) 12:48:24
私は真に驚くべくプログラムコードを発見したが、
それを書くには最大行数が少ない

521 :デフォルトの名無しさん:2010/07/05(月) 13:42:22
ガウスザイデル法などの反復法しかないんでわ?
他にもあるかもしれんがMATLABを持ってないのでわからん

522 :デフォルトの名無しさん:2010/07/05(月) 21:03:39
Mathematica オススメ

523 :デフォルトの名無しさん:2010/07/05(月) 21:15:47
>>522
自腹で買ったのか?

524 :デフォルトの名無しさん:2010/07/05(月) 21:57:10
まあね

525 :デフォルトの名無しさん:2010/07/05(月) 23:35:27
class Number {
private:
int num;
public:
Number(int n){num = n;} //変換コンストラクタ
  operator int(){return num;} // 変換関数

この変換コンストラクタってただint型の値を渡してNumberクラスの
データメンバnumに値を代入してるだけに見えていまいち理解出来ていません。
これはどういう解釈?で見たら良いのでしょうか?
説明がよく分からないと思いますがエスパーの方お願いします


526 :デフォルトの名無しさん:2010/07/05(月) 23:40:15
>>525
見えてるとおりだけど。
まずNumberというクラスの役目は何か調べてみ。

527 :デフォルトの名無しさん:2010/07/05(月) 23:40:43
だけ、だよ
それともどういう場面で呼ばれるのかが分からない?

528 :デフォルトの名無しさん:2010/07/05(月) 23:44:35
>>526-527
見えてるとおりでしたか。
ただやっぱりどういう状況で使うものなのかよく分からないので
助言どおりちょっともう1度参考書見直してみます。
ありがとうございました!


529 :デフォルトの名無しさん:2010/07/05(月) 23:48:08
int型をラップしたクラスを作りたかっただけだと思う。

530 :デフォルトの名無しさん:2010/07/05(月) 23:50:36
Number n = 100;
って出来る奴?

531 :デフォルトの名無しさん:2010/07/05(月) 23:51:35
>>530
Yes
Number n(100);と等価ではないので注意

532 :デフォルトの名無しさん:2010/07/05(月) 23:54:05
えっ?

533 :デフォルトの名無しさん:2010/07/05(月) 23:54:52
>>514
方程式を解く方法は二分法とかニュートンラフソン法とか色々あるけど、解析的に一発で答えが求まる方法はないはず。
参考
www.mech.kumamoto-u.ac.jp/Info/lab/ape/mori/dark/others-j.files/others.files/non.ppt
ただcomplex.hのままではコンパイラに怒られる

534 :デフォルトの名無しさん:2010/07/06(火) 00:11:32
int型の値をNumberクラスの値に型変換って時点でいまひとつ理解できてない気がします。
なので結局今まで使ってきた引数1つのコンストラクタとの違いが分からなくて
>>530>>531の違いがよく分からない。
int型をfloat型にキャスト変換するとかなら利用用途も分かりやすいんだけど。

535 :デフォルトの名無しさん:2010/07/06(火) 00:21:05
>>534
ToHexStringを作ってみたいとか、NULL許容型のように動作させたいとか。

536 :デフォルトの名無しさん:2010/07/06(火) 00:36:40
>>535
自分にはまだ早い気がしてきたw
取りあえず勉強します。ありがとう!

537 :デフォルトの名無しさん:2010/07/06(火) 00:40:26
>>531
横からすみません
Number n = 100;

Number n(100);
はどちらも変換コンストラクタによるNumberオブジェクトの初期化ではないのでしょうか?

n生成後に
n = 10;

だと一時オブジェクトが生成されて変換が生じてnに代入される
と思ってましたが違うのですか?

538 :デフォルトの名無しさん:2010/07/06(火) 00:47:09
一時オブジェクトが生成されて代入されるってのが等価でない点だろう?

539 :デフォルトの名無しさん:2010/07/06(火) 00:51:26
>>537
前者はexplicitがついているとエラーになるのが違う

540 :デフォルトの名無しさん:2010/07/06(火) 00:51:27
どちらもコンストラクタによる初期化だから等価

541 :デフォルトの名無しさん:2010/07/06(火) 00:58:12
>>538 代入じゃねぇ。コピーコンストラクタによる初期化だ。

542 :デフォルトの名無しさん:2010/07/06(火) 00:58:55
>>537 前者はコピーコンストラクタが private だとエラーになる。

543 :デフォルトの名無しさん:2010/07/06(火) 01:00:07
>>539
>>525のコードではexplicitがついてないので等価なのでは?

>>540
私も同じ意見です

544 :デフォルトの名無しさん:2010/07/06(火) 01:35:32
http://codepad.org/B5wqWzNO

545 :デフォルトの名無しさん:2010/07/06(火) 02:36:39
>>525が等価に見えるのは、コンパイラが自動的にコピーコンストラクタを作っているから。
>>544を見れば、Number n2 = 222に対して、コンストラクタとコピーコンストラクタが呼ばれているのが分かると思う。

546 :デフォルトの名無しさん:2010/07/06(火) 02:45:20
ん〜。

Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland

Numberオブジェクト生成
コンストラクタ num=11
コンストラクタ num=222

一時オブジェクト生成後に代入
コンストラクタ num=3333
代入演算子 num=3333

変換演算子による出力
変換演算子 num=3333
3333

547 :デフォルトの名無しさん:2010/07/06(火) 02:55:05
msvc8、9、10、g++3.4.5、全部>>546と同じ。
>>544のコンパイラは?

548 :デフォルトの名無しさん:2010/07/06(火) 03:23:05
Copy Elisionだっけか

549 :デフォルトの名無しさん:2010/07/06(火) 03:35:34
-fno-elide-constructors

550 :デフォルトの名無しさん:2010/07/06(火) 04:58:01
VC4、6も>>546と同じだた

VC4は #include <iostream.h>、//using namespace std; にしないとコンパイル通らないけど


551 :デフォルトの名無しさん:2010/07/06(火) 07:32:37
>>547
http://codepad.org/JCHEPAr9

552 :デフォルトの名無しさん:2010/07/06(火) 07:54:05
そんなことせんでもabout押せばオプションまでみんな載ってるページに飛べる

553 :デフォルトの名無しさん:2010/07/06(火) 10:28:17
charとstringって何が違うの?
全く同じ使い方に見えるんだが

554 :デフォルトの名無しさん:2010/07/06(火) 10:33:07
お前がそう思うならそうなんだろう(ry

555 :デフォルトの名無しさん:2010/07/06(火) 11:15:46
文字列は基本的にchar配列
stringはchar配列の操作を楽にするためのクラス
配列の再確保とか自動でやってくれる(はず)

ところでstd::string使ったこと無いんだけど、
strcpyとかに渡す方法あるの?

556 :デフォルトの名無しさん:2010/07/06(火) 11:20:36
c_str() で渡せる。しかし、
strcpy()…そんな関数は使う必要がねーんだ。

557 :デフォルトの名無しさん:2010/07/06(火) 11:34:39
あ、書込み元じゃなくて書き込み先ね。
>strcpy()…そんな関数は使う必要がねーんだ。
Windowsしか経験無いけど、APIが生きてるうちは
必要だと思う。

558 :デフォルトの名無しさん:2010/07/06(火) 11:39:29
Windows依存コードならStrCpyやlstrcpyならともかくstrcpyの出番は無いな

559 :デフォルトの名無しさん:2010/07/06(火) 11:41:12
>>557
Windows の人ならなおさら使えないだろうに。バッファサイズが云々で警告出るだろ。

560 :デフォルトの名無しさん:2010/07/06(火) 11:49:38
>>559
古いコンパイラ使ってるから警告出たことはないなぁ。
最近のコンパイラだと XX_s 系を使えって出るのかな?
例としてstrcpyって書いたけど、実際はstrncpyか
memcpyを使ってる。
もちろん必要の無いときは使ってないけどね。

561 :デフォルトの名無しさん:2010/07/06(火) 11:50:18
>>557
コピー元だろうと先だろうとそんなもんは要らぬ

562 :デフォルトの名無しさん:2010/07/06(火) 11:57:06
>>557,560
なぜなら、オレや、オレたちの仲間は、
そんな関数を頭の中に思い浮かべる前には!
std::string::operator=(char const*) を使って、もうすでに書き終わってるからだッ!
だから使った事がねェーッ。

563 :デフォルトの名無しさん:2010/07/06(火) 12:01:45
>>560
string内のバッファに自分で書き込みたいとか無理な注文よ
C++03まではそもそもvectorと違って連続してる保証ないから

564 :デフォルトの名無しさん:2010/07/06(火) 12:04:31
APIで使う構造体なんかにテキストデータを設定する必要があるので、
std:stringのオーバーロードだけで完結するのは不可能。

565 :デフォルトの名無しさん:2010/07/06(火) 12:08:54
>>564
そういうこともあるよね。やっぱり strcpy() は要らないんだけど。

566 :デフォルトの名無しさん:2010/07/06(火) 12:10:08
>>563
string のバッファの連続性が保証されるのは次の規格改定 (C++0x) から。
vector のバッファの連続性が保証されたのが C++ 2003 から。

567 :デフォルトの名無しさん:2010/07/06(火) 12:18:50
↓strncpyもmemcpyも要らん

568 :デフォルトの名無しさん:2010/07/06(火) 21:14:46
while(*s != NULL) *t++ = *s++;
*t = NULL;

書いていて思ったけど、危険なコードだ。

569 :デフォルトの名無しさん:2010/07/06(火) 21:30:03
それが危険と思わなくなったらまたおいで

570 :デフォルトの名無しさん:2010/07/06(火) 22:44:05
>>568
この場合は NULL と書かないほうがいい。
char *s, *t; ならば \0 とか、あるいは 0 とか。

571 :デフォルトの名無しさん:2010/07/06(火) 22:45:47
nullptrは?

572 :デフォルトの名無しさん:2010/07/06(火) 22:45:58
友人から「ファイルが読み込めない〜」って渡されたプロジェクトを、家に帰って実行してみたら
vcprojから立ち上げた場合は、ファイルが読めてないもののプログラムの実行は出来て、
slnから立ち上げた場合は、プログラムの途中でWindowsによってブレークポイントが発生するんだけど、どういうこと?
どうやら友人宅のPCでも同じ動作になる模様

調べて出てくるものは、大体二重deleteが原因って書いてあるんだけど、そのプログラムでは
deleteキーワードすらないので、関係無いだろうし、slnファイルが壊れているのかも、と新規作成してみても
結局同じ動作になってたんだけど…

573 :デフォルトの名無しさん:2010/07/06(火) 22:48:21
お前はスレタイも読めんのか

574 :デフォルトの名無しさん:2010/07/06(火) 22:50:15
コールスタックくらい書けよ

575 :デフォルトの名無しさん:2010/07/06(火) 22:58:17
やだ

576 :デフォルトの名無しさん:2010/07/06(火) 23:21:16
Win32APIとGUIが使いたい
windowsでC++という前提で、、、

MFCは古いし、C++/CLIは酷いし
みんなはどうしてる?


577 :デフォルトの名無しさん:2010/07/06(火) 23:25:32
Qt(キュート)ってのがある

578 :デフォルトの名無しさん:2010/07/06(火) 23:25:58
ほう

579 :デフォルトの名無しさん:2010/07/06(火) 23:26:31
WTLだろ

580 :デフォルトの名無しさん:2010/07/06(火) 23:39:50
メンバテンプレートを特殊化するときクラススコープに宣言できない仕様になったのは
どうしてですか?VC はできますが。

class X {
template<class T> void f(T);
template<> void f(int); // NG
};
template<> void X::f(int); // OK


581 :デフォルトの名無しさん:2010/07/07(水) 00:05:11
>>576
http://www.ooyashima.net/db/prog.htm

wxWidgetsとかUltimate++とか使ってレポートしてくれ


582 :デフォルトの名無しさん:2010/07/07(水) 00:22:04
>>576
Inkscapeで使われてるやつ

583 :デフォルトの名無しさん:2010/07/07(水) 00:55:33
InkscapeってGTK+だっけ

584 :デフォルトの名無しさん:2010/07/07(水) 01:01:08
正確にはgtkmmだろ
って何の役に立つのこの糞アンケート

585 :デフォルトの名無しさん:2010/07/07(水) 02:22:27
>>580
検索してみた。
http://www.google.co.jp/search?q=%22An+explicit+instantiation%22+%22is+placed+in+the+namespace%22

http://groups.google.com/group/comp.std.c++/msg/cd872f92408f9d5e
> Think about it, if we allow explicit instantiation/specialization in a
> function/class, then how do we explain the visibility of such
> specialization/instantiation? I think this will bring more complexity.

アクセス指定を別々にできちゃったりしてめんどくさいからじゃね?
という説が見つかった。

586 :576:2010/07/07(水) 08:44:03
みんなd
それにしても色々あるな

Qt
そういう手があるかぁ。
MSの選択肢しか見てなかった…

WTL
今まで詳しく見てなかったが、これWin32API+GUIにぴったしなんだね
ATLやWPFあたりは調べたが、WTLは見落とし

wxWidgets
こんなのもあるのか、しかしそこまで手が回るかワカラン


Win32API+GUIを使った初学者向けサンプルプログラムを書いているが、
MFCやC++/CLIは敷居が高いので困っていた


587 :デフォルトの名無しさん:2010/07/07(水) 10:50:55
で?

588 :デフォルトの名無しさん:2010/07/09(金) 16:53:03
const int a[] = { 0, 1, 2, 3, 4, 5 };
のような長さを明記しない配列宣言を
const boost::array<int,?> b = { { 0, 1, 2, 3, 4, 5 } };
みたいにboost::arrayでやる方法はありますか?

589 :デフォルトの名無しさん:2010/07/09(金) 17:22:00
男ならwin32API直叩き

590 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:51:37
>>588
ムリダナ
配列を作って、それとは別に
その配列を操作するためのラッパクラステンプレートでも作るといい

591 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:22:12
>>588
template <typename T, std::size_t N>
boost::array<T, N> & array_cast(T(&a)[N])
{
 return reinterpret_cast<boost::array<T, N>&>(a);
}
template <typename T, std::size_t N>
const boost::array<T, N> & array_cast(const T(&a)[N])
{
 return reinterpret_cast<const boost::array<T, N>&>(a);
}
int main()
{
 const int a[] = {0, 1, 2, 3, 4, 5};

 const boost::array<int, sizeof(a)/sizeof(a[0])> b = array_cast(a);

 for (std::size_t i = 0; i < b.size(); ++i)
  std::cout << b[i] << std::endl;
}

592 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:43:25
array_cast(T(&a)[N])
何なんだよこの謎の書式。どの参考書買えばこれ載ってるんだよ。

593 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:52:00
>>592
& を取っ払って解釈→& をつけて参照、か。

594 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:08:00
仕様書読めば載ってるよ。

595 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:32:31
typedef int (* (&type)[10])(int (*)(void)) ;

596 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:37:23
やっぱブーストライブラリーってやっといた方がいいんですか?

597 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 10:40:00
>>519
今さらですが、そういうことです。
ここで聞くにはそういう聞き方をするべきでしたね。
すみません。
どなたかよろしくおねがいします。

598 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 11:40:46
>>597
分母のn次多項式=0を解きたいのなら、ニュートン法を使う。

599 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 16:02:26
>>597
4次まではあるが、5次かそれより大きいものについては、一般解というものは存在しなかったはず。

600 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:09:59
>>599
公式はないけど、どこかに解はあるわけで、
それを数値的に求めるアルゴリズムはないか・・・って話じゃなくて?
というかいくつか上に答え出てるけどな
>>521とか>>533とか

601 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:31:53
代数的解法はないっていうだけ。

602 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:34:29
因数分解したいとかいってるから、解析解も出せるなら出したいようだ

603 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:49:35
へえ

604 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 18:07:22
いずれにせよ板違い

605 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 19:24:02
C++でメイン処理作ってGUIだけ別にする。
Win32xx C# HSPなど。

606 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 19:53:28
GUI だけ別にする場合ってプログレスバーとかどうすんの?
GUI 側から処理用プロセスを起動するとして、
その起動中の処理用プロセスから情報(=進行度)を取得って何使うの?

607 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 20:00:20
たとえば総合アーカイバDLLみたいにつくればいいんでは。
圧縮中に進行状況取得出来る。

608 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 20:35:12
いくらC++スレとはいえ度肝を抜かれる質問であった

609 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 21:50:33
template< class T > class ArrayAccessor
{
public:
template< int N > explicit ArrayAccessor( T(&a)[ N ] ) : array_( a ), size_( N ){}
T& operator []( int index ){ return this->array_[ index ]; }
private:
T* const array_;
const int size_;
};
int temp[] = { 8, 5, 7, 3, 6 };
ArrayAccessor<int> aa( temp );

こんな感じで配列のラッパクラス作ったんですが
これを二次元配列に拡張するのはどうすればいいですか?

610 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 22:01:41
>>609
そこまで出来れば十分だ。こうすればいい。

ArrayAccessor<ArrayAccesor<int>>> a;
a[1][2]=3;

611 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 22:15:54
int temp[][3] =
{
{ 0, 1, 2 },
{ 0, 1, 2 },
{ 0, 1, 2 },
{ 0, 1, 2 },
};
ArrayAccessor<ArrayAccesor<int>>> a(temp);

初期化がうまくいきません。

612 :名無しさん@そうだ選挙に行こう:2010/07/11(日) 23:28:50
template<typename T>
class array1d {
public:
template<int N>
explicit array1d(T (&x)[N]) : p_(x), n_(N) {}

array1d(T * p, int n) : p_(p), n_(n) {}

T& operator [] (int i) { return p_[i]; }
private:
T * p_;
const int n_;
};

template<typename T>
class array2d {
public:
template<int N, int M>
explicit array2d(T (&x)[N][M]) : p_(*x), n_(N), m_(M) {}

array1d<T> operator [] (int i) { return array1d<T>(p_ + m_ * i, m_); }
private:
T * p_;
const int n_, m_;
};
作ってみたものの、気持ち悪いな
テンプレート引数で次元を設定して――とかやるのは面倒そうだし

613 :デフォルトの名無しさん:2010/07/12(月) 01:13:40
ファイル入出力をしたときに、扱ったファイル名をcoutで出力するにはどうしたら良いでしょうか?
fout.open( "hogehoge.dat" );の直後に「hogehoge.datに出力しました」というのをcout<<"hogehoge.dat"<<endl;としないで直前に扱ったファイル名を出力できる形式にしたいのです。

614 :デフォルトの名無しさん:2010/07/12(月) 01:56:22
質問です。
BidirectionalIteratorで走査するSTLコンテナを自作するとき、
cont.back() == *--cont.end() を保証するべきでしょうか?

615 :デフォルトの名無しさん:2010/07/12(月) 06:31:16
どうやっても無理なので諦めろ

という揚げ足取りはともかく言いたいことは分かる
保証してくれないと困るだろう

616 :デフォルトの名無しさん:2010/07/12(月) 13:13:41
>>612
> テンプレート引数で次元を設定して――とかやるのは面倒そうだし
任意個のテンプレート引数ってC++0xで導入されるんだっけ?
その場合、簡単にできるのかな?


617 :614:2010/07/12(月) 20:47:53
>>615
どうもです。
もっと正確には、cont.begin() != cont.end() のとき --cont.end() が有効な要素を指すイテレータでなければならないか?
ということなのですが、検索した情報を読むかぎり「end() は終端要素+1の位置を指すイテレータを返す」という説明が多かったので、
やはり --cont.end() は有効なイテレータになるべきなんでしょうね。

618 :デフォルトの名無しさん:2010/07/12(月) 21:07:15
>>617
sizeが0のコンテナだったらどうなると思う?

619 :デフォルトの名無しさん:2010/07/12(月) 21:35:33
static bool isProxyError()
*.cppにこれが書いていて、*.hには書いてありませんでした
何がしたいんですか?

620 :デフォルトの名無しさん:2010/07/12(月) 21:37:16
*.cppの中だけで使う時にそうする。

621 :619:2010/07/12(月) 21:46:02
>>620
thx

622 :614:2010/07/12(月) 23:32:31
>>618
>cont.begin() != cont.end() のとき --cont.end() が有効な要素を指すイテレータ
cont.begin() == cont.end() の場合は、 *--cont.end() は未定義でしょう。

623 :デフォルトの名無しさん:2010/07/13(火) 13:01:11
ろくに読まずに横レスします。

>>618
イテレータクラスの
operator--()
のオーバーロードについて一切言及がない以上、
任意の実装が成されていても問題ないと考えられるため、
> --cont.end() が有効な要素を指すイテレータ
というという期待をしては行けないってのが
C++の考えなんじゃないでしょうか。



624 :623:2010/07/13(火) 13:02:49
あ、ごめん、
俺のレスtargetは>>618
じゃなくて
>>614
だったわ。


625 :デフォルトの名無しさん:2010/07/13(火) 14:34:04
Exceptional C++ 読むと、--cont.end() がコンパイルできるとは限らない
(実装がイテレータとして生ポインタを返す場合)とあるね。

626 :デフォルトの名無しさん:2010/07/13(火) 15:00:24
だから
> イテレータクラスの
> operator--()
> のオーバーロードについて一切言及がない以上、
> 任意の実装が成されていても問題ない
なんじゃね?

627 :デフォルトの名無しさん:2010/07/13(火) 22:17:28
reinterpret_castは無理やりキャストできるそうですが、
どんなメリットがあるのですか?

628 :デフォルトの名無しさん:2010/07/13(火) 22:23:15
キャストはメリットがどうとかで使うものじゃないだろ

629 :デフォルトの名無しさん:2010/07/14(水) 00:03:00
>reinterpret_castは、愚直なキャストである。
>reinterpret_castは、値を保ったまま、型情報だけ変えることのできるキャストである。
>だから、int *からfloat *とか、some_class *からother_class *などといった、お互いに継承関係になく、ユーザー定義の型変換関数もない型のポインターやリファレンスにも変換できる。
>これは、変換するというより、型だけ変えるというべきである。値はそのまま保持される。

630 :デフォルトの名無しさん:2010/07/14(水) 07:21:59
>>627
ポインタをWPARAMやらLPARAMやらに渡したり、逆に受け取った側でポインタに戻したり

631 :デフォルトの名無しさん:2010/07/14(水) 14:59:03
こうしてみるとWindowsがC++に与えた影響は大きいな
LinuxとかUNIXだけだったらC++もCのような簡素な物になっていたかも

632 :デフォルトの名無しさん:2010/07/14(水) 15:08:29
単に>>630が環境依存かどうかという区別がつかないアホの子なだけだろ。

633 :デフォルトの名無しさん:2010/07/14(水) 15:38:27
>>632
つか、お前が勝手に環境依存の問題だと勘違いしてる馬鹿な子だと思うが。

実例として相応しくないというなら、お前が挙げれ

634 :デフォルトの名無しさん:2010/07/14(水) 16:07:43
じゃあ説明してやる。

reinterpret_castにできること。

・ポインター型と整数型の間の型変換
int *型からintとか、int型からint *など。

・異なるポインター型の間の型変換
int *からfloat *とか。

・異なる参照型の間の型変換
int &からfloat &とか。

・異なるメンバーポインターの間の型変換
説明が面倒なのでコード例

struct A { int value ; } ;
struct B { int value ; } ;
int B::* ptr = reinterpret_cast<int B::*>(&A::value) ;

・異なる関数ポインター型の間の型変換
これも説明が面倒なのでコード例

void f(int) {}
void (*ptr)(short) = reinterpret_cast<type>(&f) ;

これ以外の型変換はできない。

635 :デフォルトの名無しさん:2010/07/14(水) 18:09:19
>>634
>・ポインター型と整数型の間の型変換
>int *型からintとか、int型からint *など。

これが正に

>ポインタをWPARAMやらLPARAMやらに渡したり、逆に受け取った側でポインタに戻したり

でしょうに。。

636 :デフォルトの名無しさん:2010/07/14(水) 18:27:55
>int *型からintとか、int型からint *など。
intが32bitになっている64bitコンパイラでは通らないけどね。

637 :デフォルトの名無しさん:2010/07/14(水) 19:01:15
なんで整数型といえば済むところに、
ある特定のプラットフォームのSDKのヘッダーの中で宣言されているtypedef名を持ち出すんだ?
例としてあげるにしても、まず一般的な説明をしろよ。

それから、通るか通らないかは、実装ごとに異なるので、どうしようもない。
あくまで例だ。

638 :デフォルトの名無しさん:2010/07/14(水) 20:00:51
>>637
ん、整数型とポインタが変換できる?
そのメリットは?

ってなるから、実例を挙げてるだけじゃないの?
別にどっちの答えが正しいとかじゃないと思うけど。
そして、どっちの回答が悪いと言うわけでもない。

639 :デフォルトの名無しさん:2010/07/14(水) 21:04:34
>>637
Windowsを特定とか

640 :デフォルトの名無しさん:2010/07/14(水) 21:16:32
WPARAMって何?って人には伝わらない例は悪い例だろ。
特に環境依存の話がスレ違いになるここじゃ。

641 :デフォルトの名無しさん:2010/07/14(水) 21:21:05
Winしか経験ない奴はそれがすべてだと思ってたりするから

642 :デフォルトの名無しさん:2010/07/14(水) 21:31:49
>>641
何が言いたいのか知らんが暴論だよ。
俺も基本的にはWindowsしか経験が無いが、WPARAMやLPARAMで
パラメータを渡す古臭いAPIを良いとは全く思ってねーし
reinterpret_castの説明には適してないとわかる、というかそれ以前に
VCだと古い形式のキャストでWPARAMにポインタ渡しても警告なんて出ないと記憶してるんだが。

643 :デフォルトの名無しさん:2010/07/14(水) 21:34:50
reinterpret_castの変換自体が処理系定義だからな…
決まってることはいくつかあるけどね。たとえば
"ポインタ型から十分大きい整数型に変換し、元のポインタ型に再変換すると、変換前と変換後のポインタ値は一致する(ポインタ値と整数値は一致するとは限らない)"とか
"定数0をポインタ型に変換すると空ポインタになる(変数0はそうなるとは限らない)" とか
"空ポインタを別のポインタ型に変換するとやっぱり空ポインタになる" とか

Windowsな人はVSスレで、Linuxな人はGCCスレで質問するのがいいと思う
あとどこから引用したか知らないけど >>629 はウソ情報じゃね?

参考までに規格書草案
http://www.kuzbass.ru/docs/isocpp/expr.html#expr.reinterpret.cast

644 :デフォルトの名無しさん:2010/07/14(水) 21:37:43
>>642
いや、そんな話じゃないんだけど
俺が言いたいのは、Winしか知らない奴は、他人もWinを知ってて当然で、
いきなりWPARAMとか言っちゃっても通じると思ってたりするって事だ

645 :643:2010/07/14(水) 21:39:17
">あとどこから引用したか知らないけど >>629 はウソ情報じゃね?
(処理系によってはウソとは限らない)" だわ……すまん

646 :デフォルトの名無しさん:2010/07/14(水) 22:38:37
>>644
>>630だけの文からそんなことまでわかるなんて凄いエスパーですね、尊敬します

647 :デフォルトの名無しさん:2010/07/14(水) 22:48:12
>>646
>>630だけの文って何のこと?

648 :デフォルトの名無しさん:2010/07/14(水) 22:49:13
> アホの子なだけだろ。

無闇に煽るとこんな流れになるよな

649 :デフォルトの名無しさん:2010/07/14(水) 22:55:51
どのようなときにreinterpret_castを使うのですか?
と本当は聞きたかったんじゃないかと俺は思う

650 :デフォルトの名無しさん:2010/07/14(水) 23:49:35
長いクラス名は嫌がられるのでしょうか?

651 :デフォルトの名無しさん:2010/07/14(水) 23:50:34
例えば

652 :デフォルトの名無しさん:2010/07/14(水) 23:57:20
>>650
80字以下ぐらいにしとけばいいんじゃない?

653 :デフォルトの名無しさん:2010/07/15(木) 00:10:59
名は判りやすいのがいい
長くても判りやすければいいかと

654 :デフォルトの名無しさん:2010/07/15(木) 00:19:25
たとえばクラス名の一部にPerformanceという言葉を使う場合、Perfと略すのも普遍的であると思います
これをわざわざPerformanceという正式なものをクラス名に採用するということです

655 :デフォルトの名無しさん:2010/07/15(木) 00:20:58
採用しろ

656 :デフォルトの名無しさん:2010/07/15(木) 01:20:50
略に普遍性などない。
慣習に擦り寄っているに過ぎない。
必ずグレーな単語にブチ当たって己を苦しめる事になるであろう。
はっはっは

657 :デフォルトの名無しさん:2010/07/15(木) 09:54:42
一番上がいちばん遅い。

#include <iostream>
#include <string>
#include <time.h>
using namespace std;

string fnc1() { return string(1<<16, '\0'); }
void fnc2(string &s) { s=string(1<<16, '\0'); }
void fnc3(string &s) { s.assign( 1<<16, '\0' ); }

int main() {
int c,n, N=100000; string s;
c=clock(); for(n=0; n<N; n++) s=fnc1(); c=clock()-c; cout<<c<<endl;
c=clock(); for(n=0; n<N; n++) fnc2(s); c=clock()-c; cout<<c<<endl;
c=clock(); for(n=0; n<N; n++) fnc3(s); c=clock()-c; cout<<c<<endl;
getchar(); return 0; }

658 :デフォルトの名無しさん:2010/07/15(木) 09:55:39
3番がかなり速いが、これはメモリの生成が少ないからだな。

659 :デフォルトの名無しさん:2010/07/15(木) 14:46:15
1バイトめがchar型で、2、3、4、5バイトめがfloat型のファイルから読み込むときに、

ifs >> buf_1 >> buf_4f;

ifs.read ((char*)&buf_1, 1);
ifs.read ((char*)&buf_4f, 4);

で結果が違うのですが、そういうものでうか?
>>を使うと不正な値(例えば0)が読み込まれます。
readを使うと正しい値が読み込めます。


660 :デフォルトの名無しさん:2010/07/15(木) 15:28:42
>>657
1番目と2番目の違いはコンパイラによっては最適化で消えるし。
あとわざとかもしれないけどゼロメモリを確保してもOSによっては実際には確保されないし。

>>659
ストリームオペレータはテキストファイルを読み書きするものだし。

661 :デフォルトの名無しさん:2010/07/15(木) 15:33:04
>>657
Embarcadero C++では1≒2で3が1の半分を少し下回った

MinGW(gcc4.5.0)では1≒2≒3で3が少し速かった

VC10ではECCと似た傾向だが約2倍速い

処理系によって差が出るね

当たり前だけど

662 :デフォルトの名無しさん:2010/07/15(木) 16:15:18
VC10でfstreamでファイル書き込むとビッグエンディアンになるみたいなんだけど、どういうバグだろう???

663 :662:2010/07/15(木) 16:20:51
あ、やっべ勘違いしてるかもしれん。
アラインメント関係のような気がしてきた。すまぬー。

664 :662:2010/07/15(木) 16:33:17
ビットマップの書き込みしてたんだけど、
アラインメントが4バイト境界だったのでファイルに落としてもおかしな形式になってたのでした。
いた汚してごめんなさい。

手当たりしだい#pragma packを突っ込んで解決した。

665 :デフォルトの名無しさん:2010/07/15(木) 17:15:40

Windowsアプリケーションのソースですが

   class TextClass : public exception
   {
   public:
      void Release();   // リソースの開放
   private:
      LPTSTR message;
      void SetMessage(LPCTSTR message);
   };

   void TextClass::SetMessage(LPCTSTR message)
   {
      // クラス変数にコピー
      this->message = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlen(message) + 1) * sizeof(TCHAR));
      lstrcpy(this->message, message);
   }


外部からSetMessage()を2回呼ばれると
1回目に確保したメモリがリークしませんか?
「すでにメモリ割り当てを行っていたら開放してから再割当て」
という処理を書く必要があると思うのですが
それを調べる方法はあるのでしょうか?
制御用の変数を新たに作って制御する必要がありますでしょうか?

666 :デフォルトの名無しさん:2010/07/15(木) 17:31:12
>>665
コンストラクタの段階でmessageにNULL突っ込んどいて、
SetMessageが呼ばれた段階でNULLなら初回呼び出し、NULLでなければ2回目以降と言う判断はできるかな。
色々便利だから、メモリの長さも保持しとくといいよ。

667 :デフォルトの名無しさん:2010/07/15(木) 17:43:01
>>666
なるほどなるほど。それでできそうですね。
ありがとうございました。

668 :665:2010/07/15(木) 18:24:05
ふひひひひ。
Visual Studio 2010のデバッガは
NULLで初期化したポインタの値を
強制的に0xccccccccに書き換えるらしい。

なので挿入するIF文は

  if (this->message != NULL && this->message != (LPTSTR)0xcccccccc)

が確実っぽいです。

669 :665:2010/07/15(木) 18:45:39
参考:http://hp.vector.co.jp/authors/VA014436/prg_memo/windows/vctips/007.html

追記。
>>668のようにデバッガに依存するコードは書きたくない。
そもそもこのコードは明らかに32bit環境専用。

というわけでより汎用性の高いコードを書くためには
uninitOnStackとでも名付けた初期化しないポインタを敢えて作っておいて
その値と比べるのが確実でいいかもしれないです。

670 :デフォルトの名無しさん:2010/07/15(木) 19:16:09
>>668
なんだそりゃ、おせっかいにもほどがあるなぁ。Windowsの罠か!?

671 :デフォルトの名無しさん:2010/07/15(木) 19:20:55
NULLで初期化したじゃなくてNULLで初期化してないの間違いじゃない?
初期化してない場合は不定値になるんだから0xcccccccでも問題ないと思うけど

672 :デフォルトの名無しさん:2010/07/15(木) 20:06:15
NULLで初期化して0xccccccccに書き換わるわけないだろ。

673 :デフォルトの名無しさん:2010/07/15(木) 20:18:11
明らかに未初期化ポインタですw

674 :デフォルトの名無しさん:2010/07/15(木) 20:32:51
>>668
       ,、‐ " ̄:::゙:丶、
    ,r::::l3゙::::::::/ハヽ:ヽ::::、:ヽ
    {::://:::::::// ヽ\ト、:::::::!
    ヾ l:::::::/ 丶   `ヾ ィ、:::|
     |;:r::|  O`  'O ゙ハ|   < ないない
      ヽハ :.:.    :.: レ
        ´\ r‐--‐、,ノ
 r、     r、/ヾ ̄下ヘ
 ヽヾ 三 |:l1、_ヽ/__ .ィヽ
  \>ヽ/ |` }    n_n| |
   ヘ lノ `'ソ     l゚ω゚| |
    /´  /      ̄|. |
    \. ィ   ___ |  |
        | ノ     l |  |
      | |      i:|  |

675 :665:2010/07/15(木) 20:33:45
そうです、勘違いしてました。忘れてください。


オーバーロードしたコンストラクタから、デフォルトコンストラクタを呼び出そうとして
TestClass();
と書いたのですが、これは別オブジェクトを生成してることになり、そこで混乱が生じました。

676 :デフォルトの名無しさん:2010/07/15(木) 20:34:00
this->とか

677 :デフォルトの名無しさん:2010/07/15(木) 20:42:17
そういやthis->って書いたことないな

678 :デフォルトの名無しさん:2010/07/15(木) 21:01:33
夏だなぁとか夏だなぁ厨とか言われますが実際に夏にはこうなるものです

679 :デフォルトの名無しさん:2010/07/15(木) 21:52:37
(this->*func)();
でよく使う。

680 :デフォルトの名無しさん:2010/07/15(木) 21:55:12
それは良くないスタイルだ。

681 :デフォルトの名無しさん:2010/07/15(木) 22:57:04
あ? ディスってんのか?

682 :デフォルトの名無しさん:2010/07/15(木) 23:36:29
いえ。呆れてるだけです。

683 :デフォルトの名無しさん:2010/07/16(金) 00:40:34
VS2010ならnullptr使えと思った

684 :デフォルトの名無しさん:2010/07/16(金) 03:20:24
フフフフフフフフ

685 :デフォルトの名無しさん:2010/07/16(金) 09:06:57
メモリアロケートなしでプライベートメンバーをソースファイルに隠蔽したい場合は配置newで無理やりやるしかないの?

686 :デフォルトの名無しさん:2010/07/16(金) 20:04:55
意味がわかんね

687 :デフォルトの名無しさん:2010/07/16(金) 22:04:55
pimplを動的確保なしでやりたいんじゃね?

688 :デフォルトの名無しさん:2010/07/17(土) 00:06:11
配置構文new

689 :デフォルトの名無しさん:2010/07/17(土) 00:08:11
グーグル先生がSTLのコンテナ使わないのってなんで?
boostの方使えってこと?

690 :デフォルトの名無しさん:2010/07/17(土) 00:10:20
>>689
C++標準化委員会よりスキルが上な自信があって、さらに彼らが信用できないと考えてるから

691 :デフォルトの名無しさん:2010/07/17(土) 00:52:29
>>689
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
にvectorやSTLという単語が出てくることからもわかるように、GoogleではSTLのコンテナを禁止してない

692 :デフォルトの名無しさん:2010/07/17(土) 01:06:16
We do not allow variable-length arrays or alloca().
ってあるけど可変長配列のことじゃないんか。

693 :デフォルトの名無しさん:2010/07/17(土) 01:20:16
gccの独自拡張だろ?

こういうやつ

void f( std::size_t size )
{
int buf[size] ; // 定数でなくても良い
}


だいたい、書いてあるじゃないか。
>Variable-length arrays and alloca are not part of Standard C++.

694 :デフォルトの名無しさん:2010/07/17(土) 01:20:57
ああ、考えて見れば、C99の機能だったな。

695 :デフォルトの名無しさん:2010/07/17(土) 03:14:48
-ansiオプションを常に付ける癖を付けとくといいよ
C99機能が当たり前のように慣れて他のコンパイラに移行する妨げになるのを防ぐ

696 :デフォルトの名無しさん:2010/07/17(土) 04:18:59
今時C99に対応してないコンパイラなんてあるわけないだろw

697 :デフォルトの名無しさん:2010/07/17(土) 07:52:37
あるから困る。具体的な話はスレ違いになるので割愛。

698 :デフォルトの名無しさん:2010/07/17(土) 07:52:37
C99とかクソだし。

699 :デフォルトの名無しさん:2010/07/17(土) 08:00:08
そのクソだというc99で当たり前のように使える可変長配列(これはSTLで事が足りるが)もrestrictもないC++

700 :デフォルトの名無しさん:2010/07/17(土) 08:01:18
C99は全く支持されていないし、C++スレだし。


701 :デフォルトの名無しさん:2010/07/17(土) 08:06:09
>>696
VC10はどうなの?C++0xの修正は入って来たけどC99なんて皆無だぜ?
一番よく売れているコンパイラとちゃうん?

702 :デフォルトの名無しさん:2010/07/17(土) 08:07:06
>>699
可変長配列はC++のようにライブラリで組み込み感覚で使えるような対応ができないから言語仕様で対応するしかないからだろう。
ライブラリーだとスパース配列とか特定用途で効率のいい配列とか簡単に対応できる。

restricは普通のコンパイラはベンダ拡張で装備されてるしな。

703 :デフォルトの名無しさん:2010/07/17(土) 09:28:42
>>701
皆無? ほんとに? c99で拡張されたprintf()の"%lf"も使えないの?

704 :デフォルトの名無しさん:2010/07/17(土) 10:00:46
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html

705 :デフォルトの名無しさん:2010/07/17(土) 10:11:29
> VC10はどうなの?C++0xの修正は入って来たけどC99なんて皆無だぜ?

>>703
2008→2010でC++0xに少し対応したけどC99の対応は変わってない
ってことじゃないの?
もしそれに関して詳しく知ってるなら教えてくれない?

706 :デフォルトの名無しさん:2010/07/17(土) 11:35:12
そろそろswitchでstring使えるようになったか?

707 :デフォルトの名無しさん:2010/07/17(土) 11:38:59
>>706
ハッシュ値でswitchすればいいんじゃね?そのほうが速いだろうし。

708 :デフォルトの名無しさん:2010/07/17(土) 12:57:46
C99は死産だったと思った方がよい
C++かC++0xがこれからの時代のトレンドですよ
だいたいC99なんてスレ立ってないでしょ?

709 :デフォルトの名無しさん:2010/07/17(土) 14:14:00
>だいたいC99なんてスレ立ってないでしょ?

ひどい2ch脳

710 :デフォルトの名無しさん:2010/07/17(土) 14:20:41
今時C99なんかよりD言語の方が余程使われているよ

711 :デフォルトの名無しさん:2010/07/17(土) 14:29:33
いまさら動的配列だけじゃメリットないしな。

712 :デフォルトの名無しさん:2010/07/17(土) 15:06:19
STLのヘッダってインデントが不自然なんだけどなんであんなふうになってるんですか

713 :デフォルトの名無しさん:2010/07/17(土) 15:12:59
>>712
書いた人の癖かヘッダジェネレータの出力がああなっているとしか

714 :デフォルトの名無しさん:2010/07/17(土) 16:24:00
gccのなら8タブで見てみたらいいと思う。
それでも不自然な部分は書いた人のくせではなく、GNUのインデントスタイルのせいかと。

715 :デフォルトの名無しさん:2010/07/17(土) 18:47:07
VC6で動いていた以下のテンプレートクラス内のstaticメンバの宣言がVS2010ではエラーとなってしまい
class などの語を混ぜたりして弄ってみたのですが、うまくコンパイルできずにいます。
最近のC++コンパイラではどのように書けばよいのでしょうか?
template <typename T> class a {
public:
class b { };
static b x; ///< これを宣言したい
};
template <typename T> a<T>::b a<T>::x; ///< ここがVS2010でエラー

716 :デフォルトの名無しさん:2010/07/17(土) 18:52:41
>>715これでよくね?
template <typename T> a::b a::x

717 :デフォルトの名無しさん:2010/07/17(土) 18:55:45
template <typename T> typename a<T>::b a<T>::x;

718 :デフォルトの名無しさん:2010/07/17(土) 18:57:53
>>715
その場合a<T>::bは型であることを明示する必要がある
template <typename T> typename a<T>::b a<T>::x;

719 :デフォルトの名無しさん:2010/07/17(土) 19:06:32
>>716-718 ありがとうございます
>>717-718で正常にコンパイルできました
VS2010の出していたwarning 「依存名は型ではありません。'typename' を持つプレフィックスは型を示します。」の意味がやっとわかりました
ほんと助かりました
ありがとう!ありがとう!

720 :デフォルトの名無しさん:2010/07/17(土) 19:19:14
2008までは typename なくても動いてたってのがおかしい話なんやで

721 :デフォルトの名無しさん:2010/07/17(土) 19:36:50
VC6じゃね

722 :デフォルトの名無しさん:2010/07/17(土) 20:36:14
>>719
日本語の意味がやっと判ってよかったね。

723 :デフォルトの名無しさん:2010/07/17(土) 23:39:33
std::unique_ptr<int> Get()
{
return std::unique_ptr<int>( new int );
}
std::unique_ptr<int> a;
std::unique_ptr<int> b;
a = Get();
a = b;


a = Get();は通って
a = b;の方はエラーになるんだけどなんで?

724 :デフォルトの名無しさん:2010/07/17(土) 23:46:45
エラーメッセージくらい読めないの?

725 :デフォルトの名無しさん:2010/07/17(土) 23:51:34
>>723
a=Get();は右辺値参照なのでムーブが行われるから通る。
a=b;はコピーなんでエラーになる。

726 :デフォルトの名無しさん:2010/07/18(日) 01:03:23
int&&
ってのは右辺値参照って言うのか。
C++0xの機能を知らないうちに使ってたわけね。

727 :デフォルトの名無しさん:2010/07/18(日) 06:42:22
&&以前にunique_ptrが既にそうだw

728 :デフォルトの名無しさん:2010/07/18(日) 19:07:31
>>726
右辺値参照は知らなくても恩恵にあずかれるのが凄い。
その分ライブラリ書く人は大変だけどな。

729 :デフォルトの名無しさん:2010/07/18(日) 21:01:40
class T
{
public:
  boost::ptr_list<T> list;
  class I
  {
  public:
    boost::ptr_list<T>::iterator i;
    boost::ptr_list<T>::reverse_iterator r;
  };
};

reverse_iteratorでエラーになるんですけど何故でしょうか?

730 :デフォルトの名無しさん:2010/07/19(月) 09:33:10
>>729 エラーメッセージ

731 :デフォルトの名無しさん:2010/07/19(月) 19:37:37
>>729
>>715-719と同じで
typename boost::ptr_list<T>::iterator i;
typename boost::ptr_list<T>::reverse_iterator r;
とする必要がある

732 :デフォルトの名無しさん:2010/07/19(月) 19:56:56
まて、>>728 の T はクラス名であってテンプレート引数ではない。

733 :732:2010/07/19(月) 19:58:04
すまん ×>>728>>729

734 :デフォルトの名無しさん:2010/07/20(火) 19:19:44
staticな関数ではなく、staticなクラスはどうやって作るんですか?
C++ではシングルトンパターンにするしかないんですか?

735 :デフォルトの名無しさん:2010/07/20(火) 19:32:39
普通にstatic変数で。intと同じ。
シングルトンはstaticじゃないよ。

736 :デフォルトの名無しさん:2010/07/20(火) 19:33:37
全部名前空間につっこんどけばいいんじゃない

737 :デフォルトの名無しさん:2010/07/20(火) 20:58:16
邪婆の数学ライブラリみたいなのは勘弁

738 :デフォルトの名無しさん:2010/07/20(火) 21:01:11
>>737
どんなの?

739 :デフォルトの名無しさん:2010/07/20(火) 23:02:48
なんでクラス使うの嫌なのかね

740 :デフォルトの名無しさん:2010/07/20(火) 23:24:42
世の中には普遍的でどんな属性も持たない概念がたくさんある
・・・というメタな主張で相容れないものを感じるのさ

741 :デフォルトの名無しさん:2010/07/20(火) 23:43:20
class Base{};
class Sub : public Base{};
class P
{
public:
  virtual ~P(){ delete base; }
  template<class T> void Create(){ base = new T(); }
  template<class T, class ARG0> void Create(ARG0 arg0){ base = new T( arg0 ); }
private:
  Base* base;
};
P p;
p.Create<Sub>();

ユーザーにnew演算子を使わせたくないんで、テンプレートでnewを隠蔽するのは設計的にアリですか?

742 :デフォルトの名無しさん:2010/07/21(水) 00:08:53
有名なデザインパターンです。

743 :デフォルトの名無しさん:2010/07/21(水) 07:16:26
>>741 auto_ptr ぐらい使っとけよ。

744 :デフォルトの名無しさん:2010/07/21(水) 07:21:05
いや、auto_ptrはもう使うな。
unique_ptrを使え。

745 :デフォルトの名無しさん:2010/07/21(水) 07:21:47
使える環境なら、な。

746 :デフォルトの名無しさん:2010/07/21(水) 07:59:30
使えない環境なんてないな。

747 :デフォルトの名無しさん:2010/07/21(水) 08:37:23
お前がそう思うんなら(ry

748 :デフォルトの名無しさん:2010/07/21(水) 08:58:14
>>745
C++0xでないとムーブしようとするとコンパイルエラーが出る
ムーブ出来ない環境で使っても意味がない

749 :デフォルトの名無しさん:2010/07/21(水) 08:58:59
×>>745
>>744

750 :デフォルトの名無しさん:2010/07/21(水) 08:59:33
unique_ptrなんて当然無いし、boostの一部も使えない環境だわ。

751 :デフォルトの名無しさん:2010/07/21(水) 09:41:37
boost::scoped_ptrで代用しよう

752 :デフォルトの名無しさん:2010/07/21(水) 10:57:39
自分で実装すりゃいいじゃん

753 :デフォルトの名無しさん:2010/07/21(水) 22:05:16
ifstream でテキストファイルを読み込んで
文字数を取得
文字データをバッファに格納
をしたいのですが

seekgみたいに文字列を末尾までカウントしたり
readみたいに文字列をバッファに文字数分格納したり
することができる関数ってありますか?
それとも他になにかいい方法ありますか?

754 :デフォルトの名無しさん:2010/07/21(水) 22:13:12
istreambuf

755 :デフォルトの名無しさん:2010/07/21(水) 22:21:24
class Foo
{
public:
template< int N > Foo(){ printf( "%d\n", N ); }
};
どうすればFooのコンストラクタを呼び出すことが出来ますか。

756 :デフォルトの名無しさん:2010/07/21(水) 22:24:25
テンプレートをclass Fooの方へ持って行くだけ。

757 :デフォルトの名無しさん:2010/07/22(木) 00:29:21
staticの付いたものはいつ作られるんですか?
初めに呼び出されたときですか?
Windows 7です

758 :デフォルトの名無しさん:2010/07/22(木) 07:20:02
>>753
seekg(), read() を使えばいいんじゃないの?

759 :デフォルトの名無しさん:2010/07/22(木) 07:49:05
>>757
関数ローカルなら初めて実行されたとき、そうじゃなければ main() 開始の前。
だいたいこんなところ。

760 :デフォルトの名無しさん:2010/07/22(木) 16:21:44
>>757
ちょっと話が変わるかも知れないけど、

異なる翻訳単位にある「ローカルでない静的オブジェクト」の初期化の順番はきめられていない。

って知っている?
たぶんしらなさそうなんで
ttp://cheesy.dip.jp/diary/archives/107
これとか読んどいてね。


761 :デフォルトの名無しさん:2010/07/22(木) 22:15:08
>>760
「俺もつい最近知った。」まで読んだ

762 :デフォルトの名無しさん:2010/07/22(木) 22:28:45
>>761


763 :デフォルトの名無しさん:2010/07/23(金) 19:04:17
signとunsignの数値を比べようとしましたって何?
どうやって防ぐの?

764 :デフォルトの名無しさん:2010/07/23(金) 19:09:30
勉強しなおせこのカス

765 :デフォルトの名無しさん:2010/07/23(金) 19:09:43
for(int i = 0; i < v.size(); ++i)

766 :デフォルトの名無しさん:2010/07/23(金) 19:27:28
>>765
> for(int i = 0; i < v.size(); ++i)
そのシチュエーションで出て来るのか。


767 :デフォルトの名無しさん:2010/07/23(金) 20:31:58
VCつかってると警告出るよ。

768 :デフォルトの名無しさん:2010/07/23(金) 20:36:03
キャストすればいんでね?

769 :デフォルトの名無しさん:2010/07/23(金) 20:40:40
>>765
v.size()の戻りはstd::size_tだ。
for(std::size_t i = 0; i < v.size(); ++i)
でおk

770 :デフォルトの名無しさん:2010/07/24(土) 00:23:07
static_cast<int>(v.size()) でもいい

771 :デフォルトの名無しさん:2010/07/24(土) 00:53:58
前者の方がより正しいコードではあるな。

int振り切るsizeとか64bitだとありえるんだよなー。すげーなー。

772 :デフォルトの名無しさん:2010/07/24(土) 01:36:50
ウザイよね。
いい加減に signed 側が負にならないことが明らかなシチュエーションでは黙ってて欲しい。
if (0 <= i && i < v.size())
とか。

773 :デフォルトの名無しさん:2010/07/24(土) 02:02:12
for (unsigned int i = 0; i < v.size(); i++)
なんてやってた

774 :デフォルトの名無しさん:2010/07/24(土) 02:25:05
>>769,773
中途半端だな。
型を合わせるんなら size_type 使わないと。

こういうときに decltype(v.size()) が欲しくなるのかな。

775 :デフォルトの名無しさん:2010/07/24(土) 02:25:49
イテレータ使えよ

776 :デフォルトの名無しさん:2010/07/24(土) 02:26:21
BOOST_FOREACH() 使えよ

777 :デフォルトの名無しさん:2010/07/24(土) 02:27:14
そうは言ってもループの中でインデックスを使いたいことがけっこうあるんだよね

778 :デフォルトの名無しさん:2010/07/24(土) 15:10:03
C++で手っ取り早く、HTMLをDOMでパースして編集し、出力するには、どのライブラリがオススメ?
libxml2でもいいんだが、クラスっぽく動くライブラリがあったらなぁと。

779 :デフォルトの名無しさん:2010/07/24(土) 15:53:00
リバースする時は日本薬局方「吐根」がオススメ

780 :デフォルトの名無しさん:2010/07/24(土) 16:31:12
>>778HTMLは行儀よくかかれている物ばかりじゃないからDOMでパースするのは無理だとおもわれ。

781 :デフォルトの名無しさん:2010/07/24(土) 21:39:39
>>774
X::size_typeは非負の整数型と規定されてるのでunsigned intで受けてもいいんじゃないかな

782 :デフォルトの名無しさん:2010/07/24(土) 21:54:55
sizeof(X::size_type) != sizeof(unsigned int)
な処理系のためにわざわざ地雷を埋め込む理由が分からない

783 :デフォルトの名無しさん:2010/07/24(土) 21:57:51
イテレータ使えよ

784 :デフォルトの名無しさん:2010/07/24(土) 22:38:24
>>782
地雷じゃねーだろ。
比較は、大きい方の型に拡張して行われるんだから。

「素人には地雷に見えることが問題」というならわからんでもないが。

785 :デフォルトの名無しさん:2010/07/24(土) 22:40:33
あーごめん。
v.size() > UINT_MAXのケースを想定して
地雷ということか。

786 :デフォルトの名無しさん:2010/07/24(土) 22:45:14
んー、でも、その点まで考慮して、というならば

配列の添え字にintを使っているコードは
全て地雷ということになるな。
sizeof(int) != sizeof(size_t) な環境(現実的には大抵の64bit環境)であれば。

787 :デフォルトの名無しさん:2010/07/24(土) 23:56:28
そうだろ?

788 :デフォルトの名無しさん:2010/07/25(日) 00:06:09
実際64bit環境なら大抵size_typeが8バイトでunsigned intが4バイトっしょ

789 :デフォルトの名無しさん:2010/07/25(日) 00:11:24
まあ782がそんなところまで考えていたとは思えないけどな

790 :デフォルトの名無しさん:2010/07/25(日) 00:43:43
>>786
ところがVCでは(ry

791 :デフォルトの名無しさん:2010/07/25(日) 00:59:33
環境依存で悩む場所じゃないだろこんなの。
size_type size() const;なんだからsize_typeで受けるのが当たり前。
size_tはまだ許せるとして、なんでintやunsignedを持ち出すの?

792 :デフォルトの名無しさん:2010/07/25(日) 01:36:51
vectorの添え字にintを使うべきではない
なんて、最低だね

793 :デフォルトの名無しさん:2010/07/25(日) 01:39:45
規格としてそうなっているから、それに従うべき
と言っている点に文句は無い。

問題はそうやってどんどんとっつきにくくわかりにくくしていく
言語仕様(ライブラリ含む)が、どうしようもなくドロドロだということ。

794 :デフォルトの名無しさん:2010/07/25(日) 01:39:48
google先生はunsingedは使うな言うしどうすればいいのー

795 :デフォルトの名無しさん:2010/07/25(日) 01:44:19
>>791
sizeof(Array) / sizeof(Array[0]) はsize_t型になるのだから
Arrayの添え字には、size_tもしくはptrdiff_tを使うのが当たり前ってことかね?

796 :デフォルトの名無しさん:2010/07/25(日) 01:56:57
size_t size() constだと思ってた
今度確認してみよう… もしかしてVC++だから?

797 :デフォルトの名無しさん:2010/07/25(日) 02:03:55
>>791
auto が「ない」状況では仕方あるまい

798 :デフォルトの名無しさん:2010/07/25(日) 02:11:46
このネタ定期的にループするな

799 :デフォルトの名無しさん:2010/07/25(日) 02:28:36
forはループ命令だしね。

800 :デフォルトの名無しさん:2010/07/25(日) 03:39:06
auto があれば
 for (auto sz = v.size(), i = 0u; i < sz; ++i) {}
とでも書けばいいか

801 :デフォルトの名無しさん:2010/07/25(日) 04:29:32
auto 使えるんならイテレーターにするわ

802 :デフォルトの名無しさん:2010/07/25(日) 04:58:30
でも数学的な実体 (行列, 数列, etc.) を
扱うなら iterator よりも index の方が
普通は慣れてることもあって使い易いよ。

803 :デフォルトの名無しさん:2010/07/25(日) 13:27:55
>>800
>auto があれば
すでにあるよね?auto int i = 0;とか書けるじゃん

804 :デフォルトの名無しさん:2010/07/25(日) 13:39:47
>>803
そのautoじゃなくてC++0xのautoでしょ

805 :デフォルトの名無しさん:2010/07/25(日) 13:45:02
ネタにマジレス

806 :デフォルトの名無しさん:2010/07/25(日) 14:18:42
>>790
VC++もターゲットが64ビット環境ならsize_tは64ビットですよ。

807 :デフォルトの名無しさん:2010/07/25(日) 14:20:02
boost::format
に対する
std::format
みたいなのありますか?

808 :デフォルトの名無しさん:2010/07/25(日) 21:42:37
>>807
03にも0xにもないよ
0xでは可変長引数テンプレートprintfでだいたい代替できる

>>763-806
イテレータ使えよ

809 :デフォルトの名無しさん:2010/07/25(日) 21:50:48
C++の常識はプログラミング言語の非常識

810 :デフォルトの名無しさん:2010/07/27(火) 09:44:09
yLib1.a を利用する MyLib2.so を作ります。
このときアプリからは MyLib2.so のみをリンクすれば使えるようにしたいです。
MyLib1.a を MyLib2.so の中に埋め込むにはどうすればいいでしょうか?

811 :デフォルトの名無しさん:2010/07/27(火) 09:46:36
>>810 お使いの環境を確認して専用スレへどうぞ。

812 :デフォルトの名無しさん:2010/07/27(火) 20:46:25
VC++ で
std::vector<int> a;
typeof(a)::iterator b;
みたいなことってどうやったらできる? 一行目がvectorだったりdequeだったりしても二行目を書き換えずに済ませたい

813 :デフォルトの名無しさん:2010/07/27(火) 21:14:13
std::vector<int> a;
auto b = a.begin();

814 :デフォルトの名無しさん:2010/07/27(火) 21:14:47
decltype(a)::iterator b;
こう?
http://msdn.microsoft.com/en-us/library/dd537655.aspx

815 :デフォルトの名無しさん:2010/07/27(火) 21:53:37
>>812

typedef std::vector<int> container;

container a;
container::iterator b(a.begin());

必要に応じてtypedef宣言をdequeに置き換えればいい

816 :デフォルトの名無しさん:2010/07/28(水) 01:30:28
というかすでにdecltypeを実装してるだろ。

817 :デフォルトの名無しさん:2010/07/28(水) 09:21:20
>>812
VS2010にバージョンアップして
>>813
の一択ですよ

818 :デフォルトの名無しさん:2010/07/29(木) 13:58:02
>>808
じゃあ教えてくれ、以下のようなことをやるのにイテレータを使って
どうやればいい?

for (unsigned int i = 0; i < n; i++) {
for (unsigned int j = i; j < n; j++) {
if (i != j) {
v[i][j] = v[j][i];
v[j][i] = 0;
}
}
イテレータだとループ中、現在位置が分からないというのが最大のネック

819 :デフォルトの名無しさん:2010/07/29(木) 14:26:25
>>818
なんでベクター限定のコード書いてイテレータがどうとか言ってんの?
ベクター限定なんだからそのままのコードでいいじゃん。

全然関係ないけどそのコード自体見直した方がいいよ。
「私は劣化プログラマです」って言ってるようなものだよw

820 :デフォルトの名無しさん:2010/07/29(木) 14:44:33
コンテナや使い方によるけどイテレータ使うのは要素全部に処理するときがほとんどだなぁ
逆順イテレータとか使いにくそうじゃない?



821 :デフォルトの名無しさん:2010/07/29(木) 15:32:13
>>819
unsigned int使ってるって言ったの俺だよ。
劣化プログラマですっていうのは受け入れます。

元々unsigned int使わざるおえなくなったのは上のvectorの
場合なんだ。
イテレータ万能というように言う人が結構いたので、
あらためて質問という意味で書かせてもらった。
これはイテレータ使わないよね?

あと、間違えがあって、
× v[i][j] = v[j][i];
○ v[i][j] += v[j][i];

イテレータを使わないとしたら、
インデックスになると思いますが、インデックスは
unsigned intではなかったら何を使うと良いでしょう。

さらに、このコードがクソ過ぎると思われた方は、
根本的に添削していただけると助かります。

822 :デフォルトの名無しさん:2010/07/29(木) 15:44:18
>>820
別に無理して使うものではないんだよ。価値を感じる(理解)人が使えばいい。

コンテナであればベクターであろうがリストあろうが同じコードで処理できるんだよ。
こういう抽象化に興味がない人には無用の長物。

コンテナを逆順に走査する必要があったときにリバースイテレータを使えば、
正順と全く同じコードで逆順が実現できる。
この辺の意味がわからん人が無理して使うような物でない。

823 :デフォルトの名無しさん:2010/07/29(木) 15:49:08
>>821
いや、そうじゃなくてさ
for(std::size_t i = 0; i < v.size(); ++i)
の例に「イテレータ使えよ」と言っただけなのに
なんで>>818みてーな例だして噛み付いてきてんの?アホなの?



824 :デフォルトの名無しさん:2010/07/29(木) 15:55:15
>>823
すまん。C++始めて2週間なのです。アホです。
どんな場合でもイテレータは使えるのかと本気で期待しました。
が、数値計算的なことには無力と分かって良かったです。

>>822
もっと抽象的な処理で有効ということですね。
ありがとうございます。


825 :デフォルトの名無しさん:2010/07/29(木) 15:55:20
>>821
if文無駄じゃね?

826 :デフォルトの名無しさん:2010/07/29(木) 15:55:36
>>821
>イテレータ万能というように言う人が結構いたので、
多分意味を取り違えてる。

>これはイテレータ使わないよね?
やりたいことはベクター(配列)であることが絶対条件だし、
配列のインデックスでアクセスしたいんだから、素直にインデックスでアクセスしろよ。

>根本的に添削していただけると助かります。
if 文使う必要もないでしょ。普通のプログラマなこんなコードは書かない。

827 :デフォルトの名無しさん:2010/07/29(木) 15:59:26
>>824
>が、数値計算的なことには無力と分かって良かったです。

全然理解できてないぞw

828 :デフォルトの名無しさん:2010/07/29(木) 16:02:08
>>822
そうだね。まあListなら使うしかなさそうだけど。
stlのバグ見つけたときから過信して何でも使わないようにしてる。

829 :デフォルトの名無しさん:2010/07/29(木) 16:15:58
>>818
現在位置ならstd::distanceで求めれば?

830 :デフォルトの名無しさん:2010/07/29(木) 16:26:05
ここまで、unsigned int ついてツッコミなし

831 :デフォルトの名無しさん:2010/07/29(木) 16:30:50
>>829
ありがとうございます。STLは奥深いですね。
勉強します。

832 :デフォルトの名無しさん:2010/07/29(木) 16:38:44
>>828
それでいい、今の君には無用の長物

833 :デフォルトの名無しさん:2010/07/29(木) 16:54:54
>>830
気になるのでどの辺がつっこみどころなのか教えてくれませんか

834 :デフォルトの名無しさん:2010/07/29(木) 17:18:27
unsignedが出てきたら間違い

835 :デフォルトの名無しさん:2010/07/29(木) 17:27:36
>>833
気にしない方がいいよ。
>>830 は size_type を使うように誰かに教わって、それが全てだと思い込んでいるのだろうw

836 :デフォルトの名無しさん:2010/07/29(木) 17:40:32
830はsize_typeの人ではなく、
彼自身も知りたがってるとは考えられないのか?

837 :デフォルトの名無しさん:2010/07/29(木) 18:58:51
>>818
イテレータで…という質問の答えにはならないけどこうかな

// boost-ublas
auto u = triangular_adaptor<decltype(v), upper>(v);
auto su = triangular_adaptor<decltype(trans(v)), strict_upper>(trans(v));
auto value = u + su;

確かにイテレータは行列や四元数なんかのアクセスには適当じゃない
行列は行列で別の抽象化の技法があるのでそっちを使えばいいんじゃないかな

838 :デフォルトの名無しさん:2010/07/29(木) 19:17:19
>>837
すげっ、けど変態

839 :デフォルトの名無しさん:2010/07/29(木) 19:30:08
イテレータだろうが添え字だろうが要は道具なんだから使い方次第

840 :デフォルトの名無しさん:2010/07/29(木) 20:26:27
イテレータ知らないから使えない(´・ω・`)

841 :デフォルトの名無しさん:2010/07/29(木) 20:37:19
イテレータって[]←これだよね

842 :デフォルトの名無しさん:2010/07/29(木) 20:45:58
>>841
それは添字演算子

843 :デフォルトの名無しさん:2010/07/29(木) 21:28:55
生配列を使わなくなって何年も経つ。

844 :デフォルトの名無しさん:2010/07/30(金) 00:53:06
C++0xではテンプレートメタでenum判断できますか?

845 :デフォルトの名無しさん:2010/07/30(金) 01:15:28
>>844 enum判断するとは?

846 :デフォルトの名無しさん:2010/07/30(金) 05:11:20
>>844
std::is_enum

847 :デフォルトの名無しさん:2010/07/30(金) 12:01:54
nullと0を分けてくれませんか?

848 :デフォルトの名無しさん:2010/07/30(金) 12:06:31
nullならをそういうふうに定義すればいいだけでは?

849 :デフォルトの名無しさん:2010/07/30(金) 14:38:20
>>846
おお、こんな関数がありましたか。
ちなみに0x以前にもあります?

850 :デフォルトの名無しさん:2010/07/30(金) 21:30:40
queueとstackとvectorの使い分けの例をよろしくお願いします

851 :デフォルトの名無しさん:2010/07/30(金) 21:54:52
vectorで作ってたら前から挿入したくなってムラムラしてdequeにした、みたいな?

852 :デフォルトの名無しさん:2010/07/30(金) 22:09:27
adaptor

853 :デフォルトの名無しさん:2010/07/30(金) 22:20:48
スタックはたぶんインデックサが無い。
ベクタはメモリが一本だから、旧来のファイル等のAPIに使える。
キューは順番が必要なとき使う。
デキューは上記のとき意外で使う。

俺は特に制約が無いときはデキュー使ってる。
細かくアロケートしてメモリ効率よさそうだからな。

854 :デフォルトの名無しさん:2010/07/30(金) 23:05:40
シーケンスの中間への挿入/削除が多ければlist
シーケンスの両端への挿入/削除が多ければdeque
そうでないならvector を使えと規格には書いてある

queueとstackはその名のとおりだが用途に悩むくらいなら使わなくていいと思う
どうせ中身はdequeだし

規格には- の参照先はこちら↓
http://www.kuzbass.ru/docs/isocpp/lib-containers.html#lib.sequence.reqmts の 2

855 :デフォルトの名無しさん:2010/07/31(土) 14:01:34
C++で文字コードをunicodeで
やるにはどうしたらできますか?

856 :デフォルトの名無しさん:2010/07/31(土) 14:06:29
wstring

857 :デフォルトの名無しさん:2010/07/31(土) 14:07:30
VCならオプションで文字セットをUnicodeに設定して
wchar_t a = L"あいうえお";
std::wstring b = L"かきくけこ";
wprintf(L"%s %s\n",a,b.c_str());
とかやればいいんじゃないの

858 :デフォルトの名無しさん:2010/07/31(土) 14:08:21
文字を入れるにはどうやるんですか?

859 :デフォルトの名無しさん:2010/07/31(土) 14:11:58
すみませんMINGW(GCC)なのでわかりません。
教えてください。

860 :デフォルトの名無しさん:2010/07/31(土) 14:18:58
UNICODEてなんだよ

861 :デフォルトの名無しさん:2010/07/31(土) 14:59:23
GCCでそのLをつけた書き方はどうやりますか?

862 :デフォルトの名無しさん:2010/07/31(土) 16:10:47
TCHAR、_T()マクロ使えばいいんじゃね?w

863 :デフォルトの名無しさん:2010/08/01(日) 00:24:36
メンバー変数を持つ抽象クラスの書き方を教えてください。
ID番号を持たせたいです。

864 :デフォルトの名無しさん:2010/08/01(日) 00:37:32
std::tr1::regex
を使って
"あああああ"を"(1)(2)(3)(4)(5)"
のようにマッチする度に値を変化させて置換する方法ってありますか?

865 :デフォルトの名無しさん:2010/08/01(日) 00:38:42
>>863
なにを困ってるかわからん。くわしく

866 :デフォルトの名無しさん:2010/08/01(日) 00:40:56
class Interface
{
 virtual int id = 0;
}

のようなこと

867 :デフォルトの名無しさん:2010/08/01(日) 00:51:52
virtual int id() = 0;

868 :デフォルトの名無しさん:2010/08/01(日) 01:10:30
インターフェースっていうのは

869 :デフォルトの名無しさん:2010/08/01(日) 01:10:37
お断りさせていただきます

870 :デフォルトの名無しさん:2010/08/01(日) 01:14:17
やはり言語のバグか
策定に私を参加させなかったのが裏目に出ましたね

871 :デフォルトの名無しさん:2010/08/01(日) 01:16:36
>>866
どんな動作を期待してるんだよ

872 :デフォルトの名無しさん:2010/08/01(日) 01:23:21
普通にclass書いてコンストラクタをprotectedにでもしとけ

873 :デフォルトの名無しさん:2010/08/01(日) 11:09:33
const int func();

……
case func() : // コンパイルできない
……

なぜcaseのところにfuncが入らないのでしょうか?

874 :デフォルトの名無しさん:2010/08/01(日) 11:11:28
定数式でないから
constじゃなくconstexprを付けないとだめ

875 :デフォルトの名無しさん:2010/08/01(日) 12:06:55
なぜわざわざconstとconstexprで分けられているのでしょうか?

876 :デフォルトの名無しさん:2010/08/01(日) 12:16:17
↓wikipediaから引用

int GetFive() { return 5; }

int some_value[GetFive() + 5]; // 10 要素の整数配列を作りたいが、C++ では不正。

GetFive() + 5 が定数式でないため、これは C++ では不正となる。
実際には GetFive は実行時に一定値を返すが、
コンパイラにそれを知らせる方法がないのである。
理論上、関数はグローバル変数に影響を与える、
実行時に結果が変わる他の関数を呼ぶ、などの理由がある。

877 :デフォルトの名無しさん:2010/08/01(日) 13:19:13
問1
constにconstexprの機能を持たせた場合予想される弊害を答えなさい。

878 :デフォルトの名無しさん:2010/08/01(日) 13:27:44
>>877
どこにつけるconstについてか述べなさい

879 :デフォルトの名無しさん:2010/08/01(日) 13:28:38
constexprが何か知らない俺が困る

880 :デフォルトの名無しさん:2010/08/01(日) 13:29:53
case の比較順序が未規定だから

switch(x)
{
case func1(): goto L1;
case func2(): goto L2;
}
goto L3;

L1: //func2() が実行されたかどうかわからない
L2: //func1() が実行されたかどうかわからない

L3:

# 配列やグローバルの話に飛ぶ必要はない

881 :デフォルトの名無しさん:2010/08/01(日) 13:40:29
switch(...) {
 case func():
 ...

// a.cpp
const int func() {
 return ...;
}

// a.h
const int func();

constが付いていてもコンパイル時定数ではないのでNG

882 :デフォルトの名無しさん:2010/08/01(日) 13:51:07
>>880
>ほにゃららが実行されたか分からない
分からなくていい場合は?

>>881
>constが付いてもいてもかくかくしかじか
コンパイル時定数ではなくてもいい場合は?

C++より自由に何でも書けてプログラマーの思考を阻害することなく、そのまま表現できる言語ないですか?

883 :デフォルトの名無しさん:2010/08/01(日) 13:53:14
コンパイル時定数ではなくてもいい場合は別にいいんじゃね
ただしcaseラベルはコンパイル時定数でなければならない

884 :デフォルトの名無しさん:2010/08/01(日) 16:26:47
>>882
C++にこだわりがないのなら、RubyとかPythonとかを使えばいいじゃない

885 :デフォルトの名無しさん:2010/08/01(日) 16:46:59
C++を勉強中でEffective、ExceptionalやD&Eを読んで
今はModern C++ Designを読んでるけど、なにこの変態言語…
みんなC++の言語仕様を全部理解して使ってるの?

886 :デフォルトの名無しさん:2010/08/01(日) 16:49:47
/dev/nullみたいな、空のストリームを作ることって簡単にできますか?

887 :デフォルトの名無しさん:2010/08/01(日) 16:51:12
理解してないよ!

888 :デフォルトの名無しさん:2010/08/01(日) 16:53:22
>>885
C++0xでぐぐるともっと幸せになれるよ!

889 :デフォルトの名無しさん:2010/08/01(日) 16:53:50
仕様が巨大過ぎるからコーディング規約で使う機能を絞ってる。

890 :デフォルトの名無しさん:2010/08/01(日) 20:07:37
>>882
わからなくていいかどうかを、コンパイラに通知する方法を思いついたら禿にでも相談してみては?

891 :デフォルトの名無しさん:2010/08/01(日) 20:54:47
> >ほにゃららが実行されたか分からない
> 分からなくていい場合は?

if文使えばいいでしょ。バカなんじゃないの?


892 :デフォルトの名無しさん:2010/08/01(日) 21:20:33
>>889老害乙

893 :デフォルトの名無しさん:2010/08/01(日) 21:27:05
>>892
お前のところはなんでもありでやってるのか

894 :デフォルトの名無しさん:2010/08/01(日) 21:32:36
規約とか決めるからあんな便利な機能あるのに使えないって場面が増えるんだろw
新しい機能使うときは当然慎重になるべきだが規約で縛る必要はないと思う。

895 :デフォルトの名無しさん:2010/08/01(日) 21:36:15
Google先生ですら規約で機能制限してるのに
アホプログラマーが好き勝手にやらかすのを黙って見てるのはもっとアホだろ。

896 :デフォルトの名無しさん:2010/08/01(日) 21:40:52
機能追加には慎重になるべきだと言っている文盲がw
規約を定期的に見直す作業するならいいけど、
そんな余裕はないだろうから規約制限しない方がいいと思ってる。

897 :デフォルトの名無しさん:2010/08/01(日) 21:44:41
なんか言ってることがおかしい。
・制限しない方がいい
・定期的に見直すべきだ
・新しい機能使うときは当然慎重になるべき
全部矛盾してるぞ。

898 :デフォルトの名無しさん:2010/08/01(日) 21:47:12
コード規約は正しい記法を奨励し、正しくない記法を拒絶するようにするべき

899 :デフォルトの名無しさん:2010/08/01(日) 21:49:02
オマエ文網だなwww
第一義的には制限するべきではないが機能追加には慎重になるべき。
稼動実績ないわけだから当然だよなw
仮に定期的に規約見直すならば、制限してもいいかなといっている。

900 :デフォルトの名無しさん:2010/08/01(日) 21:49:27
なんで規約があるのかわからないから「あんな便利な機能があるのに使えない」とか言っちゃう

901 :デフォルトの名無しさん:2010/08/01(日) 21:50:05
規約制限しない結果、バグだらけになったりするかもな。
慎重になるかどうかはプログラマーによるわけで、慎重にならないバカなプログラマーが出ないように規約で制限してんだろ。


902 :デフォルトの名無しさん:2010/08/01(日) 21:51:06
>第一義的には制限するべきではないが機能追加には慎重になるべき。

だめだこりゃ。なんで規約があるのかを考えろよ

903 :デフォルトの名無しさん:2010/08/01(日) 21:51:41
個人レベルで慎重になるとかありえないだろwww
リーダーが責任を負うレベルでの話だよwww

904 :デフォルトの名無しさん:2010/08/01(日) 21:53:27
規約といってもいろんな規約があるわけで、今は機能追加に関して話してんだろ?w
規約の意味とか論理飛躍も甚しすぎるんだがwww

905 :デフォルトの名無しさん:2010/08/01(日) 21:55:59
徐々にwが増えるんだな。
どのレベルでとか誰が判断するんだ?
ひとつの問題あって、それが個人レベルかリーダーレベルか。
そういうどうでも良い問題を避けるためにも規約は必要。
定期的に規約を見直すのは必要なことだが、出来ないなら規約はいらないというのは根本が間違っている。

906 :デフォルトの名無しさん:2010/08/01(日) 21:57:00
むしろそろそろスレチなので止めるべき

907 :デフォルトの名無しさん:2010/08/01(日) 22:03:03
バグで客に迷惑かけたら責任を取る、そのレベルw
ぶっちゃけプログラマなんて何の責任もないんだがw
問題起きたらプロジェクトリーダーが全て責任を追わなきゃいけないのは当然だろw
オマエはそのレベルの立場の人間じゃないのか?
規約の見直し作業を仕事に組み込む余裕なんてないから無理だろって言ってるんだけどな。
なんか話がまとまらないしスレチ言われたからもうやめる。

908 :デフォルトの名無しさん:2010/08/01(日) 22:07:56
お前がアホだということはみんなに充分伝わったから安心しろよ

909 :デフォルトの名無しさん:2010/08/01(日) 22:13:32
言っていることめちゃくちゃだな。
規約なきゃプログラマーは好きな機能というか自分の使いやすい機能を使うんだぜ?
その機能のせいでバグが発生したとして、リーダーに責任取れと?
そうならんように規約で制限したりして、確実なコーディングをするようにしているんだろ?
リーダーが機能追加に慎重になったって、規約がないんだからプログラマーが機能追加に慎重になる保証はないじゃないか。
そういう慎重にならないバカなプログラマーが出ないように規約で制限しているといっているんだが。

> ぶっちゃけプログラマなんて何の責任もないんだがw
責任を取らないやつがルール無用で好き勝手しないようにってのが理解できないのかな?

910 :デフォルトの名無しさん:2010/08/01(日) 22:18:43
ルールってのはぶち壊すためにあるんだよ

911 :デフォルトの名無しさん:2010/08/01(日) 22:18:45
仕事してたらたまにいるだろ、バカプログラマーって。
一応戦力なんだが、すき放題やらせたら周りに悪影響が及ぶから
そういうのを未然に防ぐためにはある程度規約が必要

912 :デフォルトの名無しさん:2010/08/01(日) 22:27:08
>>910
アニキかっけーっす!
マジリスペクトっす!

913 :デフォルトの名無しさん:2010/08/01(日) 22:28:05
ちょっと我慢出来ない。
規約がいらないと言ってるんじゃなくて、機能を制限するような規約がいらないと
言っている。
文盲共そこを間違えるな><
要は良い機能があったとき使わせてくれる環境にしろと言ってんだよ。
そのときに慎重になるべきでリーダーレベルで責任をとれと言ってるんだ。
俺の文章力のなさは悪いと思うがそういうことだ。

914 :デフォルトの名無しさん:2010/08/01(日) 22:29:32
なんとかとハサミは使いよう …「上の人」はこれができなきゃダメ

コーディング基準は一切なしというのも極論すぎるが
それでモグラ叩きが終わりになると思ってる奴はもっとダメ

915 :デフォルトの名無しさん:2010/08/01(日) 23:13:05
周りが文盲なんじゃなくてお前の文にセンスがないだけだろ。

> 要は良い機能があったとき使わせてくれる環境にしろと言ってんだよ。
それには同意できるが、
> 機能を制限するような規約がいらない
追加する機能がどんな機能で、また追加したことによってどういうメリット、デメリットがあるか。
そういう調査や確認もせずに「利用してしまうプログラマー」がいるから規約として制限している。
本当に良い機能を持ってきて、なぜ追加できないのか、そんな制限取っ払えというのは理解できるが
それが良い機能だとだれが証明してくれるのか。場合によっては重大な欠陥を引き起こさないとも限らない。
他のプログラマーが知らなかったことで、インターフェイスの違いによって誤動作を起こす可能性だってある。
プログラマーの能力の問題ではあるがプロジェクトとして複数の人間でやるのなら協調してやらないとだめだろ。
リーダーに良い機能を紹介説明しても取り合ってもらえないのなら、規約ではなくリーダーを責めろよ。
キミは「良い機能」だけを見て規約で制限することの間違いを説いているが、「悪い機能」も存在していることも忘れてはならない。
客に納品するのに、「良い機能を制限して効率を落とす」のと、「悪い機能を制限して欠陥を取り除く」のを天秤にかけるべき。
基本的には「悪い機能を制限して欠陥を取り除く」を行い、「良い機能を例外として取り扱う(規約上での使用を認める)」というのがベストではないだろうか。

キミは「良い機能を例外として取り扱う(規約上での使用を認める)」ことが出来ないなら、「悪い機能を制限して欠陥を取り除く」こともするべきではないと言っているんだ。
その間違いに気付いて欲しい。


916 :デフォルトの名無しさん:2010/08/01(日) 23:28:39
std::numeric_limitsで任意のビットフィールドの最大値が取れないずお。

917 :デフォルトの名無しさん:2010/08/01(日) 23:28:51
>>915
「悪い機能を制限」したらバグが減るのかい?
どうやって制限違反を検出するの?
制限内の機能を使ってもバグは出るだろう?

918 :デフォルトの名無しさん:2010/08/01(日) 23:29:53
>>886
作ったことは無いけど、空のストリームイテレータなら作れるような気がする

919 :デフォルトの名無しさん:2010/08/01(日) 23:56:42
>>917
原因が特定しにくくなるようなバグを未然に防ぐために規約があるんだ
多少の不便を強いてでも出したくない(特定困難な)バグがあることぐらいわかるだろ

920 :デフォルトの名無しさん:2010/08/01(日) 23:58:36
規約っていうと例えばどんなのかね?

昔オレの会社では例外は禁止とかハンガリアンで書けとかあったなw

921 :デフォルトの名無しさん:2010/08/02(月) 00:03:31
多重継承禁止とか、生配列禁止とか?

922 :デフォルトの名無しさん:2010/08/02(月) 00:04:07
そろそろマ板でやってくんない?

923 :デフォルトの名無しさん:2010/08/02(月) 00:06:42
newとdelete禁止

924 :デフォルトの名無しさん:2010/08/02(月) 00:08:23
>>917
> 「悪い機能を制限」したらバグが減るのかい?
「悪い機能」なんだから、悪い影響を与えるに決まっていると思うが。
> どうやって制限違反を検出するの?
検出できないなら、制限せずに認めてあげるのっておかしいよ。
仕事の怠慢が発見されないなら、それが正当化されるわけではない。
> 制限内の機能を使ってもバグは出るだろう?
ヒューマンエラーなら、制限内かどうかは関係ない。出るときは出るし出ないときは出ない。
機能に依存したバグ(その機能が内在しているバグ)なら、その機能の使用を改めるべき。

何度も言うが、制限するのは「規約にない機能だから」ではない。
一律に制限するのは「悪い機能の可能性がある」から。
それが良い機能だといえるならリーダーに掛け合えば良い。
それでも利用できないならそれはリーダーの問題であって規約の有無は関係ない。
リーダーに決定権がないなら、決定権のある者の問題だな。

925 :デフォルトの名無しさん:2010/08/02(月) 00:12:59
>>924
> 機能に依存したバグ(その機能が内在しているバグ)なら、その機能の使用を改めるべき。
たとえば何のことを言ってるの?

検出もできない、制限したってバグは出る。それなら余計な文書やリーダーに掛け合うだのいう
手間が増えてるだけじゃないか?

全部まとめてバグ出さなけりゃいいんだろ?

926 :デフォルトの名無しさん:2010/08/02(月) 00:21:14
バグが無いことを証明するのは不可能なんて話もありましたね

927 :デフォルトの名無しさん:2010/08/02(月) 00:26:37
多重継承や生配列の現場視点での議論はここのネタだろ、マ板でなく

928 :デフォルトの名無しさん:2010/08/02(月) 00:28:16
動けば良いんでしょは動かなかった時に全員共倒れするから仕事では通用しない

929 :デフォルトの名無しさん:2010/08/02(月) 00:32:16
本当に実用的なら「基本的にはダメだけど、こういう使い方に限ってはOK」とかやるよな
別に効率悪くするために規約つくってるわけじゃないし
「そんなコーディングしたらミスがでやすいですよ」っていう先人のアドバイスだと思う

930 :デフォルトの名無しさん:2010/08/02(月) 00:36:06
>>925
> たとえば何のことを言ってるの?
>>917 の「制限内の機能を使って出たバグ」でその機能に内在しているバグのこと。
実際にあるかどうかは分からないが、そもそも話自体が抽象化したものなんだから具体例を挙げることは出来ない。
もし、そんな機能はないというなら、「悪い機能」はないというだけのこと。
が、悪魔の証明は不可能。

> 全部まとめてバグ出さなけりゃいいんだろ?
そんなのは不可能に近い。
というか、作る際にバグが出ないようにするのは間違いではないが、そんなことが出来るなら苦労はしない。

> 検出もできない、制限したってバグは出る。それなら余計な文書やリーダーに掛け合うだのいう手間が増えてるだけじゃないか?
その手間を惜しんで、ひどいバグを作り多大な損失を生むかもしれないというリスクとの天秤。
なんどもいうが、客に出した後、バグが発見されるよりは手間が増えるほうが結果的に労力は少なくて済む。
「余計な文書やリーダーに掛け合うだのいう手間」を惜しむ人間は共同作業はむかないと思う。

931 :デフォルトの名無しさん:2010/08/02(月) 00:36:57
>>928
でも大半の現場はそんなもんじゃね?
スケジュールいっぱいいっぱいだから作り込む時間がなかったりしてさ。
でも約束してるからどうしても作らなきゃいけない状況とかほんと悲惨。

932 :デフォルトの名無しさん:2010/08/02(月) 00:37:54
とりあえずお前ら gets() 禁止な

933 :デフォルトの名無しさん:2010/08/02(月) 00:42:18
大丈夫だよ。
もう名前すら思い出せなくなっている。
ダンディ坂野だっけか。

934 :デフォルトの名無しさん:2010/08/02(月) 00:43:25
あぁ、俺も忘れてたわ。

935 :デフォルトの名無しさん:2010/08/02(月) 00:55:51
>>930
具体例を挙げることは出来ない?
そんな状態なのに、「何らかの」制限をかけて直近の手間を増やしたほうがいいのは確信しているの?
意味がわからん。

936 :デフォルトの名無しさん:2010/08/02(月) 01:05:30
>>935
労力と損失(リスク)との天秤だよ。
そのどちらを取るかということ。
自分なら労力をとる、というだけの話。
そりゃ世の中には直近の労力惜しむ会社もあるだろう。

降水確率の意義って知っているか?
それと似たようなもの。

937 :デフォルトの名無しさん:2010/08/02(月) 01:09:24
>>936
労力とではないだろw
安心とリスクの天秤だろwww

938 :デフォルトの名無しさん:2010/08/02(月) 01:11:29
>>937
「余計な文書やリーダーに掛け合うだのいう手間」->労力
「ひどいバグを作り多大な損失を生む」->損失

939 :デフォルトの名無しさん:2010/08/02(月) 01:11:56
>>936
具体的なリスクとして何を想定してるのか説明してくれないと話にならんな。
まぁスレ違いだし、このまま終わってもいいんだけど。

940 :デフォルトの名無しさん:2010/08/02(月) 01:15:59
>>939
そういう想定が出来ないから、規約なんていらないとか言えちゃうんだよな。

941 :デフォルトの名無しさん:2010/08/02(月) 01:16:06
>>938
新機能を入れるとその2つが出るってことだよね。
天秤の使い方がおかしいと思うけどw

942 :デフォルトの名無しさん:2010/08/02(月) 01:18:18
今時規約も作らないで新機能ホイホイ入れちゃうようなバカプロジェクトあんの?

943 :デフォルトの名無しさん:2010/08/02(月) 01:21:39
今時わざわざ規約で縛り付ける前提でC++選ぶようなバカプロジェクトあんの?

944 :デフォルトの名無しさん:2010/08/02(月) 01:27:05
規約で縛り付ける(笑)
C++関係ないし何を言ってるのか。

945 :デフォルトの名無しさん:2010/08/02(月) 01:29:07
>>941
元は規約の話だろ。
規約による制限があるかないか。
その制限を超えるための労力 <-> 制限無しで使わせ発生する損失

つーかそんなことも分からないのか?

946 :デフォルトの名無しさん:2010/08/02(月) 01:30:47
とりあえずC++限定でいいから制限する機能の具体例を挙げてくれよ。
何のつもりでしゃべってるのかさっぱりわからん。

947 :デフォルトの名無しさん:2010/08/02(月) 01:32:20
ルールを決めてコーディングするなんて当たり前のことなのに
こんなシンプルな事がわからない輩がいるのかよ。

何が新しい機能を縛ることによる損失じゃあ

948 :デフォルトの名無しさん:2010/08/02(月) 01:33:29
>>946
お前馬鹿だな

949 :デフォルトの名無しさん:2010/08/02(月) 01:40:08
機能追加なんて新技術の出現に伴って考えることが多いだろう。
そのときに柔軟に対応してくれるといいよね。

950 :デフォルトの名無しさん:2010/08/02(月) 02:00:23
>>927
確かにそうだね
でもこの議論から(10年前にはその議論は終わっているという意見は置いといて)多重継承の使用の是非に関して結論は得られるか?
というと、多重継承に関して "何がよくて何がよくないのか?" とか "代替手段はなにがあるのか?" とかっていう議論を行うには
そのための下地の構築に失敗してるように見える

下地の無いままわいわいやってもいいけど、何も得られないんじゃないかな?
それに "下地の無いままわいわいやる" 用の板が隣にあるんだからそっちに移動したらいいと思う
まぁVIPとかに移動してもらってもいいけど

951 :デフォルトの名無しさん:2010/08/02(月) 02:14:44
export とか例外仕様のことなのかな?

952 :デフォルトの名無しさん:2010/08/02(月) 02:56:16
exportと例外仕様はC++0xで非推奨になるから使用禁止でいいだろう。
そもそもコンパイラが対応していなければ使いようがないが。
多重継承に関してはデータメンバを持たないインタフェースクラス以外の
多重継承は禁止でいいのでは?


953 :デフォルトの名無しさん:2010/08/02(月) 08:20:31
テンプレート禁止

954 :デフォルトの名無しさん:2010/08/02(月) 11:23:59
制限することで問題を解決するなんて実にナンセンスだ

955 :デフォルトの名無しさん:2010/08/02(月) 11:43:34
例外仕様ってthrow()に限っては有用な気がしてるんだけど、どうなの

956 :732:2010/08/02(月) 13:59:57
throw() に限り noexcept 指定とシグネチャを同じに扱うとか、一応便宜は図られてるっぽい。

957 :デフォルトの名無しさん:2010/08/02(月) 14:35:23
質問です。

template<class T, class U> U func(T x);

のような関数を作りたいのですが、このままでは

Foo x;
Bar y = func<Foo, Bar>(x);

のような書き方をしなければなりません。
templateパラメータUを引数から推測させ

Foo x;
Bar y = func<Bar>(x);

とするためにはどう記述すれば良いのでしょうか。

958 :デフォルトの名無しさん:2010/08/02(月) 14:43:16
>>956
おお、そんなキーワードが追加される予定なの?
その中ではnoexceptなメソッドのみしか呼び出せないとかできるとよりよいな。constメソッドみたいに。

959 :デフォルトの名無しさん:2010/08/02(月) 14:49:57
>>957

template<class U, class T> U func(T x);

960 :デフォルトの名無しさん:2010/08/02(月) 14:53:52
このスレはレベルが高くてついてけないよ

961 :デフォルトの名無しさん:2010/08/02(月) 15:30:24
>>959
ありがとうございます!

962 :デフォルトの名無しさん:2010/08/02(月) 19:18:29
後ろは省略可能なの?

963 :デフォルトの名無しさん:2010/08/02(月) 20:47:05
引数から推論されるんでね?

964 :デフォルトの名無しさん:2010/08/02(月) 21:18:44
元の質問者ではないのですが、これって
class U, class T の順番変わっただけだと思うのですが
これでよくなるのはどういうルールがあるのでしょうか

965 :デフォルトの名無しさん:2010/08/02(月) 21:35:26
テンプレートのことが分かってないんだったらもう一回勉強しなおすことをオススメする
理解するまで大して時間がかかる問題でもないし

966 :デフォルトの名無しさん:2010/08/02(月) 21:36:56
>テンプレートのことが分かってないんだったらもう一回勉強しなおすことをオススメする

相談室の意味ねぇ!

967 :デフォルトの名無しさん:2010/08/02(月) 21:38:11
だから自分で調べたほうがいいという答えを教えたんだよw

968 :デフォルトの名無しさん:2010/08/02(月) 21:38:47
全部の質問それで終わるだろ!

969 :デフォルトの名無しさん:2010/08/02(月) 21:40:59
語るに足る問題じゃないんだもんw
調べればすぐ分かる問題は自分で調べろよ。
その習慣をまず身につけてからの相談室だ。
こんなこと言ってる時間あればもう理解できると思うが。

970 :デフォルトの名無しさん:2010/08/02(月) 21:42:13
お前が簡潔に説明できないだけだろがクズいいわけしてんな

971 :デフォルトの名無しさん:2010/08/02(月) 21:42:55
もういいよ、呆れてものも言えないw

972 :デフォルトの名無しさん:2010/08/02(月) 21:43:42
やめて私のために争わないでwwwwwww

973 :デフォルトの名無しさん:2010/08/02(月) 21:57:46
にちゃんではよくあること

974 :デフォルトの名無しさん:2010/08/02(月) 22:13:13
ある出来上がったアプリケーションのコードにconstを付けてもコンパイルできるところ全てに付けたら物凄い数になった。
何も指定しない方のデフォルトをconstにした方がいいレベルだぞ

975 :デフォルトの名無しさん:2010/08/02(月) 22:15:40
const char* const p974 = "aho";

976 :デフォルトの名無しさん:2010/08/02(月) 22:19:51
> 何も指定しない方のデフォルトをconstにした方がいいレベルだぞ

struct をデフォルト public にせにゃならんようなのと同じしがらみだな

977 :デフォルトの名無しさん:2010/08/02(月) 22:31:35
モタモタしてたD言語が全部悪い

978 :デフォルトの名無しさん:2010/08/02(月) 23:05:13
Hogeクラスのデータメンバ
int array[]

にアクセスするのに以下の関数を用意しましたが、コンパイルが通りません。

const int& Hoge::at( const int pos ) const{
 return array[pos];
}

int& Hoge::at( const int pos ){
 retrun static_cast<int&>( static_cast<const Hoge*>(this)->at(pos) );
}

どこが間違っているのしょうか?

979 :デフォルトの名無しさん:2010/08/02(月) 23:08:21
int& Hoge::at( const int pos ){
 retrun array[pos];
}
でいいだろ。


980 :978:2010/08/02(月) 23:48:48
>>979
>>978はあくまでも例です。

実際は const int& Hoge::at( const int pos ) const
で色々処理をしてから return をしています。

その処理部分は int& Hoge::at( const int pos ) と共通ですので
非cont関数からconst関数を呼ぶようにしたいと思いました。

981 :デフォルトの名無しさん:2010/08/02(月) 23:56:02
>>978
static_cast -> const_cast

982 :デフォルトの名無しさん:2010/08/03(火) 00:12:19
>>981
const_cast -> const_const

983 :デフォルトの名無しさん:2010/08/03(火) 07:47:55
>>958
そういうチェック機能は規格には入ってないよ。できて警告どまり。
これも昔の const と似た状態なんだけどね。

984 :デフォルトの名無しさん:2010/08/03(火) 21:09:26
(´・ω・`)あつくて精子が全部しにそうだ

985 :デフォルトの名無しさん:2010/08/03(火) 21:56:58
(*´ω`*)

986 :デフォルトの名無しさん:2010/08/04(水) 00:35:51
4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlconv.h(757): warning C4995: 'wcscpy': 名前が避けられた #pragma として記述されています。
4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlconv.h(768): warning C4995: 'wcscat': 名前が避けられた #pragma として記述されています。
4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\cstringt.h(295): warning C4995: 'vsprintf': 名前が避けられた #pragma として記述されています。
4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\cstringt.h(667): warning C4995: 'vswprintf': 名前が避けられた #pragma として記述されています。

こんな警告が出ちゃうんですが修正する方法ありますか?

987 :デフォルトの名無しさん:2010/08/04(水) 01:32:18
それは、VCの警告なのでスレチだと思う

とりあえず、
1.
wcscpy_s wcscat_s vsprintf_s vswprintf_s を使う
2.
可能な限り早く、
(たとえば、stdafx.hの先頭で)
#define _CRT_SECURE_NO_WARNINGS
する

など

988 :デフォルトの名無しさん:2010/08/04(水) 01:36:34
追加

3.
可能な限り早く、
(たとえば、stdafx.hの先頭で)
#pragma warning( disable : 4995 )
する

など

だが、いずれにせよスレ違いだろう

989 :デフォルトの名無しさん:2010/08/04(水) 01:47:47
すいませんVCと勘違いして投稿してしまいました.
ありがとうございます.

990 :デフォルトの名無しさん:2010/08/04(水) 04:39:58
では埋めますね.

991 :デフォルトの名無しさん:2010/08/04(水) 09:41:40
次スレ立つ前に埋めるなボケ

992 :デフォルトの名無しさん:2010/08/04(水) 09:49:31
つまりどういうことです?

993 :デフォルトの名無しさん:2010/08/04(水) 09:52:27
次スレ立てて誘導しろっつーんだカス
その前に埋めるんじゃねえ

994 :デフォルトの名無しさん:2010/08/04(水) 09:53:03
では埋めますね.

995 :デフォルトの名無しさん:2010/08/04(水) 10:06:19
埋め荒らしで通報します

996 :デフォルトの名無しさん:2010/08/04(水) 11:21:18
        ,. -‐- 、
.        //     `ヽ、
.      く. / ,. -―‐- 、', >
.      |/ヘ∧/\/レヘ/    __|__ゝ | _|_      |_  ―ー-
.      | | |  O  O ||          |     |   |        |   -ー―-、
.      | | |、  r.┐ ||       / ̄:| ̄\  | __|     __|_       )
.      | | | `ー┴┴ '| |    (_ノ    ヽ l (__ノ ̄ヽ (_ノ  ヽ    /
.      |∧∨ ヽ /.ヘ| |ヽ                                     _
       / | |  ∨  .| | i               ___ ぃ  l__ ぃ        l /
     /  〈 〉    .〈 〉.|、                 /   ノ  |    \  |   | /
.    /  / |`′    Y | `~` ''ー- 、        (        |       /   |/
.    / ./ .|         l  |       ./          \     ノ      ノ   o
   / ./ ̄`ー-−-、.  | .|      /
  .( 二 ) ̄`ー、__  `l .|、     /
/〈, , ,ノ        `ー-|  l、 `ヽ /
.                ( 二 ) 〉 //
.               〈 , , ,}´ //
                    /  //

997 :デフォルトの名無しさん:2010/08/04(水) 11:36:46
次スレ

998 :デフォルトの名無しさん:2010/08/04(水) 11:40:05
誰もいないから1000はもらった

999 :デフォルトの名無しさん:2010/08/04(水) 12:19:10
早く次スレ立てろ

1000 :デフォルトの名無しさん:2010/08/04(水) 12:21:18
(´・ω・`)1000だお

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

217 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)