こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2012-11-21 18:15:03

QNo.7808965

困ってます

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

表示がくずれるので、空白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;
}

投稿日時 - 2012-11-21 20:17:18

お礼

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

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:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問