小编Adr*_*thy的帖子

Interlocked*函数对共享内存有用吗?

两个Windows进程的内存映射了相同的共享文件.如果文件由计数器组成,是否适合使用Interlocked*函数(如InterlockedIncrement)来更新这些计数器?那些会跨进程同步访问吗?或者我需要使用更重的东西,比如互斥体?或者共享内存机制本身也可以确保一致的视图.

winapi ipc interlocked shared-memory

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

是否可以确定Windows为字体链接选择的字体?

假设您有两个或多个脚本中包含文本的字符串.当您使用GDI函数时TextOut,(现代版本)Windows将执行"字体链接".也就是说,GDI将使用您选择的字体绘制所需的字体,并以自动选择的适当字体绘制其余字体.例如,如果您的部分文本是英文(使用罗马字母),部分文本是中文(使用CJK字符),并且您选择了Arial,则英文部分将以Arial绘制,中文部分将使用用另一种具有CJK字形的字体绘制.

我的问题是,有没有办法确定哪种字体TextOut会选择(或选择)字体链接?

我必须使用低级Uniscribe API绘制一些文本,它不会自动进行字体链接.我已经实现了自己的字体链接,但有时候我的算法会选择TextOut与同一文本不同的字体.我试图更好地理解Windows算法,但我并不擅长在视觉上识别字体(特别是在不熟悉的脚本中).

winapi gdi font-linking textout

8
推荐指数
1
解决办法
2152
查看次数

在为Windows字体名称添加前缀时,"@"是什么意思?

有了EnumFontFamiliesEx,我得到了两个字体的实例,其中第二个字体的前缀为'@' LOGFONT.例如,我得到"MS PMincho"和"@MS PMincho".然而对于其他字体,我只得到一个单独的实例,比如"Arial".在这种情况下,符号意味着什么?

winapi fonts gdi

8
推荐指数
1
解决办法
1213
查看次数

直方图匹配 - 图像处理 - c/c ++

我有两个直方图.

int Hist1[10] = {1,4,3,5,2,5,4,6,3,2};

int Hist1[10] = {1,4,3,15,12,15,4,6,3,2};
Run Code Online (Sandbox Code Playgroud)

Hist1的分布是多模式的;

Hist2的分布是单模型,具有单个突出峰.

我的问题是

  1. 有没有办法可以通过编程方式确定分发类型?
  2. 如何量化这两个直方图是相似/不相似?

谢谢

math statistics probability histogram

8
推荐指数
1
解决办法
2881
查看次数

类模板的朋友功能

我有一个课程模板Foo<T>.

我想实现一个非成员函数Bar,它需要两个Foos并返回一个Foo.我想Bar成为一名非会员,因为写作者Bar(f1, f2)比写作更自然f1.Bar(f2).我也想Bar成为inline因为计算是微不足道的.

template <typename T>
inline Foo<T> Bar(const Foo<T> &lhs, const Foo<T> &rhs) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

诀窍是Bar需要访问Foo私人数据.我不希望拥有私有数据的访问者 - 没有充分的理由将私有数据暴露给用户.所以我想结交Bar一个朋友Foo.

template <typename T>
class Foo {
  ...
  private:
    T w, x, y, z;
    friend Foo<T> Bar(const Foo<T> &lhs, const Foo<T> &rhs);
};
Run Code Online (Sandbox Code Playgroud)

这是我遇到麻烦的地方.编译器抱怨:

当友元声明引用功能模板的特化时,不能使用内联说明符.

这个规则是由标准强加的还是特定于MSVC++?

这是我尝试过的:

  • 创建Bar一个const公共成员函数,然后声明一个简单返回的非成员版本lhs.Bar(rhs).这似乎是最不讨厌的解决方案.

  • 删除inline提示,知道编译器将决定内联而不管提示.这是否会违反单一定义规则?它仍然必须在头文件中定义,因为它是一个函数模板. …

c++ friend function-templates non-member-functions

8
推荐指数
1
解决办法
2498
查看次数

这是VS2008的错误吗?功能样式变量初始化

在下面的代码中,该行

const char * const * eNames (names+cntNames); 
Run Code Online (Sandbox Code Playgroud)

导致Visual Studio 2008 中出现C2061错误:

语法错误:标识符'标识符' - 编译器找到了不期望的标识符.确保在使用之前声明了标识符.初始化器可以用括号括起来.要避免此问题,请将声明符括在括号中或使其成为typedef.当编译器将表达式检测为类模板参数时,也可能导致此错误; 使用typename告诉编译器它是一个类型.

如果我换到

const char * const * eNames = names+cntNames; 
Run Code Online (Sandbox Code Playgroud)

它没有抱怨.这是编译器错误吗?如果没有,为何投诉?

我的关于框说:版本9.0.30729.1 SP

我与GCC的同事没有看到这个错误.

#include <string>
#include <algorithm>
#include <functional>
#include <iostream>

