Question

Je suis en train de faire une extension autonome FFT pour le rubis en C, basé sur cette recette

Je l'ai noté plusieurs méthodes pour passer des valeurs différentes entre rubis et c. Cependant im assez nouveau à la fois rubis et C et ne peut pas travailler comment copier un tableau à partir d'un objet rubis valeur dans un tableau C.

L'erreur de compilation: SimpleFFT.c: 47: Erreur: valeur indicer est ni tableau, ni pointeur

Et le code:

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

Merci à l'avance:)

Était-ce utile?

La solution

Vous ne pouvez pas parce que ce inputArr indice est un VALUE plutôt qu'un tableau C. -À-dire, il est un type scalaire. Pour accéder à un index particulier, l'utilisation

rb_ary_entry(inputArr, i)

En aparté, vous voudrez peut-être vérifier d'abord que c'est un tableau:

Check_Type(rarray, T_ARRAY);

Autres conseils

ressemble à répondre à la question (et double vérifier mes sources) m'a aidé à trouver la réponse.

remplaçant:

    rb_ary_push(outputArr, DBL2NUM(X[i][0]));

avec:

    x[i][0]=NUM2DBL(rb_ary_pop(inputArr));

semblait faire l'affaire:)

Je suis encore je me demande si cela est le moyen le plus efficace de faire les choses, mais cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top