小编Bil*_*ter的帖子

如何使用Visual Studio Express 2005创建完全静态链接的.exe?

我目前首选的C++环境是免费且非常出色的Microsoft Visual Studio 2005 Express版本.我不时将发布的.exe文件发送给其他人,结果令人满意.然而,最近我做了一个令人不安的发现,令人愉快的结果是基于我想要的更多运气.试图在一个旧的(2001年份,没有严格更新)XP盒子上运行这些程序之一,只给我一个讨厌的"系统无法运行x.exe"(或类似)消息.

一些谷歌搜索显示,使用此工具集,甚至指定静态链接会导致一个简单的hello-world.exe实际上依赖于额外的.dll文件(msvcm80.dll等).一个非常复杂的版本策划系统(清单文件任何人?)然后将不会让.exe运行没有完全正确的.dll版本.我不想要或不需要这些东西,我只想要一个老式的自包含.exe,除了最低的公分母Win32操作之外什么都不做,并且可以在任何旧的win32操作系统上运行.

有谁知道它是否可以用我现有的工具集做我想做的事情?

谢谢.

c++ linker visual-studio

99
推荐指数
3
解决办法
12万
查看次数

C++递归类型定义是否可行,特别是我可以在T的定义中放置vector <T>吗?

对于我的一个项目,我真正想要做的是(将其简化为最低限度);

struct Move
{
    int src;
    int dst;
};

struct MoveTree
{
    Move move;
    std::vector<MoveTree> variation;
};
Run Code Online (Sandbox Code Playgroud)

我必须承认,我认为不可能直接这样做,我认为MoveTree中的MoveTree矢量将被禁止.但无论如何我都试过了,它的效果非常好.我正在使用Microsoft Visual Studio 2010 Express.

这是便携式吗?这是好习惯吗?我有什么可担心的吗?

编辑:我问了第二个问题,希望能找到一个好方法.

c++

30
推荐指数
3
解决办法
4069
查看次数

我在哪里可以找到8080到x86的汇编程序转换工具?

对于复古计算项目,我需要将20世纪70年代8080汇编语言的主体翻译成x86形式.曾经有一段时间,这样做的工具是英特尔推出80x86系列市场营销的关键部分.但我的谷歌搜索技巧似乎不能找到原始工具或类似的东西.有谁知道这样的工具是否可以在任何地方使用?

编辑

我已经决定添加一些背景信息,以便更清楚我想要做的事情.这是为了普遍的兴趣,也可能是为了更多的反馈.

在之前的一个项目中,我看了20世纪70年代的国际象棋程序Microchess,在作者的祝福下,Peter Jennings在现代机器上运行.彼得在他的网站上讲述了Microchess的故事,并提供了6502汇编语言源.我的贡献现在已添加到故事中,可以在以下位置找到;

http://benlo.com/microchess/microchess9.html

我处理该项目的方法是手动对代码进行最低限度的转换,以便与C语言语义相匹配,例如我对此进行了转换;

        LDY #$0F            ; CALCULATE
        LDA SQUARE          ; POINTS
ELOOP   CMP BK,Y            ; CAPTURED
        BEQ FOUN            ; BY THIS
        DEY                 ; MOVE
        BPL ELOOP
FOUN    LDA POINTS,Y        ;
Run Code Online (Sandbox Code Playgroud)

对此;

        LDYi    (0x0F);     // CALCULATE
        LDA     (SQUARE);   // POINTS
ELOOP:  CMPx    (BK,Y);     // CAPTURED
        BEQ     (FOUN);     // BY THIS
        DEY;                // MOVE
        BPL     (ELOOP);
FOUN:   LDAf    (POINTS,Y);
Run Code Online (Sandbox Code Playgroud)

我创建了匹配所有6502指令的C预处理器宏,例如LDYi()使用(i)mmediate值加载模拟寄存器Y.

一段时间后,我发现一个德国人安德烈·阿德里安已经接受了我的代码,并添加了一个界面,使代码可以从现代国际象棋GUI中驱动.非常酷,我希望我能想到这一点.这可以在他的网站上看到;

http://www.andreadrian.de/schach/index.html

在同一页面上(我使用谷歌翻译),他链接到Sargon的原始版本,另一个经典的国际象棋程序,可能复古的国际象棋经典,并表示希望有人将这个代码恢复生活,就像我做的那样Microchess(我认为无论如何谷歌翻译都是这样说的).好吧,好的,我来这里服务!这次我也不会忽视添加GUI界面,或者我可能会与Andre合作.

