Passe valeurs de tableau dans un tableau rubis C
-
12-10-2019 - |
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:)
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.