トップページ⇒tech
1001コメント278KB

C++相談室 part82

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

前スレ
C++相談室 part81
http://pc12.2ch.net/test/read.cgi/tech/1273407971/
0002デフォルトの名無しさん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)に対応。
0003デフォルトの名無しさん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
0004デフォルトの名無しさん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/
0005デフォルトの名無しさん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/
0006デフォルトの名無しさん2010/06/02(水) 21:17:03
>>1乙
0007デフォルトの名無しさん2010/06/02(水) 21:34:29
>>1モツカレー
0008デフォルトの名無しさん2010/06/02(水) 22:36:52
相変わらず洋書と訳書ばっk(ry
0009デフォルトの名無しさん2010/06/02(水) 23:09:03
関数ポインタより関数リファレンスのほうが中の人は最適化しやすいですか?
0010デフォルトの名無しさん2010/06/02(水) 23:34:36
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0011デフォルトの名無しさん2010/06/03(木) 00:11:07
>>10
地鎮祭乙
0012デフォルトの名無しさん2010/06/03(木) 01:00:02
>>10は地鎮祭だったのかww
0013デフォルトの名無しさん2010/06/03(木) 03:27:30
崇り神の格をみて村人の程度を知る。
0014デフォルトの名無しさん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;
にした方が自然言語っぽくて見やすくない?
0015デフォルトの名無しさん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 : ...

条件が変わってる気が・・・。
0016デフォルトの名無しさん2010/06/03(木) 09:56:28
一行一動作に慣れてて、カンマで処理増やすと混乱するなぁ。
ブーリアンはやいよブーリアン。
0017デフォルトの名無しさん2010/06/03(木) 12:21:48
>>9 んなこたーない。
0018デフォルトの名無しさん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
0019デフォルトの名無しさん2010/06/03(木) 12:36:36
>>9
参照にしとけばヌルチェックが省略できるかもね。
0020デフォルトの名無しさん2010/06/03(木) 13:35:36
前にも質問した物ですが。
zipの中のzipの中を探索するライブラリないですか?
解凍をせずに直にzipの中のzipを扱いたいのですが。
0021デフォルトの名無しさん2010/06/03(木) 13:38:09
ファイル名か、ファイルポインタを受け取る部分を、
ファイルの範囲を受け取るように拡張したらいいのですが。自前だと大変です。
0022デフォルトの名無しさん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 と表示される。
規格ではどうか知らないけど。
0023デフォルトの名無しさん2010/06/03(木) 14:23:45
>>22 未定義動作
0024デフォルトの名無しさん2010/06/03(木) 14:35:13
>>14
使ってるぜ
while ( c = fgetc(fp), c != EOF )
0025デフォルトの名無しさん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
みたいな感じで
0026デフォルトの名無しさん2010/06/03(木) 16:09:49
>>22
取り敢えず 8.3.2 -4- 注記に、null参照は well-defined なプログラム中には
存在し得ないとある。
まぁ、機械語に直された後で実行時に存在しないようにするのは無理、
というか不合理だろうね
0027デフォルトの名無しさん2010/06/03(木) 21:26:30
Intel Threading Building Blocksのバージョン3使っているけと゛
同士アクセスが65-70くらいからバグるな。
それ以下だと正しいロックしているが。
これはwindowsのせいか?
0028デフォルトの名無しさん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(); }
0029デフォルトの名無しさん2010/06/03(木) 21:30:50
int *p = 0; ってやった後に *p を参照するのが未定義動作なのか
0030282010/06/03(木) 21:33:32
Thread Safe Template Library
http://en.sourceforge.jp/projects/freshmeat_tstl/

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

0031282010/06/03(木) 21:41:10
Thread Safe Template LibraryはSleep無くすか短くする
とデッドロックになりやすい。
TBBでもなったけど、Sleep(1)を一カ所入れたら平気。
安全度はTBB。
0032デフォルトの名無しさん2010/06/03(木) 21:47:29
スレッドってどういう場面で使うの?
0033デフォルトの名無しさん2010/06/03(木) 21:50:32
複数CPUを動かすとき
HTTP受信が遅いとき
0034デフォルトの名無しさん2010/06/03(木) 22:17:18
Intel Threading Building Blocksはコンパイラを限定されるのがいやだな。
BCCでは動きそうにない。
0035デフォルトの名無しさん2010/06/03(木) 22:52:49
なぜassertはASSERTでないのか。小文字のマクロとか気持ち悪いんですけど
0036デフォルトの名無しさん2010/06/03(木) 23:08:53
>>28
そのコードなら間違いなくWindowsのせい。
http://msdn.microsoft.com/en-us/library/ms687025.aspx
WaitForMultipleObjectsで渡せる個数は最大MAXIMUM_WAIT_OBJECTS個と書いてあるが、
この値は64と定義されている。

