我们在这里讨论了为什么fread和fwrite为每个成员计算一个大小并计算并返回读/写成员的数量,而不仅仅是采用缓冲区和大小.我们可以想到的唯一用途是,如果你想读/写一个结构数组,这些结构不能被平台对齐整除,因此已被填充,但这并不能保证这一选择在设计中.
来自FREAD(3):
函数fread()从流指向的流中读取数据的nmemb元素,每个数据字节长,将它们存储在ptr给定的位置.
函数fwrite()将每个大小字节长的数据的nmemb元素写入stream指向的流,从ptr给出的位置获取它们.
fread()和fwrite()返回成功读取或写入的项目数(即不是字符数).如果发生错误或达到文件结尾,则返回值为短项目计数(或零).
我已经阅读了关于C++中const-correctness的所有建议,并且它(部分)很重要,因为它有助于编译器优化代码.我从未见过的是关于编译器如何使用这些信息来优化代码的一个很好的解释,甚至连好书都没有解释幕后发生的事情.
例如,编译器如何优化声明为const的方法与不应该但应该是的方法.当你引入可变变量时会发生什么?它们会影响const方法的这些优化吗?
我正在尝试构建我们的一些软件,这些软件专门在Linux上运行,在MacOS X上运行.我们正在使用CMake并安装了MacPorts,因此我可以轻松地将CMake与我们依赖的一些第三方库一起使用.
现在的问题是,CMake默认情况下似乎没有从MacPorts查找库,因此我们的几个目标都被禁用,因为它无法找到所有在/ opt/local中的依赖项.
我如何指示CMake也从MacPorts中寻找包含和库?
我想模拟文件系统损坏,以便测试我们的嵌入式系统如何对它做出反应,并最终使它们尽可能优雅地失败.我们使用不同类型的块设备模拟闪存存储器来经常修改并且不适合存储在NAND/NOR中的数据.
因为我非常清楚在文件树的不同部分修改数据的频率以及存储敏感数据的位置.我想在特定区域注入错误,而不仅仅是随机.
在紧急情况下,我们将其fsck -y
用作最后的手段,以便尝试启动系统并报告处于非常糟糕的状态.我非常希望引发错误,这些错误会触发fsck尝试修复,以便研究对系统恢复能力的影响.
dd if=/dev/random
因为它不能轻易用于注入受控错误,所以对我的目的来说不够精确.还有其他工具或方法可以更好地满足我的需求,还是我必须创造自己的?
我们最近遇到了将C++框架移植到运行uClinux的ARM平台的问题,其中唯一受供应商支持的编译器是GCC 2.95.3.我们遇到的问题是,异常非常不可靠,导致一切从未被捕获到被不相关的线程(!)捕获.这似乎是一个记录在案的错误,即此处和此处.
经过一番考虑后,我们决定消除异常,因为我们已经达到了异常会对正在运行的应用程序造成大量破坏的程度.现在主要关注的是如何管理构造函数失败的情况.
我们尝试了懒惰的评估,其中每个方法都能够实例化动态资源并返回状态值,但这意味着每个类方法都必须返回一个返回值,这会在代码中产生很多 ifs并且在方法中非常烦人这通常不会导致错误.
我们研究了添加静态create方法,该方法返回指向创建对象的指针,如果创建失败则返回NULL,但这意味着我们不能再将对象存储在堆栈中,如果需要,仍需要传入对状态值的引用对实际错误采取行动.
根据谷歌的C++风格指南,他们不使用异常,只在他们的构造函数中做一些简单的工作,使用init方法进行非平凡的工作(在构造函数中做工作).但是,在使用这种方法时,我无法找到有关它们如何处理构造错误的信息.
有没有人在这里试图消除异常并提出一个很好的解决方案来处理施工失败?
我们使用一个简单的对象模型来处理我们的低级网络代码,其中struct指针被传递给假装为方法的函数.我继承了大部分代码,这些代码是由具有可通行的C/C++经验的顾问编写的,我花了很多深夜试图将代码重构为类似于合理结构的东西.
现在我想将代码置于单元测试下,但考虑到我们选择的对象模型,我不知道如何模拟对象.请参阅以下示例:
示例标题(foo.h):
#ifndef FOO_H_
#define FOO_H_
typedef struct Foo_s* Foo;
Foo foo_create(TcpSocket tcp_socket);
void foo_destroy(Foo foo);
int foo_transmit_command(Foo foo, enum Command command);
#endif /* FOO_H_ */
Run Code Online (Sandbox Code Playgroud)
示例源(foo.c):
struct Foo_s {
TcpSocket tcp_socket;
};
Foo foo_create(TcpSocket tcp_socket)
{
Foo foo = NULL;
assert(tcp_socket != NULL);
foo = malloc(sizeof(struct Foo_s));
if (foo == NULL) {
goto fail;
}
memset(foo, 0UL, sizeof(struct Foo_s));
foo->tcp_socket = tcp_socket;
return foo;
fail:
foo_destroy(foo);
return NULL;
}
void foo_destroy(Foo foo)
{
if (foo != NULL) { …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个适合嵌入式Linux设备(Linux和uClinux)的开源消息总线.
它需要满足以下标准:
消息总线主要由我们系统上的应用程序使用,以便传递配置参数等,因此它不需要满足实时要求.
有人知道如何将exe文件嵌入到dll中?
我有一个工具,它是我从c#代码调用的exe文件.
问题是我想要1个dll包含这个工具(exe文件)和dll包含我的c#代码.
是否可以在资源中嵌入此exe文件?
Thx提前
我目前正在使用outlookedit.el从Outlook中往返电子邮件,以便在与人对应时保持理智.除了当我必须使用特殊字符,在这种情况下用于瑞典语的"åäö"时,它工作得非常漂亮.
当我在Outlook(Cc oe)中打开包含这些字符的电子邮件时,它们在Emacs中看起来都很好但是当我将更改保存回Outlook(Cc os)时," åäö "变成" åà "切换回来对于Emacs(Cc oe),他们被Emacs正确地转换为" åäö ".
如果我没有使用outlookedit.el而是在Outlook和Emacs之间复制/粘贴文本,那么字符转换似乎完美无缺,但我不想这样做.
我试图强制Outlook将选项 - > 邮件格式 - > 国际选项中的电子邮件编码为US-ASCII,ISO-8859-1和UTF-8 ......但结果始终相同.
我如何(最好)修改我的.emacs以正确处理字符转换或重新配置Outlook以使这些字符的往返工作?
我目前的Emacs配置可在http://github.com/dholm/dotemacs/上查看.
每当我使用STL在C++中实现某些东西时,我一直虔诚地使用SGI的标准模板库程序员指南(STLPG)作为参考手册.直到昨天它一直没有让我失望,但昨天我正在使用std :: vector工作,并与我的一位同事进行配对编程,他告诉我使用assign方法.我没有认识到这种方法对我来说很不寻常,所以我开始挖掘STLPG 的std :: vector部分并且没有提到任何assign方法.我的同事向我指出cpluplus.com页面上的std ::矢量你瞧它有一对夫妇的其他方法,比如沿着是在,我还从来没有见过.
这让我很困惑,所以我在这个问题上去了中世纪并挖到了*/usr/include/c ++/4.1.2/bits/stl_vector.h*,这是版权所有Hewlett-Packard公司1994和Silicon Graphics Computer Systems,Inc.1996和它包含了assign的实现,并且没有任何特别的评论,提到为什么在最近的版权所有者自己的文档中省略了它们.
有没有比我更熟练的人可以阐明社区存在这些差异的原因以及我可以信赖的在线参考手册是否符合所有现代STL实施?
我正在编写一个小应用程序,它在SD卡上以恒定速率写入jpeg图像.我选择了一个EXT3文件系统,但是在EXT2文件系统中观察到了相同的行为.
我的写循环看起来像这样:
get_image()
fwrite()
fsync()
Run Code Online (Sandbox Code Playgroud)
或者像这样:
get_image()
fopen()
fwrite()
fsync()
fclose()
Run Code Online (Sandbox Code Playgroud)
我还显示了一些时序统计信息,我可以看到我的程序有时会被阻止几秒钟.平均速率仍然很好,因为如果我将传入的图像保持为fifo,那么我将在这样的停顿之后的短时间内写出许多图像.您知道操作系统是否存在问题,或者它是否与SD卡本身有关?我怎么能接近实时?我不需要强大的实时性,但是停滞几秒钟是不可接受的.
一些精度:是的,每个文件后都需要fsync,因为我希望图像在磁盘上,而不是在某些用户或内核缓冲区中.没有fsyncing,我有更好的吞吐量,但仍然是不可接受的失速.我不认为这是一个缓冲区问题,因为第一次失速发生在写入50 MB之后.根据手册页,fsync正是为了确保没有数据缓冲.
关于平均写入速率的精确度:我正在以我正在使用的卡可持续的速率写入.如果我在等待fsync完成时堆叠传入的图像,那么在此停顿之后写入传输速率将增加,我将很快回到平均速率.平均传输速率约为1.4 MB/s.
系统是一台现代笔记本电脑运行ubuntu 8.04与库存记录(2.6.24.19)
当在下面的代码片段中将变量x声明为常量时,clang 2.9 和 g++ 4.1.2 都会生成警告。然而,当const被删除时,就像在代码片段中一样,即使使用以下我所知道的最严格的参数执行时,两个编译器都不会生成警告:“-Wall -Wextra -pedantic -ansi”
为什么编译器不会推断并报告相同的警告,因为x不是 volatile 并且在类型转换之前不可能被修改?
#include <iostream>
int main(int argc, char **argv)
{
unsigned int x = 1000;
const unsigned char c = x;
const unsigned int x_ = c;
std::cout << "x=" << x << " x_=" << x_ << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用const unsigned int x = 1000; g++ 提供消息“警告:大整数隐式截断为无符号类型”和clang“警告:从'const unsigned int'到'const unsigned char'的隐式转换将值从1000更改为232 [-Wconstant-conversion] ”。
有没有办法在不手动检查代码或依赖正确设计的单元测试的情况下自动检测这种情况?
我使用url.<base> .insteadOf方案使用Git存储库将实际的repo URL存储在〜/ .gitconfig中.我使用的其中一个应用程序尝试使用git-config计算出对repo的访问方案(ssh,http等),但它失败了,因为输出看起来像这样:
# git config --get remote.origin.url
gerrithost:department/project
Run Code Online (Sandbox Code Playgroud)
凡gerrithost是建立在我的〜/的.gitconfig:
[url "ssh://machine.dn.tld:29418/"]
insteadOf = gerrithost:
Run Code Online (Sandbox Code Playgroud)
应用程序期望git config --get remote.origin.url的输出如下所示:
ssh://machine.dn.tld:29418/department/project
Run Code Online (Sandbox Code Playgroud)
git remote -v显示已解析的URL,但我必须解析输出以获取正确的远程和字段.
是否可以使用git-config(或其他工具之一)获取已解析的URL,或者我是否必须恢复为git remote编写解析器?