いてつくブログ

2ちゃんねるのスレッドをコピペしてまとめてみるブログ

関数

PC等【GPGPU】くだすれCUDAスレ part5【NVIDIA】

1 :デフォルトの名無しさん:2011/08/23(火) 22:08:06.09
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
CUDA使いが優しくコメントを返しますが、
お礼はCUDAの布教と初心者の救済をお願いします。

CUDA・HomePage
http://developer.nvidia.com/category/zone/cuda-zone

関連スレ
GPGPU#5
http://hibari.2ch.net/test/read.cgi/tech/1281876470/

前スレ
【GPGPU】くだすれCUDAスレ【NVIDIA】
http://pc12.2ch.net/test/read.cgi/tech/1206152032/
【GPGPU】くだすれCUDAスレ pert2【NVIDIA】
http://pc12.2ch.net/test/read.cgi/tech/1254997777/
【GPGPU】くだすれCUDAスレ pert3【NVIDIA】
http://hibari.2ch.net/test/read.cgi/tech/1271587710/
【GPGPU】くだすれCUDAスレ pert4【NVIDIA】
http://hibari.2ch.net/test/read.cgi/tech/1291467433/

159 :デフォルトの名無しさん:2011/11/27(日) 22:05:36.51
全スレッドの計算結果を1コアに集約して1スレッドで処理したいんだけどいい方法あるかな?
リダクションのサンプルだと最後はCPUで合計だしこれでは都合悪いんだよね
全てGPUでやりたいのよね

195 :デフォルトの名無しさん:2011/12/07(水) 00:45:36.69
+=で同じアドレスに同時書き込みしてるから

197 :デフォルトの名無しさん:2011/12/07(水) 01:27:31.21
競合状態が発生してんじゃないの?
atomic演算とか同期が必要だと思うよ。
512スレッドで同一アドレスの変数の読み書きしてんだから。

まず512個の要素の配列作って、添え字にスレッド番号(上のi)を指定して確認してみたら?
書籍ならcuda exampleも買って読むといいかもね

198 :デフォルトの名無しさん:2011/12/07(水) 02:05:18.21
>>197
>競合状態が発生してんじゃないの?
>>195のコメと合わせて考えるに、なんとなく予想はしてましたけど、取り合いになってるんですね...

>atomic演算とか同期が必要だと思うよ。
まだザックリとしか勉強してないので、atomic演算は知らなかったです。あとで試してみます。
同期を行う場合だったら、どうすればいいのだろう。

>まず512個の要素の配列作って、添え字にスレッド番号(上のi)を指定して確認してみたら?
それは分岐条件がきちんと実行しているのか見るためのテストをしたとき確認しました。

274 :デフォルトの名無しさん:2012/01/06(金) 20:14:34.67
環境
Windows7 Professional 64bit
Microsoft Visual C++ 2010 Express Version 10.0.40219.1
Microsoft .NET Framwork Version 4.0.30319
GeForce GTX 580
CUDA Toolkit 4.0.17
SDK 4.0.19
devdriver_4.0_winvista-win7_64_270.81_general

この(ピヨピヨ)を参考に環境を構築しました。
http://feather.cocolog-nifty.com/weblog/2011/07/visual-studio-2.html
そして以下のサイトのサンプルプログラムを実行してみました。
http://www.gdep.jp/page/view/218
Hello,Worldと99 bottles of beerはcpu、gpu共に実行できました。
しかし、Matrixのプログラムはcpuの方は実行できるのですがgpuの方が実行できません。
以下のエラーを吐きます。
matrix_gpu.cu(5) : fatal error C1083: Cannot open include file: 'cutil_inline.h'
: No such file or directory
どうやらVisualStudioのパスがうまく通ってないということまでわかり、以下のサイトなどを参考にCUDA_INC_PATHなどを変えてみましたが、一向に変わりません。
http://d.hatena.ne.jp/Levi/20090921/1253535802#c
SDK内のcutil_inline.h自体をtoolkitのincフォルダにコピペすると、他の.hファイルもいくつか同じエラーが出たのでエラーになったものをすべてコピペしたところ、LNK2019"link.exe"というエラーで先に進めませんでした。
一度VisualStudioを再インストールしてみましたが、状況は変わりません。
Nvidia GPU computing SDK Browserではサンプルプログラムを実行できているので、CUDAの環境は整っていると思われます。
どうすれば解決できますでしょうか・・・。かれこれ1週間以上格闘しています。
VisualStudioは2010よりも2008にした方がいいでしょうか?


275 :デフォルトの名無しさん:2012/01/06(金) 20:23:04.24
C初心者にはきついと思うんだが…
とりあえず 'cutil_inline.h'のある場所を見つけて
そこを-I /'cutil_inline.hのある場所'と指定する

意味わからなければCのコンパイルを勉強すること

292 :デフォルトの名無しさん:2012/01/09(月) 18:01:50.03
>>275

274です。
-Iオプションを付けてヘッダファイルのある場所を指定してみましたが、相変わらず同じエラーです。

C:\cuda_practice\test>nvcc -o matrix_gpu.exe matrix_gpu.cu -I C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common\inc
matrix_gpu.cu
matrix_gpu.cu(5) : fatal error C1083: Cannot open include file: 'cutil_inline.h': No such file or directory

自分でも試行錯誤してみますが周りにcudaがわかる人がいなくて行き詰ってます・・・。

298 :デフォルトの名無しさん:2012/01/10(火) 17:15:02.61
sharedメモリって同一WARP内でのやり取りだったら同期なしで大丈夫なのでしょうか?
たとえば全部で32スレッドで次のkernelを実行した場合、
WARP内で一斉にsharedメモリに書きに行くので同期しないで大丈夫かと
思ったのですが、実際にはうまくいきません。
globalメモリに読みに行く段階でコアレッシングが発生していないので
それが原因なのでしょうか?
どなたか教えてください。

__global__ void kernel(float *g_v, float *g_x){
float x = 0.0f;
int i = blockDim.x * blockIdx.x + threadIdx.x;
__shared__ float s_v[32];

s_v[i] = g_v[i+i%3];
__syncthreads(); // これが必要かどうか?
x = s_v[(i+3)%32];
g_x[i] = x;
}


299 :デフォルトの名無しさん:2012/01/10(火) 17:35:07.81
>>292

参照パスを ""で囲む♪

355 :デフォルトの名無しさん:2012/01/24(火) 19:53:55.48
コンパイル時に以下のエラーメッセージが出ているのですが、
ptxas error : Entry function '...' uses too much local data (0x16054 bytes, 0x4000 max)
これはローカルメモリーと何か関係あるような気がするのですけど、
ちょっとわからないので教えて頂けないでしょうか。
宜しくお願いします。


357 :デフォルトの名無しさん:2012/01/24(火) 21:56:32.01
> ptxas error : Entry function '...' uses too much local data (0x16054 bytes, 0x4000 max)

単に配列の次元が大きすぎるのでは?

最大 0x4000バイトのところを0x16054 bytes使おうとしている?


> ホスト・デバイスともに共有させたい場合はどうしたらいいのでしょうか?

物理的に無理でないの?

ホスト←→デバイス間でコピーしないといけないのでは??


358 :デフォルトの名無しさん:2012/01/24(火) 21:56:54.10
>>355
メッセージそのままの意味だろ。

362 :355,356:2012/01/25(水) 15:21:00.98
>>358
青木氏の「はじめてのCUDA」に似たようなエラーメッセージが載ってるのですが、
local dataがどの部分の話なのか、ちょっとわからない状態でして...

>>357
>単に配列の次元が大きすぎるのでは?
予定だと1×256スレッドしか使うので、足りないはずないような... 意味が違うか。
ちょっとわからないので詳細お願いします。

>ヘッダーファイルに
>#DEFINE
>などで定義して、ホストとデバイスのプログラムに そのヘッダーファイルをinclude する手があった♪

ちょっと試してみます。それができなかったら、コピーするしかないかもしれません。
__device__ extern TEST test;
のような宣言してて、実行ファイルができたときがあったのですが、何か違うよな、と引っかかってたので、
ここで質問しました。ありがとうございます。



363 :デフォルトの名無しさん:2012/01/25(水) 17:40:16.56
差し支えなければプログラムをアップしてくださいませ♪

364 :デフォルトの名無しさん:2012/01/25(水) 18:01:06.82
>>362

この(ピヨピヨ)の一番下にある資料の3-41ページにそのエラーメッセージが載っている模様。
http://accc.riken.jp/HPC/training.html






365 :355,356:2012/01/25(水) 18:04:09.31
>>362です。

>>363
申し訳ないのですが、プログラムのアップは出来ないです。すみません。

なんかもう分からなくなったので、ホストとデバイスの住み分けを行ったところ、
「ptxas error...」云々のメッセージが消え、コンパイルできました。
(さっきまでhost,device,global宣言関数がごちゃ混ぜな状態だった。)
何が原因だったのか分からず仕舞いです。

グローバル変数の共有はとりあえず、コンスタントメモリにデータコピーで様子見することにしました。
元コード(.c)をもう一度読み直したところ、デバイス側の方はReadOnlyで十分なようでしたから。

皆様回答ありがとうございました。またよろしくお願いします。



366 :365:2012/01/25(水) 21:05:50.75
>>364
資料ありがとうございます。
うまくいったと思った途端、また同じエラーが出てきてしまったので、確認します。

.cファイルに.cuファイルを組み込ませるようにしたら、
__host__ __device__で修飾した関数が定義されてないと.cファイル側に言われ、
.cファイルと.cuファイルそれぞれ単独で動かせるようにしたら、
(同じ内容の関数を.cと.cuそれぞれ別名で実体作った。.c:test .cu:ktestみたいな)
今度はさっきと同じエラー。

実行ファイル作るだけなのに難しい...

368 :デフォルトの名無しさん:2012/01/26(木) 08:53:13.45
取り敢えずCudaのサンプルは捨てて、インクルード関係とオブジェクトの生成手順を確認するんだ。

370 :366:2012/01/26(木) 16:19:08.01
>>368
>取り敢えずCudaのサンプルは捨てて、インクルード関係とオブジェクトの生成手順を確認するんだ。
のように手順を踏んでコンパイルしたところ、実行ファイルができました。
皆様ありがとうございました。

371 :370:2012/01/26(木) 20:33:24.55
お恥ずかしながら、また戻ってきました。
あれからセグメンテーション違反が出てきてしまったので、あれこれ探していた結果、
どうやらデバイスのメモリ確保&送信に失敗していたようです。

しかし解せないことがあって、
構造体A a,構造体B b[100],構造体C c[100],...(以下略 をデバイス側に送るのですが、
(1つ1つのサイズは結構大きめ。グローバルは1GBあって余裕で確保出きるハズ...)
void main(){
・・・
test(&a,b,c....);
}
void test(A *a,B *b,C *c...){
A *d_a; B *d_b; C *d_c;
CUT_SAFE_CALL(cudaMalloc((void**)&d_a,sizeof(A)));
CUT_SAFE_CALL(cudaMemcpy(d_a,a,sizeof(A),cudaMemcpyHtoD));

CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)*100));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B)*100,cudaMemcpyHtoD));
・・・

はじめてcuda,cuda_by_exampleで確認したところ、
文法的ミスはないはずなのに確保ミスしてるらしく、中断してます。

この原因は一体全体なんなんでしょうか。




372 :デフォルトの名無しさん:2012/01/26(木) 21:28:56.32
4.1正式版
CUDA Toolkit 4.1 | NVIDIA Developer Zone
http://developer.nvidia.com/cuda-toolkit-41


373 :デフォルトの名無しさん:2012/01/26(木) 21:55:28.42
構造体の中身がよく分からんが,allocateのところで *100は必要なのかな?

構造体Bのメモリーを100個分用意しようとしている??

構造体Bの中にすでに [100]個の配列を取っているのに???

数は合っておるのか????

