
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;
}
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;
}
ありがとうございます。調べる取っ掛かりが掴めました!
以下の様な感じで実装してみました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- 英語 「UNCE」って? 3 2022/09/20 12:18
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
要素を削除する最適な方法
-
perlで複数行のデータを自由に...
-
vba dir の相対パス
-
VBAで巨大なファイルの途中から...
-
エクセルVBA コードが同じでも...
-
CSVが可変長の場合の検索方法
-
MATLAB グローバル変数の宣言
-
VBAでCSVファイルを途中行まで...
-
合致する番号のデータを抽出す...
-
window.open でのファイル指定方法
-
Perlのワンライナーをスクリプ...
-
batファイルでrenameができませ...
-
タブの色を変更する方法
-
Perlで特定行から特定行までを...
-
close()で例外が投げられる理由
-
Perlで特定文字列から特定文字...
-
VBAでCSVファイルの特定行を書...
-
MATLABのm-fileについて
-
C言語で特定の行を抽出する方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
perlで複数行のデータを自由に...
-
Visual C++を用いたシリアル通信
-
PerlでInline Cを使った配列の...
-
<IN>; を単独で使う
-
Pythonの再帰関数の動作の流れ...
-
pushをすると行ができる
-
時刻表を分でソートする方法を...
-
2次元の配列にデータを格納したい
-
行・列の整理! perl
-
C言語でバイナリファイルの読み...
-
単純なお問い合わせフォーム
-
perl-cgi 文字の長さでソートし...
-
C言語のバイナリモードでのfsca...
-
数字のソート
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
ExcelをCSV書き出す場合のシー...
おすすめ情報