SUCCEEDED()的定义: #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
背景:当点击对话框的OK按钮,我需要返回一个HRESULT值hr,从而SUCCEEDED(hr)是真实的.如果单击"取消"按钮,则需要返回负值.我本可以使用bool,但这会破坏现有的模式(通常hr值来自系统dll的深度).所以,我知道我可以回答S_OKOk,但是我会在Cancel上返回什么?我可以return (HRESULT)-1;,但必须有一个更好的方法 - 一些HRESULT文字常量,它具有负值并代表一般失败.S_FALSE不是吗,因为它的价值被定义为1L.
请帮我找到合适的常数.
目标是控制允许哪些类型的用户在UI级别执行哪些操作.这段代码已经存在了一段时间; 我只想稍微改进一下.我试图改进的文件可能应该是自动生成的,但是这个变化太大了,所以我寻求一个更简单的解决方案.
我们将调用的文件PermissionBits.h有一堆这样的:
// Here names are mangled; for example XYZ_OP_A is:
// permission to operation A in category/context XYZ
// SCU64 = static const unsigned __int64
// Some namespaces utilize all 64 bits
// The actual values (as long as they are proper bit fields)
// do not matter - they are always used by name
namespace XYZPermissionBits
{
SCU64 XYZ_OP_A = 1UI64 << 0; // 1 = 0x0000000000000001
SCU64 XYZ_OP_B = 1UI64 << 1; // 2 …Run Code Online (Sandbox Code Playgroud) Clojure真正引起了我的兴趣,我开始学习它的教程:http: //java.ociweb.com/mark/clojure/article.html
考虑"Set"下提到的这两行:
(def stooges (hash-set "Moe" "Larry" "Curly")) ; not sorted
(def more-stooges (conj stooges "Shemp")) ; -> #{"Moe" "Larry" "Curly" "Shemp"}
Run Code Online (Sandbox Code Playgroud)
我的第一个念头是第二次操作应该花费不间断的时间来完成; 否则,功能语言可能对面向对象的语言没什么好处.人们很容易想象需要从[几乎]空集开始,并在我们继续时填充它并缩小它.因此,我们可以将其重新分配给自己,而不是将新结果分配给更多的傀儡.
现在,通过功能语言的奇妙承诺,副作用无需关注.因此,设置stooges并且more-stooges不应该在彼此之上工作.因此,要么创建more-stooges是一个线性操作,要么它们共享一个公共缓冲区(如Java StringBuffer),这似乎是一个非常糟糕的想法,并且与不变性相冲突(随后stooges可以逐个删除元素).
我可能在这里重新发明一个轮子.当你从最大数量的元素开始然后一次删除一个元素时,它似乎hash-set会更有效率,clojure直到空集与反对以空集开始并逐渐增长它为止.
上面的例子可能看起来不太实际,或者有解决方法,但是面向对象的语言,如Java/C#/ Python /等.既可以一次增长也可以缩小一个或几个元素,同时快速完成它也没有问题.
保证(或只承诺?)不变性的[功能]语言无法快速增长.是否还有另一个可以使用的成语,它可以帮助避免这样做?
对于熟悉的人Python,我会提到集合理解与等效循环方法.两者的运行时间略有不同,但这与解释器的相对速度有关C,Python而不是复杂性.我看到的问题是,设置理解通常是一种更好的方法,但并不总是最好的方法,因为可读性可能会受到很大影响.
如果问题不明确,请告诉我.
此博客不推荐它:http: //blog.kalmbachnet.de/?posttid = 78
但无论如何我想要这样做.我想我需要换我Debug.Assert的用某种#if或#ifdef或类似的东西.另外,有没有人有一个很好的Debug.Assert示例C++ CLI?
假设我有以下变量:String^ validationError = bldError.ToString();
现在我希望做类似的事情:
#if (DEBUG)
Debug.Assert(false, "Got the following validation error:" + validationError);
#endif
Run Code Online (Sandbox Code Playgroud)
我怎样才能安全地进行C++ CLI,还有其他需要检查的问题吗?
编辑:根据答案,我提出了以下宏:
#ifdef _DEBUG
#define CLIASSERT(condition, ...) System::Diagnostics::Debug::Assert(condition, ##__VA_ARGS__)
#else
#define CLIASSERT(condition, ...) // This macro will completely evaporate in Release.
#endif
Run Code Online (Sandbox Code Playgroud)
这是一个用法示例:
String^ strValidationError = bldError.ToString();
CLIASSERT(false, L"Schema validation error: " + strValidationError);
Run Code Online (Sandbox Code Playgroud) 我有一些动态的sql语句,它在某些条件下发生轰炸,所以我试图调试它.它像这样构建:
declare @sql varchar(4000);
...
select @sql = '<part1>';
...
select @sql = @sql + '<part2>';
...
select @sql = @sql + '<part3>';
...
begin
execute(@sql);
select @ec__errno = @@error
if @ec__errno != 0
begin
if @@trancount != 0
begin
rollback;
end
return @ec__errno;
end;
...
Run Code Online (Sandbox Code Playgroud)
正如我所说,它在一个循环的特定迭代中爆炸(不要问我为什么这样实现,我只是修复了一个错误)并且我很难在监视窗口中显示字符串的内容.我想我只得到前255个字符.注意substring(@sql, 0, 200)结果'substring(@sql,0,200)' could not be evaluated.请帮忙.我希望能看到从0到199,从200到399的子串,依此类推,然后将这个东西拼凑起来,最后调试它.
我很感激你的指点.谢谢!
Python相当于我想要的是:
>>> #C#: Dictionary<int, string> tempDict = ...
>>> tempDict = {i : str(i) for i in range(200000)}
>>> tempDict[5]
'5'
>>>
Run Code Online (Sandbox Code Playgroud)
这个例子有点简化,但我可以自己修改; 不想打扰专有类的细节.
得到它了:
var y = (from x in Enumerable.Range(0, 20000) select Guid.NewGuid()).ToDictionary(g=>g, g=>new MyObj(g))
Run Code Online (Sandbox Code Playgroud) 现在我的实现按值返回.成员m_MyObj本身不是const- 它的值会根据用户使用组合框选择的内容而更改.我不是C++大师,但我想这样做.如果我只是坚持在两个decl &前面GetChosenSourceSystem.和impl.,我得到一种编译器错误.如果我做一个而不是另一个 - 另一个错误.如果我这样做return &m_MyObj;.我暂时不会列出这里的错误,除非有强烈的需求.我假设有经验的C++编码器可以告诉我这里发生了什么.我可以省略constness或reference,但我想让它紧凑并在这个过程中学习.
// In header file
MyObj GetChosenThingy() const;
// In Implementation file.
MyObj MyDlg::GetChosenThingy() const
{
return m_MyObj;
}
Run Code Online (Sandbox Code Playgroud) 我使用过Java,C++ ,. Net.(以该顺序).当被问及关于面值的副值和副率时,我总是在这个问题上做得很好......也许是因为没有人深入研究它.现在我知道我看不到全貌.
我正在查看其他人编写的这部分代码:
XmlDocument doc = new XmlDocument();
AppendX(doc); // Real name of the function is different
AppendY(doc); // ditto
Run Code Online (Sandbox Code Playgroud)
当我看到这段代码时,我想:等一下,我不应该ref在doc变量前面使用一个(并相应地进行修改AppendX/Y?它的工作原理如同书面形式,但让我怀疑我是否真的理解了refC#中的关键字.
当我想到这一点时,我回想起早期的Java时代(大学介绍语言).我的一个朋友看了我写的一些代码,他有一个心理障碍 - 他一直在问我哪些东西是通过引用传递的,什么时候通过值传递.我无知的反应是这样的:Dude,Java中只有一种arg传递,我忘了它是哪一个:).冷静,不要过度思考,只需编码.
Java仍然ref没有它吗?然而,Java黑客似乎是富有成效的.无论如何,C++中的编码通过参考业务将我暴露给了整体,现在我很困惑.
应该ref在上面的例子中使用?
我猜测什么时候ref应用于值类型:基元,枚举,结构(这个列表中还有其他什么吗?)它会产生很大的不同.并且...当应用于对象时它不会,因为它全部是通过引用.如果事情如此简单,那么为什么编译器不会将ref关键字的使用限制为类型的子集.
说到对象,是否ref可以作为评论?好吧,我确实记得可能存在问题,null并且ref对于初始化方法中的多个元素也很有用(因为你不能像在Python中一样容易地返回多个元素).
谢谢.
我在我的位置上很新,所以在表达担忧之前我应该三思而后行,但我看到的一些代码......
当我试图提高可读性时,我被告知并不总是有时间,效率更重要.
但后来我看到不同类型的循环中的变量重新声明,有时下降到两个级别.我的一部分认为 - 不要那样做!但另一部分说 - 无论如何,这个复杂的功能应该分解成几个功能.那些较小的函数可以有临时变量,编译器应该能够处理它们.
然后函数调用会增加一些额外的成本.让我试着想出两个例子:
Class1::Do1()
{
for (int i = 0; i < 100; i++)
{
bool x = GetSomeValue();
...
if (x)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
VS
Class1::Do1()
{
bool x = false;
for (int i = 0; i < 100; i++)
{
x = GetSomeValue();
...
if (x)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
VS
Class1::Do1()
{
for (int i = 0; i < 100; i++)
{
Do2();
}
}
Class1::Do2()
{
bool x …Run Code Online (Sandbox Code Playgroud) 我使用Python 2.6作为批处理脚本替换.它将通过双击启动,因此用户将丢失/忽略对stdout的所有输出.所以,我决定添加日志记录,为了简单起见,我为此写了一个类.我的想法是,我可以Logging.Logger在我的代码中的任何地方使用,并且记录器将准备就绪.
我希望目录中的日志文件不超过10个,因此我手动清除旧的日志文件.我没有通过API找到这样的功能,而且我是偏执狂,并希望记录所有内容,事件是日志目录中有文件具有意外名称的事实.
所以,下面是我尝试这样的类,但是当我尝试测试(运行)它时出现错误:
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "C:/AutomationScripts/build scripts/Deleteme.py", line 6, in <module>
class Logging:
File "C:/AutomationScripts/build scripts/Deleteme.py", line 42, in Logging
__clearOldLogs(dummySetting)
File "C:/AutomationScripts/build scripts/Deleteme.py", line 38, in __clearOldLogs
_assert(Logger, 'Logger does not exist yet! Why?')
NameError: global name '_assert' is not defined
>>>
Run Code Online (Sandbox Code Playgroud)
是的,我来自Java/C#背景.我可能不会做"Pythonic"的方式.请帮我做正确的事,请给出一个完整的答案,而不是简单地指出我的知识漏洞.我相信我提供了足够的代码示例.对不起,如果没有设置类,它就不会运行,但希望你明白了.
# This file has been tested on Python 2.6.*. For Windows only.
import logging # For actual logging
import tkMessageBox # To display an …Run Code Online (Sandbox Code Playgroud) c++ ×4
c# ×2
performance ×2
accessor ×1
assert ×1
bit-fields ×1
c++-cli ×1
class ×1
clojure ×1
coding-style ×1
const ×1
debugging ×1
dictionary ×1
dynamic-sql ×1
hashset ×1
hresult ×1
immutability ×1
linq ×1
macros ×1
methods ×1
oop ×1
python ×1
python-2.6 ×1