375 :デフォルトの名無しさん:2012/01/27(金) 00:03:32.49
>>372
遂にRC取れたか!4.0からどう変わってるか知らんけど。
Kepler向けのプログラムを作れるのは5.0とかになるんだろうか。
そしてそれはいつ出るんだろう。

>>371
1GBのVRAM積んでるカードでも400MBぐらいの確保で失敗したことがあったような覚えがある。
確保するサイズを小さくしてもエラーが出るってんならこの話は忘れてくれ。

383 :371:2012/01/27(金) 18:15:48.81
>>373
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)*100));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B)*100,cudaMemcpyHtoD));
これはミスですね....
正しくは
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B),cudaMemcpyHtoD));
です。すみません。

>>375
4000MBの領域確保でも失敗することがあったんですか...
ちょっと試してみます。

387 :383:2012/01/28(土) 17:54:35.37
>>371
なんかサンプルがめちゃくちゃなんで書き直します。

388 :387:2012/01/28(土) 20:55:21.49
確認なのですけど、カーネル関数の引数はポインタ限定ですか?

671 :デフォルトの名無しさん:2012/04/29(日) 14:44:53.67
GPUのデメリットは同じ変数計算を毎回糞真面目に超高速で行うところ

719 :デフォルトの名無しさん:2012/05/17(木) 21:52:07.76
多次元配列を扱えないのは何でなんだろう.

ブロックとスレッドインデックスで一次元化するの面倒なんだけど.

737 :デフォルトの名無しさん:2012/05/23(水) 14:44:51.35
詳しい方に質問させてください。
Win7Pro64 + VC2010Pro + CUDA4.2で32bitのdll (Matlabのmex)を
作成して、カーネル(1回のみ呼び出し)の実行時間を計測しました。
Nsight Visual Studio Editionのプロファイルでは約3583msとなったのですが、
メイン関数側でカーネル呼び出しの時間を調べると12079msとなりました。
この差の原因がわからずに困っているのですが、心当たりのある方は
いらっしゃいませんか?
足りない情報などあればツッコんでください。
よろしくお願いします。

738 :デフォルトの名無しさん:2012/05/23(水) 15:16:21.45
>>737
詳細は実際のコードを見ないと判らないけれど、カーネル呼び出しは完了復帰じゃないよ。
逆に、それを巧く利用すればGPUとCPUで並列処理ができるって寸法だ。

739 :737:2012/05/23(水) 15:25:51.83
>>738
レスありがとうございます。
メイン関数側での測定は、カーネル呼び出し後に
cudaThreadSynchronize();
としてから測定していますが、これではダメですか?
これを入れ忘れると、メイン関数側での測定時間が極端に短くなる
という話はよく目にするのですが、今回は逆に、メイン関数側での
測定時間が極端に長くなっています・・・・

758 :デフォルトの名無しさん:2012/06/02(土) 02:34:05.01
CUDAで計算した結果をDirect3Dで描画したいんですが、
同じプログラム内で同時に使っても問題ないでしょうか?
一つのGPUがCUDAとDirect3Dを切り替えて使うので、
切替のオーバーヘッドとか大きかったりするんでしょうか??

777 :デフォルトの名無しさん:2012/06/08(金) 14:37:45.13
カーネル関数で乱数使いたいとき、みんなどのライブラリを使ってるの?
curandとtinymtは使ったことがあるんだけど、他におすすめある?

829 :デフォルトの名無しさん:2012/08/02(木) 16:58:06.96
最近CUDAの勉強を始めて、試しに画像処理アプリをGPU用に書き換えているのですが
どうしても分からないことがあるので質問させてください

double *a[5],*d_a[5];
int size=1280*1024; //実際には読み込んだ画像のサイズが入ります
for(i=0;i<5;i++){
a[i]=(double *)calloc(size,sizeof(double));
for(j=0;j<size;j++)a[i][j]=i*j; //ここのi*jは実際には読み込んだ画像の画素情報が入ります
}
for(i=0;i<5;i++)cudaMalloc((void**)&d_a[i],sizeof(double)*size);
for(i=0;i<5;i++)cudaMemcpy(d_a[i],a[i],sizeof(double)*size,cudaMemcpyHostToDevice);
func<<< Dg, Db >>>(d_a);

__global__ void func(double *f_a[5]);
上記のf_a[5]の、ホストにおけるa[i][j]にあたる値を参照するにはどうしたらよいでしょうか
ホスト同様にf_a[i][j]とすると
Warning: Cannot tell what pointer points to, assuming global memory space
上記の警告が出て上手くいきません
超初歩的な質問かと思いますが、アドバイス宜しくお願いします

830 :デフォルトの名無しさん:2012/08/02(木) 17:15:58.20
>>829
d_aはホスト上の配列。そいつへのポインタを渡してもなんともならない。
d_aが固定長でいいなら、__global__ void func(doule * f_a0, doule * f_a1, doule * f_a2, doule * f_a3, doule * f_a4);
とするのが手っ取り早い。
d_aが可変長だったり巨大だったりするなら、
double ** dPtrArray, ** hPtrArray;
hPtrArray = malloc(sizeof(* hPtrArray) * length);
cudaMalloc((void **) & dPtrArray, sizeof(* dPtrArray) * length);
for (int ic = 0; ic < length; ++ic) {
cudaMalloc((void **) & hPtrArray[ic], sizeof(* tmp) * size);
cudaMemcpy(hPtrArray[ic], a[ic], sizeof(double) * size, cudaMemcpyHostToDevice);
}
cudaMemcpy(dPtrArray, hPtrArray, sizeof(* hPtrArray) * length, cudaMemcpyHostToDevice);
とでもしないと。

853 :デフォルトの名無しさん:2012/08/06(月) 23:15:24.01
C++とCUDAを連携させたプログラムを作成しているのですが、どうしても解決出来ない問題が発生してしまったので教えて下さい。
C++のスレに質問するか迷ったのですが、エラーにはCUDAがメインで関わっていると思ったのでこちらに書き込みます。

C++のプログラムからCUDAのプログラム(既にexeになっているもの)を実行したいと思い、下記のようなプログラムを作成したのですが、
CUDAプログラム単体では動いているのにC++のプログラムから呼び出すと実行時にエラーが発生してしまいます。

SDK内のサンプルプログラムでも実行エラーになってしまうので、CUDAプログラム側のバグでは無いと思うのですが…
system関数では実行出来ないのでしょうか?system関数以外でも良いのでなんとか実行する方法が知りたいです。


int _tmain(int argc, _TCHAR* argv[])
{

int ret;

printf("CUDAプログラム実行開始\n");
ret = system("\"D:\\Program File\\Test_Print.exe\"");
if(ret == 0)
{
printf("プログラム実行成功\n");
}
else
{
printf("プログラム実行失敗\n");
}

}

854 :デフォルトの名無しさん:2012/08/06(月) 23:54:55.12
そのTest_Print.exeと同じ場所に何でもいいのでC++で作った何か*.exeを置いて同じことを試してみなよ。
俺があてずっぽうで言うとたぶん同じようにうまくいかないつまりCUDAがどうこうって問題じゃない。

857 :デフォルトの名無しさん:2012/08/07(火) 03:43:55.76
>>853
system関数のマニュアル見てエラーの値をしらべたら?

869 :デフォルトの名無しさん:2012/08/11(土) 20:06:38.41
超基本的な質問をしたい。

「はじめてのCUDAプログラミング」を読んで色々動かしてるんだが、
ブロックとスレッドとSMとSPのそれぞれ関係がいまいちモヤッとしてる。

最初から順に読んでいて、57 ページの次の説明で躓いた。

> スレッド当たりのレジスタ数が
> 「SM当たりのレジスタ数 / ブロック内のスレッド数」
より多い時は、「カーネル関数」を実行できなくなります。

SM や レジスタは物理的なもので、ブロックやスレッドは論理的なものなのに、
なんでごちゃ混ぜになってるのか・・・

その少し後のページも見たり、直前の Warp の説明を読んで
俺なりに考えた結果、次のような認識なのだが、これは間違ってる?

・1つの SP は一度に1つのスレッドを処理する
・1つの SM は一度に1つのブロックを処理する


http://toro.2ch.net/test/read.cgi/tech/1314104886/l50/../人気ブログランキングへ

PC等やってて楽しいプログラミング言語は? 3言語

1 :デフォルトの名無しさん:2011/05/14(土) 23:35:38.48
またその理由は?(やりながらお金儲けできる、アイデア次第で色んなものを作れる、など)

やってて楽しいプログラミング言語は? 2言語
http://hibari.2ch.net/test/read.cgi/tech/1303357967/

やってて楽しいプログラミング言語は?
http://hibari.2ch.net/test/read.cgi/tech/1298628324/


次スレも立てられないおまえらはPHPの刑、VBの刑

296 :デフォルトの名無しさん:2011/06/07(火) 16:23:42.79
pdfにあるよ。OOCとかで。言語を英語圏にして、ググってみれば?
gtkなんかは、大量のマクロつかって無理矢理なOOP
そこまでして、なぜCで書く必要があったのか疑問

315 :デフォルトの名無しさん:2011/06/20(月) 01:26:34.87
疑似コードを書くのが楽しい

リファレンスを引いたり、文法を手直ししたり、現実のプログラミング言語に落とし込むのが辛い
Haskell を勉強したら幸せになれるだろうか・・・

328 :デフォルトの名無しさん:2011/06/21(火) 12:46:59.54
使える使えないは別にして
「なでしこ」楽しいぜw

プログラム作ってるはずなのに
なんか良く分かんない小説みたいなの書いてる気分になるw

359 :デフォルトの名無しさん:2011/07/08(金) 17:55:35.75
rubyだけは馴染めなかった。

366 :デフォルトの名無しさん:2011/07/08(金) 22:59:44.92
・中途半端なPascal記法が気に食わない
・ソースのparser.cの汚さは異常なレベル


386 :デフォルトの名無しさん:2011/07/09(土) 15:42:55.40
言語仕様に対する不満が出て来ないのは、大きな問題は無いって事かな?

399 :デフォルトの名無しさん:2011/07/10(日) 20:59:52.19
あーでも

p (1 �\
+ 2)

とか

p("a very long string" �\
+ "another string")

ならオケなのか
納得したわ

401 :デフォルトの名無しさん:2011/07/10(日) 22:29:40.74
>>399
なんだこの\記号。VBのアンダーラインみたいなもん?
気持ち悪いな

406 :デフォルトの名無しさん:2011/07/11(月) 00:39:19.96
>>401
Cで複数行のマクロを見た事無い?

421 :デフォルトの名無しさん:2011/07/11(月) 15:59:23.28
Rubyの演算子の優先順位ってどうなってんの?
x,??y??,z??を変数として

x??=??y??+??z
x??+??y??=??z

のどっちも通るんだが、上は+が先に評価されて
下は=が先に評価されるんだけど(というか下が通るのはさすがRuby)

550 :デフォルトの名無しさん:2011/07/23(土) 11:18:47.99
末尾再帰が最適化されるからこそ関数的なスタイルで実用コードが書けるんだが

601 :デフォルトの名無しさん:2011/09/18(日) 19:54:52.22
ちょっと感動したんで書いとく

まずはプログラミングhaskellからの引用


x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。ピタゴラス数のリストを生成する関数pythsを定義せよ。ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。

以下に例を示す。

>pyths 10
[(3,4,5),(4,3,5),(6,8,10),(8,6,10)]

引用終わり

これ、haskellで書くと(と言うか、リスト内包表記使える言語だと同じ感じ)、こうなるんだけど、

pyths n = [(x,y,z) | x <- [1..n], y<-[1..n], z<-[1..n], x^2+y^2 == z^2]

リスト内包表記以外の方法だとこんなに短く書け無いんじゃ無かろうか

pythonはリスト内包表記あるの知ってるけど、他の言語でも、こんなに短く書けるんだろうか。。。




604 :デフォルトの名無しさん:2011/09/23(金) 01:23:21.32
Matlab:
function f = pyths(n)
[x y z] = meshgrid(1:n, 1:n, 1:n);
sol = x.^2 + y.^2 == z.^2;
f = [x(sol) y(sol) z(sol)];