namespace ns1 {

   struct str_eq_to
   {
      str_eq_to(const std::string& s) : s_(s) {}
      bool operator()(const char* x) const { return s_.compare(x)==0; }
      const std::string& s_;
   };

   static bool getNameIndex(const char * const * names, size_t cntNames, const std::string& nm, int &result)
   { …
Run Code Online (Sandbox Code Playgroud)

c++ most-vexing-parse

8
推荐指数
1
解决办法
301
查看次数

std::initializer_list 什么时候可以是 constexpr?

根据 cppreference.com,std::initializer_lists 具有constexpr 构造函数constexpr 大小方法(C++14 起)。

尽管我使用的编译器似乎同意 constexpr 初始值设定项列表的大小确实是 constexpr,但在某些情况下,它不相信我的列表是 constexpr。由于 std::initializer_lists 可能涉及一些“编译器魔法”,我开始想知道 constexpr 是否不适用于它们,其方式与适用于非魔法对象的方式完全相同。

我跳到 Compiler Explorer 上,发现主要编译器在这个主题上并不一致

那么以下四种情况的正确行为(根据标准)是什么?

#include <initializer_list>

using size_type = std::initializer_list<int>::size_type;

template <typename T>
size_type Foo(std::initializer_list<T> const &list) {
    return list.size();
}

int main() {
    // 1.  Example based on
    // https://en.cppreference.com/w/cpp/utility/initializer_list/size
    // gcc: works
    // clang: no viable c'tor or deduction guide
    // msvc: works
    static_assert(std::initializer_list{1, 2, 3}.size() == 3);

    // 2.  Make a constexpr std::initializer_list<T> with T …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer constexpr stdinitializerlist c++20

8
推荐指数
1
解决办法
179
查看次数

文本打包算法

我打赌有人之前已经解决了这个问题,但我的搜索结果是空的.

我想将一个单词列表打包到一个缓冲区中,跟踪每个单词的起始位置和长度.诀窍是我想通过消除冗余来有效地打包缓冲区.

示例:娃娃娃娃屋

这些可以简单地打包到缓冲区中dollhouse,记住doll是从位置0开始的四个字母,在0处dollhouse是九个字母,house在3处是五个字母.

到目前为止我想出的是:

  1. 排序最长到最短的单词:(娃娃屋,房子,娃娃)
  2. 扫描缓冲区以查看字符串是否已作为子字符串存在,如果是,请记下该位置.
  3. 如果它尚不存在,请将其添加到缓冲区的末尾.

由于长词通常包含较短的单词,因此效果很好,但应该可以做得更好.例如,如果我将单词列表扩展为包含ragdoll,那么我的算法会出现dollhouseragdoll效率低于ragdollhouse.

这是一个预处理步骤,所以我对速度并不十分担心.O(n ^ 2)很好.另一方面,我的实际列表有数万个单词,所以O(n!)可能是不可能的.

作为旁注,这个存储方案用于TrueType字体的`name'表中的数据,参见.http://www.microsoft.com/typography/otspec/name.htm

algorithm text packing

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

Visual Studio C++:使用google测试的单元测试exe项目?

使用Visual Studio 2010 C++.我正在尝试进行单元测试,并决定尝试使用Google Test(gtest).我有一个现有的项目编译成MFC可执行文件(我也对如何测试编译为DLL的项目感兴趣).我对单元测试约定的理解是你应该为你的测试创建一个新的独立项目.所以我在同一个解决方案中为我的单元测试创​​建了一个新项目.但是我如何链接项目?我可以从我的测试项目中测试我的exe项目的任意函数/方法吗?

这样做的常规方法是什么?

c++ unit-testing googletest visual-studio visual-c++

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

如何使用GetMonitorCapabilities和GetMonitorBrightness函数

我正在尝试以编程方式调整我的显示器亮度.经过一些研究,我想出了这个链接,并编写了以下代码(主要是从其他链接复制粘贴,一个引导我).

#include "Windows.h"
#include "WinUser.h"
#include "PhysicalMonitorEnumerationAPI.h"
#include "HighLevelMonitorConfigurationAPI.h"
#include <strsafe.h>

void ShowError(LPTSTR lpszFunction);

int main()
{
    HMONITOR hMonitor = NULL;
    DWORD cPhysicalMonitors;
    LPPHYSICAL_MONITOR pPhysicalMonitors = NULL;

    HWND hWnd = GetDesktopWindow();

    // Get the monitor handle.
    hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTOPRIMARY);

    // Get the number of physical monitors.
    BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &cPhysicalMonitors);

    if (bSuccess)
    {
        // Allocate the array of PHYSICAL_MONITOR structures.
        pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(cPhysicalMonitors* sizeof(PHYSICAL_MONITOR));

        if (pPhysicalMonitors != NULL)
        {
            // Get the array.
            bSuccess = GetPhysicalMonitorsFromHMONITOR( …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi

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