我必须拿起Delphi来完成我正在做的最近的合同工作,而我想要澄清的一件事就是在条件语句中执行逻辑,例如if.
我来自C/C++和这些语言的背景,一旦if声明失败,其余的逻辑就不会被执行.例如:
if (somefunc() == FALSE && anotherfunc() == TRUE)
Run Code Online (Sandbox Code Playgroud)
在上述情况下,如果somefunc()回报率TRUE则anotherfunc()不会被调用.
从目前为止我所看到的Delphi中,这并不成立.相反,为了
if (somefunc() = False and anotherfunc() = True) then
Run Code Online (Sandbox Code Playgroud)
那么,无论什么somefunc()回报,anotherfunc()都会被召唤.
我已经阅读了各种Delphi书籍,并重读了一些有条件的章节,并且在任何地方都找不到这种行为.任何人都能指出我在Delphi或Pascal的某个地方,这种行为是什么?
我已经开始使用Team Foundation Service 2012(基于云的产品),因为他们已经宣布支持使用Git作为源控制解决方案.
我的初始测试是使用以项目命名的单个Git存储库进行的单个测试.
一切顺利,我可以克隆回购,从Visual Studio 2012中提交推送和拉动,更重要的是工作项关联也可以.
然而,对于真实的项目,在TFS项目中将代码库分割为多个Git repos更有意义.
这样做没有障碍,Team Foundation Service的界面非常好地支持了....
但
现在我发现在Visual Studio 2012中存在一些问题,我想知道我是否做错了什么,或者它是否只是不完全支持的东西(还是?)
其他人发现这个,也许是一个解决方案(同时仍允许在同一个TFS项目下使用多个Git回购)?
更新:找到一些这样的链接
所以至少有一个人碰到了它.
如果您使用Git远程推送到正确的repo URL,多个repo的工作正常,只有在工作项关联和克隆repo时使用Visual Studio 2012集成时才会出现故障.
我一直在使用DUnit作为TDD的驱动程序在Delphi 5中开发一些软件但我发现在使用CheckEqualsMem时它仍然失败,即使在调试器中我可以看到被比较的对象(在这种情况下是两个长字的数组)相同.
在内部,CheckEqualsMem使用CompareMem,发现这是返回false的内容.
深入研究我发现,如果我使用@或Addr调用CompareMem指向对象地址的指针,即使内存相同,CompareMem也会失败,但如果我使用PByte(来自windows)或PChar,它会正确地比较内存.
为什么?
这是一个例子
var
s1 : String;
s2 : String;
begin
s1 := 'test';
s2 := 'tesx';
// This correctly compares the first byte and does not return false
// since both strings have in their first position
if CompareMem(PByte(s1), PByte(s2), 1) = False then
Assert(False, 'Memory not equal');
// This however fails ?? What I think I am doing is passing a pointer
// to the address of the memory where the variable is and telling …Run Code Online (Sandbox Code Playgroud)