こういう例題って効率良く解こうとすると
途端に汚くなるんだよな

605 :デフォルトの名無しさん:2011/09/23(金) 01:56:00.40
Mathematicaだと
Select[Tuples[Range@#, 3]^2, Plus @@ Most@# == Last@# &]^.5 &

もしくは問題文をそのまま書いて
Solve[x^2 + y^2 == z^2 && 0 < x <= # && 0 < y <= # && 0 < z <= #, {x,
y, z}, Integers] &

>>604
こういう初等整数論の問題をガリガリ求めるのは
結局C/C++が最速なのかな?

606 :デフォルトの名無しさん:2011/09/23(金) 07:22:42.02
Prolog
途中ちょっと必要ないことをやってますが。勘案のログということで。
http://nojiriko.asia/prolog/pythagorean_su_3.html

607 :デフォルトの名無しさん:2011/09/23(金) 11:33:34.37
>>604
手続型でも短く書けるもんですね。
>>606
短くないけど面白そうですね。
手続型、関数型と発想が違う

609 :デフォルトの名無しさん:2011/09/23(金) 15:40:31.27
C++の超難解な文法に自虐的な快感を覚えつつプログラムを書くのが好き

>>605
http://dada.perl.it/shootout/

使用しているコンパイラが古いけどおおよその傾向がつかめる
大部分C/C++が最速だが、OCamlも馬鹿に出来ない

614 :デフォルトの名無しさん:2011/09/24(土) 00:54:35.46
短く書くならperlやrubyが得意そうだが。俺書けんけど

617 :デフォルトの名無しさん:2011/09/24(土) 02:14:43.29
Scratch版があった
http://scratch.mit.edu/projects/DarthPickley/986731

623 :デフォルトの名無しさん:2011/09/24(土) 12:44:40.81
コード量が同じ、柔軟性も同じなら、速いに越したことはないと思うが


632 :デフォルトの名無しさん:2011/09/24(土) 16:39:37.87
それ使えば>>601が短くなる?

634 :デフォルトの名無しさん:2011/09/24(土) 16:45:55.92
>>632
少しだけ短くなる

使用前:let??pyths??n??=??[(x,y,z)??|??x??<-??1--n;??y??<-??1--n;??z??<-??1--n;??x*x??+??y*y??=??z*z]
使用後:let??pyths??n??=??[l??|??l??<-??1--n^3;??let??[x;y;z]??=??l??in??x*x??+??y*y??=??z*z]

643 :デフォルトの名無しさん:2011/09/25(日) 01:57:56.43
ああ、そう。


こんなのに興味がないが、FORTRANでいい。


この言語にしかできないってことあるか?
どうせ、この言語だとこんなに綺麗に書けますよ
といった好みの問題だろ。

お前が変態を美しいというのなら、別にそれでいい。


相手する気にもならん


664 :デフォルトの名無しさん:2011/09/27(火) 22:36:44.92
C別解、product()だけ関数化してみた
そんなに長くないように見えるが、main()がごちゃごちゃするのを
見ての通り使いにくく、ベタループよりずっと効率が悪くなるのが
C的にはやはり問題

#include <stdio.h>
int product(int nelem, int *elems, int *limits)
{
?? ?? int i;
?? ?? for (i = nelem - 1; i >= 0 && ++elems[i] == limits[i]; --i)
?? ?? ?? ?? elems[i] = 0;
?? ?? return i >= 0;
}
int main()
{
?? ?? int ix[] = { 0, 0, -1 };
?? ?? int limits[] = { 10, 10, 10 };
?? ?? while (product(3, ix, limits)) {
?? ?? ?? ?? int x = ix[0] + 1, y = ix[1] + 1, z = ix[2] + 1;
?? ?? ?? ?? if (x * x + y * y == z * z)
?? ?? ?? ?? ?? ?? printf("%d, %d, %d\n", x, y, z);
?? ?? }
}





681 :uy:2011/10/03(月) 04:20:58.60
俺は最近
>>664
こういうソースコードをみると、古めかしさを感じるだけど、お前等はどうなの?

特に { ... } これが古めかしいよね


Rubyみたいに思い切ってendとか、Pythonみたいにインデント構造にするとか
Lisp、XML、 ぱっと思いつくだけで4種類も別の方法がでたが


古いものがよいとも限らないところがIT技術だねぇ

718 :デフォルトの名無しさん:2011/10/10(月) 00:57:34.51
haskellをメインで使いつづけたら?手続き型のポトペタなアプリが書ける奴なんて、
その辺の道端に犬のウンコぐらいいくらでも転がってんだろ

haskellでCSP、TSPなりパーサーなりをスラスラ書ける奴と
手続き型でありきたりなウェブアプリしか書けない奴を同時に面接するとして、
自分が経営者ならどっちを雇いたい?

751 :デフォルトの名無しさん:2011/11/08(火) 18:27:55.23
8クイーン別に大げさなもんじゃないよね
Pythonで書くとこんなもんだ

def queens(size):
?? ?? solve = lambda y: ((),) if not y else \
?? ?? ?? ?? ?? ?? ?? (((x, y),) + qs
?? ?? ?? ?? ?? ?? ?? ?? for qs in solve(y - 1)
?? ?? ?? ?? ?? ?? ?? ?? ?? for x in range(1, size + 1)
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? if all(x != u and abs(x - v) != y - v for u, v in qs))
?? ?? return solve(size)

for x in queens(8):
?? ?? print x

782 :デフォルトの名無しさん:2011/11/11(金) 00:53:33.39
やべえ、Cはわかったけど
ハスケルもオカムも全然わからん

789 :デフォルトの名無しさん:2011/11/11(金) 18:50:21.25
OCamlやHaskellのリストはimmutableだから挿入や連結も苦手だけどな
本当に速いのは先頭への追加/削除だけ

790 :デフォルトの名無しさん:2011/11/11(金) 19:11:05.69
>>789
え?

add3 (n1:n2:n3:ns) x = n1:n2:n3:x:ns


792 :デフォルトの名無しさん:2011/11/11(金) 19:20:12.07
>>790
「先頭に近いところ」への追加は速いと言ってもいいけど、
add3を一般化てaddNにしたら、addNはNに比例する時間が掛かる

797 :デフォルトの名無しさん:2011/11/11(金) 20:06:58.39
>>792
騙されたなw

add3 (n1:n2:n3:ns) x = n1:n2:n3:x:ns



add (n:ns) x 0 = x:ns
add (n:ns) x num = n:add ns x (num-1)

も同じ。二つは、再起でメモリ消費するかしないかだけで、データ構造としてのリストは「先頭から順に辿る」のは変わらずO(n)だw

破壊的かどうかも、メモリ上でリストをコピーするか、しないかだけで、データ構造としてのリストはどの言語でも、「先頭から順に辿る」は変わらず、O(n)なんだよwww

破壊的かどうかってのは、リストと言うデータ構造の速度とは別の問題。


798 :デフォルトの名無しさん:2011/11/11(金) 21:55:00.65
>>797
何に騙されたって?

ともあれ、破壊的更新ができるリストなら、あらかじめ末尾へのポインタを持っておけば
定数時間で連結できるよね

799 :デフォルトの名無しさん:2011/11/12(土) 07:51:00.78
>>798
変動する末尾へのポインタ保持するのに結局最初から辿らないといけなくね?
うろ覚えだが、Cのデータ構造としてのリストも

struct intList
{
   int value;
   intList *next;
}

みたいなのじゃなかったっけ?


850 :デフォルトの名無しさん:2011/12/31(土) 23:21:06.08
今まではMFCで書いとけばWinでは何とかなるだろう感があったが、Vista以降微妙な感じはするな。

851 :デフォルトの名無しさん:2012/01/01(日) 12:17:56.31
>>850
VS2011のMFCのクラスの強化具合が分かるまでは何とも言えないが、VS2010でも順調にMFCは新しいクラスが追加されてるみたいだし、これまで通りパフォーマンス向けはx86 or x64に特化でMFCも残るんじゃないかな
そんなパフォーマンスが必要な場面は確実に減ってるけど、無くなりもしないだろうし

個人的にはARM向けにもネイティブ吐けるようになると嬉しい
(その分、for x86, for x64, for ARM。みたいになるんだろうけど)


854 :デフォルトの名無しさん:2012/01/06(金) 23:00:01.96
どう考えてもObjective-C
Cocoa, iOSの言語だから

859 :デフォルトの名無しさん:2012/01/08(日) 12:17:54.22
Javaに素晴らしい所があるとすればJVMで動作する数多くの優秀なソフトウェアがある事だし、
プラットフォームの魅力って重要だよね。
連携すればすぐに出来のいいソフトウェアが作れるのは楽しい。
構文とか意味論とかの面で見る所が無くてもね。

860 :デフォルトの名無しさん:2012/01/08(日) 14:17:08.19
>>859
> Javaに素晴らしい所があるとすればJVMで動作する数多くの優秀なソフトウェアがある事だし、
大量のCPUを並列に動かせないのでつまんないんですけど


904 :デフォルトの名無しさん:2012/03/07(水) 13:08:50.58
JavaScriptは関数型言語

914 :デフォルトの名無しさん:2012/05/14(月) 18:50:55.74
今までC~JAVA系書式の言語ばかりやって来て
ちょっと関数系でもかじろうかな~ってことでF#とHaskell試してみたらチンプンカンプン
こりゃこの書式に慣れるまで苦行だなあ

917 :デフォルトの名無しさん:2012/05/15(火) 00:27:02.66
>>914
慣れると、関数型の方が楽だよ
オブジェクト指向はライブラリがサポートしてる範囲はメソッドを利用するだけになるけど、そこから外れるとメソッドを手続き的に作る必要がある
ライブラリのサポート範囲によってプラットフォームが変わってしまうので、考え方が違ってくるけど、関数型言語は、基本は関数適用という同じ考え方で統一されてる

小さい関数は再帰関数が多いけど、それも自分自身を「関数適用する」し、大きめの関数は、既存の関数を「関数適用する」だけ


919 :デフォルトの名無しさん:2012/05/15(火) 07:42:18.49
>>917
> オブジェクト指向はライブラリがサポートしてる範囲はメソッドを利用するだけになるけど、そこから外れるとメソッドを手続き的に作る必要がある

私は Haskell も C/C++ や Java も日常的に使っていますが、
オブジェクト指向言語に対するこの認識が私にはよくわかりません。

オブジェクト指向でライブラリがサポートしてる範囲の
メソッドを利用するだけの部分も、どう考えても「手続き的に」記述して
利用する必要があると思うのですが。

もしかして、メソッドを呼ぶだけの場合は宣言的になるという意味でしょうか?
環境が変化する順(フロー)を意識しなければならないメソッド呼び出しは、
宣言的とは言いがたいと私は思います。
違うことを言っているのでしたらごめんなさい。

あと、関数適用あるいはメソッド呼び出しにおいて、
その記述的な違いは表層的なものであり本質ではないと思います。
Haskell のような関数型と C++ のような手続き型で本質的に違うのは、
記述的なことではなく、関数型は参照透過性が保たれること、
これに尽きると思います。

921 :デフォルトの名無しさん:2012/05/15(火) 08:30:54.40
>>919
>環境が変化する順(フロー)を意識しなければならないメソッド呼び出しは、
>宣言的とは言いがたいと私は思います。

これは、Haskellでもdo構文使えば同じように手続き的になると思うのですが・・・

それは置いておいて、rubyやsmalltalkのような純粋なOOだと、メソッドチェーンが繋がりやすいのですが、これは関数型言語も関数適用の連鎖で最終的にほしい関数を作るのに似てるな・・・と感じます
ただ、ほしい関数(やメソッド)の部品として作られた関数(やメソッド)の作り方が関数型言語はやっぱり関数適用であるのに対して、オブジェクト指向は手続き的になるな・・・と感じました

そして、順序を意識したHaskellのdo構文は、関数数適用という考え方のまま、手続き型をエミュレートしてるという感覚を最近感じています


923 :デフォルトの名無しさん:2012/05/15(火) 22:12:00.04
>>921
ごめんなさい、言葉が足りなかったです。
私が言っている環境というのは、アプリの振る舞いに影響を与える情報を蓄える
メモリ全体の内容の事です。

手続き型の場合、あるメソッドを呼んだ時に、
環境の複数の部分が同時に変化する事は普通にあります。
そして、ある部分の変化がその後に呼ぶメソッドの振る舞いに影響を及ぼします。
このためプログラマは環境の変化の順を意識します。
言語仕様も意識する必要がある部分を可能な限り局所化しようと工夫され、
プログラマの方も環境の局所化に苦心しますが、根本的に宣言的にはなりにくいです。

Haskellでこのような意味での環境の変化順を本当に意識しなければならないのは、
ほとんどの場合IOモナドを使っている時だけではないでしょうか(do表記かは無関係)。
この時ばかりは、変化する環境に影響される部分がコードの広範囲に渡る可能性があり、
アプリのコード全体でちゃんと意識しなければなりません。

それ以外のモナドでは、わざと環境の変化順を意識させるような構造・使い方でない限り、
たとえdo表記で見た目手続き型っぽく書いても、それほど意識する必要はないです。
せいぜいリストを map f に通してから map g に通す、程度の順の意識で良いはずです。
(この場合の環境変化は、超局所化されて引数と戻り値の関係だけになり、意識すらしない)

なので、IOモナド以外のモナドでは、
普通にHaskellコードを書くのと同程度には宣言的に書けます。
例えばYesodというWebフレームワークではdo記法を多用しますが、
むしろdo記法でより宣言的に書けるように工夫されています。

924 :デフォルトの名無しさん:2012/05/16(水) 06:31:56.43
>>923
私の言いたいこととあなたの言いたいことは概ね同じなんですが・・・

要するにですね
何か処理させたければ、必然的にOOでも関数型でも何らかのメソッドや関数を作らないといけません
その時点で、OOは手続き的にならざるを得ないが、関数型はどこまで行っても関数適用(宣言的)だ。と
(do記法すらも、モナド記法よりも手続き的に書いたほうが読みやすい場合に使う為の構文糖衣だと感じている)

OOな人たちに波風立てたくないから、オブラートに包んでいるのに、オブラートを引き剥がさないで下さいw

Listモナドも「先頭から順に」という順番はありますよ
意識しないといけないほど順序がハッキリしてるのは確かにIOモナドだけかもしれませんが


925 :デフォルトの名無しさん:2012/05/16(水) 07:53:49.96
>>924
> OOな人たちに波風立てたくないから、

気づかなくて申し訳なかったです。

> Listモナドも「先頭から順に」という順番はありますよ

私が言ってるのは環境が変化する順なんです。

では、どのような時にListモナドに対して
「先頭から順に」という順番を気にするのでしょう。


>>917
> オブジェクト指向はライブラリがサポートしてる範囲はメソッドを利用するだけになるけど、そこから外れるとメソッドを手続き的に作る必要がある

やはり私には、コードの中でメソッドを利用するだけの部分も、
どのように利用するか、つまり環境をどの順でどう変化させるかを考える必要があり、
その手続きをコードに書いている様にしか見えないです。

926 :デフォルトの名無しさん:2012/05/17(木) 01:57:31.19
>>925
え、リスト使うときに(x:xs)とかしない?それが、順序を気にしてるところだよ
環境・状態って言うよりは構造って感じで、あなたも私もあまり意識はしないけど

モナドそのものが順序の無い関数の世界に順序をもたらすものだから、環境・状態に限らず、順序を意識するものはモナドで定義されてる
そのおかげでIOモナドも宣言的に書けると言える(大抵はIOモナドはdo記法の方が読みやすいが)

数学セミナーによると静的マンセー(ここで言う静的は恐らく宣言的)な数学で動的なものを表現しようってのがどうやら圏論(モナドの元になった数学の分野)らしいんですね
(数学セミナー2011年7月号第一回圏論の歩き方・参照)


一応、擁護すると、最近のオブジェクト指向言語(主にLL)は関数型言語とも被りますが、イテレータ等でループを表現できるようになってますよ
Haskellで言うfoldlがeachに、mapはまんまmapという「メソッド」として

もちろん、それでも関数型言語ほど宣言的には出来ないし、一応OOも宣言的を目指してるはずなんですが、どうしても全部宣言的とは行かない(というか、ほとんど手続き的)です
(ついでに言うと、蒸し返したこの部分がまさにオブラートですw)



http://toro.2ch.net/test/read.cgi/tech/1305383738/l50/../人気ブログランキングへ

PC等【Perl,Python,PHP】LL バトルロワイヤル 25【JavaScript】

1 :uy:2012/08/11(土) 12:21:25.19
面白かったのでコピペ

979 名前:uy[sage] 投稿日:2012/08/11(土) 11:53:55.80
面接官「特技はRubyとありますが?」
学生 「はい。Rubyでならなんでもかけます。」
面接官「ではシングルトンパターンを書いてください。」
学生 「存在しません?」
面接官「え、存在しない?」
学生 「はい。存在しません。Rubyはシングルトンパターンを言語でサポートしています。」
面接官「・・・で、その言語でサポートされた機能を使うとシングルトンパターンになるんですよね?」
学生 「はい。シングルトンパターンです。」
面接官「いや、あなたRubyでシングルトンパターンは存在しないといいましたよね。なぜシングルトンパターンになるんですか?」
学生 「でも、シングルトンパターンは存在しないんですよ。」
面接官「いや、存在しないとか問題じゃなくてですね・・・」
学生 「Rubyなら簡単にシングルトンパターン書けますよ。」
面接官「ふざけないでください。それに機能が用意されてるってことは存在するでしょ。だいたい・・・」
学生 「機能は用意されていますが言語でサポートしているんです。だから存在しません。」
面接官「聞いてません。帰って下さい。」
学生 「あれあれ?怒らせていいんですか?シングルトンパターン書きますよ。」
面接官「いいですよ。書いてください。Rubyでシングルトンパターンを。それで満足したら帰って下さい。」
学生 「運がよかったな。Rubyにシングルトンパターンは存在しないようだ。」
面接官「帰れよ。」


146 :デフォルトの名無しさん:2012/08/15(水) 15:17:03.87
Rubyはなんでdoに|つけるの?

149 :デフォルトの名無しさん:2012/08/15(水) 15:39:44.61
>>146
パイプでブロック引数をはさまないと、
それがブロック引数なのか、
単に式としてそこにあるのかが区別できない

151 :デフォルトの名無しさん:2012/08/15(水) 15:46:24.88
>>149
pythonみたいな
for t in list:
みたいにできなかったの?
絶対にこっちのほうがわかりやすいと思うんだけど||でかこったら特殊な演算やってそうじゃん

153 :デフォルトの名無しさん:2012/08/15(水) 15:49:51.63
>>151
for t in list; end という構文も最初から存在していますけど、なにか?

162 :uy:2012/08/15(水) 16:52:58.51
rubyで一番よく使うのはmap、これは戻り値に配列を返す
普通に書いたら
p [1,2,3].map { |x| x*2 } # => [2, 4, 6]

だけど、メソッド(イテレータ)チェインする事によって、本来配列を返さない
each_with_indexなども
p [1,2,3].each_with_index { |x,i| x*(2+i) } # => [1, 2, 3]

mapを置く事による戻り値を変えられる
p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12]


