スレを勃てるまでもな ..
619:616
09/06/03 23:42:47
>>617
なるほど!
1つの文しかないときは{}を省略できるってのは、
条件式が1つの場合、って解釈してたんですが
printfも何もかも含むんですね!わかりやすい説明ありがとうございます
620:616
09/06/03 23:44:20
>>618
ありがとうございます!
621:デフォルトの名無しさん
09/06/03 23:44:21
関数で値渡しをするときに配列の要素全てを渡すことは出来ますか?
それともそれぞれ引数に指定しないとダメでしょうか
622:デフォルトの名無しさん
09/06/03 23:47:37
;が文の終わり。日本語の句点のような存在。
だからsum += n;で1つの文。
{}はその例外で、囲った部分全体で1つの文になる。 すまん話し過ぎたか。
623:デフォルトの名無しさん
09/06/03 23:51:15
>>621
C++ なら vector を使えばいいです。
Cでは直接配列を値渡しすることはできないので、
構造体の中に入れて、構造体を値渡ししましょう。
624:デフォルトの名無しさん
09/06/03 23:56:06
>>623
アリガトゴザイマす
625:デフォルトの名無しさん
09/06/04 04:23:23
初心者です。
Cの参考書でメモリ関連の事が良く出てきます。
バイトとかビットとか2進数、10進数とか出てきますけど、これらはスルーしても
良いんでしょうか?
HTMLで例えるなら#ffffffみたいな感だったので・・・。
これは覚えたほうがいいんでしょうか。
わけわからないんですが
626:デフォルトの名無しさん
09/06/04 04:54:02
スルーしちゃらめぇ。
627:デフォルトの名無しさん
09/06/04 06:24:57
>>625
C言語はそう言うのを扱うのが醍醐味というか、
それが分からないと全然まともに使えないと思われる。
理系なら分かるでしょ?がんばれ!
628:デフォルトの名無しさん
09/06/04 07:46:11
授業で言うなら、最初の3回くらいまでは知らなくてもなんとかなりそうな気はするけど
せいぜいそれくらいだよなあ。
629:デフォルトの名無しさん
09/06/04 17:39:26
C++の質問です。
あるクラスの、あるメンバ関数からしか参照されないことが分かっている変数があるとします。
この関数が呼び出されたあとも、変数の内容を保持したい場合は、どのようにするのがスマートでしょうか?
・メンバ変数にする
→ 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
・呼び出し側で変数を用意しておき、引数でその都度渡す
→ 呼び出し側の手間が増える。数が多いとかなり大変。
・staticを付ける
→ オブジェクトごとに個別の値を持てなくなる
630:デフォルトの名無しさん
09/06/04 17:42:17
そのときの変数の性質や役割による。 手間隙とかは関係ない
631:デフォルトの名無しさん
09/06/04 17:50:18
ああごめん、途中で質問を書き直したら
頓珍漢な内容になってました。
以下の3パターン以外に方法はないのでしょうか、で。
思いついた3つのうち、いずれの方法を取るにしても何らかの欠点があるので。
632:デフォルトの名無しさん
09/06/04 17:57:18
制約がないなら好きにすればいい
633:デフォルトの名無しさん
09/06/04 17:58:41
>>629
・メンバ変数にする
→ 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
これがやっぱり一番自然でしょ。
と俺は思う。
いくつあるのかしらないが、そんなに多いならクラス内クラスを作るとかすれば?
634:デフォルトの名無しさん
09/06/04 17:58:43
・関数オブジェクトを用いる。
635:デフォルトの名無しさん
09/06/04 18:08:35
C言語勉強中なんですが、宿題で
「ファイル名を自分で設定しそのファイルに、EOFを行うまで
スペース区切りの二つの整数を何回でも入力できるようにし、
それをファイルに改行して記録しなさい」
というのがあり、
#include <stdio.h>
int main()
{
int a,b;
FILE *fp;
char name[100];
printf("ファイル名を入力してください\n");
scanf("%s",name);
fp=fopen(name,"w");
printf("数値を入力してください\n");
while(scanf("%d %d",&a,&b)!=EOF){
scanf("%d %d",&a,&b);
fprintf(fp,"%d,%d\n",a,b);
}
fclose(fp);
return(0);
}
というプログラムを作ったんですが、なぜか
数値を入力した際に記録される時とされない時があります。。。。
どなたか解決策を教えていただけないでしょうか?
636:デフォルトの名無しさん
09/06/04 18:36:32
スレの皆様に質問です。
8ビットbitmapファイルを読み込み、各ピクセルに演算を加え、別ファイルとして出力するプログラムを作っています。
演算結果をint型の変数ifooに格納し、unsigned char型にキャストしてputしています。
ifooがunsigned char型の範囲外の値の時は、範囲の端の値を代入しています。
//fin,foutのファイル上の位置は適切な場所にあるとする
for (int y=0 ; y<height ; ++y){
for (int x=0 ; x<width ; ++x){
int ifoo = fin.get()*A+B;
if(ifoo<0) ifoo=0;
if(ifoo>255) ifoo=255;
fout.put((unsigned char)ifoo);
++i;
}
//bmpファイルの幅は4の倍数ピクセルとする
}
先輩が組んだプログラムはこれの2倍以上速いのですが、AとBがハードコードされていて
ソースコードは失われ、先輩本人は行方知れずです。。。
そのためA,Bを引数で与えられるように、イチから再作成しています。
1000x1000pxのBMPを一度に数千枚〜数万枚単位で処理するため
このループ部分をもっと高速化したいです。何か良いアイデアは無いでしょうか。
ちなみにこの部分以外に目立ったループ箇所は無いです。
637:デフォルトの名無しさん
09/06/04 18:48:13
>>636
1. ループの中で ファイルIOするのは遅すぎるので、
一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
(全部読み込めないほどメモリが少ないのなら、一部ずつとか)
2. SIMDで複数pixelを同時に処理するか、OpenGL or DirectXのpixelシェーダ書く
638:デフォルトの名無しさん
09/06/04 20:50:01
>>637
早速ありがとうございます。とりあえず1を試してみます。
環境書き忘れて申し訳なかったですが、Windowsのプロンプトから呼ぶプログラムをgccで作っています。
2の手法はVisualStudio等を使って行う方法でしょうか?
そのうち勉強してみたいと思います。
639:デフォルトの名無しさん
09/06/04 20:56:08
>>638
インラインアセンブラ
640:デフォルトの名無しさん
09/06/04 20:57:00
と外部ライブラリ
641:デフォルトの名無しさん
09/06/04 21:17:36
usingを解除することはできますか?
namespace {
using foo::CFoo;
class CBar {
public:
void hoge(CFoo);
};
}
みたいにやってるんですが副作用があるのかどうか気になってます
642:デフォルトの名無しさん
09/06/04 21:21:29
>>638
最近だとインラインアセンブラのほかに<emmintrin.h>なんかの組込関数という手もある。
いずれにせよgccでも使える。
643:デフォルトの名無しさん
09/06/04 21:23:37
まぁまずないとは思うけど最適化オプションの存在は知ってるよね?
644:デフォルトの名無しさん
09/06/04 21:37:23
>>635
while(scanf("%d %d",&a,&b)!=EOF){
fprintf(fp,"%d,%d\n",a,b);
}
としてみるべし
645:デフォルトの名無しさん
09/06/04 21:40:54
デートは家でまったりしたいのですが
女性から見ればNGですか?
646:デフォルトの名無しさん
09/06/04 21:43:37
Rubyを教えてくれるならOK
647:デフォルトの名無しさん
09/06/04 21:43:39
>>645
死ね
648:デフォルトの名無しさん
09/06/04 21:44:20
>>645
誤爆サーセン
649:636
09/06/04 22:05:38
>>639
アセンブラはマイコンで少々やったことがあるので挑戦してみます。
ただ後年に後輩が読めなそうなので、教授が許してくれなそう・・・orn
>>>640
外部ライブラリというと、そういう処理が高速にできる
ライブラリを他から持ってきちゃえということでしょうか?
>>643
恥ずかしながら知らなかったです。
軽くググってみて、とりあえず -O3 をつけて変化を観察することにします。
プログラムを大学に置いてきてしまったので、有意な変化があれば明日報告します。
皆様アドバイス有難う。
650:デフォルトの名無しさん
09/06/04 22:46:58
あと、流行りの並列処理も最近のコア沢山なCPUには効くぞ。
gccならOpenMPが使えるし。
651:636
09/06/05 14:13:30
>ループの中で ファイルIOするのは遅すぎるので
>一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
new で uint8(unsigned char)型の readbuf,writebuf を、int型のcalcbufを確保し
以下のように書き換えたところ、>>636より約6倍も高速化しました。
fin.read((char*)readbuf,width*height);
int i=0;
for( int y=0 ; y<height ; ++y){
for( int x=0 ; x<width ; ++x){
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];
++i;
}
//bmpファイルの幅は4の倍数ピクセルとする
}
}
fout.write((char*)writebuf,width*height);
○vector<uint8> foo でバッファを確保した場合 read()にchar* が渡せないからダメ。
という判断から、バッファはnewで確保しました。
○ループ中の2回のif文をelse if でまとめ、比較演算回数の減少を図りました。
(気休め程度だと思ったので、これ単体の効果は未計測)
「先輩と互角」という目標を軽くクリアし、先輩の倍以上高速なプログラムになりました。
最適化オプション、インラインアセンブラ、並列化等もこれから試してみたいですが
目標クリアしたためとりあえず質問は終了させて頂きます。
スレの皆様ありがとうございました!
652:デフォルトの名無しさん
09/06/05 14:20:51
アセンブラ化は効果なし。
もっとも時間かかるのはディスクアクセス。
Windowsであれば、Noバッファリングで読み込んでみて。
バッファリングありより倍以上の速度になる。
あと、一度にたくさん読み込んでも逆に遅くなる。
100M読み込むより、4Mや2Mずつのほうが速い。
データが仮想メモリ(HDD)に移動してしまう可能性が高い。
自分の環境では4M以上は速度は上がらなかった。
653:デフォルトの名無しさん
09/06/05 14:24:21
ちなみに一度に一斉に書くのも遅くなる。
メモリ不足になるという理由で。
入出力バッファは、1M〜4Mくらいにして、使い回すのが吉。
654:デフォルトの名無しさん
09/06/05 14:27:13
並列化もきっと意味ないだろうなぁ
655:デフォルトの名無しさん
09/06/05 14:27:21
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];
↓
tmp = readbuf[i] * A + b;
if (tmp < 0) tmp = 0;
if (tmp > 255) tmp = 255;
writebuf[i] = (uint8) tmp;
656:デフォルトの名無しさん
09/06/05 14:29:14
2008-04-30 大容量ファイルI/Oの効率について 其の弐
FILE_FLAG_NO_BUFFERING 指定のないReadFile() -赤線-
リニアにアクセス速度が低下していく。大容量ファイルのリードを行うことに対して
Windows の I/O バッファリングアルゴリズムにパフォーマンスバグがあると思われる。
FILE_FLAG_NO_BUFFERING を指定すれば回避できるとはいえ、
コンシューマ市場向けにもTBクラスのストレージが出回ってる昨今、これは致命的な問題だと思う。
FILE_FLAG_NO_BUFFERING 指定のあるReadFile() -緑線-
2GiB の読み込みに概ね12-13秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!!
URLリンク(img.f.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
657:デフォルトの名無しさん
09/06/05 14:34:48
bmpではなくjpgなら、アセンブラ化は効果あるだろけど
bmpはサイズがでかいからな。
処理内容が複雑 (ディスク読み込み時間と比べて速すぎない) なら並列化は効果あるだろけど
単純なものをスレッド化すると、スレッドの呼び出し時間がかかり、余計に鈍くなり得る。
658:デフォルトの名無しさん
09/06/05 19:59:01
implementationは実装と訳せばいいのですか?
659:デフォルトの名無しさん
09/06/05 20:33:17
>>656
バッファリングなしの非同期読み取りだともう少し速くなるのだろうか?
660:デフォルトの名無しさん
09/06/05 21:24:22
>>658
そうです^^
661:658
09/06/05 21:31:46
>>660
ありがとうございます。
662:デフォルトの名無しさん
09/06/06 01:54:30
関数を呼びまくるとスタックオーバーフローを起こします。
スタックを増やす以外にどんな解決方法がありますか?
663:デフォルトの名無しさん
09/06/06 02:01:52
関数オブジェクトをヒープに置く。
664:デフォルトの名無しさん
09/06/06 02:23:44
>>662
再帰呼び出しが原因ならば、アルゴリズムを工夫して再帰が深くならないようにする。
そうでなければ、ローカル変数域を減らす。特にバッファ。
665:デフォルトの名無しさん
09/06/06 05:33:46
配列の要素の組み合わせを出力したいのですが、
実装をどのようにするか迷っています・・・
配列
int array[10] = {0,1,2,3,4,5,6,7,8,9};
出力
{0}, {1}, {2}, {3}... {9}
{0,1}, {0,2}, {0,3}... {8,9}
{0,1,2}, {0,1,3}... {7,8,9}
...
{0,1,2,3,4,5,6,7,8,9}
このような出力を実現するにはどのようにコードを組めば効率が良いでしょうか?
666:デフォルトの名無しさん
09/06/06 05:41:25
ヒント:二重ループ
667:デフォルトの名無しさん
09/06/06 06:29:22
なんだよそのヒントw
>>665は一応実装はできるけど
最適な実装ロジックを聞いてるんでしょ。
668:デフォルトの名無しさん
09/06/06 06:47:20
いや二重ループが一番のヒントだろ
669:デフォルトの名無しさん
09/06/06 07:25:49
>>665
どういう規則で出力するのかさっぱりわからん。
670:デフォルトの名無しさん
09/06/06 07:37:10
桁ごとに、組み合わせを順番に表示してくんだろw
671:デフォルトの名無しさん
09/06/06 07:56:47
>>665
効率はしらんが、適当に書いてみた
#include <stdio.h>
void combi(int n, int pos, int digit, int *array)
{
int i, j;
if(pos==digit) {
printf("{%d", array[0]);
for(i=1; i<digit; i++) printf(",%d", array[i]);
putchar('}');
} else {
for(i=n; i<=9; i++) {
array[pos] = i;
combi(i+1, pos+1, digit, array);
}}}
int main(void)
{
int i, array[10];
for(i=1; i<=10; i++) combi(0, 0, i, array);
return 0;
}
672:デフォルトの名無しさん
09/06/06 08:23:21
printfのfはformattedのfだと聞いたことがありますが、
そもそもformattedってどういう意味ですか?
辞書を引いてもC/C++に適した訳語が見つからなくて。。。
673:デフォルトの名無しさん
09/06/06 08:30:09
書式に則った
674:デフォルトの名無しさん
09/06/06 08:31:42
>>673
何の書式に則ったってことですか?
自分で指定した"hoge%spi%dyo"だとかそういうことでしょうか?
675:デフォルトの名無しさん
09/06/06 08:34:17
どう考えてもそれしかないと思う。
676:デフォルトの名無しさん
09/06/06 08:38:52
>>675
ありがとうございました。
677:デフォルトの名無しさん
09/06/06 08:45:47
>>665
main()
{
int array[10]={0,1,2,3,4,5,6,7,8,9};
int i,f,set;
for(set=1;set<=0x3ff;set++)
{
putchar('{');
for(i=0,f=0;i<10;i++)
if(set & (1 << i)) {
if(f) putchar(',');
printf("%d", array[i]),f=1;
}
putchar('}');
}
}
678:デフォルトの名無しさん
09/06/06 10:20:23
>>677 これは良いな。出力順序が変わるのを何とかしようと頑張ってみたが俺には無理だった
679:デフォルトの名無しさん
09/06/06 15:57:09
クラス内で動的確保した文字列に、ポインタ渡しでのアクセスは出来ませんか。
680:デフォルトの名無しさん
09/06/06 15:59:10
>>679
できます
681:デフォルトの名無しさん
09/06/06 16:04:03
これができません。なぜでしょうか。
#include <iostream>
#include <string>
using namespace std;
class A {
public: char *ch;
A() { ch=new char [10]; strcpy(ch,"aaa"); }
void test(char *p){ p=ch; } };
main () {
A x; char *p;
x.test(p);
cout<<p;
}
682:デフォルトの名無しさん
09/06/06 16:06:26
自己解決しました。 test(char* &p)にしたら良かったです。
683:デフォルトの名無しさん
09/06/06 16:11:36
char* &pって気持ち悪いなchar*& pがクール
684:デフォルトの名無しさん
09/06/06 16:16:08
いやむしろ、char *&p の方がクール。
理由は宣言構文の仕様上、char が specifier で *&p が declarator だから。
char* p; のように書く人は p と q をポインタにしたいとき
char* p, *q; のように非対称に書いたりするので混乱必至。
っていうか宗教^^
685:デフォルトの名無しさん
09/06/06 16:16:56
それより一引数で参照私の値変更ってのがさ!
686:デフォルトの名無しさん
09/06/06 16:23:07
>>684
> char* p; のように書く人は p と q をポインタにしたいとき
> char* p, *q; のように非対称に書いたりするので混乱必至。
そうでもないよ。俺は普段1行目のように書くけど、2行目のようなケースは
まず第一に「滅多に書かない」し、もし書く時は char *p, *q; って書く。
まぁ、宗教。
687:デフォルトの名無しさん
09/06/06 16:26:38
そもそも*&ってのが気持ち悪い
ダブルポインタのほうがかっこよくない?
まぁ、宗教。
688:デフォルトの名無しさん
09/06/06 16:29:15
Effective C++(第2版)には ** 使うくらいならどうして *& を使わないのかって書いてあるから
*& でいいんじゃない?っていうか、>>681のような質問って時々出てくるけど
その設計にどういうメリットがあるのかしら?
ポインタの管理はクラスの外でやってるし、そもそも内部の詳細を公開しているし・・・
689:デフォルトの名無しさん
09/06/06 16:29:33
創価学会最高!
690:デフォルトの名無しさん
09/06/06 17:09:37
そこまでするならmulti_arrayみたいにラップするわ
691:デフォルトの名無しさん
09/06/06 18:20:00
デバッグしてるときにちょっと気になったんですが
他人の作ったメソッドや関数(例えばSTLやboost)が投げる可能性のある例外を調べる方法は仕様を読む以外ないんでしょうか?
強制的に例外を投げさせるオプションみたいなものがあるんでしょうか?
コンパイラはVC++EE2008を使っています
692:デフォルトの名無しさん
09/06/06 18:27:02
つ grep
693:デフォルトの名無しさん
09/06/06 22:29:11
複文マクロは
do{〜;〜;〜;}while(0)
とすると良いとききました。
しかしこれだと返り値を持たせられないため、関数形式のマクロが書けません。
複文マクロでありながら、返り値を持たせる方法はありませんか?
694:デフォルトの名無しさん
09/06/06 22:34:00
インライン使っとけ。 複雑なマクロつかうよりいい。
エラーがわかりやすい。 実行時間が計測できるなどりメリット。
695:デフォルトの名無しさん
09/06/06 22:34:51
>>694
インライン関数などの知識は十分あるんですが、
どうしても変なマクロが書きたいんです。
マクロでしかできない変な処理なんです。
696:デフォルトの名無しさん
09/06/06 22:46:21
カンマ演算子でなんとかするのはもう考えた?
697:デフォルトの名無しさん
09/06/06 22:48:56
>>696
ありがとうございます。
もう考えてあります。
ただ、try catchブロックを盛り込みたく、それがカンマ演算子に合わせられないのです。。。
そしてマクロでしかできない処理というのは「マクロ引数から#で文字列化する」というような
いわばリフレクション的な処理も含んでいる物だからです。
まあ無くても支障ないのですが、一般化して再利用可能にしておいたら便利かなと思って
変態マクロに挑戦しているところです。
698:デフォルトの名無しさん
09/06/06 22:50:26
引数っぽくすれば
#define FOO(X) do{;;(X)=hoge;}while(0)
699:697
09/06/06 22:55:03
>>698
ありがとうございます。
副作用を持たせるわけですね。
最終手段として考慮します。
しかし当面はもうちょっと挑戦してみます。
返り値はbool型になる予定でして、疑似関数の形の方が分かりやすいので。
関数テンプレートや文字列結合演算子、無名構造体など、
もちえる言語仕様の知識をフル活用してみます。
700:デフォルトの名無しさん
09/06/06 23:20:30
void func(float a[]){
int size=sizeof(a)/sizeof(float);
}
これでsizeに配列aの個数が入ると思ったのに1になる。何で?
701:デフォルトの名無しさん
09/06/06 23:31:22
aはfloatへのポインタに変わったから
702:デフォルトの名無しさん
09/06/06 23:31:55
サイズが分からないから
void func(float a[10]){
とかにすれば10って出るはず
703:デフォルトの名無しさん
09/06/06 23:34:47
void func(float a[]){
としても
void func(float *a){
となるから
>>702
なんねーよばか
704:デフォルトの名無しさん
09/06/06 23:35:53
ありがとう。float[10]ってしないと駄目なのか
でもそれだとint size=10;ってすることと一緒だから意味無いよね
受け取った配列の数によって処理を変えたいんですがどうすればいいですか?
705:デフォルトの名無しさん
09/06/06 23:38:08
それこそマクロっぽくするべき
#define func(x) func_(sizeof(x)/sizeof(float))
void func_(unsigned size);
706:デフォルトの名無しさん
09/06/06 23:39:11
>>704
二引数にして大きさを渡すする
ものすごい馬鹿みたいに思うかもしれんが
memsetやらfreadやらあるように領域の大きさを渡すのは普通
707:デフォルトの名無しさん
09/06/06 23:39:19
void func(float *a, size_t n) { }
#define numberof(array) (sizeof(array)/sizeof(array[0]))
float foo[10];
func(foo, numberof(foo));
708:デフォルトの名無しさん
09/06/06 23:48:33
ありがとうございます。サイズを引数として受け取るしかないんですね
当たり前なんだろうけど、これにはちょっとびっくり。
普通に分かるものだとばかり思ってた
709:デフォルトの名無しさん
09/06/07 00:27:30
商業ソフトだとメモリ確保とかでガチガチにtry catchするんでしょうか?
710:デフォルトの名無しさん
09/06/07 01:10:01
メモリ確保失敗はアプリレベルではどうにもならないからOSに例外投げてしまう。
という考え方もある。
711:デフォルトの名無しさん
09/06/07 01:14:08
限界になる前に、そろそろメモリが足りません言い出すソフトもあるなぁ・・・・
712:デフォルトの名無しさん
09/06/07 02:22:58
OSに例外投げたらどうなるんだ?つか、そんなことできるのか?
713:デフォルトの名無しさん
09/06/07 02:57:00
他人のソースコードを読んでいってもさっぱり頭に入ってきません。
何かソースコードを読む際のポイントとかあるんでしょうか。
714:デフォルトの名無しさん
09/06/07 03:00:11
コメントを読んだり、
読んでる関数の中身までは読まずに、大まかな流れを先に確認する。
715:デフォルトの名無しさん
09/06/07 03:37:32
>>713
doxygen(Graphviz)で関係のグラフ化オヌヌメ
716:デフォルトの名無しさん
09/06/07 10:54:46
テンプレートの型を一部の型に限定したい(たとえばunsignedの各種整数型のみ)場合は
template<typename T> class HOGE;
template<> class HOGE<unsigned char> {...;};
template<> class HOGE<unsigned short> {...;};
template<> class HOGE<unsigned long> {...;};
template<> class HOGE<unsigned int> {...;};
のように本体を書かずに、特殊化のほうをいちいち全部書くしかないんでしょうか?
717:デフォルトの名無しさん
09/06/07 11:53:12
traits
718:デフォルトの名無しさん
09/06/07 12:20:01
C++にて。
同じ副作用を保ったまま、式を文にすることは出来ます。
セミコロンを付ければ良いだけです。
例 x=3ならx=3;とすればよい。
しかし同じ副作用を保ったまま、文を式にすることは出来ますか?
その際の式の値は何だって良いとして。
例 while(flag){++x;} を ???
719:デフォルトの名無しさん
09/06/07 12:50:35
>716
class の中身の方は型によって変わらないと仮定して、
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_unsigned.hpp>
template<typename T, typename Enable = void>
class HOGE {};
template<typename T>
class HOGE<T, typename boost::enable_if<boost::is_unsigned<T> >::type>
{ // 何か
};
他の型にするなら boost::is_unsigned を適宜変更すれば OK。
型をべた書きするなら↓なんてのも可能。
#include <boost/mpl/set.hpp>
#include <boost/mpl/has_key.hpp>
template<typename T>
class HOGE<T, typename boost::enable_if<
boost::mpl::has_key<
boost::mpl::set<
unsigned int,
unsigned char
>,T> >::type>
{ // 何か
};
中身も変わってくるなら >717 の通り traits でまとめる。
720:デフォルトの名無しさん
09/06/07 13:42:55
>>718
そこを関数にする。
そうすれば関数呼出式になる。
721:718
09/06/07 14:31:24
>>720
あーなるほど。
ありがとうございます。
722:デフォルトの名無しさん
09/06/07 18:39:05
for each 処理を自前で作りたい。
Sentinelを付加する方法でなんかいいアイデアない?
723:デフォルトの名無しさん
09/06/07 18:43:09
CかC++かくらい書け。
もっとも、C++ならSTL使え、だが。
724:デフォルトの名無しさん
09/06/07 18:57:23
もっと洗練されたライブラリが必要だと思うんだ
725:722
09/06/07 19:00:27
STL様 i=begin;while((function(i++),i)<=end); は偽物foreach
i=begin; end+1=eoloop; while(function(i++));
^^^^^^^^^←この部分
726:デフォルトの名無しさん
09/06/07 19:01:00
一応Qt(C++用ライブラリ)にforeachはある
それを参考にしろとは言わんが
727:デフォルトの名無しさん
09/06/07 21:22:20
インターフェースクラスがクールに感じたんだけど、これってなにかマイナス面はある?
今作ってるプログラムをこれ使って大幅に書き換えようかなと思ってるんだけど
728:デフォルトの名無しさん
09/06/07 21:39:06
>>727
ソースコードの量が増える
保守するとき読めればいいが
そんな保証などない
将来性にかけて拡張性に優れた設計にするには
優れた設計能力が必要
後からの変更は1からのやり直し
729:デフォルトの名無しさん
09/06/07 21:48:20
>>727
Qtのこと?
俺もQtの設計は美しいと思ってるし、
いまさらMFCやろうとしてる(まずいないがw)やついたらQtを紹介してる
マイナス面は、以前はGPLだったけどそれも変更になってLGPL
不満といえばdllのサイズぐらいかな?
マルチOSなのもおいしいところ
730:デフォルトの名無しさん
09/06/07 21:56:43
>>725
std::for_eachもいやならBOOST_FOREACHはだめ?
731:デフォルトの名無しさん
09/06/07 22:02:31
>>729
そのインターフェイスじゃないだろ
732:デフォルトの名無しさん
09/06/07 22:11:32
QtってGUI専用だと勝手に思っていたが、
GUI以外の事も出来るの?
733:デフォルトの名無しさん
09/06/07 22:18:02
>Qt
何故か俺の中で、
フジコフジオのイメージが払拭できない
734:デフォルトの名無しさん
09/06/07 22:21:55
>>732
コンテナ、ネットワーク、XML、データベースとか一通り
機能制限はあるが組込み向けやXサーバーなしでもGUIが使えたり
735:732
09/06/07 22:24:51
>>734
すげーー
マジかよ。
LGPLだと商用利用はしんどいか?
Staticリンクしちゃうとオープンソース強制だっけ?
736:デフォルトの名無しさん
09/06/07 22:55:36
>>735
LGPLだと静的リンクはアウトだね
動的リンクなら商用非公開おk
737:デフォルトの名無しさん
09/06/07 23:03:14
LGPLだと、リバースエンジニアリングの拒否の禁止かな。
738:732
09/06/07 23:06:54
リバースエンジニアリングはどうせされるんだろうし
そんなの禁止しても意味ないだろうけど・・・。
>動的リンクなら商用非公開おk
これはつまりDLLを付属させて配れってこと?
739:デフォルトの名無しさん
09/06/07 23:14:11
>>735
強制じゃないけど
staticリンクでその条件を満たすのはかなりしんどい
740:デフォルトの名無しさん
09/06/07 23:14:53
>>738
そうだよ配っていいんだよ
741:デフォルトの名無しさん
09/06/07 23:28:13
ってことは
「QtのDLLを付属させてスタティックリンクしないようにするかぎり」
無償でクローズドソースの商用利用が可能
ということか。
Qtいいな。
…ちょっと考えてみようかな。
742:デフォルトの名無しさん
09/06/08 02:12:57
>>715
分かりやすい解説サイト教えてください
743:デフォルトの名無しさん
09/06/08 02:20:00
>>742
ggrks
相当前からあるソフトで、情報も腐るほどあるぞ
ちなみにそのウィザードもQtでできてる
744:デフォルトの名無しさん
09/06/08 03:44:59
C++のテンプレートについて教えて
クラスとどう違うんだ?
745:デフォルトの名無しさん
09/06/08 03:49:36
次元が違う
746:デフォルトの名無しさん
09/06/08 04:18:25
違いすぎて逆に説明が困難だな。
747:デフォルトの名無しさん
09/06/08 04:19:38
訂正
C++のテンプレートについて教えて
やっぱクラスとの違いじゃなくてどういう時に使うのか
どんなニーズによってできたのか教えて
748:デフォルトの名無しさん
09/06/08 04:27:42
型が違うだけで同じような処理を何回も書かないで済むように
749:デフォルトの名無しさん
09/06/08 06:46:52
今年女子大に入ったばかりのゆきこと言います。
C++を学びたいのですが、どの本がお薦めでしょうか?
750:デフォルトの名無しさん
09/06/08 06:47:04
>>744
天と地ほど違うと思うけど。
[タイヤキを作るための金属の鋳型]
と
[食べられるタイヤキ]
の違い。ぜんっぜん違う。
751:デフォルトの名無しさん
09/06/08 06:56:11
>>742
このスレに行け。
【コメント】doxygen【コンソメ】
スレリンク(tech板)
オススメは以下。
Graphviz
URLリンク(www.graphviz.org)
doxygenの文字化け対策 - 僻地のプログラマkmt-t - わりとどうでもいい日記 1.1
URLリンク(d.hatena.ne.jp)
Let’s use doxygen!
URLリンク(www.fides.dti.ne.jp)
無題ドキュメント
URLリンク(www.sat.t.u-tokyo.ac.jp)
SourceForge.net: sakura-editor ≫ DoxygenComment
URLリンク(sakura-editor.wiki.sourceforge.net)
Doxygenマニュアル
URLリンク(www.doxygen.jp)
Doxygen公式
URLリンク(www.doxygen.jp)
752:デフォルトの名無しさん
09/06/08 10:12:17
>>750
それクラスとインスタンスの違いでなくて?
テンプレートはその鋳型を付け替えるとタコ焼にも今川焼きにもなる台とか
753:デフォルトの名無しさん
09/06/08 11:03:19
型チェックしてくれるマクロとでも思えば。
754:デフォルトの名無しさん
09/06/08 12:56:01
なんだかtemplateってbindに似てるね
755:デフォルトの名無しさん
09/06/08 13:03:26
コンストラクタの引数の値によって、データメンバの型を変える方法ってありますか?
756:デフォルトの名無しさん
09/06/08 13:24:48
>>749
女子供は股開いてればいいんだよ
757:デフォルトの名無しさん
09/06/08 13:34:28
子供もかよ……
758:デフォルトの名無しさん
09/06/08 13:49:24
ぼくおとこのこだよ…
759:デフォルトの名無しさん
09/06/08 13:58:54
>>755
同じ親クラスから継承した子クラスという条件内であれば可能。
もしくは、void*で持たせれば、多分なんでもおkだけど。
760:750
09/06/08 16:12:44
>>752
そうとも言えるな。
なら俺方式で言うなら
クラステンプレート=[タイヤキやら今川焼きやらを作るための金属の鋳型を作るためのナニモノか]
クラス=[タイヤキを作るための金属の鋳型]
インスタンス=[食べられるタイヤキ]
とでも言えばいいかな。
761:デフォルトの名無しさん
09/06/08 16:55:30
喩えなら何とでも言えるわ。
762:デフォルトの名無しさん
09/06/08 17:42:54
名前空間について質問です。
名前空間 foo と、それとは別に名前空間 bar::foo があるとします。
このとき、bar の内側から、bar::fooでは無い方の foo を指定するにはどうしたら良いのでしょうか。
なお、環境はWinXP、C++、VisualStudio2005です。
763:デフォルトの名無しさん
09/06/08 17:46:20
::foo
764:762
09/06/08 17:53:04
すみません、2つ質問するつもりで書いてませんでした。
あるクラス内に、別クラスをメンバ変数として取り込む時、
その別クラスが書かれたヘッダファイルをインクルードするのではなく、
先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?
さて、その別クラスの名前が、名前空間 bar の下にあるとき、
namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?
>>763
ありがとうございます。
なんで思いつかなかったんだろう、自分。
765:デフォルトの名無しさん
09/06/08 18:40:27
便乗質問、テンプレートクラスを持たせる時って同じ方法使えるん?
766:デフォルトの名無しさん
09/06/08 18:48:37
使えるん
767:デフォルトの名無しさん
09/06/08 18:51:59
>>764
あなたのいうクラスに名前が付いていないので
説明の便宜上
あるクラス=MyClass, 別クラス=fooとします。
まずは本題からちょっとそれた話から。
> その別クラスが書かれたヘッダファイルをインクルードするのではなく、
> 先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?
あります。
しかし
> あるクラス内に、別クラスをメンバ変数として取り込む時、
この場合は前方宣言Forward declarationだけでは足りません。
というのも、
class MyClass {int m_num;std::string m_str;foo m_var;}
のようにメンバ変数としてfoo型変数を使いたい場合、
fooが不完全型なのでそのサイズがわからず、したがって
MyClassのために確保すべき領域のサイズもコンパイラには分からないことになるからです。
前方宣言で足りるのはfoo型メンバ変数ではなく
foo型への参照型メンバ変数やfoo型へのポインタ型メンバ変数、
あるいはメンバ関数の戻り値としてfoo型を使用する場合などです。
768:デフォルトの名無しさん
09/06/08 18:54:54
ユーザが入力した数式を処理するプログラムを考えているのですが
cin>>eq;
#define function(x) (eq)
cout<<function(1);
みたいなことができませんんか?もしくは別の方法があったら教えてください
769:767
09/06/08 18:54:56
あとはまあ
前方宣言で足りるのは
メンバ関数の引数の型としてfoo型を使用する場合
や
typedefとかかな。
> さて、その別クラスの名前が、名前空間 bar の下にあるとき、
> namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?
それでいいと思いますが。
class bar::foo;とか書いても無理ですし、それ以外記述できないですよねぇ?
もし有識者がいらしたらそっちを信用してください。
770:767
09/06/08 18:56:45
>>768
意味不明ですが、どういうことですか?
プリプロセッサにより
cin>>eq;
cout<<((eq));//xは無視される
として処理されるだけですが。。。
771:デフォルトの名無しさん
09/06/08 19:01:07
>>770
768に書いたのはあくまでイメージです。言葉足らずですみません
私がしたいことは引数にある文字列を数式として扱いたいのです
もしくはcinで入力した式をプログラムで処理したいのですが
772:デフォルトの名無しさん
09/06/08 19:02:27
ほんとは言語の問題じゃないかもしれないけど教えてください
@double配列と、Aメンバがdoubleいっこだけの構造体の配列を読み上げる速度を比較するための
コードを書いて実行してみたらAのほうが速かったです
環境はItanium、CentOS、GCC(C++)です
これはなぜなんでしょうか?
773:デフォルトの名無しさん
09/06/08 19:04:08
そうなったから
774:767
09/06/08 19:04:19
>>771
言いたいことは分かりました。
C++の知識はどのくらいありますか?
STLやBoost C++はご存じですか?
C言語じゃなくてちゃんとC++らしいコードが書けますか?
775:デフォルトの名無しさん
09/06/08 19:05:31
>>772
不思議だわ。
・・・最適化とかレジスタの割り付けとか、もう不確定要素に押されて結果が揺らいでるだけじゃないか?
つまりどっちで書いても大差ないから好きな方で記述すればよか。
776:デフォルトの名無しさん
09/06/08 19:08:39
>>774
c++は初めて3か月くらいですが、STLはつかったものがあるので
簡単なものなら大丈夫だと思います。
777:デフォルトの名無しさん
09/06/08 19:09:25
>>775
計算時間半分くらいでした
ちなみにこれに気づいたのは構造体メンバのアライメントに関する実験中でした
コンパイラが賢くなりすぎてマニアックな知識も必要ない時代になったんですかねえ・・・
778:デフォルトの名無しさん
09/06/08 19:11:11
普通のポインタがインスタンスを持ってるかどうか判別する方法はありますか?
現状ではポインタのゼロ初期化とdelete・0代入を徹底するぐらいしか手段が思いつきません
779:767
09/06/08 19:11:28
>>776
せっかくSTLの知識の有無を聞いたのですが、STLつかった実例が見つかりませんでした。
とりあえず適当なリンクを張っておきます。
以下の中で、上に挙げられている物の方が
より優れていると思ってください。
letsboost::spirit
URLリンク(www.kmonos.net)
数式解釈プログラム - uPage
URLリンク(www-as.dse.ibaraki.ac.jp)
七行プログラミング
URLリンク(cm.xrea.cc)
LISPですが
記号数式処理
URLリンク(www-antenna.ee.titech.ac.jp)
780:767
09/06/08 19:13:06
追記。
>>776
Spiritで数式を解釈させるなら
boost::spiritっちゃえ!
URLリンク(tamachan.club.kyutech.ac.jp)
C++ Labyrinth
URLリンク(www.fides.dti.ne.jp)
Spirit v1.6
URLリンク(boost.cppll.jp)
これらが有名で質も高いと評判です。
781:デフォルトの名無しさん
09/06/08 19:14:34
>>768
これでイメージが湧いたらそいつは一流のエスパーだwwwww
782:767
09/06/08 19:17:06
>>778
>普通のポインタがインスタンスを持ってるかどうか
有効な領域を指し示しているかどうかとおっしゃりたいものと推測・解釈します。
結論から言えば、
普通のポインタでしたら、そんな方法はありません。
指し示す領域が有効かどうかなぞわかり得ません。
783:768
09/06/08 19:22:56
>>782
いろいろ情報ありがとうございます。
784:764
09/06/08 19:45:30
>>767>>769
ありがとうございます
>宣言
やっぱ namespace bar { class foo; }; って書くしか無さそうですね。
階層が深いとちょっと面倒かな?と思っただけなので、特に問題はありません。
>メンバ変数
確かに、メンバ変数を直接弄ろうとすると前方宣言だけじゃダメですよね。
まあ、素直にアクセサ付けれ、って話ですが。
>>765
確かに、 std::string とかは上記の方法じゃ出来ないですね。
785:デフォルトの名無しさん
09/06/08 20:11:52
C++の関数で文字列を参照渡しする方法がわかりませ
ん &stringだと弾かれたし
786:デフォルトの名無しさん
09/06/08 20:16:09
>>785
参照の記述を勉強してください。
クラス名& ref=参照先;
で記述します。
787:785
09/06/08 20:23:15
参照の書き方って&nと違うの?
788:デフォルトの名無しさん
09/06/08 20:31:10
>>787
まずは日本語から覚えた方がよさそうだな
789:デフォルトの名無しさん
09/06/08 20:33:46
char &string;
って書いてるんだったりして。
790:786
09/06/08 20:36:41
もう らちがあかないので
ソースみせるか、
参照の記述を勉強し直すか、
名前空間を記述するか
せめて少なくとも1つはやってみせてください。
なんかアドレスとごっちゃになってそうな予感もしますね。
791:デフォルトの名無しさん
09/06/08 20:39:25
int func(const char *string)
792:デフォルトの名無しさん
09/06/08 20:40:24
途中送信。>791を参照渡しにする
793:786
09/06/08 21:04:14
>>791
それだけエスパーを強制しすぎです。
適当に答えるなら
//before
int func(const char *string);
const char * const p="mojiretsu";
func(p);
がアドレス渡し(ポインタ渡し)で、
//after
int func(const std::stirng &string);
std::string str="mojiretsu";
int func(str);
が参照渡しです。
せめて前後関係の分かるソースを見せてください。
答える側が書いたソースの方が長いっておかしいです。
794:デフォルトの名無しさん
09/06/08 21:16:08
foo *p = new foo[bar]; delete p;
がまずいのはわかるんだけど
foo *q = new foo; delete [] q;
ってーのはべつにやばくない・・・よね?
795:デフォルトの名無しさん
09/06/08 21:16:58
やばいよ。何が起きても知らないよ。
796:デフォルトの名無しさん
09/06/08 21:17:12
std::stringで書き変えるのは要求を満たしてない気がするなあ。
797:デフォルトの名無しさん
09/06/08 21:19:34
>>794
配列をnewしたときは、その配列のサイズなんかも保持しておくので
配列じゃないのにdelete[]だと、関係ない部分にアクセスする危険性がある……と教わったが、正確には違うかも。
798:786
09/06/08 21:21:37
>>796
彼は
>C++の関数で文字列を参照渡しする方法
と言っています。
別にconst char*型変数を参照渡ししてもいいんですが、
もうエスパーするしかないからわかりませんよ。
799:デフォルトの名無しさん
09/06/08 21:23:02
>>794
だめな理由は処理系によりいろいろあるだろうけど、そんなの関係ない。
「仕様上認められていない」ってだけで
十分に鼻から悪魔が出てくると結論づけられます。
800:デフォルトの名無しさん
09/06/08 21:26:52
C++はめんどくさいな
801:デフォルトの名無しさん
09/06/08 21:36:37
>>800
なにを今更w
802:デフォルトの名無しさん
09/06/08 21:50:39
C++に限らず、多種多様の実装が存在する言語は多かれ少なかれそういう傾向にあると思う。
803:デフォルトの名無しさん
09/06/08 23:34:58
doxygen = デュクシジェン
804:デフォルトの名無しさん
09/06/09 01:06:17
doxygen destroyer
805:デフォルトの名無しさん
09/06/09 04:19:56
>>804
スレリンク(gamedev板:692番)
692 :名前は開発中のものです。:2009/06/09(火) 00:57:34 ID:2fI/sHFo
何言ってんだ。プログラマにまともな精神持った奴がいた試しなんてねえよ。
第一プログラマと精神科なんてほとんどセットなのに今更それを語るとか情弱以下だろ。
806:デフォルトの名無しさん
09/06/09 04:31:40
C言語をやりたいんだけど
Microsoftのc++ExpressEdition
ってのでもできますか?
#include <stdio.h>
int main(void){
printf("aaaa");
return 0;
}
みたいなのもちゃんとできますか?
807:デフォルトの名無しさん
09/06/09 05:09:32
>>806
Microsoft Visual C++ 2008 Express Edition
の事ですね。
可能です。
ですが、最初はコンソールの方が分かりやすいと思いますよ。
C/C++初心者なら
bcc5.5.1+bcc developer
がなかなかオススメ。
エラーメッセージが分かりやすいので。
複雑なテンプレート等、まともなC++をやりたくなったらその時初めて
Microsoft Visual C++ 2008 Express Edition
gcc3.x, gcc4.x
などを試せば良いかと思います。
808:デフォルトの名無しさん
09/06/09 09:17:19
まあ鼻から悪魔が出ることは無いと断言できる
809:デフォルトの名無しさん
09/06/09 15:45:37
C/C++というよりLinuxの質問になってしまうのですが、
mq_sendとmq_receiveでメッセージキューのパラメータに
任意の構造体を渡すことはできますでしょうか?
関数仕様ではchar*のみのようですが。
メッセージキュー以外の方式で別プロセスに任意の型の
値を渡す代替案があればそれでも良いのですが。
810:デフォルトの名無しさん
09/06/09 16:10:40
mmapとかpipeとか
プロセス間通信は、Linuxの方で聞いた方がいいかもね
811:デフォルトの名無しさん
09/06/09 16:13:22
使ったこと無いけど
文字列にシリアライズして渡すんじゃねーの
そんな雰囲気のある関数っぽい
812:デフォルトの名無しさん
09/06/09 17:07:30
>>809
昔は, 任意のバイト列に対するポインタは char* を使っていた
で, 関数使用はその名残だと思うんだわ
# kernel 内部の caddr_t とかの絡みもあるとは思うが………
構造体とか配列とかもバイト列として表現できるわけだから,
キャストすれば何でも可
813:デフォルトの名無しさん
09/06/09 17:08:35
>>812
× 関数使用は
〇 関数仕様は
814:デフォルトの名無しさん
09/06/09 17:27:02
なるほど、ありがとうございます。
mmapとかの共有メモリがお手軽そうですね。
>>812
やはりできるんですね。やろうとしてsegvでちゃったん
ですが、できるとわかればもうちょっと調べてみます。
815:デフォルトの名無しさん
09/06/09 17:29:28
vectorのmax_size()って中の人はどうやって計算してるの?
816:デフォルトの名無しさん
09/06/09 17:51:40
bad_alloc出した場合って普通何をするもんなのかな
・APIとかで開いた画像ファイルとかを閉じる
・そのメソッドで確保成功した分のメモリを開放する
・そのメソッド内での仕事が完了したらbad_allocを上に投げる
・再帰的に開放作業を繰り返して、一番上でプログラム終了
とかでいい?
817:デフォルトの名無しさん
09/06/09 18:01:25
>>815
gcc 4.1は単にsize_type(-1) / sizeof(value_type)を返してた。
VC2008は、上の値とアロケータの最大サイズと比較してちっさい方返してた。
818:デフォルトの名無しさん
09/06/09 19:52:52
void Initialize(){
ここで配列を5本動的確保
}
そしてこの関数で使いたいんですがどうすればいいですか?
void calc(){
}
calcは何度も呼び出すのでcalc内で動的確保するのは無駄だと思いました。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5394日前に更新/231 KB
担当:undef