Я делаю и пример для класса программирования C:
#define xSize 2
#define ySize 3int x,y, a[xSize][ySize];
for (x=1; x<=xSize; x++){for (y=1; y<=ySize; y++){
a[x][y]=(x*x)+(y*y);}}for (x=1; x<=xSize; x++){for (y=1; y<=ySize; y++){
printf("a[%d][%d]= %d ", x, y, a[x][y]);}}
Он дает ошибку, когда я пытаюсь скомпилировать в "Xcode-macOS"
Но когда я даю int x, y, a [xSize + 1] [ySize + 1] он компилируется отлично, почему это происходит?
Когда вы указываете
a[xSize]
иb[ySize]
. Массивa
может хранить доxSize
значений, в то время какb
может хранить доySize
значений. Однако это начинается от индекса 0 доxSize-1
и от 0 доySize-1
в массивахa
иb
соответственно. Поэтому, когда вы используете цикл for, вы повторяете цикл с индексами от 1 доxSize
, когда на самом деле массив ограничен максимальным индексомxSize-1
.Индексирование массива начинается с 0. В цикле for вы выполняете итерацию с x = 1 & & х & л; = размер. Условия должны быть x = 0 & х < размер. То же самое относится ко всем измерениям массива.
+1
- чтобы заставить алгоритм работать практически без ошибок. У вас все еще могут быть проблемы. Было бы лучше переработать алгоритм для использования массивов на основе 0. И идиоматические циклы C для итерации по элементам массива используют обозначениеfor (int i = 0; i < max; i++)
- используйте их и отклоняйтесь только тогда, когда это важно, и вы знаете, что делаете.