これをforで書くとこう
s??=??[]
i??=??0
for??x??in??[1,2,3]
????s??<<??x*(2+i)
????i??+=??1
end
p??s

for文とイテレータじゃ力の差が有りすぎて異論の余地すらない

177 :デフォルトの名無しさん:2012/08/15(水) 18:40:16.04
だから、分かりやすいのがよいなら、
一時変数用意すればよいだろ。何の説明も要らなくなるよ。

181 :153:2012/08/15(水) 19:14:29.25
>>177
一時変数は悪ではないし、否定しないよ
実際に実用的なプログラムでは、あまりに長いメソッドチェーンを
途中で切って、間に一時変数を入れることがある
ただし、一度代入したら二度と更新しない

問題は変数の「破壊的代入」
たとえば>>162の最後にあるforを使った手続き型スタイルでは、
最初にリスト変数とループ変数に初期値を代入した後、
forループ内でこれら変数をゴリゴリと更新(破壊的に代入)している
これが可読性の悪化とコード品質の低下をまねく要因

なお破壊的代入の無さは、専門用語だと「参照透明性」と呼ばれる

191 :デフォルトの名無しさん:2012/08/15(水) 21:10:40.01
内包表記が読み難いとか言ってる奴は
数学の素養が無いって自己紹介してることに気付いてないの?
かっこわるいから控えた方が良いよ

197 :153:2012/08/15(水) 21:57:54.67
>>191
自分は内包表記が読み難いとは思わないね
ただしPythonの場合、局所宣言またはクロージャがないから
せっかくの内包表記構文が台無しになっている
過去スレ19,20で議論になったコードを以下に示す

==== Haskell ====
 data Option a = None | Some a
 ys = [fn x | x <- xs]
   where fn x =
     let
       h = if is_first_page x then generate_header else None
       b = generate_body x
       f = if is_last_page x then generate_footer else None
     in
       (h, b, f)

Haskellには局所宣言としてwhere節があるから、関数fnを定義することで
内包表記を含む式をトップダウンに数学っぽく記述できる

==== Python ====
 ys??=??(Document.new(h,b,f)??for??x??in??xs
   for??h??in??[generate_header()??if??x.is_first_page??else??None]
   for??b??in??[generate_body(x)]
   for??f??in??[generate_footer()??if??x.is_last_page??else??None])

このPythonコードが何をしているかどうか、はたして一目で把握できるかな?

198 :153:2012/08/15(水) 22:01:18.03
参考として、>>197に関するRubyのコードを過去スレからコピペする

==== Ruby ====
 ys = xs.map { |x|
   h = if x.first_page? then generate_header else nil end
   b = generate_body x
   f = if x.last_page? then generate_footer else nil end

   Document.new h, b, f
 }

Rubyには内包表記構文は無いけれど、普通に書ける(実に初歩的なコードだ)

211 :デフォルトの名無しさん:2012/08/15(水) 22:52:50.85
>>197をPythonで(RubyやHaskellのコード相当で)書くならごく素直に

def preprocess(x):
h = generate_header() if x.is_first_page else None
b = generate_body(x)
f = generate_fotter() if x.is_last_page else None
return h, b, f
ys = [Document(preprocess(x)) for x in xs]

じゃないかと。まずリスト内包で書くことはない

235 :153:2012/08/16(木) 10:04:35.58
>>211
ん、最終行にはリスト内包表記が見えるけど、気のせいかな?

それはさておき、Pythonでは「ごく普通に」関数を定義して適用するのに対して、
Ruby(および関数型言語)では「ごく普通に」ブロックや無名関数を使って
シンブルな式として表現できる、ということになった
また当たり前だけど、>>211のような関数を定義するコードはRubyでも書ける

これは>>197,198で述べたように、関数型言語風プログラミングにおいて
局所宣言が無いというPythonの欠点、そしてRubyの優位性を示している

237 :デフォルトの名無しさん:2012/08/16(木) 11:05:52.40
>>235
Rubyは関数内関数を素直に定義できないじゃん
Proc??と??lambda??の違いとかキモイし
どさくさにまぎれて関数型言語と一緒にすんなよ

243 :153:2012/08/16(木) 14:13:16.73
>>237
>Rubyは関数内関数を素直に定義できないじゃん

エッ!、Rubyは普通に関数内関数を定義できるよ???
以前(1.8)は関数内関数のスコープに問題があったけど、今(1.9)では解消されたし

・メソッド定義のネスト - Ruby 1.9.3 リファレンスマニュアル
 http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fdef.html#nest_method

