将 ruby​​ 数组值传递到 C 数组

2024-04-12

我正在尝试为 C 中的 ruby​​ 制作一个独立的 FFT 扩展,基于这个食谱 http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-in-under-5-minutes-100.html

我已经注意到在 ruby​​ 和 c 之间传递不同值的几种方法。然而,我对 ruby​​ 和 C 都相当陌生,无法弄清楚如何将数组从 VALUE ruby​​ 对象复制到 C 数组中。

编译错误: SimpleFFT.c:47: 错误:下标值既不是数组也不是指针

和代码:

#include "ruby.h"
#include "fft.c" // the c file I wish to wrap in ruby

VALUE SimpleFFT = Qnil;
void Init_simplefft();
VALUE method_rfft(VALUE self, VALUE anObject);

void Init_simplefft() {
    SimpleFFT = rb_define_module("SimpleFFT");
    rb_define_method(SimpleFFT, "rfft", method_rfft, 1);
}

VALUE method_rfft(VALUE self, VALUE inputArr) {
    int N = RARRAY_LEN(inputArr); // this works :)

    // the FFT function takes an array of real and imaginary paired values
    double (*x)[2] = malloc(2 * N * sizeof(double)); 
    // and requires as an argument another such array (empty) for the transformed output
    double (*X)[2] = malloc(2 * N * sizeof(double));

    for(i=0; i<N; i++) {
        x[i][0]=NUM2DBL(inputArr[i]); // ***THIS LINE CAUSES THE ERROR***
        x[i][1]=0;  // setting all the imaginary values to zero for simplicity
    }

    fft(N, x, X); // the target function call

    // this bit should work in principle, dunno if it's optimal
    VALUE outputArr = rb_ary_new();
    for(i=0; i<N; i++){
        rb_ary_push(outputArr, DBL2NUM(X[i][0]));
    }

    free(x);
    free(X);

    return outputArr;
}

提前致谢 :)


您不能添加下标inputArr因为它是一个VALUE而不是 C 数组。即,它是标量类型。要访问特定索引,请使用

rb_ary_entry(inputArr, i)

顺便说一句,您可能想首先验证它是否是一个数组:

Check_Type(rarray, T_ARRAY);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ruby​​ 数组值传递到 C 数组 的相关文章

随机推荐