如何使用size_t迭代uint64*,以及c#的等效函数是什么
How do you iterate through a uint64* with size_t, and what is the equivilent for c#?
我正在做一个用c#写的Teamspeak3插件(使用这个基础),我正在努力获得一个频道列表,这就是如何在c中做到这一点:
/* Print list of all channels on this server */
char* s;
char msg[1024];
anyID myID;
uint64* ids;
size_t i;
unsigned int error;
if(ts3Functions.getChannelList(serverConnectionHandlerID, &ids) != ERROR_ok) {
ts3Functions.logMessage("Error getting channel list", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
return;
}
printf("PLUGIN: Available channels:n");
for(i=0; ids[i]; i++) {
/* Query channel name */
if(ts3Functions.getChannelVariableAsString(serverConnectionHandlerID, ids[i], CHANNEL_NAME, &s) != ERROR_ok) {
ts3Functions.logMessage("Error querying channel name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
return;
}
printf("PLUGIN: Channel ID = %llu, name = %sn", (long long unsigned int)ids[i], s);
ts3Functions.freeMemory(s);
}
ts3Functions.freeMemory(ids); /* Release array */
在for(i=0; ids[i]; i++)
处,表示uint64*
正在与size_t
进行迭代。
我想知道迭代是如何工作的,在c#中最接近的等效是什么?
我找到了答案(感谢localhost和Chris找到了这个!)基本上,ulong*
指向一个数组,size_t
遍历它,试图找到通道的id。因为在c++中,for循环中,除0之外的所有数字都为真,它会一直查询,直到没有通道id,并返回一个0。TeamSpeak社区论坛Post
对于使用这个插件的c#代码感兴趣的人:
if (funcs.getChannelList(serverConnectionHandlerID, ref v) != Errors.ERROR_ok) {
funcs.logMessage("Failed", LogLevel.LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
break;
}
// Convert it to a ulong*
ulong * ptr = (ulong * ) v.ToPointer();
// Iterate through the array
for (ulong t = 0; ptr[t] != 0; t++) {
// The String result
string result;
// The pointer result
IntPtr res = IntPtr.Zero;
/*
Channel Variable Arguments:
1: The server connection ID
2: The iterated channel id
3: An IntPtr at 0, which signifies CHANNEL_NAME
4: A reference to stores results
*/
if (
funcs.getChannelVariableAsString(serverConnectionHandlerID, ptr[t], new IntPtr(0), ref res) != Errors.ERROR_ok) {
// Error message
funcs.logMessage("Error", LogLevel.LogLevel_WARNING, "Plugin", serverConnectionHandlerID);
break;
}
// Convert the pointer to a string
if ((result = Marshal.PtrToStringAnsi(res)) == null) break;
// Print it
funcs.printMessageToCurrentTab(result);
}
相关文章:
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- BOOST矩阵的迭代器1和迭代器2是什么,以及如何使用
- 是什么导致异常输出以及如何修复
- 该代码将如何工作以及输出的输出是什么
- 错误 opencv 错误断言失败 (p [-1] <= 2) 是什么意思以及如何处理它?
- wxDataViewModel:它是什么以及如何使用它
- typedef void (*MyCallback) : 它是什么以及如何使用它
- C/C++ 三维数组如何在内存中存储,以及遍历它的最快方法是什么
- 这个错误是什么意思?(errorc2678)以及如何修复代码
- 在 C++ 中,在矩阵中搜索最小值和最大值以及不同行或列的最快方法是什么
- 这个链接器警告的含义是什么,以及如何修复它
- 这个指针类型是什么以及如何使用它
- c在这两种情况下是如何工作的以及有什么不同
- InterlockedCompareExchange - 确切的对齐要求是什么以及如何强制执行
- 代码库是什么意思?以及我如何访问一个
- 这是什么样式的组装(英特尔,att..等等?以及我如何生产它
- 如何计算对该函数的递归调用,以及正确答案是什么
- 是什么导致了我在套接字代码上的编译错误,以及我如何修复它
- 当我们从用户模式转移到内核模式时,哪些寄存器会发生变化?!以及转移到内核模式的原因是什么
- 什么是“using”,以及C++中构造函数后面的冒号是什么