Я работаю над плагином Teamspeak3, написанным на c # (используя эта база) и я работаю над получением списка каналов, вот как это сделать в 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 */
В for(i=0; ids[i]; i++)
, это заявляет, что uint64*
перебирается с size_t
,
Мне интересно, как работает итерация через это, и что является ближайшим эквивалентом в C #?
Я нашел ответ (спасибо localhost и Крису за это!). В основном, ulong*
указывал на массив, а size_t
проходил через это, пытаясь найти идентификаторы канала. Поскольку в C ++ в цикле for каждое число, кроме нуля, имеет значение true, оно продолжало запрашивать его до тех пор, пока не будет больше идентификаторов каналов и не будет возвращен ноль. Сообщение на форумах сообщества TeamSpeak
Для всех, кто интересуется кодом с использованием 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);
}