julia Cxx пакетное поведение в модуле - PullRequest
1 голос
/ 08 октября 2019

Я использую Julia 1.1.1 и версию 0.3.2 Cxx. Я обнаружил, что получаю сообщение об ошибке при вызове icxx "" из модуля, который я определил, но не при вызове его в REPL. В REPL у меня есть:

using Cxx

function xformVectors()

cxx"""
#include <iostream>
#include <vector>

class Summer {
public:
    Summer() {}
    std::vector<int> compute_sum(const std::vector<std::vector<int>> &input) {
        std::vector<int> result(input.size(), 0);
        for (std::size_t i = 0; i != input.size(); ++i) {
            for (std::size_t j = 0; j != input[i].size(); ++j) {
               result[i] += input[i][j];
            }
        }
        return result;
    }
};
"""
    as = [rand(1:10,5), rand(1:10,6)]
    x = convert(cxxt"std::vector< std::vector< int > >", as)
    summer = @cxxnew Summer()
    cxx_v = icxx"$summer->compute_sum($x);"
    for v in cxx_v
        println(collect(v))
    end

end

Если я тогда позвоню xformVectors(), он записывает пару целых чисел и выходит (ожидаемое поведение). Если я использую Pkg.generate () для обертывания этого кода в модуле, а затем вызываю xformVectors(), я получаю фатальную ошибку:

ERROR: BoundsError: attempt to access 36-element Array{Tuple{AbstractString,Symbol,Int64,Int64,Bool},1} at index [37]
Stacktrace:
 [1] getindex(::Array{Tuple{AbstractString,Symbol,Int64,Int64,Bool},1}, ::Int64) at ./array.jl:729
 [2] #s37#70 at /home/jov9025/.julia/packages/Cxx/vxYtJ/src/cxxstr.jl:705 [inlined]
 [3] #s37#70(::Any, ::Any, ::Any, ::Any) at ./none:0
 [4] (::Core.GeneratedFunctionStub)(::Any, ::Vararg{Any,N} where N) at ./boot.jl:522
 [5] xformVectors() at /home/jov9025/sandbox/julia/Vector2Vector.jl/src/Vector2Vector.jl:30
 [6] top-level scope at none:0

Если в REPL я включаю исходный файл (include("src/Vector2Vector.jl"), а затем позвоните Vector2Vector.xformVectors(), он работает без жалоб.

Есть идеи, что происходит?

1 Ответ

0 голосов
/ 15 октября 2019

Строка в моем коде, где возникла ошибка, была:

cxx_v = icxx"$summer->compute_sum($x);" 

Я до сих пор не понимаю, в чем проблема с icxx "", но на самом деле мне не нужно использовать это в этомобразец (или в моем реальном коде). Я могу просто использовать макрос @cxx и вуаля, без сбоев:

cxx_v = @cxx compute_sum(x)

Так что, возможно, я задавал неправильный вопрос (хотя я думаю, что он интересный).

...