
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ランキング
-
パラメーターについて
-
どのようなプログラムをつくれ...
-
perlでの三次元配列の作り方
-
Perlでのforeach文の挙動がわか...
-
CSVファイルのフォーマット
-
このスクリプトの意味を教えて...
-
GDモジュールについて
-
文字列の抽出がうまくできません
-
ファイルの読み込みと置き換え
-
パスから最後のディレクトリだ...
-
FlashよりLoadVarsクラスを使用...
-
番号をつける
-
ExcelをCSV書き出す場合のシー...
-
「パスが見つかりません」とい...
-
シュワルツ変換の不具合
-
ディレクトリー内のリスト出力...
-
外部サーバーにあるファイルを...
-
絶対+相対アドレスから絶対ア...
-
[perl5.8] SJISで出力したはず...
-
telnet接続
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlでのテキスト処理について
-
PerlでInline Cを使った配列の...
-
[arduino]数値の大きなデータを...
-
逆順ソートのやりかた
-
単純なお問い合わせフォーム
-
配列のソートについて質問です。
-
2次元の配列にデータを格納したい
-
Perlの初歩的な質問・・・
-
配列の中に重複文字列があるか...
-
CSVデータ「","」と「,」混在読...
-
配列について
-
<IN>; を単独で使う
-
Visual C++を用いたシリアル通信
-
数十件あるデータを10件だけ表...
-
perlの無名配列の使い方を教え...
-
データの日付でソートをしたい
-
pandasでまとめてインデックス...
-
頻度表の作成(Perl初心者です)
-
要素を削除する最適な方法
-
数字のソート
おすすめ情報