【问题标题】:How can I create an array of void whose size will be specified by the user input from command line?如何创建一个 void 数组,其大小将由用户从命令行输入指定?
【发布时间】:2016-12-31 16:38:55
【问题描述】:

我想要求用户输入一个整数来创建一个像这样的二维数组:

void* myArray_1[2][userInput];

编译器不允许这样做,因为userInput 不是常量。

然后我尝试了这个:

void** myArray_2 = new void*[rowCount];
for(int i = 0; i < rowCount; ++i)
    myArray_2[i] = new void[colCount];

导致以下错误:

错误:不允许使用 void 数组。

如何创建一个 void 数组,其大小将由用户从命令行输入指定?

编辑:
我的函数原型是:
errorType EventGet ( EVENT_HANDLE hEvent, void * pBuffer);

我用过这个:

void* myArray_3[2][10];
...
myArray_3[0][count++] = myOtherArray[0]; //myOtherArray[0] contains a handle and myOtherArray is an 1D array with size of 2.
EventGet ( myEventHandle, myArray_3[0][i]);

我得到了正确的结果。现在我唯一想要的是允许用户指定第二维大小而不是 10。

【问题讨论】:

  • 您希望在 void 数组中放入什么?错误消息很清楚,这种事情是不允许的。动态大小甚至无关紧要。
  • std::vector&lt;std::vector&lt;void*&gt;&gt; myVector(2, std::vector&lt;void*&gt;(userInput));
  • 也许您想要一个void* 的二维数组:void*** myArray ...
  • @Code-Apprentice 我想将它传递给一个接受 void 二维数组的函数。是的,我想要一个void* 的二维数组。
  • @GmtK:你是一个困惑的人。没有函数可以接受 void 的 2D 数组。 (至少,不是在 C++ 中)。向我们展示函数的实际签名。

标签: c++ arrays visual-studio-2013 command-line


【解决方案1】:

杀点不是传球、指点或任何类似的东西,问题就在这里:

myArray_2[i] = new void[colCount];

new void[colCount]; 说“给我一个void 的数组。” void 是“无类型”的占位符,无法实例化。您实际上将创建一个什么都没有的数组。没有什么是没有定义的。没有大小。这是做不到的。

但是,OP 希望复制 Variable Length Array

void* myArray_1[2][userInput];

为此,OP 需要进一步间接一层,并存储void * 的二维数组(实际上是数组数组)。

void*** myArray_2 = new void**[rowCount];
for(int i = 0; i < rowCount; ++i)
    myArray_2[i] = new void*[colCount];

这将给出void* myArray_1[2][userInput];的外观

首选的 C++ 方法是使用容器为您和 use a std::vector 管理内存:

std::vector<std::vector<void*>> myVector_1(2, std::vector<void*>(userInput));

定义一个vector,其中包含一个vector,该vector 包含指向void 的指针。外部vector 的大小预置为 2 个元素,内部向量的大小预置为 userInput 元素。

【讨论】:

  • 金句:OP需要再间接一层。有效!谢谢。
【解决方案2】:

显然你需要一个void* 的数组。这与void 的二维数组不同,因为您无法分配void 的数组作为错误状态。第一层是正确的:

void** myArray_2 = new void*[rowCount];

但是,第二层必须分配一个有效的类型,例如

void** myArray_2 = new void*[rowCount];
for(int i = 0; i < rowCount; ++i)
    myArray_2[i] = new int[colCount];

当然,除了int,您可以输入任何您想要的类型。如果需要,您还可以混合类型。

【讨论】:

    【解决方案3】:

    根据 Igor Tandetnik 的评论,鉴于您知道外部大小为常数 2,您可以执行以下操作:

    std::vector<void*> myArray[2] = {
      std::vector<void*>(userInput), std::vector<void*>(userInput)
    };
    
    for (int i = 0; i < userInput; ++i) {
      work on myArray[0][i]...
      work on myArray[1][i]...
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多