该类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)
你可能知道,但让我说我想要做的不仅仅是使用随机函数.
考虑一个也用协议注释的 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)
我的代码有什么问题吗?
当我查看机器人操作系统(ROS)的教程时,我发现大多数示例代码将发布者的队列大小设置为较大的值,例如1000。我认为这会导致节点失去实时响应。
人们出于什么目的将其设置为那么大的值?
我希望同时使用&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?
要使用依赖于索引的值填充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) 假设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中止主循环
为什么会发生此错误?以及如何解决?
给我一个错误的代码如下所示。当我从参数类型中删除“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}\nRun Code Online (Sandbox Code Playgroud)\n\n错误如下。我无法理解。有人可以向我解释一下吗?有没有一种好方法可以用“const”关键字做同样的事情?
\n\nerror: 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());\nRun Code Online (Sandbox Code Playgroud)\n 我尝试了像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)
你能告诉我怎么解决吗?
我在将列表传递到宏时遇到问题,该列表将用于生成函数名称。例如,下面的代码将导致错误。
(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) 如何隐藏远程分支而不删除它?我经常通过以下方式显示整个提交树
git log --graph --oneline --all
Run Code Online (Sandbox Code Playgroud)
这当前显示所有远程分支...
为了在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) 以下代码是从我的原始代码中提取的,会导致分段错误。为了进一步调查,我使用了一个调试器,发现*pts[i][j]=...在 i=0 和 j=1 时发生了分段错误。
当我更换*pts由a它运作良好。但是,*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) 我在一个有和没有数组访问的循环之间做了如下比较,发现两者之间的性能差异很大: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)