我目前首选的C++环境是免费且非常出色的Microsoft Visual Studio 2005 Express版本.我不时将发布的.exe文件发送给其他人,结果令人满意.然而,最近我做了一个令人不安的发现,令人愉快的结果是基于我想要的更多运气.试图在一个旧的(2001年份,没有严格更新)XP盒子上运行这些程序之一,只给我一个讨厌的"系统无法运行x.exe"(或类似)消息.
一些谷歌搜索显示,使用此工具集,甚至指定静态链接会导致一个简单的hello-world.exe实际上依赖于额外的.dll文件(msvcm80.dll等).一个非常复杂的版本策划系统(清单文件任何人?)然后将不会让.exe运行没有完全正确的.dll版本.我不想要或不需要这些东西,我只想要一个老式的自包含.exe,除了最低的公分母Win32操作之外什么都不做,并且可以在任何旧的win32操作系统上运行.
有谁知道它是否可以用我现有的工具集做我想做的事情?
谢谢.
对于我的一个项目,我真正想要做的是(将其简化为最低限度);
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.
这是便携式吗?这是好习惯吗?我有什么可担心的吗?
编辑:我问了第二个问题,希望能找到一个好方法.
对于复古计算项目,我需要将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代码使用了这个相当奇怪的混合汇编程序. …
我一直在做一些休闲度假计算.我的迷你项目是对意大利"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) 昨天我问了以下问题,为方便起见,转载于此;
"对于我的一个项目,我真正想做的就是这样做(将其简化为最低限度);
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++技能的持续过程的一部分,我试图打破一些旧的习惯.我的老学校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)特别是看似人为和错误.我错过了第三种可能性吗?