有没有办法让不同编译器构建的c ++ dll相互兼容?这些类可以有工厂方法来创建和销毁,因此每个编译器都可以使用自己的new/delete(因为不同的运行时有自己的堆).
我尝试了以下代码,但它崩溃了第一个成员方法:
interface.h
#pragma once
class IRefCounted
{
public:
virtual ~IRefCounted(){}
virtual void AddRef()=0;
virtual void Release()=0;
};
class IClass : public IRefCounted
{
public:
virtual ~IClass(){}
virtual void PrintSomething()=0;
};
Run Code Online (Sandbox Code Playgroud)
test.cpp用VC9编译,test.exe
#include "interface.h"
#include <iostream>
#include <windows.h>
int main()
{
HMODULE dll;
IClass* (*method)(void);
IClass *dllclass;
std::cout << "Loading a.dll\n";
dll = LoadLibraryW(L"a.dll");
method = (IClass* (*)(void))GetProcAddress(dll, "CreateClass");
dllclass = method();//works
dllclass->PrintSomething();//crash: Access violation writing location 0x00000004
dllclass->Release();
FreeLibrary(dll);
std::cout << "Done, press enter to exit." << …Run Code Online (Sandbox Code Playgroud) 我需要创建一个用于创建逻辑电路和查看结果的应用程序.这主要用于A-Level(英国,一般为16-18岁)计算机课程.
我从来没有做过这样的任何应用程序,所以我不确定存储电路和评估结果的最佳设计(以可重复的速度,比如1.6Ghz单核计算机上的100Hz).
我希望允许这些门用于制作"芯片",然后可以在其他电路中使用(例如,你可能想要制作一个8位),而不是从基本门(和,或者nand等)构建电路.寄存器芯片,或16位加法器).
问题是这些电路的门数大量增加,这样如果模拟工作在每个单独的门上,它将有1000个门进行模拟,所以我需要简化这些可以放在电路中的元件,这样它们就可以了快速模拟.
我考虑为每个组件生成一个真值表,然后模拟可以使用查找表来查找给定输入的输出.虽然这些表的大小随着输入而大量增加,但问题出现了.如果芯片有32个输入,那么真值表需要2 ^ 32行.这在很多情况下使用大量内存比使用更多,因此对于非平凡组件不实用,它也不能用于存储其状态的芯片(例如寄存器),因为它们不能简单地表示为简单投入和产出表.
我知道我可以硬编码注册芯片之类的东西,但是因为这是出于教育目的,我想要它,以便人们可以制作自己的组件,以及查看和编辑标准的实现.我考虑过允许使用代码(例如dll或脚本语言)创建和编辑这些组件,以便例如加法器可以表示为"output = inputA + inputB",但是假设学生已经完成了足够的编程.给定语言能够理解和编写这样的插件来模仿他们的电路结果,这可能不是这样的...
是否有其他方法可以采用布尔逻辑电路并自动简化它,以便模拟可以快速确定组件的输出?
至于存储组件,我正在考虑存储某种树结构,这样一旦评估了链接到其输入的所有组件,就会评估每个组件.
例如,考虑:AB + C模拟器首先评估AND门,然后使用AND门和C的输出来评估OR门.
然而,我刚刚想到,如果输出链接回输入,将导致死锁,因为输入将永远不会被评估...我如何克服这个问题,因为程序只能评估一个门时间?
有没有办法在c ++中做这样的事情,似乎有些因为某种原因不能在那里使用?
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
Run Code Online (Sandbox Code Playgroud) 我需要一个队列来将消息从一个线程(A)传递到另一个线程(B),但是我找不到真正做到我想要的东西,因为它们通常允许添加一个项目失败,这种情况在我的情况下由于需要处理消息,因此线程真的无法停止并等待备用空间,因此非常致命.
我正在使用Doxygen为我的代码生成文档.我需要制作一个PDF版本,并使用Doxygen的LaTeX输出似乎是这样做的方式.
然而,我遇到了许多恼人的问题,并且对LaTeX一无所知以前对如何处理它们并没有太多了解,而且对LaTeX相关事物的无数参考都没有多大帮助......
我研究了如何在sty文件中创建自定义样式的东西以及如何让Doxygen使用它.经过大量的搜索,我发现了如何通过这个设置页边距等,我猜这可能是我想要做的其他事情我想要的文件,但我似乎无法找到任何doign的命令我想要的是 :(
文档开头的目录包含很多项ID,而不是因为它使内容很长.有没有办法限制这个内容只是说前两个级别,而不是每个单独的函数,变量等的条目?我很喜欢保留所有书签.我确实尝试了"COMPACT_LATEX"选项,但除了删除内容页面上的项目外,还删除了每个部分开头的书签和成员列表,我确实希望保留这些内容.
有没有办法改变事物的顺序,比如把完整的类描述放在部分的开头,而不是在所有的成员和属性之后?
在C++ 0x,C++ 03 TR1和boost等函数和绑定之类的东西可以在3个不同的地方定义,具体取决于编译器,例如对于VC pre VC9功能包,你有升级版本,然后你得到它们但是在std :: tr1 :: namespace中,VC10将其移动到std :: namespace.
目前我的现有代码在boost :: namespace exclusivly中使用较旧的boost版本,但是因为对于我的许多应用程序和库,我使用的所有增强内容现在都在tr1和C++ 0x中,如果可能的话,id会删除boost依赖项从那些,同时保持与旧编译器版本的向后兼容性.
但是我不确定如何使我的代码定位,包含然后能够访问正确的版本:(我考虑的一件事是使用像_MSC_VER这样的宏来查看编译器是否包含我想要的类,(退回)到tr1然后根据需要进行提升)然后使用"using somenamespace :: someclass;"来将有问题的类移动到std :: namespace中.
问题是,在某些情况下,这可能会破坏内容,我甚至不确定如何判断VC9是否安装了其功能包或SP1 :(我也不确定是否能够以一种整洁的方式来实现它,也许提供我自己的functional.hpp来完成所需的"魔术"?
最重要的是我想开始编写新标准的代码,但在某种程度上它仍然可以在较旧的编译器上以最小的努力工作.
所以我使用了许多工具来为我的东西创建msi安装程序,包括WiX和几个GUI周围的东西.
但是,我从未真正解决过的一件事是Windows Installer本身实际上做了什么,这些工具在哪里开始和结束?就此而言,msi在技术上究竟是什么,为什么它没有人(我甚至无法找到关于如何在理论上完成它的信息,比如它实际上只是某种类型的DLL类型的东西实现了一个简单的接口)自己创建一个msi,而不使用其中一个工具为它们制作?
该:focus选择器用于在具有焦点的一般意义上的风格元素.但究竟是什么时候应用,考虑鼠标按下或触摸等情况?作为一名Web开发人员,我如何控制它以保持一致?
例如,在stackoverflow上,如果我在其中一个链接上鼠标按下,但是没有激活,通过在释放之前关闭鼠标,链接获得键盘焦点(如按下tab所示,焦点转到下一个链接).然而,:focus即使它具有焦点,它也不会得到风格.如果我选择链接到链接,我会得到:focus大纲样式.
但是在我正在研究的其中一个网站上,鼠标:focus直接给了我风格,所以必须有一些细微的细节.
在这个片段中,Chrome中的元素<a>和<button>我的元素就像我之前的描述一样,可点击的效果<div>似乎与后者类似.但是在我的一个网站上,后者发生在所有3个案例中,我甚至不确定为什么它们在这个片段中并不完全相同,因为我这里没有额外的样式或JS.
$('button').on('click', function() {});
$('.fake-btn').on('click', function() {});Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
<a href="www.example.com">A link</a>
</p>
<p>
<button>A button</button>
</p>
<p>
<div class="fake-btn" tabindex="0">A clickable element</div>
</p>Run Code Online (Sandbox Code Playgroud)
编辑:在IE11中,一切都像GIF中的默认<a>和<button>,包括在我的其他网站上.也许是一个Chrome错误,或者:focus在应用样式时我还缺少一些我想念的规范?伪类CSS规则的顺序是否以某种非显而易见的方式在这里起作用?
我想使用new和delete运算符来创建和销毁我的对象.
问题是python似乎把它分成了几个阶段.tp_new,tp_init和tp_alloc用于创建,tp_del,tp_free和tp_dealloc用于销毁.但是c ++只有new,它分配并完全构造对象和删除对象的析构和解除分配.
我需要提供哪些python tp_*方法以及它们必须做什么?
此外,我希望能够直接在c ++中创建对象,例如"PyObject*obj = new MyExtensionObject(args);" 我是否还需要以某种方式重载新运算符以支持此操作?
我也希望能够在python中继承我的扩展类型,我需要做些什么来支持这个?
我正在使用python 3.0.1.
编辑:好的,tp_init似乎使对象有点太可变了我正在做的事情(例如,取一个Texture对象,在创建后改变内容很好,但改变它的基本方面,如size,bitdept等会破坏许多现有的c ++东西,假设这些东西是固定的).如果我没有实现它,它只会阻止人们在构造之后调用__init__(或者至少忽略调用,就像元组一样).或者,如果在同一个对象上多次调用tp_init,我是否应该有一些抛出异常或某事的标志?
除此之外,我认为其余的大部分已经排序.
extern "C"
{
//creation + destruction
PyObject* global_alloc(PyTypeObject *type, Py_ssize_t items)
{
return (PyObject*)new char[type->tp_basicsize + items*type->tp_itemsize];
}
void global_free(void *mem)
{
delete[] (char*)mem;
}
}
template<class T> class ExtensionType
{
PyTypeObject *t;
ExtensionType()
{
t = new PyTypeObject();//not sure on this one, what is the "correct" way to create an empty type object
memset((void*)t, 0, sizeof(PyTypeObject));
static PyVarObject init = {PyObject_HEAD_INIT, 0}; …Run Code Online (Sandbox Code Playgroud) 我是否正确地假设向std :: map添加/删除元素不会影响其他元素(即使它们在内存中重新定位),以便以下是安全的:
我查看了有关容器信息的各个站点,但只发现了迭代器失效的情况,我已经知道...
std::map<std::string,std::string> map;
PopulateMap(map);
std::string &a= map["x"];
AddMoreData(map);
RemoveRandomKeysExceptX(map);
map["x"] = "foo";
std::cout << a << " " << map["x"] << std::endl;//prints "foo foo"
a = "bar";
std::cout << a << " " << map["x"] << std::endl;//prints "bar bar"
Run Code Online (Sandbox Code Playgroud)
我在VC9上测试了一些类似的代码,但这似乎不起作用,但这并不意味着我不仅仅是幸运,也不是因为编译器没有变化.