というか、OOPLであるRubyでは、プライベートメソッドとして定義するのが一般的で、
関数内関数はまず目にすることはない
しかも(>>211のPyhtonのような)他LLでは関数定義を「普通」に使うけど、
Rubyならブロックがあるから一度しか適用しない関数は式の中に埋め込むのが「普通」
つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない

>Proc??と??lambda??の違いとかキモイし

確かにProcとlambdaの微妙な差異は分かりづらいよね
でもRubyにはブロック構文があるから、(Procやlambdaのような)明示的な無名関数宣言を
使う頻度は比較的少ないし、使うケースでもどちらか一方を使えば済むことが多い
また、言語の微妙な弱点を避けて、良い点を引き出すことに注力することが
(Rubyに限らず)中級プログラマのたしなみの一つだと考える

>どさくさにまぎれて関数型言語と一緒にすんなよ

え、一度も「Rubyは関数型言語である」とは言ってないけど.....???
「関数型言語風プログラミングには(他LLよりも)Rubyは明らかに優れている」と主張している


244 :デフォルトの名無しさん:2012/08/16(木) 14:25:57.61
>>243
>??エッ!、Rubyは普通に関数内関数を定義できるよ???

はあ?じゃあ何で関数内関数が外から見えてんだよ

http://ideone.com/4J057

245 :デフォルトの名無しさん:2012/08/16(木) 14:42:18.11
>??つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない

関数型言語でも関数内関数を多用するけど...?

「関数型言語風プログラミング」って何?
それってただの「Ruby風プログラミング」なんじゃないの?

248 :153:2012/08/16(木) 14:50:55.63
>>244
わざわざideon上のコードを引用しなくても、Rubyの振る舞いは>>243で示した
リファレンスマニュアル「普通のメソッド定義式と同じ」の通りだよ???

確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める
これが>>211のPythonコードのように、関数定義を多用するのが「普通」、
あるいは関数定義を多用「しなければならない」言語であれば、致命的な欠陥になる
でも>>243で述べたように、Rubyでは関数内関数の必要性がほとんど存在していないんだ

もしも可能であるならば、ブロックやプライベートメソッド定義では読みづらかったり
冗長だったりするけど、関数内関数であれば素直に表現できるコード例を示してほしいなあ...


255 :153:2012/08/16(木) 15:41:10.73
>>245
>関数型言語でも関数内関数を多用するけど...?

うん、関数型言語では関数内関数でプログラムを構築していくのが普通だね
でもRubyはオブジェクト指向言語であり(>>243の最後で書いたように)関数型言語ではないから、
モジュールやクラスでプログラムを構築するのが普通なんだ

>「関数型言語風プログラミング」って何?

「(破壊的代入を含む)副作用を避けた参照透明性のあるプログラミング」(>>181も参照)

これは関数型言語のパラダイムと同じ
もちろん(関数内関数ではない)Rubyでは、入出力や効率(性能や資源)といった理由から
完全に参照透明性のあるコードは書けないけど、それでも副作用を極力避けたり、
参照透明性のある部分とない部分を意識的に使い分ける、あるいは副作用のあるコードを隠蔽する

現実に実用的なテキスト処理プログム開発で試したところ(全体で約20Kstep)、
8割は参照透明性のあるコードで実装することが可能だった
残る2割の部分は、トップレベルの(入出力を含む)メイン処理モジュール群と
最下層の副作用をカプセル化(隠蔽)した内部ライブラリ群になる

264 :デフォルトの名無しさん:2012/08/16(木) 17:48:13.46
旧世代的なラムダ脳にはリスト内包表記、イテレータ、ジェネレータ、デコレータを上手く使うPythonicなコードは理解出来ない
なんとかラムダで書こうとするのは、どの言語でもCみたいなコードを書く奴と何も変わらん

267 :153:2012/08/16(木) 18:11:28.09
>>264
論よりコード

270 :デフォルトの名無しさん:2012/08/16(木) 18:42:06.27
>>267
Closures in Python (part 1)
http://ivan.truemesh.com/archives/000392.html
>(ie. use a "list comprehension" - I think it reads a bit easier than using the map/lambda).

278 :デフォルトの名無しさん:2012/08/16(木) 19:02:19.29
そもそも関数定義無しに書けなきゃダメって
勝手にルール作ってるところがおかしい

285 :デフォルトの名無しさん:2012/08/16(木) 19:21:31.64
>全ての関数をラムダ式で書くわけもなく、普通に関数定義するし
普通の関数もかけるのは当たり前で、
それだけじゃつらいからラムダを導入したって話だろ。
論点ずれてるだろ。何言ってんだか。
ラムダが要らないものならわざわざ変な文法作ってまで導入するかよ。

286 :デフォルトの名無しさん:2012/08/16(木) 19:23:37.43
>>285
上のはラムダで書くべき例なの?

287 :153:2012/08/16(木) 19:26:19.29
>>278,279
あらゆる関数型言語であれば関数定義無しにかけるから、
それは「関数型プログラミング」の特徴の一つである、という理屈
だってPythonだけが関数定義が無ければ書けないんだから、
マイナス評価されても当然だろ?

というかさ、もしルールに不満があるならそれを最初に主張すべきだった
具体的には、>>235の指摘に対して即座に反論すればよかったのに....
いろいろゴネたあげく、技術論で反論できないからルールに不満を言うのは
カッコワルイと思うよ

294 :デフォルトの名無しさん:2012/08/16(木) 20:14:22.38
>>287
あれ?お前>>255でRubyはOOPLだから関数内関数無くても良いんだとか
言ってなかったっけ?
関数型言語では関数内関数あるんだからRubyではdefの入れ子で
関数内関数が定義できないのはマイナス評価されても良いの?

297 :デフォルトの名無しさん:2012/08/16(木) 20:18:08.51
(1)Pythonのlambdaじゃ書けなくて
(2)関数を定義したら冗長になってしまうほど短い

そんな例題があればいいんだよ

310 :153:2012/08/16(木) 21:19:31.47
>>294
>関数型言語では関数内関数あるんだからRubyではdefの入れ子で
>関数内関数が定義できないのはマイナス評価されても良いの?

正確には「関数内関数定義で内部の関数が外部から隠蔽されない」だね
もちろんこの点はRubyのマイナス評価であると認めるよ
また、アンカも間違いで(>>255ではなくて)>>243じゃないかな?

さらに言えば、>>297自身も(>>243,248から)引用しているように、
このマイナス評価はRubyにとっては致命的な欠点ではない
もしも致命的ではないという意見が不満ならば、
>>248の最後でリクエストしたように具体的なコードで語って欲しい

論よりコードだ

328 :デフォルトの名無しさん:2012/08/16(木) 22:02:23.59
Pythonディスりたければ、俺みたいに、
あの糞みたいな、ネスとスコープの仕様をつつけば良いのに。
あれだけは生粋のパイソニストでも擁護不可能だからね。
擁護しようものなら、
今になってnonlocal追加した事実に反してしまうしな。

333 :デフォルトの名無しさん:2012/08/16(木) 22:08:32.79
>>328
nonlocal(酷い名前だ)を追加したPython3ではネストスコープの問題は無いの?

344 :デフォルトの名無しさん:2012/08/16(木) 22:24:22.12
>>333
ああ、問題残ってるよ。代入の有る無しでスコープが切り替わる問題が。
互換性のためか残っちゃってるけど、
nonlocal追加したんなら、思い切ってこの糞仕様は廃止すべきだったな。
nonlocal有りならネストスコープ、無しならローカルスコープ。
一貫してそれでよかったんだよ。シンプル、単純、分かりやすい。
スコープ調べるのに代入の有る無し調べるとか意味わかんねー。
折角nonlocal追加したのに、なぜに。
二箇所調べなきゃならなくなったから、状況はより悪化したともいえる。

346 :デフォルトの名無しさん:2012/08/16(木) 22:26:16.84
>>344
ちょっと待てよ。nonlocal追加以前はそもそも代入不可だろ

349 :デフォルトの名無しさん:2012/08/16(木) 22:30:33.87
>>346
いや、代入できるよ。ローカルスコープの変数になるけどな。
代入があっても、nonlocalならネストスコープ。
nonlocal無くても、代入が無ければネストスコープ。
あー超ややこしいね。
単に、nonlocal有り/無しで、ネスト/ローカルが切り替わる
方が直感的で良いよなぁ。

419 :デフォルトの名無しさん:2012/08/17(金) 02:16:05.29
ラムダを多用ってどこの誰が多用してんの?

512 :uY:2012/08/20(月) 05:46:11.83
さっきちょっと書いたコードなんだけど
何も考えずに適当に書くとこうなるコードでも

n??=??i??=??0
s??=??[]
b??=??["a","b"]
[1,2,3].cycle??do??|??m??|
????n??+=??1
????i??+=??1
????break??if??n??==??21
????s??<<??m
????if??i??==??4
????????i??=??0
????????s??<<??b.first
????????b.rotate!
????end
end
p??s

↓ちゃんと書けばちゃんとブロック内に全部収まるところが、rubyが最強である所以だと思う

[1,2,3].cycle.take(20).each_with_index.each_with_object??[??s??=??[]??,??["a","b"]??]????do??|??(??m??,??i??)??,??(??s??,??b??)??|????
????s??<<??m
????(??(i??+=??1)??%??4??).zero???and??s??<<??b.rotate![-1]
end
p??s

メソッド名が長かったりしてソースは長いけどアルゴリズムとしては完璧なものが書けるんだよ

519 :uY:2012/08/20(月) 16:31:55.85
40.times.map.each.with_index(1).each_with_object( [ [1,2,3] , ["a","b"] ].map(&:cycle) ).map?? do | ( m , i ) , ( a , b ) |??
?? Hash[ true , b.next , false , a.next ][ ( i % 5 ).zero? ]
end.display

puts

[1,2,3].cycle.take(40).each.with_index(1).each_with_object( ["a","b"].cycle ).map?? do | ( m , i ) , b |??
?? ( i % 5 ).zero? ? b.next : m
end.display


変数の完全隠蔽がされている

アルゴリズムとして完璧なんだよこれは


これを無駄に長いとはいわない
短くしようと思えば出来る長さなんだよ
すべてがメソッドで、その引数で構成されているから

↓これが出来る

a = [1,2,3].cycle.take(40).each.with_index(1).each_with_object( ["a","b"].cycle )

a.map do | ( m , i ) , b |??
?? ( i % 5 ).zero? ? b.next : m
end.display


520 :デフォルトの名無しさん:2012/08/20(月) 17:05:56.67
from??itertools??import??cycle

print([s??if??i??%??5??==??0??else??n??for??n,s,i
????????in??zip(cycle([1,2,3]),??cycle("ab"),??range(1,41))])

576 :uY:2012/08/21(火) 19:53:34.60
def func n , aa , bb
?? y = Enumerator.new do | e |
?? ?? a = aa.cycle
?? ?? b = bb.cycle??
?? ?? [*1..n].cycle { |i|
?? ?? ?? r = (i%n) == 0 ? a : b
?? ?? ?? e << r.next
?? ?? }
?? end
end

y = func 5 , ["a","b"] , [1,2,3]

p y.take(20) # => [1, 2, 3, 1, "a", 2, 3, 1, 2, "b", 3, 1, 2, 3, "a", 1, 2, 3, 1, "b"]

y = func 2 , [true] , [false]

p y.take(20) # => [false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]


ゲームでインターバルの制御に使うんです


592 :デフォルトの名無しさん:2012/08/21(火) 21:51:53.70
>>576
func の中の y の代入が意味不明。
[*1..n].cycle は冗長。

def func(n, aa, bb)
????Enumerator.new do |y|
????????a = aa.cycle
????????b = bb.cycle
????????loop{ (n-1).times{ y << b.next }; y << a.next }
????end
end

enum = func(5, ["a","b"], [1,2,3])
p enum.take(25)

720 :デフォルトの名無しさん:2012/08/30(木) 16:23:23.43
大学のプログラミングでperlやってるんですが
3年になったら何言語やるんでしょう?

1年 C java Basic Javascript ruby
2年 C++ perl
な感じです。

2学期後期は何ですか?

