如何解决错误:ISO C ++禁止可变大小的数组

时间:2013-11-11 05:40:28

标签: c++ arrays variables

我一直收到一条错误消息,说ISO C ++禁止使用可变大小的数组。

我想要有一个显示

的输出
Level       Score          Stars
----------------------------------
1              3840           ***

依旧......

这是我的程序

#include <iostream> // access to cin, cout
#include <cstring>
#include <cstdlib>
#include<fstream>


using namespace std;

int buildArrays(int A [], int B [], int C [])
{
    int i = 0, num;
    ifstream inFile;
    inFile.open("candycrush.txt");

    if (inFile.fail())
    {
        cout << "The candycrush.txt input file did not open" << endl;
        exit(-1);
    }
    while (inFile)
    {
        inFile >> num;
        A[i] = num;

        inFile >> num;
        B[i] = num;

        inFile >> num;
        C[i] = num;

        i++;
    }
    inFile.close();

    return i;
}
void printArrays(string reportTitle, int levelsArray [], int scoresArray [], int starsArray [], int numberOfLevels)
{
    cout << endl;
    cout << reportTitle << endl;
    cout << "Levels\tScores\tStars" << endl;
    cout << "---------------------" << endl;

    for (int i = 0; i < numberOfLevels; i++)
    {
        cout << levelsArray[i] << "\t" << scoresArray[i] << "\t";
        for (int j = 0; j < starsArray[i]; j++)
        {
            cout << "*";
        }
        cout << endl;
    }
}

void sortArrays(int levelsArray [], int scoresArray [], int starsArray [], int numberOfLevels)
{
    for (int i = 0; i < numberOfLevels; i++)
    {
        for (int j = 0; j < numberOfLevels; j++)
        {
            if (levelsArray[i] < levelsArray[j])
            {
                int temp1 = levelsArray[i];
                int temp2 = scoresArray[i];
                int temp3 = starsArray[i];

                levelsArray[i] = levelsArray[j];
                scoresArray[i] = scoresArray[j];
                starsArray[i] = starsArray[j];

                levelsArray[j] = temp1;
                scoresArray[j] = temp2;
                starsArray[j] = temp3;
            }
        }
    }
}


int main()
{
    int MAX = 400;         (This is where I am getting my valid array size error)
        int levelsArray[MAX];
    int scoresArray[MAX];
    int starsArray[MAX];

    int numberOfLevels = buildArrays(levelsArray, scoresArray, starsArray);

    printArrays("Candy Crush UNSORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels);
    sortArrays(levelsArray, scoresArray, starsArray, numberOfLevels);
    printArrays("Candy Crush SORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels);

    system("pause");
}

6 个答案:

答案 0 :(得分:4)

除非您(或您的老师,如果您正在做这项工作)意图严重执行此操作,否则您只需将MAX转换为const

相反,你应该使用std::vector而不是使用数组。

只要你在这里:

  1. 创建struct以保留单个分数的三个部分。
  2. 使用std::sort代替您自己的排序功能。
  3. 重载operator>>operator<<以对score个对象执行I / O操作。
  4. 首选基于默认构造的一步初始化,然后进行实际初始化(例如,创建,然后单独打开流以及创建然后单独填充向量)。
  5. 不要 使用while (stream) read_data 1 。始终测试读取数据的结果,并对结果做出反应。
  6. 使用这些,我们最终会得到类似这样的代码:

    struct score { 
        int level;
        int score;
        int stars;
    
        bool operator<(score const &other) const { 
            return level < other.level;
        }
    
        friend std::istream &operator>>(std::istream &is, score &s) { 
            return is >> s.level >> s.score >> s.stars;
        }
    
        friend std::ostream &operator<<(std::ostream &os, score const &s) { 
             return os << s.level << "\t" 
                       << s.score << "\t"
                       << std::string(s.stars, '*');
        }
    };
    
    int main() { 
        std::ifstream in("candycrush.txt");
        std::vector<score> scores{std::istream_iterator<score>(in),
                                  std::istream_iterator<score>()};
    
        std::cout << "Unsorted:\n";
        for (auto const &s : scores)
            std::cout << s << "\n";
    
        std::cout << "\n";
    
        std::sort(scores.begin(), scores.end());
        std::cout << "Sorted:\n";
    
        for (auto const &s : scores) 
            std::cout << s << "\n";
    }
    

    应该可能还会添加一些东西来处理两个等级相同的分数(例如,通过比较那个案例中的分数),但这可能是另一个答案/ dia骂的主题。


    <子> 1. ...或while (stream.good())while (!stream.eof())

答案 1 :(得分:2)

gcc支持可变大小的数组,但其他编译器则不支持。尝试。

int main()
{
    #define MAX 400        /* use macro instead of stack variable */
    int levelsArray[MAX];
    int scoresArray[MAX];
    int starsArray[MAX];
    /* rest of your code */
    return 0;
}

答案 2 :(得分:2)

对于大多数编译器,数组大小应该是C ++中的编译时常量。尝试

#define MAX 400;
...
int levelsArray[MAX];

const int MAX=400;
...
int levelArray[MAX];

答案 3 :(得分:2)

您需要将MAX变量设为const变量。 试试这个:

const int MAX=400;

答案 4 :(得分:2)

#include <iostream> // access to cin, cout
#include <cstring>
#include <cstdlib>
#include<fstream>

#define MAX 400 //<- Try this

using namespace std;

我还建议在处理多个数组时使用类。 通过使用类,您不需要将多个数组传递给函数,并使用该长数组列表设置函数的参数。比如这一个:

void printArrays(string reportTitle, int levelsArray [], int scoresArray [], int starsArray [], int numberOfLevels)

答案 5 :(得分:0)

请遵循向量用法(当您的目的需要可变大小的数组时):https://stackoverflow.com/a/49021923/4361073