ところで、ちゃんと戻り値やGetLastErrorが返す値を見ようよ。
65個以上渡したときには、どっちもエラーを意味する値になっているから。
0037デフォルトの名無しさん2010/06/03(木) 23:16:46
WaitForMultipleObjectsをMAXIMUM_WAIT_OBJECTS個以上に使ってるプログラマのせいだろ
0038デフォルトの名無しさん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(); }
0039デフォルトの名無しさん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(); }
0040デフォルトの名無しさん2010/06/03(木) 23:38:33
ミスった。こっちだった。
WaitForMultipleObjects( k, hd, TRUE, INFINITE);

→

WaitForMultipleObjects( k, &hd[n], TRUE, INFINITE);
0041デフォルトの名無しさん2010/06/04(金) 04:55:57
codepad使えよ・・・
0042デフォルトの名無しさん2010/06/04(金) 13:13:35
http://ideone.com/aBipc
0043デフォルトの名無しさん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
というエラーが出てきます。
どうしたら良いのでしょうか?
0044デフォルトの名無しさん2010/06/04(金) 17:11:25
>>43
なんで引数が二つなの?
一つは自分自身でしょ
0045デフォルトの名無しさん2010/06/04(金) 17:17:16
>>43 組み込み型の演算は再定義できないよ。 少なくとも一つのユーザ定義型が必要。
0046デフォルトの名無しさん2010/06/04(金) 18:50:13
組み込みのオペレータ定義できないのはちょっと残念な仕様だよね
namespace内のみ定義可能で、ローカルスコープでusingした時のみオーバーロド可能とかなら良かったのに
0047デフォルトの名無しさん2010/06/04(金) 21:20:42
関数をインラインにする時の目安ってどんな感じにしてますか?
ヘッダのクラス定義の中に書いちゃいますか?
0048デフォルトの名無しさん2010/06/04(金) 21:27:15
inlineの目安は10行以内とはよく言うけど、それってかなりたくさんinlineになっちゃうよね
0049デフォルトの名無しさん2010/06/04(金) 21:38:08
それ大して意味ないから書かない方が良いよ
異なる箇所から頻繁に呼ばれる関数が多所に分散することで遅くなることもある。
0050デフォルトの名無しさん2010/06/04(金) 21:39:47
へぇ難しいなぁ
0051デフォルトの名無しさん2010/06/04(金) 21:41:41
20カ所くらいに埋め込むより、
唯一の関数がレジスタとかにある方が速い。
片っ端に付けまくるとそういった高速アクセスが出来なくなるから遅くなる。
コンパイル時のオプションや実測後に変更すればいい。
はじめから付けると損。
0052デフォルトの名無しさん2010/06/04(金) 21:49:30
俺は何行でも全部インラインだぜ!
たまにpimpl
0053デフォルトの名無しさん2010/06/04(金) 21:50:59
めんどいので-O2に任せる
0054デフォルトの名無しさん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よりもシステム全体の速度を円滑に管理できます。

0055デフォルトの名無しさん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
0056デフォルトの名無しさん2010/06/04(金) 22:04:09
フーン
0057デフォルトの名無しさん2010/06/04(金) 22:04:33
ベンチマークかよ。
ボタン押してから画面に結果が表示されるまでのレスポンスがそんなに変わんのかよ
0058デフォルトの名無しさん2010/06/04(金) 22:08:11
L1キャッシュだのお前はOSのカーネルでも作ってんのかよと
0059デフォルトの名無しさん2010/06/04(金) 22:10:30
複数箇所から呼ばれる関数は付けない方が速いことが多い。
埋め込みで効果あるのは、使われるところが一緒のみの場合。
コードの見やすさの為に関数化した場合だけ有効。
0060デフォルトの名無しさん2010/06/04(金) 22:10:57
通常の関数にinline指定子つけることはまずないかな
以前は小物にはつけるようにしてたけど、ライブラリで間に合う事が多いから
そういったものを自分で定義することがなくなった
メンバ関数のインラインは通常1行で最大3行くらい。主にアクセッサ。
ただアクセッサを用意する設計はなるべく避けてるのであまり定義することはない

