我正在使用Visual C#2008 Express.我想为应用程序使用相同的图标(即.exe显示的图标),以及主窗体.不幸的是,VC#似乎并不是很聪明,并且坚持要复制图标数据.
似乎没有办法选择"已嵌入"的图标用于表单或项目图标(仅选择文件),并且对两个图标使用相同的文件只是将文件嵌入两次尽可能远看到.这不是什么大不了的事(现在硬盘空间很便宜,对吧?),但这让我很烦恼.
知道怎么避免这个吗?有没有办法以编程方式加载可执行文件的图标,以便在构建表单时使用,比如说?一些关于类似事情的论坛帖子似乎暗示.NET资源不使用普通的旧Windows资源系统 - 在获取旧式资源的框架内有没有办法?或者我是否必须绑定Win32 API函数才能执行此操作?
在编写测试套件时,我需要提供一个operator<<(std::ostream&...Boost单元测试的实现来使用.
这有效:
namespace theseus { namespace core {
std::ostream& operator<<(std::ostream& ss, const PixelRGB& p) {
return (ss << "PixelRGB(" << (int)p.r << "," << (int)p.g << "," << (int)p.b << ")");
}
}}
Run Code Online (Sandbox Code Playgroud)
这没有:
std::ostream& operator<<(std::ostream& ss, const theseus::core::PixelRGB& p) {
return (ss << "PixelRGB(" << (int)p.r << "," << (int)p.g << "," << (int)p.b << ")");
}
Run Code Online (Sandbox Code Playgroud)
显然,当g ++尝试解决运算符的使用时,第二个未包括在候选匹配中.为什么(什么规则导致这个)?
代码调用operator<<深入Boost单元测试框架,但这里是测试代码:
BOOST_AUTO_TEST_SUITE(core_image)
BOOST_AUTO_TEST_CASE(test_output) {
using namespace theseus::core;
BOOST_TEST_MESSAGE(PixelRGB(5,5,5)); // only compiles with operator<< definition inside theseus::core …Run Code Online (Sandbox Code Playgroud) 我想创建一个线程,然后立即调用CloseHandle并让线程自行死亡,这样我就不必在'原始'线程中做额外的清理工作(不是说清理本身很难) ,但这意味着我需要避免相当多的额外簿记.
MSDN说在一个线程上调用CloseHandle()不会终止该线程,但我不清楚这是否意味着我真的被允许这样做.
我正在构建一个微基准来测量性能变化,因为我在一些原始图像处理操作中尝试使用SIMD指令内在函数.但是,编写有用的微基准测试很困难,因此我想首先了解(如果可能的话)消除尽可能多的变异和误差源.
我必须考虑的一个因素是测量代码本身的开销.我正在使用RDTSC进行测量,我正在使用以下代码来查找测量开销:
extern inline unsigned long long __attribute__((always_inline)) rdtsc64() {
unsigned int hi, lo;
__asm__ __volatile__(
"xorl %%eax, %%eax\n\t"
"cpuid\n\t"
"rdtsc"
: "=a"(lo), "=d"(hi)
: /* no inputs */
: "rbx", "rcx");
return ((unsigned long long)hi << 32ull) | (unsigned long long)lo;
}
unsigned int find_rdtsc_overhead() {
const int trials = 1000000;
std::vector<unsigned long long> times;
times.resize(trials, 0.0);
for (int i = 0; i < trials; ++i) {
unsigned long long t_begin = rdtsc64();
unsigned long long t_end = rdtsc64(); …Run Code Online (Sandbox Code Playgroud) 给出以下代码:
char buffer[1024];
char * const begin = buffer;
char * const end = buffer + 1024;
char *p = begin + 2000;
if (p < begin || p > end)
std::cout << "pointer is out of range\n";
Run Code Online (Sandbox Code Playgroud)
比较执行(p < begin和p > end)定义明确吗?或者此代码是否具有未定义的行为,因为指针已经超过了数组的末尾?
如果比较定义明确,那么定义是什么?
(额外信用:评估begin + 2000自身未定义的行为?)
我刚才意识到写这个是合法的:
let _ = sum [1..100]
in "Hello"
Run Code Online (Sandbox Code Playgroud)
let-binding似乎绝对没有任何作用.
但现在我想知道这里的确切语义.可以编写一个包含_绑定的程序,但删除该绑定会明显改变所述程序的含义吗?
基本上,我想知道自动删除这样的绑定是否安全.据我所知,这种绑定的价值不可能影响任何事情.然而,似乎假设它的类型可能会影响其他东西.任何人都可以构建一个例子吗?
对于大多数容器,该iterator类型提供对容器中的值的读写访问,并且该const_iterator类型提供只读访问.但是,因为std::set<T>迭代器类型不能提供读写访问,因为修改集合中的值(可能)会破坏容器不变量.因此,在std::set<T>,无论是iterator和const_iterator提供只读访问.
这引出了我的问题:你可以用a做std::set<T>::iterator的事情和用你做的事情之间有什么区别std::set<T>::const_iterator吗?
请注意,在C++ 11中,容器的操作方法(例如erase)可以带const_iterator参数.
我有一组被分为两个数组中的数据(我们称它们data和keys).也就是说,对于具有索引的任何给定项目i,我可以使用该项目data[i]的密钥和该项目的密钥来访问该项目的数据keys[i].我不能改变这种结构(例如,将键和数据交织成单个数组),因为我需要将data数组传递给需要某种数据布局的库函数.
如何根据keys数组的内容对两个数组(最好使用标准库函数)进行排序?
我知道至少有三个轻量级C++ XML解析器:RapidXML,TinyXML和PugiXML.但是,所有这三个都使用基于DOM的接口(即,它们构建自己的XML文档的内存中表示,然后提供遍历和操作它的接口).对于我必须处理的大多数情况,我更喜欢SAX接口(解析器只是吐出一些事件流,比如start-of-tag,应用程序代码负责根据这些事件做任何想做的事情) .
任何人都可以推荐一个带有SAX接口的轻量级C++ XML库吗?
编辑:我还应该注意Microsoft XmlLite库,它确实使用SAX接口(好吧,实际上是一个"拉"接口,可能更好).不幸的是,目前我已经排除了它,因为据我所知它只是闭源和Windows(如果我错了,请纠正我).
我希望在10的幂的频率下被中断,因此启用/ dev/rtc的中断并不理想.我想在中断之间睡1毫秒或250微秒.
从/ dev/hpet启用定期中断非常有效,但它似乎在某些机器上不起作用.显然我不能在没有HPET的机器上使用它.但我无法让它在一些可以作为时钟源使用的机器上工作.例如,在Core 2 Quad上,当设置为poll时,内核文档中包含的示例程序在HPET_IE_ON处失败.
使用Linux提供的itimer接口而不是直接与硬件设备驱动程序连接会更好.在某些系统上,itimer提供的定期中断随着时间的推移更加稳定.也就是说,由于hpet不能以我想要的频率中断,因此中断开始从挂起时间开始漂移.但我发现有些系统的睡眠时间比使用itimer要长(10+毫秒).
这是一个使用itimer进行中断的测试程序.在某些系统上,它只打印出一个警告,它在目标时间内睡眠约100微秒左右.在其他情况下,它将打印出批次警告,它在目标时间内睡了10+毫秒.用-lrt编译并运行sudo chrt -f 50 [name]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <error.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <fcntl.h>
#define NS_PER_SECOND 1000000000LL
#define TIMESPEC_TO_NS( aTime ) ( ( NS_PER_SECOND * ( ( long long int ) aTime.tv_sec ) ) \
+ aTime.tv_nsec )
int main()
{
// Block alarm signal, will be waited on explicitly
sigset_t lAlarm;
sigemptyset( &lAlarm );
sigaddset( &lAlarm, SIGALRM );
sigprocmask( …Run Code Online (Sandbox Code Playgroud) 如果我有一个容器std::vector<T*> items,我可以创建一个IndirectIterator包装std::vector<T*>::iterator并允许迭代T而不是T*s.
我可以专门iter_swap用于通过指针IndirectIterator制作标准算法(例如std::sort)交换项吗?
即,如果我写下以下内容,它会对标准算法产生任何影响吗?
namespace some_namespace
{
template <typename IterT>
class IndirectIterator
{
IterT m_base;
public:
typedef IterT base_iterator;
typedef /* ... */ reference;
/* ... */
reference operator*() const { **m_base; }
const base_iterator& base() const { return m_base; }
base_iterator& base() { return m_base; }
};
template <typename T>
void iter_swap(IndirectIterator<T>& a, IndirectIterator<T>& b)
{
using std::iter_swap;
iter_swap(a.base(), b.base());
}
}
Run Code Online (Sandbox Code Playgroud)
这种专业化的好处是它交换指针而不是完整的T实例,所以它更快(可能).
我一直在编写一个自定义std::streambuf作为日志系统的一部分.但是,我遇到的问题是流的第一段输出没有正确格式化.
这是一个简化的测试用例,不使用任何自定义streambuf或ostream类:
#include <iostream>
int main()
{
std::streambuf *coutbuf = std::cout.rdbuf();
std::ostream(coutbuf) << "test" << ": writing to cout using a separate ostream." << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用g ++编译它:
$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1
$ g++ -o fail reduced-case.cpp
$ ./fail
0x400c80: writing to cout using a separate ostream.
Run Code Online (Sandbox Code Playgroud)
请注意,第一个字符串文字("test")被格式化为通用指针(字符串的地址以十六进制输出),而第二个字符串文字格式正确.
我唯一能想到的是直接使用新构造的std::ostream(即,不将其放入变量)是无效的.如果是这种情况,我非常想知道究竟是什么使它无效(我认为它与iostreams无关,而是与评估顺序或与构造函数或其他东西的交互).如果这不是问题,那么是什么?
我试图将多个命令组合成一个输出.
#!/bin/bash
x=$(date +%Y)
x=$($x date +m%)
echo "$x"
Run Code Online (Sandbox Code Playgroud)
这回来了
./test.sh:line 4:2011:命令未找到