我有一个代表有限状态机的类,它应该在永久循环中运行并检查它的当前状态.在每个状态机器中将设置它的下一个状态,或者进入idle
状态或做一些工作.我想允许另一个线程在它运行时改变机器的状态.这将导致预期的竞争条件.所以我添加了一个互斥锁定/解锁包装循环的机器和公共方法,允许其他线程改变机器的当前状态.
class Robot
{
public:
enum StateType {s1,s2,s3,idle,finish};
void run();
void move();
private:
StateType currentState;
StateType nextState;
StateType previousState;
std::mutex mutal_state;
};
Run Code Online (Sandbox Code Playgroud)
执行:
void Robot::run()
{
this->currentState = s1;
while(true)
{
mutal_state.lock();
switch(currentState)
{
case s1:
// do some useful stuff here...
currentState = idle;
nextState = s3;
break;
case s2:
// do some other useful stuff here...
currentState = idle;
nextState = finish;
break;
case s3:
// again, do some useful things...
currentState = idle;
nextState = …
Run Code Online (Sandbox Code Playgroud) 我需要在我的项目中加载和存储3d模型,并在OpenGL场景中渲染它们.我可以选择要导出的模型类型.dwg,max,step和其他一些格式可用.刚刚发现OpenGL是低级API,并且不包含任何解析3d模型文件的工具.我正在寻找一些库/ API来将3d文件结构转换为OpenGL基元(或其他一些原始数据)并将它们存储回具有指定格式的文件中.
例如,我想加载一个步骤文件,旋转和缩放一些对象,然后保存修改后的文件.
标题说明了所有.我将为具有默认值的类的成员函数添加一个参数.这个论点属于非平凡的类型.这会破坏ABI吗?假设我的新库版本将会出现M.m.0
,并且应该可以作为所有使用的链接应用程序的替代品M.m-1.x
.
示例代码:
// These are some classes: base and child : public base
/* Version 1.2.3 */
class foo() {
public:
void do_that_stuff(const std::string a);
}
/* Version 1.3.0 */
class foo() {
public:
void do_that_stuff(const std::string a, const base& b = base());
}
Run Code Online (Sandbox Code Playgroud)
PS:我做了自己的测试,并且它正在运行.只是不能确定
一个学习纯数学的朋友让我考虑下面的问题.
假设有一个名为X的算法有2个输入:A和a_1 ... a_n,其中'A'代表仲裁算法,'a_1..a_n'是A的输入.X接收A及其输入和返回如果带有a_1..a_n的A可以终止,则返回true;如果带有a_1..a_n输入的A落入无限循环(永不结束),则返回false.像这样:
A(n):
while(n<5):
write "I'm immortal!"
Run Code Online (Sandbox Code Playgroud)
结果X(A,6)
是真实的,X(A,2)
是假的.
那结果是X(X,X)
什么?
另外,你知道谁是第一个引入这个问题的人吗?
经过一个小时深入思考后编辑:你能看到一些与Russel悖论相当的东西吗?
我正在尝试按照此处描述的指令在Ubuntu 11.10上编译OpenCV版本2.3.1 .我收到了以下错误.无法理解发生了什么...... /usr/local/lib/libavcodec.a
存在但链接器无法链接它或其他东西?
错误:
[ 20%] Built target pch_Generate_opencv_highgui
Linking CXX shared library ../../lib/libopencv_highgui.so
/usr/bin/ld: /usr/local/lib/libavcodec.a(avpacket.o): relocation R_X86_64_32S against `av_destruct_packet'
can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用flex
和bison
在我的项目中为文件结构生成解析器代码.主要编程语言是C++,项目主要是并行运行的OO设计.
我听说flex
并且bison
生成的解析器是C代码,它们不是重新检测的.谷歌搜索,我发现flex++
和bisonc++
.不幸的是,没有简单的入门教程.大多数例子都是基于bison/flex
.有些人以某种方式将bison/flex
解析器集成到他们的C++代码中.他们应该"狡猾"......
文档,flex++
并bisonc++
没有帮助我和.教程和示例,它们都从stdin获取输入并在stdout上打印一些消息.
我在解析器中需要这些功能:
std::string
或std::stringstream
或空终止char*
.我感到很困惑.我应该使用flex++/bisonc++
或flex/bison
?如何做到这一点,满足上述条件?
是否有标准实现打印std::duration
为人类可读的持续时间?
steady_clock::time_point start = steady_clock::now();
doSomeFoo();
steady_clock::time_point end = steady_clock::now();
std::cout << "Operation took "
<< may_be_std::theMagic(start-end) << std::endl;
Run Code Online (Sandbox Code Playgroud)
哪个应该打印类似于:
"Operation took 10d:15h:12m:14:s"
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
我是python的新手.我想写一个带有两个键作为索引器的类.还需要能够在类中使用它们,如下所示:
a = Cartesian(-10,-10,10,10) # Cartesian is the name of my class
a[-5][-1]=10
Run Code Online (Sandbox Code Playgroud)
在笛卡尔类中:
def fill(self,value):
self[x][y] = x*y-value
Run Code Online (Sandbox Code Playgroud)
我试着用
def __getitem__(self,x,y):
return self.data[x-self.dx][y-self.dy]
Run Code Online (Sandbox Code Playgroud)
但不起作用.
在我们的项目中,我们使用QtTestLib进行单元测试.原因是整个项目在可能的情况下已经使用Qt并且它是一个GUI应用程序,因此我们希望能够测试GUI界面.
我们的项目是由MSVC编译的,所以我们不希望每个测试都有一个单独的项目文件,因为它会使解决方案变得混乱.因此,我们为所有测试创建了一个项目.所有测试都应该在CIS上自动进行(持续集成),因此我们尝试使用一些XSLT转换通过XML格式的输出文件将测试插入Hudson.
但似乎测试输出存在问题.如果对所有测试使用单个main(),并且仅向每个测试传输cmd行参数:
#include "MyFirstTest.h"
#include "MySecondTest.h"
int main(int argc, char **argv)
{
int result = 0;
MyFirstTest test1;
result |= QTest::qExec(&test1, argc, argv);
MySecondTest test2;
result |= QTest::qExec(&test2, argc, argv);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到一个多次重写的结果文件.因此,如果您想使用输出文件(例如xml)稍微自动化它,您将只获得其中的最后结果.所有其他都将被覆盖.
我们已经尝试过这种方法,它不能让你使用像Hudson这样的连续集成系统.所以我的问题是:有没有机会在一个输出文件中附加结果?当然,我们可以使用一些解决方法,例如通过QTest :: qExec()运行每个测试,并使用修改后的参数将结果写入单独的文件,但这似乎不是最好的方法.理想情况下,我希望有一个结果文件与CIS一起使用.
我正在编写一种分布式搜索算法,其中代理需要在TCP套接字上侦听传入连接.在某些时候,代理应绑定一个空闲的TCP端口.端口号并不重要,但代理应将其侦听端口号发送给其他代理.
我想这是正确的做法:
socket.bind("tcp://*:0");
Run Code Online (Sandbox Code Playgroud)
套接字成功绑定但是,如何获取套接字绑定的端口号?我在zmq_getsockopt
页面返回端口号时看不到任何选项代码.