我编写了一个名为removeIllegalMoveFromMovesCell
的函数,用于从某些变量中删除数据,现在我们将其称为x和y。
x 的值会在函数内部更改,但不会在函数外部更新。
调用方法:
removeIllegalMoveFromMovesCell(movesArr[row][col].moves,&(movesArr[row][col].size), row, col);
解释变量
上面提到的 x和y变量是movesArr[row][col].moves
和movesArr[row][col].size
,它们基于这些结构:
typedef struct _move {
char rows;
char cols;
} move;
typedef struct _movesArray {
unsigned int size;
move* moves;
} movesArray;
这是我创建它们的方式:
movesArray* arr = (movesArray*)malloc(sizeof(movesArray));
move* movesArr1 = (move*)malloc(2 * sizeof(move));
move* movesArr2 = (move*)malloc(2 * sizeof(move));
move move1, move2, move3, move4;
move1.rows = -2;
move1.cols = 3;
move2.rows = 1;
move2.cols = 3;
move3.rows = -2;
move3.cols = 5;
move4.rows = 1;
move4.cols = 2;
movesArr1[0] = move1;
movesArr1[1] = move2;
movesArr2[0] = move3;
movesArr2[1] = move4;
arr[0].size = 2;
arr[1].size = 2;
arr[0].moves = movesArr1;
arr[1].moves = movesArr2;
removeIllegalMoveFromMovesCell
方法:
void removeIllegalMoveFromMovesCell(move* moves, int* size, int currRow, int currCol) {
int i;
int cloneIndex = 0;
move* movesClone = (move*)malloc((*size - 1) * sizeof(move));
for (i = 0; i < *size; i++) {
if (!isMoveOutOfBounds(currRow, currCol,
getPureNumber(moves[i].rows), getPureNumber(moves[i].cols))) {
movesClone[cloneIndex].rows = moves[i].rows;
movesClone[cloneIndex].cols = moves[i].cols;
cloneIndex++;
}
}
moves = (move*)realloc(moves, cloneIndex * sizeof(move));
for (i = 0; i < cloneIndex; i++) {
moves[i] = movesClone[i];
}
*size = cloneIndex;
}
尽管size
变量在方法外更改(并且通过更改movesArr[row][col].size
),moves
变量将接收方法内的所有movesClone
变量,并将更改其值在方法内,但不会在方法外(movesArr[row][col].moves
)进行更改。
move
充当局部变量,尽管我传递了他的引用而不是它的值,但我不明白为什么在方法之外它不会改变
这里是getPureNumber
内部使用的removeIllegalMoveFromMovesCell
函数
int getPureNumber(char c) {//simple return `movesArr[row][col].size` as number
if (c < 0)
return c - 0;
return c;
}