Я учусь использовать язык программирования C и, возможно, возникла проблема с возвратом несовместимых типов указателей.
У меня есть текстовый файл с двумя столбцами, который R считывается как data.frame.После прочтения этого я хочу выполнить .Call для функции в C, которая будет читать этот date.frame и будет возвращать значение для переменной в R, однако при попытке вернуть значение возникает ошибка segfault.Я не могу найти решение этой проблемы, кто-нибудь может мне помочь?
Текстовый файл структурирован в два столбца, как в примере ниже.
Q0045 YJL166W
Q0045 YDL085W
Q0045 YDR119W-A
Вот код C длячтение data.frame.
#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <stdlib.h>
#include <stdio.h>
char **test(SEXP lst){
int i,elLength;
int len = length(lst);
SEXP col1, col2;
char ***target = malloc(sizeof(char **) *len);
col1 = VECTOR_ELT(lst, 0);
col2 = VECTOR_ELT(lst, 1);
elLength = length(col1);
target[0] = malloc(sizeof(char *) * elLength);
target[1] = malloc(sizeof(char *) * elLength);
for (i=0; i<elLength; i++) {
target[0][i] = CHAR(STRING_ELT(col1, i));
target[1][i] = CHAR(STRING_ELT(col2, i));
}
return target;
}
После этого я создаю файл .so с командной строкой в терминале:
R CMD SHLIB test.c
И, наконец, код в R, который читает файл ивыполнить .Call.
dyn.load("/home/lab/test.so")
fileR = data.frame(read.table("file.txt", sep = "\t", stringsAsFactors = FALSE))
fileFromC = .Call("test", fileR)
После этого я получил ошибку, запущенную в R с терминала:
*** caught segfault ***
address 0x310000c0, cause 'memory not mapped'
Если я только печатаю и возвращаю R_NilValue, ошибка не отображается.Но мне нужно вернуть процесс C в новую переменную.