[Rcpp-devel] integer arrays as arguments for a module function
On 12 August 2011 at 16:59, Chris DuBois wrote:
| Point taken: STL looks like the way to go in general. ? | | In my particular example, however, the arrays get immediately cast to another | structure foo (somebody else's code). ?So I need to cast from IntegerVector to | int[] before they get cast to foo[]. ?What you suggested works perfectly (and | makes sense in hindsight). | | Is the story identical for char[]? ?Where x is a CharacterVector, I tried? | | char* a = x.begin(); | | and got | error: cannot convert ?Rcpp::Vector<16>::iterator? to ?char*? in | assignment char can be a pain. It is something C and C++ didn't get quite right by lacking a base type for string. Doing it in plain C (as in *argv[] from main()) is a pain but doable. CharacterVector works as the equivalent of std::vector< std::string >. Out of each element (ie string) you can extract the underlying char* but you may have to rely on strcmp etc. Remember that you may be dealing with pointers of pointers... Have a peek at the unitTests/ directory to see if you find something. Hope this helps, Dirk | Any help much appreciated. | Chris |
| On Fri, Aug 12, 2011 at 3:19 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
| |
| On 12 August 2011 at 14:50, Chris DuBois wrote:
| | Hi all,
| |
| | I'm trying to figure out how to pass in an array of integers to a
| function
| | inside a module. ?For example, adding the following function to
| runit.Module.R
| | works fine:
| |
| | ? ? ? ? int bla3( IntegerVector x ) {
| | ? ? ? ? ? ? ? return sum(x);
| | ? ? ? ? }
| |
| | However, I need to pass an int array, rather than an IntegerVector.
| ?Using int
| | x[] in the arguments doesn't compile (though I'm unfamiliar with C++ in
| | general, so maybe this shouldn't work anyway). ?
| |
| | Alternatively, should I just cast x from an IntegerVector to an int
| array? ?I
| | tried various permutations of as, vector, <int>, etc, and would like to
| learn
| | the proper way of doing this.
|
| You generally do not want old school x[] arrays in C++. Why? ?Because STL
| vectors do _everything_ they do at (essentially) zero added cost, free you
| from malloc/free and still allow you to access the straight memory should
| you
| need to (to talk to a C API, say).
|
| So use IntegerVector for _the interface_. You can the, if you must, do
|
| ? ? IntegerVector x;
|
| ? ? int a1[] = x.begin(); ? ? // STL-style iterator to beginning of
| memory
| ? ? int *a2 ?= x.begin(); ? ? // idem
|
| Hope this helps, ?Dirk
|
| --
| Two new Rcpp master classes for R and C++ integration scheduled for
| New York (Sep 24) and San Francisco (Oct 8), more details are at
| http://dirk.eddelbuettel.com/blog/2011/08/04#
| rcpp_classes_2011-09_and_2011-10
| http://www.revolutionanalytics.com/products/training/public/
| rcpp-master-class.php
|
|
Two new Rcpp master classes for R and C++ integration scheduled for New York (Sep 24) and San Francisco (Oct 8), more details are at http://dirk.eddelbuettel.com/blog/2011/08/04#rcpp_classes_2011-09_and_2011-10 http://www.revolutionanalytics.com/products/training/public/rcpp-master-class.php