gpt4 book ai didi

Delphi 并使用 Teamspeak SDK 读取返回的多暗淡数组

转载 作者:行者123 更新时间:2023-12-03 01:02:09 25 4
gpt4 key购买 nike

我正在尝试从 TeamSpeak3 SDK 读取返回的数组,其中一些方法返回以 null 结尾且具有混合数据类型的多维数组。

我应该将什么“delhpi”结构作为参数传递,以及如何在匹配的结构中读取返回的值?啦。

type
TDeviceInfo = record
DeviceId : string; // maybe an integer
DeviceName : string;
end;

TDeviceInfoArr = array of TDeviceInfo

// or maybe
TDeviceInfoArr = array of array[0..1] of string;

var
DeviceArr : array of TDeviceInfoArr;

这是 SDK 文档的内容。

要获取指定模式的所有可用播放和捕获设备的列表,请调用

unsigned int ts3client_getPlaybackDeviceList(modeID, result); 
const char* modeID;
char**** result;

unsigned int ts3client_getCaptureDeviceList(modeID, result);
const char* modeID;
char**** result;

参数
• 模式ID
定义要使用的播放/捕获模式。对于不同的模式可能有不同的设备列表。有效模式由
返回ts3client_getDefaultPlayBackMode/s3client_getDefaultCaptureMode 和 ts3client_getPlaybackModeList/ts3client_getCaptureModeList。

• 结果
接收以 NULL 结尾的数组的变量的地址 { { char* deviceName, char* deviceID }, { char* deviceName, char* deviceID }, ... , NULL }。
除非函数返回错误,否则需要使用 ts3client_freeMemory 释放数组元素和数组本身。
成功时返回 ERROR_ok,否则返回 public_errors.h 中定义的错误代码。如果发生错误,结果数组未初始化且不得释放。

查询所有可用播放设备的示例:

char * defaultMode;
if (ts3client_getDefaultPlayBackMode( & defaultMode) == ERROR_ok) {
char * * * array;
if (ts3client_getPlaybackDeviceList(defaultMode, & array) == ERROR_ok) {
for (int i = 0; array[i] != NULL; ++i) {
printf("Playback device name: %s\n", array[i][0]); /* First element: Device name */
printf("Playback device ID: %s\n", array[i][1]); /* Second element: Device ID */
/* Free element */
ts3client_freeMemory(array[i][0]);
ts3client_freeMemory(array[i][1]);
ts3client_freeMemory(array[i]);
}
ts3client_freeMemory(array); /* Free complete array */
} else {
printf("Error getting playback device list\n");
}
} else {
printf("Error getting default playback mode\n");
}

最佳答案

首先,我将忽略错误处理,因为我认为我们在您的上一个问题中处理了该问题。我假设 ts3client_getDefaultPlayBackMode 不会出现任何问题。

这样就剩下了ts3client_getPlaybackDeviceList。像这样导入它:

function ts3client_getPlaybackDeviceList(modeID: PAnsiChar; 
out result: PPPAnsiChar): Cardinal; cdecl; external '...';

您可能需要定义PPPAnsiChar

type
PPPAnsiChar = ^PPAnsiChar;
PPAnsiChar = ^PAnsiChar;

您可能会发现 RTL 已经定义了 PPAnsiChar

所以,接下来调用该函数。首先声明一个变量来保存数组,等其他的来帮助迭代:

var
arr, myarr: PPPAnsiChar;
p: PPAnsiChar;

然后调用函数:

ts3client_getPlaybackDeviceList(modeID, arr);
myarr := arr;
while myarr^ <> nil do
begin
p := myarr^;
Writeln('Playback device name: ', p^);
ts3client_freeMemory(p^);
inc(p);
Writeln('Playback device ID: ', p^);
ts3client_freeMemory(p^);
ts3client_freeMemory(myarr^);
inc(myarr);
end;
ts3client_freeMemory(arr);

这段代码确实相当卑鄙,我相信你会同意的。如果您有现代版本的 Delphi,那么您可以启用指针数学以使其可读性更好。

{$POINTERMATH ON}

ts3client_getPlaybackDeviceList(modeID, arr);
i := 0;
while arr[i] <> nil do
begin
Writeln('Playback device name: ', arr[i][0]);
Writeln('Playback device ID: ', arr[i][1]);
ts3client_freeMemory(arr[i][0]);
ts3client_freeMemory(arr[i][1]);
ts3client_freeMemory(arr[i]);
inc(i);
end;
ts3client_freeMemory(arr);

虽然这段代码更好,但它永远不会赢得选美比赛。

请记住,我忽略了所有错误检查。您需要添加它。

关于Delphi 并使用 Teamspeak SDK 读取返回的多暗淡数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27127380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com