小编Jon*_*vis的帖子

如何获取Windows中任意时区的信息?

理想情况下,我希望能够做的是获取时区的名称,并询问Windows的相应时区信息(偏离UTC,DST偏移,DST开关的日期等).看起来Windows使用TIME_ZONE_INFORMATION结构来保存这种信息.因此,据推测,我想要一个函数,它接受带有时区名称的字符串并返回一个TIME_ZONE_INFORMATION结构.

但是,我能找到的所有函数都是GetTimeZoneInformation(),这些函数为我提供了本地时间的TIME_ZONE_INFORMATION.我需要的是一个函数,它将为我提供任意时区的信息,而不管本地时区是什么.

我看到获取该信息的唯一方法是直接从注册表中获取它,这不太理想.该TIME_ZONE_INFORMATION页面显示了它在注册表中,所以它应该可以从那里获取的信息,但我更喜欢一个正确的系统功能做这件事.这样的功能是否存在,或者我是否必须进行注册表潜水才能获得任意时区的时区信息?

c c++ windows timezone

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

如何在Windows上使add_custom_command配置特定?

为了在我的一个项目中运行单元测试,我有一个自定义命令,它将可执行文件,库和其他相关文件复制到其他地方,以便它们可以使用特定的设置运行,而不是在它们所在的位置运行它们建成.在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上将自定义命令设置为特定于配置?

cmake

9
推荐指数
2
解决办法
8808
查看次数

如何在没有MouseEvent的情况下检测Qt中的鼠标状态

好的,使用Qt,我想知道如何在任何时间点检测鼠标的当前状态 - 没有 MouseEvent.

使用QCursor :: pos(),您可以获得它的位置,但有没有办法确定按钮的当前状态?

基本上,我希望在计时器关闭时验证鼠标的状态,因此它不会与任何特定的MouseEvent相关,因此没有要查询的MouseEvent.我需要知道如何在没有MouseEvent的情况下查询鼠标的状态 - 特别是按钮的状态.

哦,我正在使用Qt 3,所以如果在Qt 4中添加了这样的功能但不在Qt 3中,它对我没什么帮助(尽管知道它仍然很好).

c++ mouse qt qt3

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

什么是Windows XP等效的inet_pton或InetPton?

我需要确定特定字符串是否是有效的IPv4或IPv6地址文字.如果我理解正确,在POSIX系统上执行此操作的正确方法是使用inet_pton将其转换为网络地址结构并查看是否成功.Windows Vista和更高版本具有InetPton基本相同的功能.但据我所知,Windows XP没有声明其中任何一个,我需要能够在XP上正确地执行此操作.那么,问题是使用什么系统功能来做到这一点?

最糟糕的情况是,我可以编写一个函数来自己解析它,但我更喜欢一个标准的系统函数,因此经过了彻底的测试并正确处理了所有的角落情况等等.已经足够糟糕的是,微软不能inet_pton像其他人一样声明并且与InetPton他们的新操作系统一起使用.

c c++ ip windows-xp ip-address

7
推荐指数
3
解决办法
8625
查看次数

范围来自D 2中的关联数组

在阅读了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算法一起使用的任何版本的范围.

我错过了什么吗?做错了什么?如果没有,这是一个明显的遗漏吗?有什么理由可以解决这个问题吗?

associative-array d

6
推荐指数
2
解决办法
475
查看次数

D中的简单集实现?

我正在D标准库中寻找Set实现,我只发现了这些:

  • 二叉堆
  • RedBlackTree

如果我只能弄清楚如何使用它们,这两种方法都可以正常工作.我从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?

containers d set phobos

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

我应该如何初始化这个多维数组?

我有一个代表我世界的巨型三维阵列.静态初始化太大了:

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的结果转换为三维数组?我已经完成了切割常规数组,但三维事物令我感到困惑.

arrays d initialization multidimensional-array

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

冒号在这个结构定义中做了什么?

可能重复:
'unsigned temp:3'表示什么

我不明白这个结构定义.这对我来说似乎是违法的,但显然不是:

typedef struct
{
    unsigned i:1;
} my_struct;
Run Code Online (Sandbox Code Playgroud)

我认为将变量标记为unsigned没有类型与将其标记为相同unsigned int.但是,我对结肠感到困惑.它有什么作用?我的猜测是它是某种初始化器,但我不知道它意味着什么.在我的头顶,我唯一期望在C中冒号的地方是三元运算符,这显然不是.所以,这似乎是一个我不熟悉的结构.任何人都可以在这个结构定义中解释冒号的目的是什么吗?宣言到底unsigned i:1;意味着什么?

c

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

如何确定符号链接指向的文件的路径?

在Linux中,如果您有一个知道符号链接的文件的路径,那么如何以编程方式确定(在C或C++中)它指向的文件的路径?

c c++ linux symlink symlink-traversal

5
推荐指数
2
解决办法
3458
查看次数

通过mixin列出一个类的方法

我想在mixin中列出类的方法.

要做到这一点,我假设我必须在mixin中打开包含源代码的文件,但发现该文件的名称比我想象的要难.

我试过用

__FILE__
Run Code Online (Sandbox Code Playgroud)

但是它给出了mixin声明的文件...所以我必须在每个文件中定义mixin ......这没有任何意义,因为目标是减少样板代码.

现在我的解决方案是将文件名作为参数传递给类的构造函数,并从那里调用mixin.因为我将在从同一个父类继承的所有类中执行此操作,所以我理想地希望将它放在父类的构造函数中并注册子类的方法.

有没有更好的方法呢?任何可以在不打开文件的情况下搜索类的方法?

reflection d mixins

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

如何使用cmake在vcproj文件中设置属性?

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专门为(例如PreprocessorDefinitionsAdditionalIncludeDirectories)提供跨平台的东西.但我需要能够设置特定于Visual Studio的那些.

windows cmake visual-studio

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

Linux 的时区文件总是在 /usr/share/zoneinfo 中吗?

我正在编写一个程序,需要能够读取 Linux 上的时区文件。这意味着我需要能够在各个发行版中一致地找到它们。据我所知,它们始终位于/usr/share/zoneinfo 中。问题是,它们实际上总是位于 /usr/share/zoneinfo 中吗?或者是否有发行版将它们放在其他地方?如果是这样,他们把它们放在哪里?

linux timezone

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

是否使用kill发送到父线程的信号保证在下一个语句之前处理?

好的,所以如果我在Linux上运行子线程(如果重要的话使用pthreads),我运行以下命令

kill(getpid(), someSignal);
Run Code Online (Sandbox Code Playgroud)

它会将给定的信号发送给当前线程的父节点.

我的问题:在kill()运行后面的语句之前,是否保证父母会立即获得CPU并处理信号(如果是SIGKILL则杀死应用程序,或者如果是其他信号则执行其他任何操作)?或者是否可能 - 甚至可能 - kill()在父线程处理信号之前,任何后续命令都会运行?

c c++ linux multithreading pthreads

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