我一直收到一条错误消息,说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");
}
答案 0 :(得分:4)
除非您(或您的老师,如果您正在做这项工作)意图严重执行此操作,否则您不只需将MAX
转换为const
相反,你应该使用std::vector
而不是使用数组。
只要你在这里:
struct
以保留单个分数的三个部分。std::sort
代替您自己的排序功能。operator>>
和operator<<
以对score
个对象执行I / O操作。while (stream) read_data
1 。始终测试读取数据的结果,并对结果做出反应。使用这些,我们最终会得到类似这样的代码:
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