- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PerlでInline Cを使った配列の引渡し)
PerlでInline Cを使った配列の引渡し
このQ&Aのポイント
- Perlで繰り返し計算を高速化するためにInline Cを使用してC言語のサブルーチンを作成します。
- しかし、PerlからCへの巨大配列の引渡し方法が分からず困っています。
- リファレンスで渡してポインタで受け取ることもできないため、助けが必要です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
表示がくずれるので、空白2文字を全角空白にしていることに注意。 なお、 0 .. 10000000 の和は long で表現できないので、 double に加算しています。 #!/usr/bin/perl use strict; use warnings; use feature 'say'; use Inline C => 'DATA'; my @data = (0 .. 10000000); my $ret = add(\@data); say $ret; __DATA__ __C__ #include <stdio.h> double add(SV* array_ref) { int i; int len; double sum; AV *av_ptr; SV **num_ptr; sum = 0; av_ptr = (AV*)SvRV(array_ref); len = av_len(av_ptr) + 1; for (i = 0; i < len; i++) { num_ptr = av_fetch(av_ptr, i, 0); sum += SvIV(*num_ptr); } return sum; }
お礼
ありがとうございます。調べる取っ掛かりが掴めました! 以下の様な感じで実装してみました。 use Inline C; my @data; for(my $t=0;$t<=10000000;$t++){ $data[$t]=$t; } # C言語による処理 my $x = my_function_1(@data); print "合計は$x\n"; __END__ __C__ // サブルーチン_1 double my_function_1(long value, ...){ Inline_Stack_Vars; long t; double t1=0; for(t=0;t<=10000000;t++){ t1=t1+SvIV(Inline_Stack_Item(t)); } return t1; }