注意我使用的是C而不是C ++。我正在开发一个程序,它将采用二维数组并计算子数组中非空格的数量。例如lines[0][i]
< - 迭代line[0][0] - line[0][n]
。但是,我很难让函数接受二维数组。
这是我的代码:
pScore[0]=letters(pLines, 0);
这是实际功能。 pScore[]
是另一个数组,但是1d数组。 pLines
是一个4乘200的二维数组。
int letters(char line[][], int row)
{
int i = 0;
int n = n;
int results = 0;
for( i = 0; i < (sizeof(line)/sizeof(line[0])); i++ )
{
if( !isspace(line[row][i]) )
results++;
}
return results;
}
当我这样做时,它给了我“正式参数1未完成”。如果我从中移除第二个[]
,则代码会运行,但会提供非空格字符的数量。
答案 0 :(得分:3)
从上面的评论和你的函数参数列表中获取:
int letters(char line[][], int row)
您违反了将2D数组传递给函数的一个主要租户。具体而言,您必须始终提供数组中包含的列的数量。例如
int letters(char line[][5], int row)
char line[][5]
是一个合适的参数。但是,无论何时将数组作为函数参数传递,第一级间接都将转换为指针。 (你经常在这里将其称为&#34; 指针衰减&#34;,尽管这有点用词不当)。因此,明确说明的适当声明是:
int letters(char (*line)[5], int row)
转换后, line
是5-int
的指向数组的指针。虽然您可以将数组作为line[][5]
传递,但这并不像(*line)[5]
那样提供信息。如果您有任何问题,请告诉我。
数字而不是字符
如果没有看到代码的其余部分,很难说出发生了什么。但是,我怀疑您对数组内容的数值和 ASCII字符值感到困惑。 (例如字符 '0'
= 十进制 48
(0x30
(十六进制),'1' = 49
,'a' = 97
等等。)。见ASCIItable.com
答案 1 :(得分:2)
您将数组传递给它衰减为指针的函数。这意味着char line[][]
应该char (*line)[SIZE_OF_SECOND_ARRAY]
。
这也意味着sizeof
技巧不起作用,因为在指针 sizeof
上执行line
只会返回指针的大小,而不是它指向,你需要显式地将大小作为参数传递给函数。
答案 2 :(得分:1)
你需要告诉函数2d数组的列数。 Here可能会对您有所帮助。
答案 3 :(得分:1)
我不确定以下声明是否适用于您
for( i = 0; i < (sizeof(line)/sizeof(line[0])); i++ )
其中sizeof(line)
将是4或类似的东西取决于您的平台,因为&#34; line&#34;是一个指针,你得到指针本身的大小。
如果我错了,请纠正我。
在这种情况下,您应该将列号作为行传递。