アプリ版:「スタンプのみでお礼する」機能のリリースについて

Perlで繰り返し計算をする部分を高速化しようとInline Cを使ってC言語のサブルーチンを作りました。
C言語単体なら、巨大な配列はポインタを使って引き渡すのですが。
Inline Cを使って、PerlからCへの巨大配列の引渡し方法が分かりません(><;
以下のように、リファレンスで渡してポインタで受け取る事もできないし。。。助けてください

use Inline C;

my@data;
for(my $t=0;$t<=10000000;$t++){
$data[$t]=$t;
}

# C言語による処理
my $x = my_function_1(\@data);

print"0から10の合計は$x\n";
__END__
__C__
// サブルーチン_1
long my_function_1(long *data){
long t;
long t1=0;
for(t=0;t<=10000000;t++){
t1=t1+data[t];
}
return t1;
}

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。調べる取っ掛かりが掴めました!
以下の様な感じで実装してみました。

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;
}

お礼日時:2012/11/21 21:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!