理想情况下,我希望能够做的是获取时区的名称,并询问Windows的相应时区信息(偏离UTC,DST偏移,DST开关的日期等).看起来Windows使用TIME_ZONE_INFORMATION结构来保存这种信息.因此,据推测,我想要一个函数,它接受带有时区名称的字符串并返回一个TIME_ZONE_INFORMATION结构.
但是,我能找到的所有函数都是GetTimeZoneInformation(),这些函数为我提供了本地时间的TIME_ZONE_INFORMATION.我需要的是一个函数,它将为我提供任意时区的信息,而不管本地时区是什么.
我看到获取该信息的唯一方法是直接从注册表中获取它,这不太理想.该TIME_ZONE_INFORMATION页面显示了它在注册表中,所以它应该可以从那里获取的信息,但我更喜欢一个正确的系统功能做这件事.这样的功能是否存在,或者我是否必须进行注册表潜水才能获得任意时区的时区信息?
为了在我的一个项目中运行单元测试,我有一个自定义命令,它将可执行文件,库和其他相关文件复制到其他地方,以便它们可以使用特定的设置运行,而不是在它们所在的位置运行它们建成.在Linux上,这非常简单.但是在Windows上,由于cmake将配置名称附加到输出目录(我一般都喜欢它,但它搞砸了我在这种情况下正在做的事情),因此我遇到了一些麻烦.这使得很难确定生成的库或可执行文件的路径.例如,如果我有一个自定义命令,它只是将可执行文件复制到另一个目录
set(EXE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/exeName${CMAKE_EXECUTABLE_SUFFIX}")
set(NEW_EXE_PATH "${RUN_UNITTESTS_DIR}/exeName${CMAKE_EXECUTABLE_SUFFIX}")
add_custom_command(TARGET unitTests POST_BUILD
COMMAND ${CMAKE_COMMAND} ARGS -E copy "${EXE_PATH}" "${NEW_EXE_PATH}")
Run Code Online (Sandbox Code Playgroud)
它会在Windows上窒息,因为可执行文件实际上并不存在CMAKE_RUNTIME_OUTPUT_DIRECTORY.根据配置类型,它位于${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release或中${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug.在Linux上,通过使用CMAKE_BUILD_TYPE并将其添加到路径可以轻松修复,但这不适用于Windows,因为在Windows上,cmake生成多个配置而不是一个.所以,我希望能够做的就是这样
add_custom_command(TARGET unitTests POST_BUILD
debug
COMMAND ${CMAKE_COMMAND} ARGS -E copy "${DEBUG_EXE_PATH}" "${DEBUG_NEW_EXE}")
add_custom_command(TARGET unitTests POST_BUILD
release
COMMAND ${CMAKE_COMMAND} ARGS -E copy "${RELEASE_EXE_PATH}" "${RELEASE_NEW_EXE}")
Run Code Online (Sandbox Code Playgroud)
并且一些cmake命令看到能够做到这一点(例如target_link_libraries),但据我所知,add_custom_target并没有提供这种能力.那么,问题是我将如何做到这一点?如何在Windows上将自定义命令设置为特定于配置?
好的,使用Qt,我想知道如何在任何时间点检测鼠标的当前状态 - 没有 MouseEvent.
使用QCursor :: pos(),您可以获得它的位置,但有没有办法确定按钮的当前状态?
基本上,我希望在计时器关闭时验证鼠标的状态,因此它不会与任何特定的MouseEvent相关,因此没有要查询的MouseEvent.我需要知道如何在没有MouseEvent的情况下查询鼠标的状态 - 特别是按钮的状态.
哦,我正在使用Qt 3,所以如果在Qt 4中添加了这样的功能但不在Qt 3中,它对我没什么帮助(尽管知道它仍然很好).
我需要确定特定字符串是否是有效的IPv4或IPv6地址文字.如果我理解正确,在POSIX系统上执行此操作的正确方法是使用inet_pton将其转换为网络地址结构并查看是否成功.Windows Vista和更高版本具有InetPton基本相同的功能.但据我所知,Windows XP没有声明其中任何一个,我需要能够在XP上正确地执行此操作.那么,问题是使用什么系统功能来做到这一点?
最糟糕的情况是,我可以编写一个函数来自己解析它,但我更喜欢一个标准的系统函数,因此经过了彻底的测试并正确处理了所有的角落情况等等.已经足够糟糕的是,微软不能inet_pton像其他人一样声明并且与InetPton他们的新操作系统一起使用.
在阅读了Andrei的书"D编程语言"之后,我刚刚开始在D 2.0中实现我的第一个中等规模的程序.我遇到的第一个问题之一是使用带有内置关联数组的std.algorithm库.例如:
#!/usr/bin/env rdmd
import std.stdio;
import std.algorithm;
void main()
{
alias int[string] StringHashmap;
StringHashmap map1;
map1["one"] = 1;
map1["two"] = 2;
writefln("map1: %s", map1);
StringHashmap map2;
map2["two"] = 2;
map2["three"] = 3;
writefln("map2: %s", map2);
auto inter = setIntersection(map1, map2);
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很简单,期望迭代inter会产生单个"两个"条目.但是,我收到此编译器错误:
./test.d(20):错误:模板std.algorithm.setIntersection(alias less ="a <b",Rs ...)if(allSatisfy!(isInputRange,Rs))与任何函数模板声明都不匹配
./test.d(20):错误:模板std.algorithm.setIntersection(alias less ="a <b",Rs ...)如果(allSatisfy!(isInputRange,Rs))不能从参数类型推导出模板函数! ()(INT [字符串],INT [字符串])
我可以看到内置的关联数组似乎没有提供与std算法一起使用的任何版本的范围.
我错过了什么吗?做错了什么?如果没有,这是一个明显的遗漏吗?有什么理由可以解决这个问题吗?
我正在D标准库中寻找Set实现,我只发现了这些:
如果我只能弄清楚如何使用它们,这两种方法都可以正常工作.我从RedBlackTree开始(因为我已经熟悉它们是如何工作的),这就是我想出的:
auto rbt = redBlackTree!string();
foreach(s; setOfStrings) {
rbt.insert(s);
}
foreach(s; rbt) {
if (s[0 .. 3] == "sth") {
rbt.removeKey(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在第一个foreach中完成这个条件,但这只是一个示例,表明我需要添加和删除Set中的元素.这会工作,但我得到编译错误:
错误:模板std.container.RedBlackTree(串).RedBlackTree.removeKey(U)如果(!isImplicitlyConvertible(U,ELEM))不匹配任何函数模板声明
错误:!模板std.container.RedBlackTree(串).RedBlackTree.removeKey(U)如果(!isImplicitlyConvertible(U,ELEM))不能从参数类型推断模板函数()(字符串
我不需要红黑树(任何没有重复的东西),速度不是太重要.我可以这样做:
string[] arr;
foreach(s; setOfStrings) {
// check for duplicate code here...
arr ~= s;
}
for(int i = 0; i < arr.length; i++) {
if (s[0 .. 3] == "sth") {
arr = arr[0 .. i] ~ arr[i + 1 .. $];
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
标准库中是否有任何简单的Set?
我有一个代表我世界的巨型三维阵列.静态初始化太大了:
alias Cell[128][128][128] World; // <-- The compiler points to this line
Error: index 128 overflow for static array
Run Code Online (Sandbox Code Playgroud)
我试过使用World* world但是上面的溢出仍然会出错.所以我现在所拥有的是这个丑陋的混乱:
alias Cell[][][] World;
// ...
private World world;
// ...
world.length = WORLD_XDIM;
for (uint x = 0; x < world.length; ++x)
{
world[x].length = WORLD_YDIM;
for (uint y = 0; y < world[x].length; ++y)
{
world[x][y].length = WORLD_ZDIM;
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但它让我在里面哭了一点.有没有办法将calloc的结果转换为三维数组?我已经完成了切割常规数组,但三维事物令我感到困惑.
可能重复:
'unsigned temp:3'表示什么
我不明白这个结构定义.这对我来说似乎是违法的,但显然不是:
typedef struct
{
unsigned i:1;
} my_struct;
Run Code Online (Sandbox Code Playgroud)
我认为将变量标记为unsigned没有类型与将其标记为相同unsigned int.但是,我对结肠感到困惑.它有什么作用?我的猜测是它是某种初始化器,但我不知道它意味着什么.在我的头顶,我唯一期望在C中冒号的地方是三元运算符,这显然不是.所以,这似乎是一个我不熟悉的结构.任何人都可以在这个结构定义中解释冒号的目的是什么吗?宣言到底unsigned i:1;意味着什么?
在Linux中,如果您有一个知道符号链接的文件的路径,那么如何以编程方式确定(在C或C++中)它指向的文件的路径?
我想在mixin中列出类的方法.
要做到这一点,我假设我必须在mixin中打开包含源代码的文件,但发现该文件的名称比我想象的要难.
我试过用
__FILE__
Run Code Online (Sandbox Code Playgroud)
但是它给出了mixin声明的文件...所以我必须在每个文件中定义mixin ......这没有任何意义,因为目标是减少样板代码.
现在我的解决方案是将文件名作为参数传递给类的构造函数,并从那里调用mixin.因为我将在从同一个父类继承的所有类中执行此操作,所以我理想地希望将它放在父类的构造函数中并注册子类的方法.
有没有更好的方法呢?任何可以在不打开文件的情况下搜索类的方法?
Visual Studio的vcproj文件包含影响构建的各种设置或属性.例如,我试图转换为cmake的项目使用的一些项目是
StringPooling="true"
RuntimeLibrary="2"
TreatWChar_tAsBuiltInType="true"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
Run Code Online (Sandbox Code Playgroud)
当然还有很多其他的可以设置.问题是如何使用cmake生成项目时设置它们.有没有人知道如何在使用cmake时设置这些属性,而不是在事后编辑vcproj文件?我找不到任何解释如何通过cmake设置这些属性的东西.我知道如何设置的唯一一个是cmake专门为(例如PreprocessorDefinitions或AdditionalIncludeDirectories)提供跨平台的东西.但我需要能够设置特定于Visual Studio的那些.
我正在编写一个程序,需要能够读取 Linux 上的时区文件。这意味着我需要能够在各个发行版中一致地找到它们。据我所知,它们始终位于/usr/share/zoneinfo 中。问题是,它们实际上总是位于 /usr/share/zoneinfo 中吗?或者是否有发行版将它们放在其他地方?如果是这样,他们把它们放在哪里?
好的,所以如果我在Linux上运行子线程(如果重要的话使用pthreads),我运行以下命令
kill(getpid(), someSignal);
Run Code Online (Sandbox Code Playgroud)
它会将给定的信号发送给当前线程的父节点.
我的问题:在kill()运行后面的语句之前,是否保证父母会立即获得CPU并处理信号(如果是SIGKILL则杀死应用程序,或者如果是其他信号则执行其他任何操作)?或者是否可能 - 甚至可能 - kill()在父线程处理信号之前,任何后续命令都会运行?