765 :uy:2012/08/31(金) 03:21:35.57
逆に考えると専門にはいれば
論外的に才能ない奴はすぐ挫折していなくなるから、かえってそのほうが早期にIT脱出できて幸せなんじゃね
大学だと才能なくてもやめずに4年間ズルズルとやり続けて産廃になってる可能性もある
才能がないなら早めにリターンしたほうが絶対良い


http://toro.2ch.net/test/read.cgi/tech/1344655285/l50/../人気ブログランキングへ

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

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

【前スレ】
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1331894668/

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

119 :デフォルトの名無しさん:2012/07/15(日) 15:07:09.82
初めて質問させていただきます。
現在私はシューティングゲームを製作中で
オブジェクト(弾や敵、プレイヤー等)生成時に製造番号を振ってくれるクラスを作成したのですが
IDを解放する時に、std::listの挙動がおかしくなっていて、困っています。
IDの生成は各オブジェクトのコンストラクタで
IDの解放は各オブジェクトのデストラクタで呼び出しています。

改行が多いと言われてしまったので、次にコードを書きたいと思います。
場所をとってしまってすみません。



142 :デフォルトの名無しさん:2012/07/18(水) 14:02:39.82
あるスレッドで作成したFiber、またはSetTimer、またはQueueUserAPCに
他のスレッドから切り替えさせる方法はありませんか?

172 :デフォルトの名無しさん:2012/07/23(月) 16:27:46.15
バイト列を無理やりdoubleにキャストして、それが
doubleとして有効かどうかを判定する方法を教えて

175 :デフォルトの名無しさん:2012/07/23(月) 23:23:54.34
>>172
でもそれって一様乱数じゃないよね

177 :デフォルトの名無しさん:2012/07/24(火) 09:38:27.61
>>175
一様乱数なバイト列ならdouble表現にしても
符号部,仮数部,指数部どれも一様になる気がするけどならないの?

178 :デフォルトの名無しさん:2012/07/24(火) 09:42:12.10
>>177
そもそも全doubleが一様分布じゃないでしょ

181 :デフォルトの名無しさん:2012/07/24(火) 09:52:40.50
>>178
どういうこと?
上で出てるisnan,isinfや-0を除外する話でなく?

182 :デフォルトの名無しさん:2012/07/24(火) 09:58:37.06
>>181
小さな数は密で大きな数は粗

191 :デフォルトの名無しさん:2012/07/24(火) 11:12:15.12
doubleが表現できる範囲での一様分布なんて無理だろ

194 :デフォルトの名無しさん:2012/07/24(火) 14:19:02.99
>>191
doubleが表現できる範囲=doubleの全ビットパターン なら可能だろ

216 :216:2012/07/25(水) 21:33:30.39
#include <vector>
int map_one[10][10] = {
//中身は0,1,2のどれかが10×10
}
int map_two[10][10] = {
//中身は0,1,2のどれかが10×10
}
int map_three[10][10] = {
//中身は0,1,2のどれかが10×10
}
std::vector<int> StageList;
int StageId = 0 //0,1,2のどれか
StageList.push_back(map_one[10][10]);
StageList.push_back(map_two[10][10]);
StageList.push_back(map_three[10][10]);


277 :デフォルトの名無しさん:2012/08/02(木) 16:08:20.69
負の数の試射五入ってどうやってやるの?

309 :デフォルトの名無しさん:2012/08/05(日) 04:26:09.40
同一のクラス中で同名の変数と関数を宣言したらコンパイルエラーが出て、どうやら衝突してるみたいなんですが、
これって仕様なんですか?
また、変数、関数を別名にする以外の対処法があったら教えて下さい。

例:
class test {
int hoge;
public:
int hoge();
};

326 :デフォルトの名無しさん:2012/08/05(日) 12:16:41.70
#include <stdio.h>
#include <string.h>
#include <conio.h>

using namespace System;

void hoge1()
{
puts("hoge");
}

void hoge2()
{
puts("hogehoge");
}

int main()
{
void (*p1[])() = {hoge1,hoge2},(*p2[2])();
int p3[2];
memcpy(p3,p1,sizeof(p3));
printf("%d,%d\n",p3[0],p3[1]);
memcpy(p2,p3,sizeof(p3));
p2[0]();
p2[1]();

return 0;
}


329 :デフォルトの名無しさん:2012/08/05(日) 12:47:48.39
>>326
p1に入ってる関数ポインタを、p2に入れて変数としてアドレスを表示し、
さらにp2の内容をp3の関数ポインタに入れ直して関数ポインタとして実行。
これが何故正常に動くのかは素人には分からんだろうな。

331 :デフォルトの名無しさん:2012/08/05(日) 13:28:27.32
>>329
int型とポインタが同じメモリーサイズだという常識から説明しないと分からんだろ。
16ビットの頃のsizeof(int)は2だし、64ビットでコンパイルするとsizeof(int)は8になる。

332 :309:2012/08/05(日) 13:43:33.14
#include <stdio.h>

int hoge() {}
int hoge;

int main(void)
{
return 0;
}

これでエラーが起きるのは、
同一のメモリ領域にhoge()の実態のアドレスを指すhogeが暗黙的に定数(書き換えできない変数?)として存在しているから。
という理解でいいでしょうか?


365 :デフォルトの名無しさん:2012/08/05(日) 22:37:46.08
31以上を保証しなければいけないのは、内部リンケージの識別子。

380 :デフォルトの名無しさん:2012/08/06(月) 02:02:01.95
NXbitってなに? おいしいの?

404 :デフォルトの名無しさん:2012/08/10(金) 14:37:52.01
親クラスのメンバを初期化するとき、
class Oya {
protected:
int age;
};
class Kodomo : public Oya {
Kodomo() : Oya::age(50) {}
};
こう書くとエラーになるのは何でですか?


418 :デフォルトの名無しさん:2012/08/12(日) 06:44:51.22
純粋仮想デストラクタを使うのってどういう場面ですか?
何もしてないデストラクタ virtual ~myClass() {} みたいなのがあるのですが、
これを純粋仮想にするとコンパイルが通りません。
いったいどういう場面で使うのでしょうか?


420 :デフォルトの名無しさん:2012/08/12(日) 09:01:04.93
>>418
純粋仮想デストラクタを使う場面はありません
インターフェイスのインスタンスを作らせないようにするには
コンストラクタをprotectedにします

421 :デフォルトの名無しさん:2012/08/12(日) 12:00:48.61
struct IHoge {
virtual ~IHoge()
{
} // <- このかっこがなんかウザい
virtual void DoSomething() = 0;
};

こういうときに純粋仮想デストラクタを書くと見た目が気持ち良くなります

424 :デフォルトの名無しさん:2012/08/12(日) 14:16:57.24
>>421
派生が迷惑だろ
class IHoge:public Deletable みたいな感じに
仮想デストラクターもったクラスを継承した方がいい

430 :デフォルトの名無しさん:2012/08/12(日) 18:19:08.78
ラムダみたいにして匿名のクラスをなんとかして作れないんですか

struct Hoge {
Hoge(function<void(void)> h, function<void(void)> w): Hello(h), World(w) {}
function<void(void)> Hello;
function<void(void)> World;
};

template <class T> void Test(T obj) { obj.Hello(); obj.World(); }

int main(void) {
SmartPtr<X> obj(new X);
Test(Hoge(
[obj]() { obj->hello(); },
[obj]() { obj->world(); }));
return 0;
}

このコードからHogeクラスを削りたいんだけど

435 :デフォルトの名無しさん:2012/08/12(日) 20:34:54.98
>>430
またhoge厨か
恥ずかしくない?w

461 :デフォルトの名無しさん:2012/08/12(日) 23:47:32.32
どうでもいいけど、hogeは『これには何の意味もありません』って意味だからな。

480 :デフォルトの名無しさん:2012/08/14(火) 03:15:11.48
最後の無限ループはウィンドウが閉じないようにしてる

Run-Time Check Failure #3 - The variable 'hoge' is being used without being initialized.

#include <iostream>
#include <fstream>

using namespace std;

void main(){

ifstream List("GunList.txt");

char* hoge;

while(List.getline(hoge,100)) {

for(int i=0;i<5;i++)
std::cout << hoge;
std::cout << "\n";
}

while(1);
}


483 :デフォルトの名無しさん:2012/08/14(火) 03:35:06.03
hoge初期化してねージャン
char hoge[1024];とでもしとけ

486 :デフォルトの名無しさん:2012/08/14(火) 11:24:24.85
>>483
char* hoge="";
でもいいの?
文字数分やらないとダメなのかな

489 :デフォルトの名無しさん:2012/08/14(火) 11:37:02.57
>>480
どうでもいいけど無限ループでウィンドウを閉じさせないって随分お大尽だな。
CPUぶん回すことになるからエコじゃないぞ。
単に進行を止めたいだけならgetline()でも充分だろ。

491 :デフォルトの名無しさん:2012/08/14(火) 12:30:03.32
>>489
まぁ2秒ぐらい眺めて閉じますし・・・

495 :デフォルトの名無しさん:2012/08/14(火) 15:31:48.90
>>491
言い訳してないで、回答してくれた皆さんに感謝の一言でも書きなさい。

496 :デフォルトの名無しさん:2012/08/14(火) 15:34:15.73
忘れてました、
ありがとうございました!

516 :デフォルトの名無しさん:2012/08/14(火) 19:31:03.14
GUIを勉強すればそこから先はだいぶはかどる
作りたいもの作りながら足りないものをその都度べんきょうするかんじ

518 :デフォルトの名無しさん:2012/08/14(火) 19:59:29.21
WIN32APIでGUIやったら挫折した

525 :デフォルトの名無しさん:2012/08/14(火) 20:41:38.10
C#のがライブラリ充実してるしMonoもあるから環境もそんな気にしなくていい
むしろQtを使う理由なんてあるの?って感じ

542 :デフォルトの名無しさん:2012/08/15(水) 23:45:43.07
ユニポのカスタムデリータは動的じゃないからいちいち型書かなきゃいかんからめんどくさいよな
なんで静的にしたんだろう


549 :デフォルトの名無しさん:2012/08/16(木) 03:12:33.15
fgetsは
abcdefghij�\nklmnopq
という文字列が有った場合に、
17文字読み込むように指定すると、
abcdefghij�\nまで読み込みますか?
それとも
abcdefghij�\nklmno
まで読み込みますか?

551 : ◆QZaw55cn4c :2012/08/16(木) 03:26:01.87
>>549
\n が改行コードだとして、
>abcdefghij\n
は11バイトですので、ここまで読み込んで末尾に\0をつけ、以上12バイトを指定領域に残します。

553 :デフォルトの名無しさん:2012/08/16(木) 09:34:32.24
>>542
例えば同種の100個のリソースハンドルがあったとして
それのデリータ関数は1つなのに、関数ポインタなりを100個持つのは無駄じゃね?

554 :デフォルトの名無しさん:2012/08/16(木) 09:55:18.95
>>551
前から思ってたけど日本語おかしいよ
残します ってなんだよ

555 :デフォルトの名無しさん:2012/08/16(木) 10:16:26.00
>>553
そういうケースはそうかもしれないけど
じゃあこういうケースはどうするの?

vector<MyUniquePtr<IFoo>> v;

v.push_back(MyUniquePtr<FooX>(new FooX)); // 標準new、delete
v.push_back(MyUniquePtr<FooY>(FooY::Create(), FooY::Delete)); // 隠ぺいされた生成、破棄