割と初学者やJavaやC#から流れてきた人ほどインラインしたがると思うんだけど偏見かなw
0061デフォルトの名無しさん2010/06/04(金) 22:13:25
swapとか代入とか

templateクラスのメンバとかどうすんべ
0062デフォルトの名無しさん2010/06/04(金) 22:13:54
ある程度、プログラム経験あれば
最終的なコードサイズが小さい方が速いことは気づくはずだが。
L1でもL2でもメモリでも速い方に収まっていた方が良いに決まってるが。
0063デフォルトの名無しさん2010/06/04(金) 22:17:52
ただのベンチマーク厨か
0064デフォルトの名無しさん2010/06/04(金) 22:20:43
JavaやC#など、ハードと密着してない言語だと埋め込んだ方が速いかもね。
C++だとまず遅くなるがな。
メモリに読みに行くより、関数コールと復帰のコストが高い場合。
C++、アセンブラだとそう複雑な手続き無いから、メモリ読む方が遅い。
0065デフォルトの名無しさん2010/06/04(金) 22:35:25
>>62
> 最終的なコードサイズが小さい方が速いことは気づくはずだが。

コードサイズは全く考えず、コードの読みやすさ・保守性だけ考えてます。速さなんぞ二の次
0066デフォルトの名無しさん2010/06/04(金) 22:39:09
シンプルは速いよ
0067デフォルトの名無しさん2010/06/04(金) 23:52:31
シンプルなヤツ程強いって承太郎が言ってた
0068デフォルトの名無しさん2010/06/05(土) 00:34:53
C/C++言語、アセンブラはやるべきではないな。
これは蓄積・経験がないとプログラム出来ないようになっている。
経験少ないやつは太刀打ちできない仕組みになっている。
速度を求めるために書き換えるなら良いが。
第一言語にすべきではない。
0069デフォルトの名無しさん2010/06/05(土) 00:37:02
C++勉強中のつやつにいいやつ教えてやるぜ。
PHP、C#、HSP。
これだけあれば事足りる。
C言語より生産性は、10倍はいいな。
C言語で1ソフト開発している間に10個は出来る。
0070デフォルトの名無しさん2010/06/05(土) 01:02:15
>>69
でも10倍遅かったりバグったりしたら元も子もないよね
0071デフォルトの名無しさん2010/06/05(土) 01:05:41
>>70
10倍遅いくらいなら全然許容範囲。
むしろ、プログラムがシンプルになるのでバグが減る。
0072デフォルトの名無しさん2010/06/05(土) 01:07:45
>>71
なるほど。
では10倍が許容できない要件の場合はどうするの?
0073デフォルトの名無しさん2010/06/05(土) 01:13:00
roadsendPHP

これつかっとけ。PHP -> C言語 -> バイナリ
とコンパイルするコンパイラ。
速度はうまくやればC言語と変わらない。
0074デフォルトの名無しさん2010/06/05(土) 01:14:33
ほぇ〜。そんなのあるんだ。
使わないけど。
0075デフォルトの名無しさん2010/06/05(土) 03:15:28
C#をネイティブ化さえできれば。
GUI中心にC++を捨て去れると思うが
0076デフォルトの名無しさん2010/06/05(土) 03:29:55
ネイティブじゃないからあんなに高機能なんじゃないの?
0077デフォルトの名無しさん2010/06/05(土) 03:39:49
実行前には、ネイティブ化しているわけだが。
ただし配布できる形にはなっていない。
0078デフォルトの名無しさん2010/06/05(土) 03:41:55
windowsディレクトリにコンパイルされたイメージが入っているが。
単体のexeではなくて持ち運びが出来ない。
0079デフォルトの名無しさん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());
}

}


}
0080デフォルトの名無しさん2010/06/05(土) 04:51:32
みなさんの意見を聞きたいのですが、
http://codepad.org/txrScMGg
上記のように、グローバルな位置にenumを置くのはタブーなのでしょうか?
それとも、あっても障害にはならないからどうでもいいのでしょうか?
0081792010/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
これ実行すると二回目以降、ファイルの名前指定すると必ずファイル名が違います言われるんです……何が悪いんでしょう
0082デフォルトの名無しさん2010/06/05(土) 05:17:38
>>80
unscoped enumは、その宣言されたスコープに、名前を導入するから、
その例のように、グローバル名前空間で、あまりにも簡単すぎる名前だと、
何かと面倒だな。