Sargon汇编语言在这里;

http://web.archive.org/web/20040217034933/madscientistroom.org/chm/Sargon.html

安德烈删除了一切无关的东西,只留下汇编语言代码;

http://www.andreadrian.de/schach/sargon.asm

现在,情节变浓了.安德烈试图使用模拟器让这些东西自己工作.(编辑3jan2012 - 安德烈已经向前推进了很多,现在您可以在现代PC上运行旧的Sargon代码 - 请参阅下面的答案和上面链接的网站).但是我认为他并不理解这种并发症.Sargon代码实际上是针对Z80的.但是汇编语言不是普通的Z80组装,而是8080汇编,只有英特尔风格的助记符只能用于Z80的说明.一些背景; Zilog Z80是Intel 8080的第三方后代.它使用8080指令集的二进制兼容超集.Zilog决定为Z80提供更清晰,更正交但完全不同(源级)的汇编语言.第三个(第四个?)派对明确认定这是一个糟糕的决定,并制作了另一个英特尔风格的Z80汇编程序,其中Z80扩展以英特尔的方式表达.或者他们可能只是使用现有8080汇编程序的宏功能添加了Z80扩展.没关系; 复杂的是Sargon代码使用了这个相当奇怪的混合汇编程序. …

x86 assembly retro-computing

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

这个改组算法有什么问题吗?

我一直在做一些休闲度假计算.我的迷你项目是对意大利"tomboli"游戏的模拟.一个关键的构建模块是对以下过程的模拟;

游戏由一个男人控制,一袋90个大理石,编号为1到90.他从包里随机抽出弹珠,每次都给玩家打出大理石号码.

经过一番思考后,我为这个构建块编写了以下代码;

// NBR marbles, numbered 1...NBR are in a bag. Simulate randomly
//  pulling them from the bag, one by one, until the bag is empty
void bag( int random_sequence[NBR] )
{
    int i;

    // Store each marble as it is pulled out
    int *store = random_sequence;

    // Array of marbles still in the bag
    int not_yet_pulled[NBR];
    for( i=0; i<NBR; i++ )
        not_yet_pulled[i] = i+1;    // eg NBR=90; 1,2,3 ... 90

    // Loop pulling marbles from the bag, …
Run Code Online (Sandbox Code Playgroud)

c c++ random algorithm simulation

4
推荐指数
3
解决办法
1783
查看次数

如何在C++中模拟递归类型定义?

昨天我问了以下问题,为方便起见,转载于此;

"对于我的一个项目,我真正想做的就是这样做(将其简化为最低限度);

struct Move
{
    int src;
    int dst;
};

struct MoveTree
{
    Move move;
    std::vector<MoveTree> variation;
};
Run Code Online (Sandbox Code Playgroud)

我必须承认,我认为不可能直接这样做,我认为MoveTree中的MoveTree矢量将被禁止.但无论如何我都试过了,它的效果非常好.我正在使用Microsoft Visual Studio 2010 Express.

这是便携式吗?这是好习惯吗?我有什么值得担心的吗?"

基本上社区的答案是否定的,我不能这样做,标准禁止它,所以它有效的事实意味着我很幸运.

所以我的新问题是.如何在合法的C++中实现我想要的简单功能,而不会增加一堆令人讨厌的复杂性和痛苦?

c++ design-patterns

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

在这个例子中,使用C++赋值运算符而不是复制构造函数?

作为尝试升级我的C++技能的持续过程的一部分,我试图打破一些旧的习惯.我的老学校C程序员倾向于写这个;

void func( Widget &ref )
{
    Widget w;  // default constructor
    int i;
    for( i=0; i<10; i++ )
    {
        w = ref;  // assignment operator 
        // do stuff that modifies w
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但我认为以下内容更接近最佳实践;

void func( Widget &ref )
{
    for( int i=0; i<10; i++ )
    {
        Widget w = ref; // ??
        // do stuff that modifies w
    }
}
Run Code Online (Sandbox Code Playgroud)

至少使用我的Widget类,这很好用.但我不完全明白为什么.我有两个理论;

1)复制构造函数运行10次.
2)复制构造函数运行一次,然后赋值运算符运行9次.

这些都让我有点麻烦.2)特别是看似人为和错误.我错过了第三种可能性吗?

c++

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