Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何迭代大小为t的uint64*,c的等效值是多少?_C#_C++_Pointers_Size T_Teamspeak - Fatal编程技术网

C# 如何迭代大小为t的uint64*,c的等效值是多少?

C# 如何迭代大小为t的uint64*,c的等效值是多少?,c#,c++,pointers,size-t,teamspeak,C#,C++,Pointers,Size T,Teamspeak,我正在开发一个用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(serve

我正在开发一个用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 = %s\n", (long long unsigned int)ids[i], s);
        ts3Functions.freeMemory(s);
    }
    ts3Functions.freeMemory(ids);  /* Release array */
在(i=0;ids[i];i++)的
处,它表示
uint64*
正在使用
大小进行迭代

我想知道迭代是如何工作的,在c#?

中最接近的等价物是什么?我找到了答案(感谢localhost和Chris找到了答案!)。基本上,
ulong*
指向一个数组,而
size\u t
正在遍历它,试图找到频道的ID。因为在C++中,在for循环中,除零数之外的每个数都是真的,它一直查询它,直到没有更多的信道ID,并且返回了0。p> 对于任何对C语言中的代码感兴趣的人,请使用:

我找到了答案(感谢localhost和Chris找到了答案!)。基本上,
ulong*
指向一个数组,而
size\u t
正在遍历它,试图找到频道的ID。因为在C++中,在for循环中,除零数之外的每个数都是真的,它一直查询它,直到没有更多的信道ID,并且返回了0。p> 对于任何对C语言中的代码感兴趣的人,请使用:


你有没有考虑过检查一个现有的问题,如果有帮助的话,(比如C#中的size_t等价物)比如简短的回答:“使用IntPtr和/或UIntPtr是正确的-类型是专门用于此目的的!…”我已经看过了这个评论,但我也在问,如何使用size#t实现迭代,以及是否有一种方法可以在c#中实现同样的效果。因为在这个例子中,我不知道这样做的效果是什么。根据我自己的测试,迭代
大小\u t
类似于迭代
int
,除了变量定义为
size\u t
而不是
int
之外,循环中的比较也应使用
size\u t
类型的变量进行。仅作为说明,可以将类型转换为int;i、 e.
(int)my_size\u t
但是,不建议这样做——当不需要浇铸时,将每种类型视为正确的类型。关于C#中如何做的问题。有帮助吗?对不起,不活动,总之,我在C++中做了这个。我发现他回来了。你是否考虑过检查一个现有的问题,如果有帮助的话,(用C#表示大小等价物)比如简短的回答:“使用IntPtr和/或UIntPtr是正确的-类型是专门用于此目的的!…”我已经看过了这个评论,但我也在问,如何使用size#t实现迭代,以及是否有一种方法可以在c#中实现同样的效果。因为在这个例子中,我不知道这样做的效果是什么。根据我自己的测试,迭代
大小\u t
类似于迭代
int
,除了变量定义为
size\u t
而不是
int
之外,循环中的比较也应使用
size\u t
类型的变量进行。仅作为说明,可以将类型转换为int;i、 e.
(int)my_size\u t
但是,不建议这样做——当不需要浇铸时,将每种类型视为正确的类型。关于C#中如何做的问题。有帮助吗?对不起,不活动,总之,我在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);
}