【问题标题】:Vector/Array problems, cannot assign index to variable/cannot use variable as the array size(indexes) C++向量/数组问题,不能为变量分配索引/不能使用变量作为数组大小(索引)C++
【发布时间】:2015-09-01 14:35:19
【问题描述】:

好的,所以我正在尝试通过此转换函数将整数转换为二进制,但我在其中使用数组/向量时遇到了一些问题。我以前使用数组进行过这项工作,但我开始收到错误。我将最初使用的数组(已注释掉)放在我现在使用的向量下方。我改用矢量是因为从我所做的研究来看,它似乎会更好。

我在 for 循环中遇到 tempArray[i] = remainder; 错误。

错误提示:

错误 2 错误 C2679:二进制“=”:未找到采用“int”类型右侧操作数的运算符(或没有可接受的转换)`

我读过一些关于重载的文章,但不知道那是什么。

当我做一个数组时,我在数字int tempArray[digits]; 上得到了这三个错误,我把它作为索引(对于数组,只需注释掉向量并使用已经注释掉的数组):

错误 1 ​​错误 C2057:预期的常量表达式

错误 2 错误 C2466:无法分配常量大小为 0 的数组

错误 3 错误 C2133:“tempArray”:未知大小

最后,我刚刚从使用 Sublime Text 3 和 Cygwin 作为我的编译器切换到使用 Visual Studios,所以我不知道这是否与它有关。

char* convert(int palindrome)
{
    int remainder, digits = 0, dividend = palindrome;

    while (dividend != 0)
    {
    dividend = dividend / 2;
    digits++;   //5 digits, Johns Computer
    }

    std::cout << "Digits: " << digits;

    std::vector<int>* tempArray = new std::vector<int>[digits]; // vector
    //int tempArray[digits]; using an array

    dividend = palindrome;

    for (int i = digits - 1; i >= 0; i--)
    {
    remainder = dividend % 2;
    tempArray[i] = remainder;
    dividend = dividend / 2;
    // cout << array[i];
    }

    // cout << setw(3) << palindrome << " in binary is" << setw(3);

    for (int j = 0; j < digits; j++)
    {
        //  cout << array[j];
    }

    if (palindrome == 0)
    cout << 0;
    cout << endl;

    //int *pDriveArray = array[digits];
    //return readDrives(array, digits);

    return 0;

}


int main() {

    char *currDrives = convert(GetLogicalDrives());

    cin.get();

    return 0;

}

编辑:在下面的帮助下修复了该问题。在转换函数结束时,我有return readDrives(tempArray, digits);,并且我在 tempArray 上遇到错误。返回向量的正确方法是什么?

【问题讨论】:

  • tempArray 是(没有明显原因)指向向量的指针。 tempArray[n] 是一个向量。您不能为其分配 int 。除非确实需要,否则不要使用指针。
  • 你的转换函数中“回文”这个词是做什么的?你是随机取名字还是真的只打算接受回文数字?

标签: c++ arrays vector


【解决方案1】:
std::vector<int>* tempArray = new std::vector<int>[digits];

正在创建一个大小为 0 的向量数组。这不是你想做的。改成

std::vector<int> tempArray(digits);

这将创建一个名为 tempArray 的向量,其中包含 digits 个元素。

【讨论】:

  • 太好了,很有帮助。对向量来说有点新。如果也可以这么好,在转换函数的末尾,我有return readDrives(tempArray, digits);,我在 tempArray 上遇到错误。返回向量的正确方法是什么?
  • 如果要返回向量,则需要将函数签名更改为std::vector&lt;int&gt; convert(int palindrome),然后您只需使用return tempArray;
【解决方案2】:

上面已经解释了您的向量错误,但不是数组解决方案。您的数组分配错误是可变长度数组在 C++ 中是不合法的。您的数组调用 int tempArray[digits]; 需要在编译时分配一个常量值。由于您在编译时使用变量,因此不知道要分配什么。

相反,您应该分配一个指针并在调用函数时动态分配数组,如下所示:

//Declare pointer for your array.
int* tempArray = NULL;
...
//Allocate your array once digits is computed
tempArray = new int[digits];
... //do your work
//clean up the allocated memory
delete [] tempArray;
tempArray = NULL;

理想情况下,您还应该检查数字为 0 的情况并在那里返回错误,而不是尝试分配具有 0 个元素的数组。

【讨论】:

  • 为什么?你应该使用std::vector
  • 这回答了他关于为什么在他的数组实现中遇到错误的问题。不过一般来说,向量可能是更好的做法。
  • 他已将他的数组实现注释掉,但特别提到它在问题中以及如何使用它。除了他当前的向量实现之外,他还提到了由这个较旧的数组实现引起的错误,并且不明白为什么也会失败。你的回答解释了如何修复他现在使用的向量实现,但没有提到为什么他最初的 Array 实现失败了,我认为这也可能很好解释。
  • 很抱歉没有看到他将 VLA 注释掉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
相关资源
最近更新 更多