FooZPool fac = FooZPool::GetInstance(); // プールされたFooZ
v.push_back(MyUniquePtr<FooZ>(fac.get(), [fac] (FooZ * p) { fac.release(p); }); // 借りたものは借りた場所へ

こういうのはデリーターの型固定じゃだるくね?


556 :デフォルトの名無しさん:2012/08/16(木) 11:22:34.27
>>555
そういう場合は unique_ptr に動的な削除子の型を指定すればいいんでしょ。
だるいって、具体的に何のことを言ってるの?

557 :デフォルトの名無しさん:2012/08/16(木) 11:36:21.59
>>556
どうやって?

570 : ◆QZaw55cn4c :2012/08/16(木) 21:54:55.57
>>554
んー、じゃ、どうかけばいいの?

574 :デフォルトの名無しさん:2012/08/17(金) 04:38:14.46
>>570
「残す」という言葉の意味を考えれば、どう考えてもおかしいだろ。
その場合は寧ろ、「移す」とか「移動する」とか、さもなきゃ単に「書き込みます」とか。

575 :デフォルトの名無しさん:2012/08/17(金) 04:49:48.65
日本語がおかしいのは俺も思ってた
在日なん?

582 :デフォルトの名無しさん:2012/08/17(金) 08:00:39.70
厳密性を考慮して思考した結果が「残す」とか。
そもそも、日本語を勉強しなければいけない段階でお郷が知れるのだが。
私ゃ自分の言語感覚のほうを信じるね。

583 :デフォルトの名無しさん:2012/08/17(金) 08:32:30.64
>>582
「移す」よりはましだし、結果を「残す」のだから、意味として問題はない

>>582==>>574
ならば、あんた、言語感覚狂っているよ

598 :デフォルトの名無しさん:2012/08/18(土) 07:36:31.16
hoge[]とかfuga[9]とか書くと
hoge[0]だのfuga[4]だのが実際のデータを指し示す事になってるんだよ
これはわかるよな
じゃあそのとき
hogeとかfugaとかだけ書くと、これは実はhoge[0]とかfuga[0]って先頭データのアドレスになってるんだよな
つまりhoge = &(hoge[0])な
その例だとtypedef char* charpとか置き換えると
charp argv[]とcharp *argvになってどっちもargvはcharpのポインタになってるってわけだ

613 :デフォルトの名無しさん:2012/08/18(土) 22:08:08.77
hogeじゃなくローマ字でいいから意味の解る名前をつけろ
質問にしてもいちいち目的はなんだと訊かにゃならんからめんどくせぇ

614 :デフォルトの名無しさん:2012/08/18(土) 22:14:31.80
>>613
>意味の解る名前
何のためのメタ構文変数なんだよ……

619 :デフォルトの名無しさん:2012/08/18(土) 22:34:36.97
>>614
説明ならともかく質問すんのに無意味な名前をつけるな

657 :デフォルトの名無しさん:2012/08/21(火) 13:47:35.28
655じゃないけどwikiみたら

http://ja.wikipedia.org/wiki/リスコフの置換原則
S が T の派生型であれば、プログラム内でT 型のオブジェクトが使われている箇所は
全て S 型のオブジェクトで置換可能であり、それによってプログラムの動作は全く変化しない

って書かれてるんだけどこれマジで?
「正常に動作する」とかなら分かるけど「動作は全く変化しない」なら
ポリモーフィズム全否定になると思うんだが
というかTが純仮想だったらどうすんのかと

659 :デフォルトの名無しさん:2012/08/21(火) 17:44:19.62
>>657
>なお、これが派生型の唯一の定義ではない

と書いてあるじゃん
仮想関数が派生型と基本型で動作が違う事はいくらだってある
無理にC++に当てはめようとする事自体おかしい

662 :デフォルトの名無しさん:2012/08/21(火) 18:24:32.45
>>659
それはつまり
リスコフの置換原則についてはポリモーフィズム全否定であってるってこと?

671 :デフォルトの名無しさん:2012/08/22(水) 00:22:38.46
using namespace std;

class Sample {
string name;
string groupe;
public:
Sample(string const & n, string const & g): name(n), groupe(g) { }
Sample(string const & n, string && g): name(n), groupe(move(g)) { }
Sample(string && n, string const & g): name(move(n)), groupe(g) { }
Sample(string && n, string && g): name(move(n)), groupe(move(g)) { }
};

上のように引数がたくさんあるとconst & と && の両方を書くのがめんどくさいんですが
どうにかして一発で書く方法はありませんか?




691 :デフォルトの名無しさん:2012/08/24(金) 01:42:09.63
ifstream List("List.txt");
string Text;
while(List && getline(List,Text)) {
TextList.push_buck(Text);
}

このようにしてvector<string>TextListにList.txtの文章を一行づつコピーできる
と聞いたのですがどうしてかわかりません。

http://sato-si.at.webry.info/200703/article_1.html
を参考に
http://www.cppll.jp/cppreference/cppio_details.html#getline
のリファレンスと食い違うところがありまして・・・

696 :デフォルトの名無しさん:2012/08/24(金) 20:09:30.79
C++ってCPAN, RubyGemsみたいなのは無いの?
boostは標準化委員会が作ってるtr1候補みたいなものだし

704 :デフォルトの名無しさん:2012/08/27(月) 14:42:41.72
>>696
そんなものがあったら
boost.eggの悲劇はおきなかった

709 :デフォルトの名無しさん:2012/08/28(火) 17:48:38.33
hello worldの次は何するのが良いと思います?
参考になりそうなサイト読んでもチンプンカンプン

734 :デフォルトの名無しさん:2012/08/29(水) 20:40:12.92
Cygwin使ってたら
error: cannot pass objects of non-trivially-copyable type ‘struct std::string’ through ‘...’
って出たんだけれどこれなんですか?
エラー部分は
printf("%s\n",s);
sはstring型です。


740 :デフォルトの名無しさん:2012/08/30(木) 07:57:28.02
linuxでcoutとprintf混ぜるとバグる


http://toro.2ch.net/test/read.cgi/tech/1341052801/l50/../人気ブログランキングへ

PC等C++11/C++1y 15

1 :営利利用に関するLR審議中@詳細は自治スレへ:2012/04/03(火) 15:18:20.76
The C++ Standards Committee
http://www.open-std.org/jtc1/sc22/wg21/

Wikipedia
http://ja.wikipedia.org/wiki/C%2B%2B11

前スレ: C++11/C++0x 15
http://toro.2ch.net/test/read.cgi/tech/1321453654/

51 :デフォルトの名無しさん:2012/04/25(水) 21:53:17.91
volatileは、ポインターかアセンブリで特殊な
セグメントに設置した外部変数じゃないと意味ないから
外部変数をオブジェクトにするならPODじゃないといけないし、
コンテナは使えない

58 :デフォルトの名無しさん:2012/04/26(木) 10:08:51.40
>>51
マルチスレッドで共有しているオブジェクトとか…

134 :デフォルトの名無しさん:2012/05/05(土) 19:19:51.80
ところで
constexpr constructor
って初めて聞いたけど、どこで使うんだ?

148 :デフォルトの名無しさん:2012/05/05(土) 21:31:04.81
#include <iostream>
using namespace std;

struct X {
const int x;
X(const int& x): x(x) {}
X(const X&) = delete;
X& operator=(const X&) = delete;
X(X&& rhs): x(move(rhs.x)) {
cout << "called X(X&&)" << endl;
}
X& operator=(X&& rhs) {
cout << "called operator=(X&&)" << endl;
return *this = X(move(rhs));
}
};

int main()
{
X a = X(2);
cout << a.x << endl;
}

・・・誰が呼ばれたの?・・・

151 :デフォルトの名無しさん:2012/05/05(土) 21:53:02.43
>>148
C++相談スレか、初心者向けのスレに行けよ
C++03の仕様すら知らないのに背伸びするな

159 :デフォルトの名無しさん:2012/05/20(日) 12:17:02.83
>>151
ここは C++11/C++1y スレなので C++03 は関係ないし
右辺値参照を使っているレスに頓珍漢なこと言ってんじゃねえ

おまえこそ cfront 1.0 や ARM C++ の知識はあるのか

160 :デフォルトの名無しさん:2012/05/20(日) 13:06:41.48
>>159
は?一つ前の規格ぐらい把握してから来いっつうのは当たり前だろ。
なんでC++お勉強スレでも無いのにそんな一つ前の規格調べれば
わかる内容を、手とり足取り教えなきゃならん。
ここは、新規格部分の内容や影響を話し合う隔離スレだろうが。

>おまえこそ cfront 1.0 や ARM C++ の知識はあるのか
前規格と関係ないだろ理論的に考えられんのか?
そんな思考じゃデバッグも苦手だろプログラマーやめっちまえ

175 :デフォルトの名無しさん:2012/05/21(月) 00:25:24.06
RVOは戻り値最適化であって
ここでは関係なくね

177 :デフォルトの名無しさん:2012/05/23(水) 21:39:13.60
>>175
確かRVO以前の問題で
X object( 10 );と、X object = X( 10 );は
どちらかが構文糖だったはず。
どのコンパイラでもコピコンとか
別のコンストラクターは介入しない
ようになってたと思う。

178 :デフォルトの名無しさん:2012/05/23(水) 21:43:02.71
上の質問、何を気にしているかというと、

・ループの中身を別の関数で書いて
・thread数だけのプールにその関数をぶっこんで
・main内でthreadをjoinする

と書くことはできるだろうけど、
これだけのためにコードをわかりにくくする必要がないと思っていて、
この作業を抽象化したものがWikipediaで言われているthread poolだろう、
そして、それはOpenMPなみに直感的なものになるだろうと思うんだけど。

簡単にそういう高レベルな内容を実装できると思うならアイディアください。

200 :デフォルトの名無しさん:2012/05/25(金) 18:20:26.25
template <class T>
void f(T x){
  [&] {
    auto y = x;
    std::cout << (&x == &y) << std::endl;
  }();
}

int main()
{
  f(0);
}

gcc-4.7 だと true が表示されるんだけど、
これは正しい動作なのか、バグなのか。


202 :デフォルトの名無しさん:2012/05/25(金) 18:25:44.21
>>200
非明示的な型をautoで推論するとconst referenceが最優先されるからバグじゃない。

226 :デフォルトの名無しさん:2012/05/26(土) 20:38:45.93
template <typename T>
auto f = [](const T& x){return x*x;};
名付けて「テンプレートラムダ」

template using ... と似ててよくね?
ここまでやって本当の関数型言語と呼べるだよ(笑)。

229 :デフォルトの名無しさん:2012/05/26(土) 20:42:03.92
>>226
template <typename T> auto f = [](const T& x){return x*x;} + 1;
って書いたら結果どうなるんだよ

239 :デフォルトの名無しさん:2012/05/26(土) 21:33:12.85
http://codepad.org/TW17YYCe
せやろか?

252 :デフォルトの名無しさん:2012/05/26(土) 21:58:58.87
-std=??? や -ansi はそれだけで規格に厳密になるわけじゃなくて
-pedantic-errors をつけないと拡張機能が有効のまま

285 :デフォルトの名無しさん:2012/05/30(水) 22:50:04.77
この初期化ってC++03でいけたっけ?
std::vector<int> v{5,6,4,3,2,6,7,9,3};
某(ピヨピヨ)でサンプルに使われてるんだけど・・・。

287 :デフォルトの名無しさん:2012/05/30(水) 23:09:16.68
ここです
http://www2.research.att.com/~bs/

336 :デフォルトの名無しさん:2012/06/03(日) 12:27:04.88
具体的にテンプレートでどんなふうに使いたいの?

339 :デフォルトの名無しさん:2012/06/03(日) 12:37:13.03
>>336
実際自分で演算子定義して使ってたりすんだけどね

SelfType &ChangeLevel( const Type &level )
{
 if( !( 0 <= level && level <= 8 ) ) throw InvalidValueError<Type>( key );
 this->level = key;
return *this;
}
※浮動少数系の比較演算子にならい、どちらかが数字でないなら
  大小に関わらずfalseに倒れる
  文字列の変換コストが掛かるが、キャッシュしてるので
  2回目以降は速い。


341 :デフォルトの名無しさん:2012/06/03(日) 13:08:28.47
namespace ore
{
  class string: public std::string
  {
  public:
    // 比較演算以外は完全に std::string と互換で相互に変換可
    template <class ...Args>
    string(Args&& ...args): std::string(std::forward<Args>(args)...){}

    // 独自の比較オペレータ
    operator bool() const {
      if(this->empty()) return false;
      if(*this == "false") return false;
      try{ return !!std::stoi(*this); } catch(...){}
      return true;
    }
  };

  // ore::string 独自の演算子定義
  :
}


342 :デフォルトの名無しさん:2012/06/03(日) 13:17:17.12
>>341
突っ込みどころ満載ではあるが、それはともかく標準であることに意義があるんだよ。
自作なら既に出来てる。

345 :デフォルトの名無しさん:2012/06/03(日) 13:24:44.53
>>342
比較時に勝手に(しかも文字列が)変換される具体的な詳細なんて
合意がとれるわけない。

誰でも簡単に小労力で自分の好みに比較を実装できるんだから
好き勝手にやればいい

348 :デフォルトの名無しさん:2012/06/03(日) 13:32:48.03
>>345
インタプリター系言語だと何故合意がとれてるの?

2番目の理由だと、<tuple>とか不要じゃね
一行書けば誰でも作れるじゃん

351 :デフォルトの名無しさん:2012/06/03(日) 13:39:05.44
そして "0" == 0 でtrue/falseどっちを返しても非難gogoですね、わかります

352 :デフォルトの名無しさん:2012/06/03(日) 13:41:30.64
>>348
javascript のバージョンによって、ブラウザによって、
0 == "0" の意味は変わってきた(はず)

それはつまりコンセンサスが取りづらいということ。

363 :デフォルトの名無しさん:2012/06/03(日) 13:57:35.90
型安全じゃないだろ。
少なくともEffective C++にはそう書いてあるようにしか自分には読めなかったが…(不勉強であることは認める)

365 :デフォルトの名無しさん:2012/06/03(日) 13:59:54.11
>>363
あなたの型安全の定義を教えてもらえるかな?
私としては、実行時に型違反に伴うエラーが起きず
コンパイル時にチェックされることだと思ってるけど。

367 :デフォルトの名無しさん:2012/06/03(日) 14:06:21.70
>>365
型安全の定義はそのとおりだが、
10 == "10" という構文を許すためにはどちらかに自動の型変換が必要になる。
自動の型変換(コンストラクタにせよoperatorにせよ)そのものがC++では危険(必ずしも1対1に対応しないケースが往々にして生じる)なので、
この構文を許す機構が型安全でなくなる…というのがEffective C++の主張だったように思う。

369 :デフォルトの名無しさん:2012/06/03(日) 14:23:07.15
>>367
operator Type()の話じゃないの?

比較演算子とか他のオーバーロードとは別物だと思う。
>>339-340にも書いたと思うけど、文字と数値を比較して
文字列に数字以外が混じっていればfalse。これは、
doubleのNaNと同じ動作だから問題にはならない筈で
型安全に問題をきたす事は無いと思うよ。

370 :デフォルトの名無しさん:2012/06/03(日) 14:44:29.13
>>369
ああ、なるほど。
bool operator ==( int, string const & );
bool operator ==( string const &, int );
のような類を記述するってこと?それなら問題ない。
しかし、やはり標準には入れられない。
なぜなら、char*やstringの中に記述された数値列をどう扱うかは
人によって直感的でないから。
これはCording Standardsの主張だったはず。

372 :デフォルトの名無しさん:2012/06/03(日) 14:53:35.11
std::string::compare( int )を許すのなら、std::string::compare( double )も許す必要がある。
他にも数値型はある。std::std::complexや独自のものなど。
これらについての扱いをどうするのか考えなければならない。
さらに、compareだけ対応するのはおかしいので、assignやappend、その他にもこれを許す必要がある。
型*対応メソッドで爆発するから型変換をオーバーロードで(バキューン!)するのは現実的ではない。
だから型変換は別で行ったほうが良い。しかし、オーバーロードの関係上、型変換は明示的に行う必要がある。
明示的に行うということは、明示的に記述するのだが、
問題は、C++で型変換の記述がいまいち一本化されていないところ。
通常はコンストラクタで代用するが、基本型はクラスを持たないし、加えてC++はオープンクラスではないから、
後から拡張することが出来ない。
型変換はコンストラクタで一本化するとして、
後から拡張できるように、
コンストラクタをクラス外にも定義できるようにしてもらいたいところだね。

373 :デフォルトの名無しさん:2012/06/03(日) 15:00:20.51
>>370
了解。「Cording Standards」はこういう名前の文章があるの?
何かの一部に書いてあるの?

>>372
std::istringstreamが対応してる型だけでいいじゃん。
他は、各自対応すればいい。メンバー関数じゃないから拡張できる。

あと、assingやappendは数値型と互換性がないから意味が無いでしょ
元々、数値型と同じテンプレートが使えるってのがメリットなんだし。
数値型にできない事ができてもしかたない。

411 :デフォルトの名無しさん:2012/06/04(月) 21:37:26.28
0 + std::string("10") + std::string("100") == 110 // true
std::string("10") + std::string("100") == 10100 // true

529 :デフォルトの名無しさん:2012/06/30(土) 01:22:17.16
go langの型推論に感動した。
value := 0;
代入式にコロンつけりゃ推論してくれる
なぜC++もこの方式を導入しなかったんだ。

533 :デフォルトの名無しさん:2012/06/30(土) 03:42:26.61
autoあるしね

536 :デフォルトの名無しさん:2012/06/30(土) 16:46:55.89
>>533
autoじゃなくて、:=が良かったって話で。

547 :デフォルトの名無しさん:2012/06/30(土) 18:13:13.48
1言語狂信者が多いな、いつの間にRuby厨みたいなのが増えたんだ・・・

552 :デフォルトの名無しさん:2012/06/30(土) 18:22:44.85
いや一言語至上主義者が増えたな。
昔はC++関係は比較的そういう人が少ない傾向にあった。
複数の言語の中で気に入った言語があるのは良いことだが
他を排斥するようになったら終わりだ。

567 :デフォルトの名無しさん:2012/07/01(日) 21:53:08.56
>>529
そんなん、大昔の VB みたいにスペルミスのバグを防ぐために option explicit つけろってなるよ。
var value = 0; の方がずっといい。

568 :デフォルトの名無しさん:2012/07/01(日) 23:23:58.78
>>567
型推論と動的型付言語の違い分かってる?
VBのアレは、動的型付の禁止だぞ

572 :デフォルトの名無しさん:2012/07/03(火) 07:55:05.47
>>568
俺が何を言ってるのか分からないなら、
??option explicit スペルミス
でググってよ。
value := 0;
(略)
if ( hoge ) {
??valeu := 1;
}
のバグを見栄えで見つけるのが容易とは言い難いという話なんだけど。

575 :デフォルトの名無しさん:2012/07/03(火) 14:39:50.91
valu := 1; は auto valu = 1; ってことだろ
宣言なんだから

585 :デフォルトの名無しさん:2012/07/03(火) 20:02:01.05
scalaで型推論+自動変換でバリバリ持ち回られると激しく混乱してしまうのは
俺がバカなせい?

型推論使う時は明示的なキャストを、自動変換使う時は明示的な型宣言を
強制する方がソースコードは読みやすくなる気がするんだが・・・・・・

587 :uy ◆pdu1UZmweE :2012/07/04(水) 01:30:05.37
>>585
おめでとうございます
よく気づいたな

型推論(笑)をやっていったその先に何があるかというと
動的言語と同じ問題が静的言語でも発生するようになるだけだよ

型推論のせいでタイプ数は減っても、
情報が目に見えなくなるから、可読性が落ちるのもそのひとつ
a := "test"

~数百行~

b := a  ←型推論   bの型なんてわかりゃしねえ

b := bb
c := cc ッ手やるべき場所を

b := cc
c := bb ッ手やってもエラーは起きない
結局これなら中途半端に型推論とかやらないで最初から動的言語使っていたほうがいい
しかしこれから数年間は、変な奴らが型推論型推論あげまくってるから、この中途半端な概念のゴミカス型推論を使いまくった
超超ゴミッカスソースコードが量産されていくんだろうなwwww、そして10~20年後にソース引き継ぐ奴が涙目になるじゃんやったね

639 :デフォルトの名無しさん:2012/07/26(木) 13:53:33.08
本家のGoコンパイラは、C/C++とcalling convention違うからな。
奴らの特殊なCコンパイラ使わないとCのライブラリをリンクできない。
そしてC++のコンパイラはない。
だからwebkitとかC++のライブラリをGoにラップしてポートするのは大変。
悪い言語じゃないと思うが、これじゃ普及は厳しいだろう。

644 :デフォルトの名無しさん:2012/07/26(木) 22:57:53.81
>>639
とは言え実装他にないわけだし
大差なくね?

646 :デフォルトの名無しさん:2012/07/26(木) 23:35:20.60
>>644
意味がわからん
kwsk

648 :デフォルトの名無しさん:2012/07/27(金) 20:17:06.06
>>646
Cとリンクできるコンパイラーしかないんだから、
言語上インターフェースが特殊だろうと関係ないんじゃなかろうか?
厳密にはコンパイラーが一個しか無いわけじゃないけど
同じパッケージで配布されるから実質1ソフトでしょ

658 :デフォルトの名無しさん:2012/07/28(土) 22:15:55.80
constexpr関数の中に書けてコンパイル時にエラーを出す assert があればいいのに、無いね。

659 :デフォルトの名無しさん:2012/07/28(土) 22:21:49.51
>>658
http://stackoverflow.com/questions/8626055/c11-static-assert-within-constexpr-function

664 :デフォルトの名無しさん:2012/08/02(木) 00:22:52.14
pair や tuple で返ってくるのを、
auto (v1,v2,v3) = hoge();
みたいに受け取れないかな。要は多値だけど。

initializer_list じゃなくて、returner_list とか。

689 :デフォルトの名無しさん:2012/08/05(日) 10:29:28.39
ベクトルや複素数や行列のように、
まとまった一つの数と見なすものを除けば、
式の評価値が複数になることって、
数学的にも無い概念だから、
あまり複雑に考えないほうが良いよ。

694 :デフォルトの名無しさん:2012/08/05(日) 14:29:56.86
解が解の公式の答えの事言ってるなら
std::vectorでよくね。
x.size() == 0; //解なし
x.size() == 1; //解1個
x.size() == 2; //解2個

716 :デフォルトの名無しさん:2012/08/08(水) 07:37:15.99
20.7.2.2.1 shared_ptr constructors

template<class Y, class D> shared_ptr(Y* p, D d);
8. ...The copy constructor and destructor of D shall not throw exceptions.
 The expression d(p) shall be well formed, shall have well defined behavior,
 and shall not throw exceptions.

なので、例外投げる削除子を shared_ptr に使ってはいけない。

719 :デフォルトの名無しさん:2012/08/08(水) 08:31:48.50
>>716-717
削除子の呼び出しが例外を投げるかどうかじゃなくて、 712 が聞いてるのは
削除子のコピーが例外を投げるかどうか、だろ。その規定は関係ないよ。

738 :デフォルトの名無しさん:2012/08/13(月) 20:29:38.11
decltype(*this)
ってできないんだね
子クラスの型情報を親クラスで処理したかったのに


756 :デフォルトの名無しさん:2012/08/16(木) 21:26:02.82
$ cat sizeof.c
#include <stdio.h>
int main()
{
printf("%d\n", sizeof('a'));
return 0;
}
$ gcc sizeof.c && ./a.out
4
$ g++ sizeof.c && ./a.out
1

面倒な・・・w



757 :デフォルトの名無しさん:2012/08/16(木) 23:22:01.11
http://www.bohyoh.com/CandCPP/FAQ/FAQ00004.html
C と C++ で違ったのかよ

761 :デフォルトの名無しさん:2012/08/17(金) 01:29:47.81
横からだけど初めて知ったわー
むしろCの方が何故intにしようと思ったんだろう


http://toro.2ch.net/test/read.cgi/tech/1333433900/l50/../人気ブログランキングへ

学ばないブログ
忍者AdMax
記事検索
最新コメント
QRコード
QRコード
  • ライブドアブログ