C++0xから導入される、scoped enumでは、そういう問題もなくなる。
0083デフォルトの名無しさん2010/06/05(土) 05:45:27
>>81
inFile.close(); してないから。
0084デフォルトの名無しさん2010/06/05(土) 06:14:24
>>81
違うなら、(中略・各種データ操作)の中にカレントディレクトリを変更する操作があるとか。
0085デフォルトの名無しさん2010/06/05(土) 06:41:37
C++と他の言語比べて嬉しいのってエラー修正しやすいところだと思う
0086デフォルトの名無しさん2010/06/05(土) 06:42:25
>>83
最後のinFile.clearの後にinFile.close()入れても上手くいかないです・・

>>84
いや、txtから数列読み取って計算とかするだけでディレクトリ移動とかはしないです
0087792010/06/05(土) 06:58:45
100%まったく関係ないところを修正してからrunしなおしたら上手くいくようになりました
(coutいくつか追加しただけ)
セーブせずにrunしたわけでもないのになんでよ。訳わからん

お騒がせしました・・・・
0088デフォルトの名無しさん2010/06/05(土) 07:10:50
100%無関係なら、そこがバグの原因じゃないわけだから、いつか再発するかもね。
0089デフォルトの名無しさん2010/06/05(土) 07:15:18
>>87
> 100%まったく関係ないところを修正してからrunしなおしたら上手くいくようになりました
あるあるwwww

0090デフォルトの名無しさん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しないとメモリリークが発生するのでしょうか?
0091デフォルトの名無しさん2010/06/07(月) 03:52:18
環境依存の内容はスレ違い。
0092デフォルトの名無しさん2010/06/07(月) 08:09:42
ありがとうございました(´・ω・`)
0093デフォルトの名無しさん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__・・・みたいな感じで
0094デフォルトの名無しさん2010/06/07(月) 09:22:30
>>93
局所的なやつはちゃんと #undef する。局所的じゃないやつはライブラリ名とか含めた
プリフィックス付きにする。これで問題ないだろ。
0095デフォルトの名無しさん2010/06/07(月) 09:53:36
ど忘れしてしまった……
setw(X)中に string + int + string を表示させるのってどうやるんだっけか
まぁ具体的には表示の番号割り振りで"[" int "]" みたいな修飾したいだけなんだけど
0096デフォルトの名無しさん2010/06/07(月) 11:22:55
>>95
setw()とやらの仕様は知らんが、文字列と数値を連結したいのならsprintf()かstringstreamかboost::format辺りではどうか。
# lexical_castでもできるか。
0097デフォルトの名無しさん2010/06/07(月) 13:16:09
setw(20)で20文字分のスペースを確保じゃなかったっけ?
「cout << setw (15) << "etcetc" << "blah"<<endl;」 すると
「etcetc_________blah」
になるみたいな。 解ると思うけどアンダーバーは空白でヨロ。
0098デフォルトの名無しさん2010/06/07(月) 13:17:40
つーかsetw(X)でX文字分のスペース、か。
違う数字を同じ例内で使うとかどんだけだ俺。
0099デフォルトの名無しさん2010/06/07(月) 13:27:24
言いたいことは判ったが説明が下手だな。先ずは入力と出力をはっきりさせろ。
0100デフォルトの名無しさん2010/06/08(火) 19:18:56
Cでerrnoを文字列で出力するのはperrorだけど
C++では何使えばいいの?なんとなくstdio.hはインクルードしたくないんだけど
0101デフォルトの名無しさん2010/06/08(火) 19:28:03
cstdio
■ このスレッドは過去ログ倉庫に格納されています