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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Pythonの再帰関数の動作の流れ...
-
どのようなプログラムをつくれ...
-
配列のサイズを動的に拡張
-
batファイルでrenameができませ...
-
エラー 'dir.h' : No such fi...
-
HTMLのフォームで画像と文...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
Perlの変数に文字数制限(容量...
-
readdir()で得られるファイル・...
-
ファイル全てを .xlsm に変更し...
-
while(<ハンドラ>) {} で行数を...
-
パスから最後のディレクトリだ...
-
テキストデータから指定した1...
-
一定時間が経過したフォルダの削除
-
htaccessで特定のディレクトリ...
-
ReadLineでの読み出し行を指定する
-
1行がやたら長いテキストをバッ...
-
while文がうまく動かない
-
chdirがうまくできない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
C言語のバイナリモードでのfsca...
-
データの日付でソートをしたい
-
perlで複数行のデータを自由に...
-
perl-cgi 文字の長さでソートし...
-
Visual C++を用いたシリアル通信
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
VBAで巨大なファイルの途中から...
-
Perlで特定行から特定行までを...
-
ReadLineでの読み出し行を指定する
-
エクセルVBAで素数だけを出力す...
おすすめ情報