【发布时间】:2017-12-01 09:54:02
【问题描述】:
我需要在 C 中设置一个可变参数函数,它可以并排打印可变数量的二维字符数组。我很难弄清楚如何用va_arg() 初始化boards 变量。
有问题的关键行是:boards[i] = va_arg(ap, char*[][BOARDSIZE]); 该行产生编译器错误(当前为Second argument to 'va_arg' is of incomplete type 'char *[][10]'),但基本上我确定我没有做对。我只是不确定那是什么东西。我尝试了几种变体均无济于事。其余代码应该没问题。
(提前感谢您的帮助。)
#include <stdio.h>
#include <stdarg.h>
#define BOARDSIZE 10
void showBoardVariadic(int numArgs, ...) {
va_list ap;
va_start(ap, numArgs);
// Assign an array of 2-D char arrays.
char *boards[numArgs][BOARDSIZE][BOARDSIZE];
for (int i = 0; i < numArgs; i++)
boards[i] = va_arg(ap, char*[][BOARDSIZE]); // TODO: Fix this line
// Print the 2-D arrays side-by-side
for (int row = 0; row < BOARDSIZE; row++) {
for (int i = 0; i < numArgs; i++) {
for (int column = 0; column < BOARDSIZE; column++) {
printf(" %c", *boards[i][row][column]);
}
printf("\t");
}
printf("\n");
}
va_end(ap);
}
int main() {
char *playerBoard[BOARDSIZE][BOARDSIZE];
char *opponentBoard[BOARDSIZE][BOARDSIZE];
// Initialize playerBoard and opponentBoard to all tildes.
for (int row = 0; row < BOARDSIZE; row++) {
for (int column = 0; column < BOARDSIZE; column++) {
playerBoard[row][column] = "~";
opponentBoard[row][column] = "~";
}
}
showBoardVariadic(2, playerBoard, opponentBoard);
return 0;
}
【问题讨论】:
-
您没有说明问题所在。编译器错误消息?崩溃?来自
va_arg的值错误? -
你不能将数组作为参数传递——你总是传递指针。如果您将数组记为函数参数,则编译器会将其读取为指针。考虑到这一点,我对
va_arg(ap, char*[][BOARDSIZE])感到难过。我会尝试改为读取指针并将其转换为数组类型。 (不,实际上我会尝试找到另一种解决方案。var args 很吸引人,但与多维数组结合使用......) -
嗯...
char *boards[numArgs][BOARDSIZE][BOARDSIZE]是一个由char*组成的三维数组。根据你的评论,你想要一个指向二维数组的指针数组......(我讨厌这个多维数组垃圾。它让你很想掌握它,但实际上它没有生产价值。单一的暗淡。数组和明确的“多-dim indexing”简单、健壮且更易于维护。) -
还有一个问题:当您只打印
printf(" %c", *boards[i][row][column]);中板的第一个字符时,这让我假设每个单元格始终只有一个字符。在这种情况下,我会放弃char*并改用char。