我正在从FUSE阅读这个示例代码:
http://fuse.sourceforge.net/helloworld.html
我无法理解以下代码片段的作用:
static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
{
(void) offset;
(void) fi;
Run Code Online (Sandbox Code Playgroud)
具体来说,(void)"变量名"的东西.我以前从未在C程序中看到过这种结构,所以我甚至不知道要在Google搜索框中添加什么.我目前最好的猜测是它是未使用的函数参数的某种说明符?如果有人知道这是什么,可以帮助我,那将是伟大的.谢谢!
我试图找到我的程序中的瓶颈(目前处于"低悬的水果"阶段),并使用分析器我得到如下内容:

我在这里看到的是RtlInitializeExceptionChain占用了大部分时间,而我实际程序中的函数甚至没有进入这个顶级列表.我想知道是否有人知道RtlInitializeExceptionChain做了什么,如何调用它,以及如何重新组织我的程序而不是这么称呼它?
关于我的项目的一些其他信息:它是使用ATL的COM API,被分析的程序是一个"测试"C++程序,它使用这个API.
谢谢!
假设我有一个字符数组,我已在堆上分配,并且我想将其转换为std :: string.目前我正在做以下事情:
char *array = new char[size];
WriteIntoArray(array, size);
std::string mystring(array);
delete[] array;
return mystring; // or whatever
Run Code Online (Sandbox Code Playgroud)
从我在互联网上读到的内容(http://www.cplusplus.com/reference/string/string/string/),字符串构造函数执行我传递它的缓冲区的副本,让我释放缓冲区(稍后,该字符串释放其内部缓冲区).我想要做的是分配我的缓冲区,将它的控制转移到字符串,然后在它被破坏时让它释放我的缓冲区.
这个问题从字符*初始化的std :: string没有副本看起来前途无量,但我的代码依赖于(在上面的例子中"WriteIntoArray")API调用它必须写入字符数组,所以我必须创建一个C风格char*buffer,并且不能将我的代码转换为仅使用内置字符串操作(这是建议的答案).
有没有一些标准的方法来做到这一点,或者我应该写我自己的字符串类(呃)?谢谢!
我是Go的新手,并希望将一个数组(切片)复制到另一个数组中.例如,我有一个largeArray [1000]字节或者什么和一个smallArray [10]字节,我希望largeArray的前10个字节等于smallArray的内容.我试过了:
largeArray[0:10] = smallArray[:]
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.是否有内置的类似memcpy的功能,或者我只需要自己写一个?
谢谢!
我正在编写用C++编写COM的API,还编写一个在C#中使用这个API的程序.我的问题是关于将BSTR传递给COM函数时的BSTR内存管理语义.说我的IDL看起来像:
HRESULT SomeFunction([in] BSTR input);
Run Code Online (Sandbox Code Playgroud)
目前这个功能是这样实现的:
HRESULT SomeFunction(BSTR input) {
// Do stuff ..., then:
SysFreeString(input);
}
Run Code Online (Sandbox Code Playgroud)
当我用C#调用它时,C#SomeFunction(myString)会生成这样的东西(伪代码):
myString = SysAllocString("string");
SomeFunction(myString);
Run Code Online (Sandbox Code Playgroud)
或者更喜欢这样:
myString = SysAllocString("string");
SomeFunction(myString);
SysFreeString(myString);
Run Code Online (Sandbox Code Playgroud)
也就是说,C#是否释放它生成的BSTR来编组COM接口,还是应该在我的函数中释放它?谢谢!
我正试图在网络程序中使用Google的协议缓冲区(protobuf),使用裸套接字.我的问题是:在发送方发送消息后,接收方如何知道发送了什么类型的消息?例如,假设我有消息定义:
message StrMessage {
required string str = 1;
}
message IntMessage {
required int32 num = 1;
}
Run Code Online (Sandbox Code Playgroud)
现在,发送器对其进行StrMessage序列化,并通过网络发送序列化字节.接收器如何知道使用StrMessage而不是IntMessage反序列化字节?我试过做两件事:
// Proposal 1: send one byte header to indicate type
enum MessageType {
STR_MESSAGE = 1;
INT_MESSAGE = 2;
}
// Proposal 2: use a wrapper message
message Packet {
optional StrMessage m_str = 1;
optional IntMessage m_int = 2;
}
Run Code Online (Sandbox Code Playgroud)
但是,这些似乎都不是很干净,并且都要求我手动列出所有消息类型.是否有规范/更好的方法来处理这个问题?
谢谢!
我正在尝试编写一个简单的Unix数据报服务器/客户端,并且遇到了一些问题.我想要的是一个服务器,它监听数据报套接字并将收到的每条消息的回复发送给原始发送者.我决定首先尝试使用socat"服务器"并在C中编写客户端.我正在运行这样的socat:
socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这应该监听/tmp/test.socket并回复使用相同字符串收到的所有内容?然后我有一个看起来像这样的客户端程序(为清楚起见,删除了错误检查):
int s = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, "/tmp/test.socket");
const char *data = "Testing data";
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un));
printf("Sent!\n");
unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len);
for (int i = 0; i < recv_len; i++) {
putc(buffer[i], stdout);
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
它应该发送数据包(有效),接收数据包,然后将其打印出来,但程序似乎无法接收数据包.我在这里做错了什么,或者我对Unix套接字有一个根本的误解?谢谢!
我正在用C#编写一个视频游戏,我想只在游戏循环的特定点处理某些事件(例如键盘/鼠标事件).例如,有没有办法写出如下内容:
void gameLoop()
{
// do updates
handleAllEvents();
render();
}
Run Code Online (Sandbox Code Playgroud)
如果事件发生在循环中的某个其他点,我想等到handleAllEvents()处理它们."事件"我的意思是标准的C#事件系统,例如:
public event Action<object, KeyboardEventArgs> KeyPressed;
Run Code Online (Sandbox Code Playgroud)
如果问题没有明确表达,请告诉我.谢谢!
我在Python/Flask Web应用程序中使用用户提供的名称作为路径组件:例如,用户创建一个名为"hello"的项目,提示我的Web应用程序创建一个名为"data/hello /"的文件夹来存储文件用户将上传.我想知道如何清理用户提供的名称,以便例如用户不能输入"../hello"并且在不同的目录中创建文件夹.我能想出的最好的基于路径名的解决方案是这样的:
import os.path
rpath = os.path.relpath(input_path)
safepath = rpath[rpath.index('../'):]
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来确保我的网络应用程序不访问目录之外的data文件?谢谢!
我想使用MurmurHash3唯一地识别大型数据。此实现:
http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.h
不过,似乎并没有提供一种增量更新哈希的方法-它似乎为给定的每个数据块计算一个单独的哈希。例如,如果我要对磁盘中的512MB数据进行哈希处理,则可能不想一次将其全部加载到内存中,或者如果我要对网络中的未知数据进行哈希处理。有没有人曾经在这样的上下文中使用过MurmurHash3(以增量方式散列大量数据)?如果您可以向我介绍一些资源或替代实施,那将非常好:)。我正在寻找与SHA256_UpdateOpenSSL 类似的东西。
谢谢!
c++ ×4
c ×2
c# ×2
com ×2
python ×2
buffer ×1
com-interop ×1
datagram ×1
events ×1
flask ×1
fuse ×1
go ×1
murmurhash ×1
networking ×1
opentk ×1
optimization ×1
security ×1
sha ×1
socat ×1
sockets ×1
stl ×1
string ×1
unix-socket ×1
user-input ×1