【问题标题】:Multidimensional array calculating多维数组计算
【发布时间】:2015-07-27 08:12:15
【问题描述】:

我有一个TCHAR 的数组,我在其中存储文件扩展名。

TCHAR *extens[] = { L".*", L".txt", L".bat" };

为了通过它,我正在计算它的长度。

int extCount = sizeof(extens) / sizeof(TCHAR);

但由于某种原因extCount的值是2。我认为问题是因为这是错误的计算方法,但是,如何正确计算这个数组中元素(“单词”)的数量?

UPD:我正在将此数组传递给函数:

void func(TCHAR *path, TCHAR **names, TCHAR **extensions);

当我在函数外计算这个数组长度时,它显示正确的数字,但在它里面总是工作错误(返回 2 或 1)。

UPD2: 我试图像这样重新声明数组:

TCHAR *extens[] = { L".txt", L".bat", L".txt", NULL };

现在在函数内部我正在做类似的事情:

TCHAR **p = extensions;
    int extCount = 0;
    while (*p != NULL)
    {
        extCount++;
        *p++;
    }

    extCount = cnt;
    wsprintf(temp, L"%d", cnt);
    MessageBox(NULL, temp, temp, MB_OK);

它可以工作,但看起来它不是那么有效,因为要遍历两个数组,不是吗?

【问题讨论】:

  • 你有一个 TCHAR* 数组,而不是 TCHAR
  • 你在期待什么?您将一个字符串放入数组中,因此长度为 1。
  • @ElderBug,不管有多少元素,都不总是1
  • @Ivan Petrov extCount 对我来说是 3。您是否重新构建了程序?
  • 在需要时使用char,在需要时使用wchar_t。在编译时在它们之间切换是零意义的。

标签: c++ arrays string tchar


【解决方案1】:

TCHAR *extens[]TCHAR 类型的指针数组。而这样一个数组的大小将是array_length * sizeof(pointer))

注意:系统上的sizeof(pointer) 对于所有数据类型都是相同的。

【讨论】:

  • 所以我需要获取数组长度(知道有多少元素)。
  • “系统上的 sizeof(pointer) 对所有数据类型都相同”。 AFAIK 这不受 C++ 标准的保证。特别是,sizeof(char*)>sizeof(otherdatatype*) 和 TCHAR 有可能代表char(如果 OP 修复程序以正确使用 _T())。
【解决方案2】:

您有一个 TCHAR* 数组。

获取以下数组的长度:

TCHAR *extens[] = { L".*", L".txt", L".bat" };

你需要使用:

sizeof(extens) / sizeof(TCHAR*)

【讨论】:

    【解决方案3】:

    首先,你有一个指针数组,所以你需要

    extCount = sizeof(extens) / sizeof(TCHAR*);
    

    计算它的大小。但是,这假定 extens 仍然是数组类型。一旦你将它传递给一个期望 TCHAR** 的函数,该数组将衰减为一个指针,并且它的大小信息将丢失。

    我认为你最好的选择是用std::stringstd::vector 重写它。这是 C++,所以你不妨使用它的功能。如果由于任何原因无法做到这一点,并且数组在编译时是已知的,则可以在数组大小上模板化函数:

    template <size_t N, size_t M>  
    void func(TCHAR *path, TCHAR *(&names)[N], TCHAR *(&extensions)[M]);
    

    语法可能有点混乱。例如,TCHAR *(&amp;names)[N] 被读作:“names 是对N 指向TCHAR 的指针数组的引用”。在这里,只要不让数组衰减为普通指针,编译器就会推导出大小 N。

    【讨论】:

    • 问题是数组可以在执行过程中动态改变。
    • 如果是这种情况,您根本不能像在问题中那样使用 C 样式数组。如果你需要动态大小的数组,你肯定需要std::vector
    • @IvanPetrov 您仍在使用静态数组,所以我的回答仍然有效。现在的情况是,您的数组无法更改大小。
    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2012-06-26
    • 2021-12-10
    • 1970-01-01
    • 2011-07-08
    • 2021-03-25
    • 2016-10-13
    相关资源
    最近更新 更多