• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PerlでInline Cを使った配列の引渡し)

PerlでInline Cを使った配列の引渡し

このQ&Aのポイント
  • Perlで繰り返し計算を高速化するためにInline Cを使用してC言語のサブルーチンを作成します。
  • しかし、PerlからCへの巨大配列の引渡し方法が分からず困っています。
  • リファレンスで渡してポインタで受け取ることもできないため、助けが必要です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; }

WEB_scientist
質問者

お礼

ありがとうございます。調べる取っ掛かりが掴めました! 以下の様な感じで実装してみました。 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; }

関連するQ&A