【问题标题】:Passing a list as an attribute in C ++在 C++ 中将列表作为属性传递
【发布时间】:2017-03-09 14:15:11
【问题描述】:

我需要创建一个LPSTR 列表并将其放入结构的LPSTR 属性中。

typedef struct _wfs_pin_caps
{
...
LPSTR               lpszExtra; //This attribute should receive
} WFSPINCAPS, * LPWFSPINCAPS;

我需要这种东西。

WFSPINCAPS PinCapabilities;

list<LPSTR> Keys;
Keys[0] = (LPSTR) "value=key";
Keys[1] = (LPSTR) "value1=key1";
Keys[2] = (LPSTR) "value2=key2";

PinCapabilities.lpszExtra = Keys;

我需要传递具有各种值的列表...

【问题讨论】:

  • 如果您必须强制转换才能使字符串起作用,这表明您正在做一些危险和错误的事情。在这种情况下,您正在抛弃 constness,而且您甚至看不到您正在这样做。
  • LPSTR 中存储指向std::list 的指针确实没有意义。为什么在struct 中没有std::list*
  • 最终程序需要多个值,比如数组
  • @MatheusCardozo 请阅读我的更新,我认为它很清楚。
  • @IharobAlAsimi 好的,伙计...我会测试

标签: c++ dll cen-xfs


【解决方案1】:

很简单,就这么做

struct _wfs_pin_caps {
    // ... other fields ...
    std::list<const LPSTR> lpszExtra;
};
list<const LPSTR> &extra(PinCapabilities.lpszExtra);
extra.push_back(TEXT("value1=key1"));
extra.push_back(TEXT("value2=key2"));
// ... more items ...
extra.push_back(TEXT("valueN=keyN"));

阅读The TEXT macro,这样你就不会做那种尴尬的演员,顺便说一句,这是错误的。

注意:您可能需要 std::vector,阅读他们的文档来决定。

【讨论】:

  • 嘿家伙,我需要传递具有各种值的列表
  • 推测该结构不是 OP 要更改的代码。 TEXT 也不是LPSTR,而是LPTSTR。如果字符串要更改为宽字符串,TEXT 将开始产生编译器错误。在任何情况下,现在一般来说,T 型弦都已经过时了。 TEXT 也没有修复演员表,因为 TEXT 与 const 正确性无关。至于const,它不起作用,因为LPSTRchar*,使const LPSTR 成为char* const。更常见的拼写是LPCSTR
  • @Iharob Al Asimi 家伙,我需要使用这个结构: typedef struct _wfs_pin_caps { ... LPSTR lpszExtra; //这个属性应该接收 } WFSPINCAPS, * LPWFSPINCAPS;
  • 你不能,然后创建一个结构列表。
【解决方案2】:

这是一个纯粹的 cen-xfs 东西,所以只有 C++ 知识是不够的。 XFS 结构的所有 lpszExtra 字段都是特殊格式的 C 字符串。

因此,填充 xfs 功能结构的 lpszExtra 字段的正确方法是使用双 NULL 终止和 NULL 分隔字符串。 由于所有这些字段都是键值对,因此格式为: “key1=value1\0key2=value2\0...\0keyN=valueN\0\0” 注意这里的“keyX”并不意味着 PINPAD 键定义,而是所有 XFS lpszExtra 字段数据的格式化方式,因此首先 key_name =-sign key_value。

如何处理这些字符串取决于您,但我喜欢使用普通换行符而不是 '\0' 作为键值对分隔符,然后将其转换为/从它转换为 XFS 特定的 NULL 字符分隔和双 NULL终止格式。

这样您就可以使用普通的 C 字符串方法在您自己的代码中进行操作。

简单的转换是分配内存,在从 C 字符串复制到 XFS 时复制和交换 '\n' 到 '\0' 和 '\0' 到 "\0\0" 并在从 XFS 转换到 C 字符串时反向.

请注意,这仅适用于 XFS 结构中的那些 lpszExtra 字段。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2019-10-20
    • 2020-04-21
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2013-12-03
    相关资源
    最近更新 更多