小编oma*_*tai的帖子

是否可以将空std :: vector指定为默认参数?

我一直在阅读这个类似的问题,发现自己对答案不太满意.我没有一个叫做"foo"的简单函数; 我有一个更复杂的功能,如果没有明智地提供参数,则会产生很大的危险.对于我来说,强制执行自己的规则并确保系统健壮性的功能似乎比倾向于坚持"一个功能,一个要做的事情"的语义细节更为可取.我认为对这个问题给出的有利回应反映了编程理想主义过于采取,而不是某些情况的现实.

我面临的是:

void DoSomethingVeryComplex( const CRect bounds, CPoint startPoint = CPoint(-1,-1) );
Run Code Online (Sandbox Code Playgroud)

现在这恰好满足了语义规则 - 它正在做一些事情,而不是几件事情.它做的一件事恰好是复杂的,多阶段的,但它仍然是一回事.

对于那个复杂的事情,建议用户提供边界,让函数确定自己的起点.高级用户可能希望进行相当大的数学计算以确定特定的替代起点并提供......但用户要注意.

而现在我已经看到,在极少数情况下,提供不是一个,而是几个起点是有道理的.这在所涉及的过程的语义概念中没有任何改变,因为该过程是从一个点传播到邻居,到邻居的邻居,等等.因此,从许多方面开始是一种自然的延伸.

因此,我更愿意指出:

void DoSomethingVeryComplex( const CRect bounds,
                             const std::vector<CPoint> startPoint /* = empty" */ );
Run Code Online (Sandbox Code Playgroud)

因此,如果向量为空,则函数像以前一样确定起点,如果向量中有任何点,则将它们用作起点.

是否有可用的C++语法允许我这样做 - 将空数组指定为默认参数?

c++ optional-parameters

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

当list为空时,std :: list:begin()的行为

以下是否根据C++标准给出了定义的结果?

std::list<int> myList;
std::list<int>::iterator myIter = myList.begin();    // any issues?
myList.push_back( 123 );
myIter++;                                  // will myIter point to the 123 I pushed?
Run Code Online (Sandbox Code Playgroud)

我可以在我正在使用的编译器上测试它...但我想要一个更明确的答案.

c++ std

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

具有多个容器的循环范围

假设我有2个(或更多)容器我想同时迭代 - 例如,计算两个向量的点积:

std::vector<double> vector1;
std::vector<double> vector2;    // identical size to vector1
Run Code Online (Sandbox Code Playgroud)

同时在两个(或所有)容器上指定range-for循环的首选C++ 11方法是什么?是否涉及选择一个容器/迭代器来for ( auto i : c )在范围for for循环中编写short-hand(ie ),而所有其他容器/迭代器必须长期处理?是否有任何理由将来的语法无法扩展到支持两个/所有容器的短手,如下所示...这看起来真的可读:

double dotProduct( 0.0 );
for ( auto const & value1 : vector1, auto const & value2 : vector2 )  // illegal!
{
    dotProduct += value1*value2;
}
Run Code Online (Sandbox Code Playgroud)

c++ c++11

14
推荐指数
1
解决办法
6380
查看次数

是否可以#define两个单词到一个表达式,而不只是一个单词?

如果我想替换所有出现的byteunsigned char,简单的#define将做到这一点.有没有办法用反向做#define?使用单引号或双引号对两个单词进行分组不起作用,也不使用反斜杠转义它们之间的空格.它甚至可能吗?

c c++ c-preprocessor

12
推荐指数
2
解决办法
2183
查看次数

如何在Windows上每毫秒或更好地做一些事情

这个问题不是关于在Windows(XP或更好)上准确计时,而是通过回调或中断非常迅速地做某事.

我需要每1毫秒定期做一些事情,或者最好每100微秒做一次.我需要做的是以这个速率驱动一些同步硬件(以太网),以便向网络输出稳定的数据包流,并使该流看起来尽可能规则和同步.但如果问题可以与(以太网)设备分开,那么了解一般答案会更好.

在你说"甚至不考虑使用Windows !!!!"之前,有点背景.并非所有实时系统都有相同的要求.大多数时候歌曲和视频在Windows上可以接受,尽管平均每10-16ms左右需要处理音频或图像块.通过适当的缓冲,Windows可以具有可变延迟,但硬件可以广泛地免受它们的影响,并保持稳定的同步事件流.即便如此,我们大多数人都容忍偶尔的故障.我的应用就是这样 - 可能相当宽容.

对我来说,昂贵的选择是将我的整个应用程序移植到Linux.但Linux只是在同一硬件上运行的不同软件,所以我强烈倾向于编写一些更好的软件,并坚持使用Windows.我能够消除所有竞争的硬件和软件(没有互联网或其他网络访问,没有运行其他应用程序等).我有可能让Windows这样做吗?我会遇到什么限制?

我知道我的目标硬件有一个高性能事件定时器,并且该定时器可以编程为中断,但没有驱动程序.我可以写一个吗?那里有有用的例子吗?我还没找到一个.这会干扰QueryPerformanceCounter吗?我是否会使用以太网设备这一事实是否意味着如果我明智地使用select()会变得简单?

欢迎使用有用文章的指针 - 我已经找到了关于如何获得准确时间的几十个概述,但是除了使用相当于忙碌的等待之外,还没有关于如何做这样的事情的概述.有没有办法避免忙碌的等待?是否有内核模式或设备驱动程序选项?

c++ windows raw-ethernet

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

Winsock错误10054(WSAECONNRESET)"正常"与UDP到/来自localhost?

"在单个Windows PC上使用UDP进行进程间通信可能会出现什么问题?" 我想......然后继续实施它.

