我正在将Java代码转换为C,这就像在Java中交换多数组内容一样简单:
boolean[][] temp = board;
board = nextBoard;
nextBoard = temp;
在C中似乎更麻烦。
在本网站上查看类似问题之后,我了解到我必须使用memcpy
,这是我在名为arrayCopy
的方法中启动的。
这是arrayCopy
:
void arrayCopy(char * a, char * b)
{
struct universe data;
int r;
for(r = 0; r < data.rows; r++)
memcpy(b, a, sizeof(a));
}
我从主要方法中打电话:
char temp[SIZE][SIZE];
arrayCopy(&data.board, &temp);
arrayCopy(&data.nextBoard, &data.board);
arrayCopy(&temp, &data.nextBoard);
使用以下结构:
struct universe
{
char board[SIZE][SIZE];
char nextBoard[SIZE][SIZE];
int columns;
int rows;
}universe;
但是我收到的警告如下:
A2Q1.c:189:15:警告:不兼容的指针类型传递 'char(*)[60] [60]'到'char *'
类型的参数
然而memcpy
只返回指针,所以我无法切换参数。我也不能使用malloc()
,因为我还没有学到它,所以任何其他建议都会受到赞赏。
答案 0 :(得分:0)
试试这个
void swapBoard(struct universe *x){
char temp[SIZE][SIZE];
memcpy(temp, x->board, sizeof(temp));
memcpy(x->board, x->nextBoard, sizeof(temp));
memcpy(x->nextBoard, temp, sizeof(temp));
}
int main(){
struct universe data;
//...
swapBoard(&data);
答案 1 :(得分:0)
我认为你让它有点过于复杂。您可以直接在上面的示例中使用memcpy来复制a到b中的所有内容,而无需迭代它。如果你运行这段代码......
int main()
{
char temp[60][60];
printf("%d", sizeof(temp));
}
您将看到sizeof将为您提供3600个字节,60 * 60到阵列分配的总字节数。这些字节分配在一块连续的内存中,memcpy可以一次性复制它们。这证明了这一点:
int main()
{
char temp[60][60];
memset(temp, 'a', sizeof(temp));
char temp2[60][60];
memset(temp2, 'b', sizeof(temp2));
memcpy(temp2, temp, sizeof(temp2));
printf("%c", temp2[23][34]);
}
printf将打印&#39; a&#39;。在上面的代码中,这应该可以正常工作:
char temp[SIZE][SIZE];
memcpy(data.board, temp, sizeof(data.board));
memcpy(data.nextBoard, data.board, sizeof(data.nextBoard));
memcpy(temp, data.nextBoard, sizeof(temp));
请注意,这假设所有这些数组的大小相同。您可能想要创建一个minsize函数或使用像#define MINSIZE(a,b) (sizeof((a)) < sizeof((b)) ? sizeof((a)) : sizeof((b)))
这样的宏函数来保证安全。