Заполнение вектора строк в C ++ содержимым массива двумерных символов: ошибка, если размер слишком велик - PullRequest
1 голос
/ 29 апреля 2020

Я новичок в программировании на C ++ и пытаюсь написать функцию, которую хочу запустить из R (используя R Cpp).

Внутри функции я создаю массив C символьных строк с нулевым символом в конце.

Функция должна возвращать std :: vector, поэтому я пытаюсь «заполнить» std: : vector с содержимым массива символьных строк.
Это работает (и дает ожидаемый результат), пока массив символьных строк не превысит определенный размер (около полумиллиона); больше и функция вылетает при запуске. Почему?

Кажется, что даже не нужно «заполнять» весь std :: vector - достаточно просто заполнить первый элемент, чтобы вызвать cra sh. Однако, если я заполню первый элемент константной строкой (а не из массива символьных строк), этого не произойдет, и функция с радостью создаст и вернет гораздо большие std :: vectors (например, 100 миллионов строк).

Вот минимальный пример (который я компилирую и запускаю из R с использованием R cpp):

std::vector<std::string> test_function(int vecsize) {
    const char mystring[] = "will I crash or not?";
    char mychararray[ vecsize ][ sizeof(mystring) ];
    int i; for (i=0; i<sizeof(mystring); i++) {
        mychararray[0][i] = mystring[i];
    }
    std::vector<std::string> out_string(vecsize);
    out_string[0]=mychararray[0]; // this line causes crash when vecsize = 500000 or more
    // out_string[0]="like this I dont crash"; // but runs fine using this line instead with vecsize over 100 million
    return out_string;
}

Вызов test_function (100000) - это нормально, но вызов test_function (1000000) завершается сбоем ,

Я предполагаю, что это что-то тривиальное: заранее спасибо за любой совет или объяснение того, что я делаю неправильно.

1 Ответ

1 голос
/ 30 апреля 2020

Я согласен с комментарием Джозефа Вуда. У вас неправильная ментальная модель.

В R символьная переменная также отличается, а вектор ее отличается от числовых c векторов. Но R cpp все еще облегчает работу с ними.

Ниже приведен простой пример работы с матрицей символьных переменных.

Код

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::CharacterMatrix foo(Rcpp::CharacterMatrix x) {
  for (int i=0; i<x.rows(); i++) {
    for (int j=0; j<x.cols(); j++) {
      std::string s(x(i,j));
      s[0] = std::toupper(s[0]);
      x(i,j) = s;
    }
  }
  return x;
}

/*** R
foo(matrix(c("the","quick","brown","fox"),2,2))
*/

Выход

R> Rcpp::sourceCpp("~/git/stackoverflow/61508511/answer.cpp")

R> foo(matrix(c("the","quick","brown","fox"),2,2))
     [,1]    [,2]   
[1,] "The"   "Brown"
[2,] "Quick" "Fox"  
R> 
...