但是尽管只发送了几百个字节并且只是非常偶发,并且尽管UDP被用作无连接协议(使用的sendto()功能),但我仍然被随机出现的错误10054 - "连接重置"所困扰.我觉得这很混乱.是吗:

  • 完全正常,可以预料,在这种情况下......这意味着什么?
  • 完全出乎意料,我可能实施了一些错误
  • 完全出乎意料,所以我应该检查是否有冲突的软件(例如对于这样的问题)
  • 别的什么?

我在某处读到它可能表明在另一端没有接收端口打开......但这对我来说更没意义 - 不是UDP只是假设发送数据报而不关心它发生了什么?或者在同一台机器(localhost)上的端口发送/从某些机器上的端口发送一些特殊情况?

udp winsock

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

如何在Visual Studio中查找静态c/c ++库中的哪些函数

我有一个应用程序和一个静态库.这个图书馆看来是建立就好了-这当然编译我foobargeewhizz功能就好了,没有任何错误或警告创建静态库.

然而,当应用程序构建和链接到静态库,它管理的链接功能,foobar却找不到功能geewhizz.如何判断geewhizz它是否已进入库中?我看不到/map像构建应用程序那样的库的任何选项.\map在构建应用程序时使用该选项毫无意义,因为它无法找到我的geewhizz功能,也无法报告它.

我正在使用C和C++的混合,我怀疑可能存在函数名称修改/翻译问题,或者调用约定问题,导致问题,所以我认为有一个库中包含的函数列表应该能够照亮它.但如果对解决这些问题有任何更一般的建议,我会很高兴听到它.

c c++ static-libraries visual-studio

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

如何在Windows 8.1/10上可靠地窃取/重新获得MFC /桌面应用程序的焦点?

好吧,我明白了:专注偷窃是邪恶的.或者至少它是99.9%的时间.但我真的需要在Windows 8上可靠地窃取焦点,到目前为止,我被大量坚持专注偷窃的人总是邪恶所挫败.

场景:我们在运行Windows 8.1的普通PC上运行自定义应用程序(很快将成为Windows 10).屏幕,键盘和鼠标距离地面约5米,距离叉车操作员真正不应爬的楼梯.他们拥有的一个输入设备是扩展器电缆上的数字键盘.他们需要做的一切都可以通过键盘完成...只要一些邪恶的程序没有窃取我们的应用程序的焦点,或者某些远程用户没有注销并留下另一个重点应用程序.

该应用程序本质上是一个最大化的桌面应用程序 - 它填充屏幕(但不是严格意义上的"全屏"或"最顶层"应用程序),因此允许其他应用程序在需要时出现在它前面.但是当鼠标空闲时,我们希望此应用程序在所有其他应用程序之前恢复其"正常"位置,以便它获得焦点并且数字键盘输入将可靠地工作.

在Windows 7上,使用SetForegroundWindow()(通过AllowSetForegroundWindow()正常工作启用- 应用程序可以返回到前面并恢复焦点.在Windows 8上,SetForegroundWindow()只会导致任务栏图标闪烁,但应用程序无法重新获得焦点,迫使我们的用户爬上楼梯......全键盘和鼠标太诱人了他们不要按下按钮他们不应该,并且通常会出现混乱.

所以请先生:我的(MFC,桌面)应用程序可以在鼠标闲置1分钟后重新获得焦点,因为它或多或少是通常应该运行的唯一应用程序.如果允许,我们如何可靠地窃取它?

c++ windows winapi mfc windows-8.1

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

无法以管理员身份替换本地驱动器

多年来(在 Win XP 和 Win 7 下)我通过使用用户启动程序文件夹中的 .cmd 文件将 S: 映射到包含源代码的本地文件夹,该文件包含如下命令:

subst s: C:\MyStuff\Programming\Source
Run Code Online (Sandbox Code Playgroud)

因为我现在正在 Visual Studio 中编写一些代码来更改注册表,所以需要管理员权限。如果我不以管理员身份运行上述命令,那么当我以管理员身份运行 Visual Studio 时,S: 驱动器将会消失。

到目前为止,以管理员身份运行此现有 .cmd 文件的所有尝试都失败了,唯一看起来有效的尝试需要管理员密码。有没有一种方法可以在每次登录时自动以管理员身份运行 subst 命令,而无需知道/提供管理员密码?

windows

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

在TensorFlow Estimator.DNNClassifier中DNN是什么意思?

我猜想DNN在某种意义上是TensorFlow指“ 深度神经网络 ”。但是我发现这深深地令人困惑,因为“深度”神经网络的概念似乎在其他地方被广泛使用,这意味着通常具有多个卷积和/或关联层(ReLU,池化,丢失等)的网络。

相比之下,很多人会首先遇到这个术语(在tfEstimator Quickstart示例代码中),我们发现:

# Build 3 layer DNN with 10, 20, 10 units respectively.
  classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,
                                          hidden_units=[10, 20, 10],
                                          n_classes=3,
                                          model_dir="/tmp/iris_model")
Run Code Online (Sandbox Code Playgroud)

这听起来像是可疑的浅,甚至更像是老式的多层感知器(MLP)网络。但是,没有提到DNN该近似定义源上的替代术语。那么DNN在TensorFlow tf.estimator上下文中实际上是一个MLP吗?hidden_units参数的文档表明是这种情况:

  • hidden_​​units:可迭代的每层隐藏单元数。所有层均已完全连接。例如 [64,32]表示第一层有64个节点,第二层有32个节点。

MLP已经写满了。这种理解正确吗?DNN因此,是否使用了不当用语?如果DNNClassifier可以,则最好弃用MLPClassifier?还是DNN代表深层神经网络以外的东西?

terminology tensorflow tensorflow-estimator

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