Ошибка компилятора: недопустимый спецификатор ранга: ожидаемый ',' или ']' для инициализации двумерного массива
У меня есть назначение для класса, который должен быть выполнен на С#. Являясь полнофункциональным новичком С#, я сначала выполнил проект в Java, и теперь я пытаюсь преобразовать его в С#. У меня есть следующая функция, которая приводит к следующей ошибке компилятора.
Ошибка: Недопустимый спецификатор ранга: ожидаемый ',' или ']' в следующей строке:
int[][] grid=new int[g.cols][g.rows];
Visual studio подчеркивает g в g.rows
public int[][] getConvergenceCounts(MandelbrotGrid g){
int[][] grid=new int[g.cols][g.rows];
for(int x=0;x<g.cols;x++){
for(int y=0;y<g.rows;y++){
double tx=x*(double)3/400-1.5;
double ty=y*(double)3/400-1.5;
grid[x][y]=getConvergenceCount(new Complex(ty,tx));
}
}
return grid;
}
Я не знаю, что я делаю неправильно здесь, и чтение на многомерных массивах в С#, похоже, не помогло.
Ответы
Ответ 1
Компилятор С# считает, что вы пытаетесь объявить неровный массив, и делаете это неправильно. Явлённый массив представляет массив массивов массивов, где каждый массив, содержащийся в основном массиве, может иметь различное количество элементов. Замятый массив объявляется следующим образом:
int[][] jaggedArray = new int[numElements][];
Что бы создать массив, который мог бы содержать массивы "numElements
" целых чисел внутри него.
Вы хотите объявить многомерный массив, например:
int[,] grid = new int[g.cols, g.rows];
Ответ 2
public int[][] getConvergenceCounts(MandelbrotGrid g){
int[][] grid=new int[g.cols][];
for(int x=0;x<g.cols;x++){
int[x] = new int[g.rows]
for(int y=0;y<g.rows;y++){
double tx=x*(double)3/400-1.5;
double ty=y*(double)3/400-1.5;
grid[x][y]=getConvergenceCount(new Complex(ty,tx));
}
}
return grid;
}
Ответ 3
Если вы хотите использовать зубчатый массив, решение @Frank - это метод, который вам нужно сделать. Вы не можете объявить оба измерения, когда запускаете зубчатый массив, потому что предположение С# состоит в том, что ваши строки будут иметь неравные размеры. В решении @Doughnut метод многомерного массива является хорошим решением, если у вас есть решение с матричным типом (что это такое), однако С# оптимизирован для одномерных массивов, и вы все равно можете использовать опцию зубчатого массива, чтобы сэкономить временные затраты., По этой причине, если вы будете выполнять много операций с вашим многомерным массивом, вы должны инициализировать неровный массив THEN при вводе строк, указав длину строки индивидуально.
public int[][] getConvergenceCounts(MandelbrotGrid g)
{
int[][] grid=new int[g.cols][];
for(int x=0;x<g.cols;x++){
grid[i] = new int[g.rows];
for(int y=0;y<g.rows;y++){
double tx=x*(double)3/400-1.5;
double ty=y*(double)3/400-1.5;
grid[x][y]=getConvergenceCount(new Complex(ty,tx));
}
}
return grid;
}