小编ore*_*uro的帖子

作为成员变量的lambda函数崩溃

该类montecarlo包含lambda作为成员变量.此代码可以编译,但会在运行时导致"分段错误(核心转储)".你能解释一下如何解决它吗?

#include<random>
#include<functional>
#include<iostream>

class montecarlo
{
  public:
    montecarlo(double x_min, double x_max);
    std::function<double()> rand;
};

montecarlo::montecarlo(double x_min, double x_max){
  std::random_device rd;
  std::mt19937 mt(rd());
  std::uniform_real_distribution<double> rand_(x_min, x_max); 
  rand = [&](){return rand_(mt);};
}

int main(){
  montecarlo x(0, 1);
  std::cout<<x.rand()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

让我想知道的是,当我将构造函数的实现更改为下面的代码时,它工作正常:

montecarlo::montecarlo(double x_min, double x_max){
  rand = [](){return 0;};
}
Run Code Online (Sandbox Code Playgroud)

你可能知道,但让我说我想要做的不仅仅是使用随机函数.

c++ random lambda functional-programming c++11

8
推荐指数
2
解决办法
382
查看次数

嵌套协议的使用(协议的成员也是协议)

考虑一个也用协议注释的 Python 协议属性。我发现在这种情况下,即使我的自定义数据类型遵循嵌套协议,mypy 和 Pyright 都会报告错误。例如,下面的代码Outer遵循协议,因为HasHasA它遵循协议。hasa: HasAInnerHasA

from dataclasses import dataclass
from typing import Protocol

class HasA(Protocol):
    a: int

class HasHasA(Protocol):
    hasa: HasA

@dataclass
class Inner:
    a: int

@dataclass
class Outer:
    hasa: Inner

def func(b: HasHasA): ...

o = Outer(Inner(0))
func(o)
Run Code Online (Sandbox Code Playgroud)

但是,mypy 显示以下错误。

nested_protocol.py:22: error: Argument 1 to "func" has incompatible type "Outer"; expected "HasHasA"  [arg-type]
nested_protocol.py:22: note: Following member(s) of "Outer" have conflicts:
nested_protocol.py:22: note:     hasa: expected "HasA", got "Inner"
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题吗?

python-3.x mypy python-typing pyright

7
推荐指数
1
解决办法
453
查看次数

将 ROS 发布者或订阅者的队列大小设置为较大值的原因

当我查看机器人操作系统(ROS)的教程时,我发现大多数示例代码将发布者的队列大小设置为较大的值,例如1000。我认为这会导致节点失去实时响应。

人们出于什么目的将其设置为那么大的值?

message-queue publisher subscriber ros

6
推荐指数
1
解决办法
1万
查看次数

在 Common Lisp 中同时使用 &amp;rest 和 &amp;key

我希望同时使用&rest,并&key在同一时间。但是,下面的尝试代码:

(defun test (&rest args &key (name "who")) nil)
(test 1 2 3 4 5 :name "hoge")
Run Code Online (Sandbox Code Playgroud)

导致错误:

*** - 测试: (1 2 3 4 5 :NAME "hoge") 中的关键字参数应该成对出现

当我只给出关键字参数时(test :name "hoge"),它就起作用了。是否可以同时使用 &rest 和 &key?

lisp common-lisp variadic-functions keyword-argument

6
推荐指数
2
解决办法
2623
查看次数

如何通过带有索引增量的generate_n填充STL容器

要使用依赖于索引的值填充STL容器,我通常会像下面的代码一样编写.在没有声明索引的情况下有没有办法做同样的事情?

int main(){
  static int N=10;
  auto func = [](int idx){return idx*(idx+1)+1;};
  int idx = -1;
  std::list<int> lst;
  std::generate_n(std::back_inserter(lst), N, [&](){idx++; return func(idx);});
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda stl

5
推荐指数
1
解决办法
218
查看次数

用两个管道包围的关键字符号

假设fun下面的代码中有一个函数,我的目标是expr2在下面进行评估。

(defun fun (&key (x nil)) x)
(defparameter expr1 (list 'fun :x 2))
(defparameter expr2 (list 'fun (intern "x" "KEYWORD") 2))
Run Code Online (Sandbox Code Playgroud)

如预期的那样,(eval expr1)给出了2,但是(eval expr2)给出了类似的错误

***-FUN:非法的关键字/值对:| x |,参数列表中的2。允许的关键字是(:X)下列重新启动可用:ABORT:R1中止主循环

为什么会发生此错误?以及如何解决?

symbols common-lisp

4
推荐指数
2
解决办法
64
查看次数

通过 const 引用后使用 Eigen::Map 发生错误

给我一个错误的代码如下所示。当我从参数类型中删除“const”时,它起作用了。

\n\n
#include<iostream>\n#include<vector>\n#include</usr/include/eigen3/Eigen/Core>\nusing namespace std;\n\nvoid func(const vector<double>& x)\n{\n  Eigen::VectorXd X=Eigen::Map<Eigen::VectorXd>(&x[0], x.size());\n}\n\nint main(){\n  vector<double> x(100);\n  func(x);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误如下。我无法理解。有人可以向我解释一下吗?有没有一种好方法可以用“const”关键字做同样的事情?

\n\n
error: invalid conversion from \xe2\x80\x98const value_type* {aka const double*}\xe2\x80\x99 to \xe2\x80\x98Eigen::Map<Eigen::Matrix<double, -1, 1>, 0, Eigen::Stride<0, 0> >::PointerArgType {aka double*}\xe2\x80\x99 [-fpermissive]\n   Eigen::VectorXd X=Eigen::Map<Eigen::VectorXd>(&x[0], x.size());\n
Run Code Online (Sandbox Code Playgroud)\n

c++ constants pass-by-reference eigen

3
推荐指数
1
解决办法
1553
查看次数

模板特化会导致未定义的引用错误

我尝试了像bellow一样的模板专业化.

#include<iostream>
using namespace std;

template<class T1, class T2>
T1 something(T2 a);

template<class T2>
double something(T2 a){
    double b;
    return b;
}

int main(){
    something<double, double>(0.0);
}
Run Code Online (Sandbox Code Playgroud)

但是,这给了我一个compilatoin错误:

In function `main':
test.cpp:(.text+0x9): undefined reference to `double something<double, double>(double)'
Run Code Online (Sandbox Code Playgroud)

你能告诉我怎么解决吗?

c++ templates template-specialization

3
推荐指数
1
解决办法
82
查看次数

将列表传递给Common Lisp中的宏

我在将列表传递到宏时遇到问题,该列表将用于生成函数名称。例如,下面的代码将导致错误。

(defmacro gen (str-lst)
  `(defun ,(intern (string-upcase (car str-lst))) () (print "foo")))

(gen '("foo" "bar"))
Run Code Online (Sandbox Code Playgroud)

产生的错误是:

***-DEFUN / DEFMACRO:QUOTE是一种特殊的运算符,不能重新定义。可以使用以下重新启动:ABORT:R1
中止主循环

我应该如何修改我的代码,我的代码有什么问题?

令我更加困惑的是,下面的代码(有关答案在此处退出)的运行正常。

(defmacro easy-one (str-lst)
  `(mapc #'(lambda (str) (print str)) ,str-lst))
(easy-one '("foo" "bar"))
Run Code Online (Sandbox Code Playgroud)

lisp macros metaprogramming common-lisp quote

2
推荐指数
1
解决办法
56
查看次数

如何隐藏远程分支而不从远程删除它们

如何隐藏远程分支而不删除它?我经常通过以下方式显示整个提交树

 git log --graph --oneline --all
Run Code Online (Sandbox Code Playgroud)

这当前显示所有远程分支...

git

2
推荐指数
1
解决办法
55
查看次数

在C++ 14中初始化唯一指针向量的正确方法

为了在C++ 14中初始化唯一指针的向量,我可以考虑以下两种方式.哪种方法更好?

#include<memory>
#include<vector>
using namespace std;

int main(){

  const int N = 10000000;

  {//first method
    vector<unique_ptr<int>> vec(N);
    for(auto it=vec.begin(); it!=vec.end();++it){
      auto ptr = make_unique<int>();
      *it = std::move(ptr);
    }
  }

  {//second method
    vector<unique_ptr<int>> vec;
    for(int i=0; i<N; i++){
      vec.push_back(make_unique<int>());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers vector unique-ptr c++14

1
推荐指数
1
解决办法
745
查看次数

使用 malloc 和别名时出现分段错误

以下代码是从我的原始代码中提取的,会导致分段错误。为了进一步调查,我使用了一个调试器,发现*pts[i][j]=...在 i=0 和 j=1 时发生了分段错误。

当我更换*ptsa它运作良好。但是,*pts只是 的别名a,所以我认为行为应该是相同的。有人能告诉我为什么会发生这个错误吗?

#include<stdlib.h>

int main(){
    double*** a;
    int n = 3;
    int m = 3;
    int l = 3;

    a = (double***)malloc(n * sizeof(double**));
    double**** pts = &a;
    for(int i=0; i<n; i++){
        *pts[i] = (double**)malloc(m * sizeof(double*));
        for(int j=0; j<m; j++){
            *pts[i][j] = (double*)malloc(l * sizeof(double));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c malloc pointers

1
推荐指数
1
解决办法
74
查看次数

在Julia中,数组访问的循环很慢

我在一个有和没有数组访问的循环之间做了如下比较,发现两者之间的性能差异很大:1.463677 [sec] vs 0.086808 [sec].

你能解释一下如何通过数组访问改进我的代码以及为什么会这样吗?

@inline dist2(p, q) = sqrt((p[1]-q[1])^2+(p[2]-q[2])^2)
function rand_gen()
    r2set = Array[]
    for i=1:10000
        r2_add = rand(2, 1)
        push!(r2set, r2_add)
    end
    return r2set
end

function test()
    N = 10000
    r2set = rand_gen()
    a = [1 1]
    b = [2 2]

    @time for i=1:N, j=1:N
        dist2(r2set[i], r2set[j])
    end

    @time for i=1:N, j=1:N
        dist2(a, b)
    end
end
test()
Run Code Online (Sandbox Code Playgroud)

julia

0
推荐指数
1
解决办法
247
查看次数