【问题标题】:Vector won't store correct datatype (wchar_t instead of uint16_t)Vector 不会存储正确的数据类型(wchar_t 而不是 uint16_t)
【发布时间】:2011-12-11 18:32:14
【问题描述】:

我有一些来自网络的代码,将高光谱数据(图像,所以很多整数给出像素强度)读入向量。我在 Linux 系统上成功使用了该代码,但现在我在 Windows 系统上需要相同的代码。我使用 Visual Studio 2008。

在 Linux 中读取数据我得到一个充满整数的向量。在 Windows 上,我得到整数,然后是一些字符或字节数据。我没有足够的知识来更好地描述它。

向量被初始化为

std::vector< unsigned short int > data;
data.resize( samples * lines * bands );
std::fill( data.begin(), data.end(), 0 );

相关代码是

for( unsigned int i=0; i < num_pixels && file; ++i ){
     char number[sizeof(DataType)];
     file.read( number , sizeof( DataType ) );
     int l = sizeof(DataType)-1;
    if (machine_endian != header.big_endian) {
        for (int j = 0; j < l; j++, l--){
            number[j] ^=number[l];
            number[l] ^= number[j];
            number[j] ^= number[l];
        }
    }
 unsigned short temp = *((unsigned short int*)number);
     data[i] = temp;
}

machine_endian 部分永远不会运行。 temp 只是为了测试我是否可以将数字转换为 int。它工作正常。但是,当我将 temp 放入向量中时,插入的信息不仅仅是 int,它被列为 wchar_t。见下图。我想这与字体大小有关,但我不知道为什么。是我的错还是 Visual Studios 的错?有什么想法吗?

【问题讨论】:

  • wchar_t 被定义为unsigned short (如果它没有直接定义,它是两个字节并且行为相同)所以它只是类型名显示问题。数字是否正确(无论类型如何)?
  • 感谢您的回复!好的,这有点清楚了。不幸的是,我现在无法确定这些数字,但我没有理由相信它们是不正确的(合理的值)。如果它非常重要,我可以尝试获取这些值,但这有点工作。但是如何将它们很好地保存在 temp 变量中,然后在使用相同数据类型初始化向量时在向量中获取额外数据?
  • 对不起,英语不是我的母语,我不懂“但是如何将它们很好地保存在临时变量中,然后在向量中使用相同的数据类型初始化时获取额外的数据?”你能改写一下这个问题吗?
  • 请参阅我对以下答案的评论。英语也不是我的第一语言,所以这可能是它不清楚的原因;)但我想知道 813 L 中的 L 之后的字符“部分,我认为实际数据就是全部,而不是它首先显示int 然后是字符。
  • @Seth: wchar_t 既不是unsigned short 也不是两个字节。实际上,几乎没有这样的具体要求(3.9.1/5);它只需要能够支持所有可用语言环境中最大的扩展字符集。

标签: c++ wchar-t


【解决方案1】:
typedef struct {
    unsigned short x;
    unsigned short y;
    unsigned short z;
} vec3_t;

并使用 vec3_t 代替 std::vector。

在 Windows 中 wchar_t 与 unsigned short 相同,而在 Unix 中它是 4 个字节长,因此您应该创建自己的向量类型以使您的代码具有可移植性。

【讨论】:

  • 在 UNIX 中未指定它有多长(尽管 4 字节确实倾向于遵循语言环境的要求)。
【解决方案2】:

一切正常,只是 wchar_t 在您的平台上是 unsigned short 的同义词,因此调试器不知道在那里显示什么名称。也没有插入“更多信息”。又是 MSVC 调试器将数字解释为宽字符。

【讨论】:

    【解决方案3】:

    实际上,它运行良好。 Microsoft 只是想方便检查wchar_t 值(它们是short ints 并在Windows 上表示utf16 编码字符),因此他们的调试器将short ints 显示为wchar_ts。这只是解释的问题。

    如果您使用chars 处理数据,几乎在任何架构上都会遇到同样的现象。

    【讨论】:

    • 谢谢。那时我可能还有其他问题,因为一段时间后向量没有按应有的方式填充。所以我想我有一个数据问题,应该真正检查数字是否正确。奇怪的是它在 linux 上运行良好。但是 int 之后的那些额外字符来自哪里?记忆中的随机片段?编辑:没关系,我猜 L 之后的那部分是角色......?之前应该想到的,再次感谢!
    • s/and represent/and can represent/ 数据类型T 没有什么神奇之处,它可以自动管理数组的编码T[N]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2012-11-26
    • 2017-10-25
    相关资源
    最近更新 更多