小编Fir*_*cer的帖子

编译器之间的DLL兼容性

有没有办法让不同编译器构建的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)

c++ compiler-construction dll binary-compatibility

9
推荐指数
4
解决办法
7266
查看次数

创建逻辑门模拟器

我需要创建一个用于创建逻辑电路和查看结果的应用程序.这主要用于A-Level(英国,一般为16-18岁)计算机课程.

我从来没有做过这样的任何应用程序,所以我不确定存储电路和评估结果的最佳设计(以可重复的速度,比如1.6Ghz单核计算机上的100Hz).

我希望允许这些门用于制作"芯片",然后可以在其他电路中使用(例如,你可能想要制作一个8位),而不是从基本门(和,或者nand等)构建电路.寄存器芯片,或16位加法器).

问题是这些电路的门数大量增加,这样如果模拟工作在每个单独的门上,它将有1000个门进行模拟,所以我需要简化这些可以放在电路中的元件,这样它们就可以了快速模拟.

我考虑为每个组件生成一个真值表,然后模拟可以使用查找表来查找给定输入的输出.虽然这些表的大小随着输入而大量增加,但问题出现了.如果芯片有32个输入,那么真值表需要2 ^ 32行.这在很多情况下使用大量内存比使用更多,因此对于非平凡组件不实用,它也不能用于存储其状态的芯片(例如寄存器),因为它们不能简单地表示为简单投入和产出表.

我知道我可以硬编码注册芯片之类的东西,但是因为这是出于教育目的,我想要它,以便人们可以制作自己的组件,以及查看和编辑标准的实现.我考虑过允许使用代码(例如dll或脚本语言)创建和编辑这些组件,以便例如加法器可以表示为"output = inputA + inputB",但是假设学生已经完成了足够的编程.给定语言能够理解和编写这样的插件来模仿他们的电路结果,这可能不是这样的...

是否有其他方法可以采用布尔逻辑电路并自动简化它,以便模拟可以快速确定组件的输出?

至于存储组件,我正在考虑存储某种树结构,这样一旦评估了链接到其输入的所有组件,就会评估每个组件.

例如,考虑:AB + C模拟器首先评估AND门,然后使用AND门和C的输出来评估OR门.

然而,我刚刚想到,如果输出链接回输入,将导致死锁,因为输入将永远不会被评估...我如何克服这个问题,因为程序只能评估一个门时间?

boolean-logic

9
推荐指数
2
解决办法
6024
查看次数

C++在宏条件中获取类型的大小

有没有办法在c ++中做这样的事情,似乎有些因为某种原因不能在那里使用?

#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
Run Code Online (Sandbox Code Playgroud)

c++ macros sizeof

8
推荐指数
3
解决办法
4383
查看次数

多线程单读者单写入器fifo队列

我需要一个队列来将消息从一个线程(A)传递到另一个线程(B),但是我找不到真正做到我想要的东西,因为它们通常允许添加一个项目失败,这种情况在我的情况下由于需要处理消息,因此线程真的无法停止并等待备用空间,因此非常致命.

  • 只有线程A添加项目,只有线程B读取它们
  • 线程A必须永远不会阻塞,但线程B不是性能关键,所以它可以
  • 添加项必须始终成功,因此队列不能具有大小上限(缺少系统内存不足)
  • 如果队列为空,则线程B应该等待,直到有一个要处理的项目

c++ linux windows multithreading message-queue

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

控制Doxygen的LaTeX输出以制作PDF文档

我正在使用Doxygen为我的代码生成文档.我需要制作一个PDF版本,并使用Doxygen的LaTeX输出似乎是这样做的方式.

然而,我遇到了许多恼人的问题,并且对LaTeX一无所知以前对如何处理它们并没有太多了解,而且对LaTeX相关事物的无数参考都没有多大帮助......

我研究了如何在sty文件中创建自定义样式的东西以及如何让Doxygen使用它.经过大量的搜索,我发现了如何通过这个设置页边距等,我猜这可能是我想要做的其他事情我想要的文件,但我似乎无法找到任何doign的命令我想要的是 :(

  1. 文档开头的目录包含很多项ID,而不是因为它使内容很长.有没有办法限制这个内容只是说前两个级别,而不是每个单独的函数,变量等的条目?我很喜欢保留所有书签.我确实尝试了"COMPACT_LATEX"选项,但除了删除内容页面上的项目外,还删除了每个部分开头的书签和成员列表,我确实希望保留这些内容.

  2. 有没有办法改变事物的顺序,比如把完整的类描述放在部分的开头,而不是在所有的成员和属性之后?

documentation latex pdf-generation doxygen

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

使用可能在几个不同位置定义的函数等C++类

在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来完成所需的"魔术"?

最重要的是我想开始编写新标准的代码,但在某种程度上它仍然可以在较旧的编译器上以最小的努力工作.

c++ tr1 c++11

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

Windows Installer本身实际上做了什么,为什么我没有看到没有第三方工具的msi?

所以我使用了许多工具来为我的东西创建msi安装程序,包括WiX和几个GUI周围的东西.

但是,我从未真正解决过的一件事是Windows Installer本身实际上做了什么,这些工具在哪里开始和结束?就此而言,msi在技术上究竟是什么,为什么它没有人(我甚至无法找到关于如何在理论上完成它的信息,比如它实际上只是某种类型的DLL类型的东西实现了一个简单的接口)自己创建一个msi,而不使用其中一个工具为它们制作?

windows windows-installer

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

CSS控制何时应用:焦点选择器

: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规则的顺序是否以某种非显而易见的方式在这里起作用?

html css focus css-selectors

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

Python C-API对象分配

我想使用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)

c c++ python python-c-api python-3.x

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

C++在std :: map中存储对值的引用

我是否正确地假设向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上测试了一些类似的代码,但这似乎不起作用,但这并不意味着我不仅仅是幸运,也不是因为编译器没有变化.

c++ reference stdmap

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