7

我找不到我的问题。不断给我这些错误:

"c:2:5: note: expected 'int *' but argument is of type 'int'"
"c:28:1: warning: passing argument 1 of 'CountEvenNumbers' makes pointer from
   integer without a cast [enabled by default]"

这是代码:

1 #include <stdio.h>
2 int CountEvenNumbers(int numbers[], int length);
3 int main(void)
4 {
5 int length;
6 int X;int Z; int Y; int W;
7 X=0;Y=0;Z=0;W=0;
8 printf("Enter list length\n");
9 scanf("%d",&length);
10 int numbers[length];
11 
12 if (length<=0)
13 .   {printf("sorry too low of a value\n");
14 .   .   return 0;}
15 else
16 .   {
17 .   printf("Now, enter %d integers\n",length);
18 .   for (X=0;X<length;X++)
19 .   .   {scanf("%d",&Y);//X is position in array, Y is value.
20 .   .   numbers[X]=Y;
21 .   .   }
22 .   printf("The list reads in as follows:\n");
23 .   for (W=0;W<length;W++)
24 .   .   {Z=numbers[W];
25 .   .   printf("%d ",Z);}
26 .   printf("\n");
27 .   }
28 CountEvenNumbers( numbers[length] , length );
29 return 0;
30 }
31 
32 int CountEvenNumbers(int numbers[], int length)
33 {
34 .   int odd_count;int even_count;int P;int Q;
35 .   Q=0; odd_count=0;even_count=0;
36 .   for (P=0;P<length;P++)
37 .   .   if (numbers[Q]==0)
38 .   .   .   {even_count++;
39 .   .   .   Q++;}
40 .   .   else if ((numbers[Q]%2)!=0)
41 .   .   .   {odd_count++;
42 .   .   .   Q++;}
43 .   .   else
44 .   .   .   {even_count++;
45 .   .   .   Q++;}
46 .   printf("There are %d even numbers in the series\n",even_count);
47 .   return 0;
48 }
4

4 回答 4

14

你的问题的答案是交换这个:

CountEvenNumbers(numbers[length], length);

为了这

CountEvenNumbers(numbers, length);

但是,如果您继续编码,您可能会发现一项非常宝贵的技能是破译警告/错误消息:

“c:2:5: 注意:预期的 'int *' 但参数是 'int' 类型”
“c:28:1: 警告:传递 'CountEvenNumbers' 的参数 1 使指针从整数不进行强制转换 [默认启用]"

那是什么意思?它声明在第 28 行 ( CountEvenNumbers( numbers[length] , length ); ) 它希望您对参数 1 进行强制转换,这意味着您向它传递了一些它没有预料到的东西。所以你知道第一个论点有问题。

这里的诀窍是另一行:expected 'int *' but argument is of type 'int'它说“我想要一个指向整数的指针,但你只给了我一个整数”。这就是你如何知道你传递了错误的类型。

所以你应该问自己的是,参数 1 是什么类型?你知道如果你想访问数组中的一个元素,你需要使用[]'s,(你在代码的第 20 和 25 行这样做了),所以通过传递numbers[length]给你的函数,你试图传递一个元素1而不是像它期望的那样一个完整的数组。

另一半是expected 'int *',为什么你的函数会期望得到一个指向 int 的指针?那是因为在 C 语言中,当您传递一个 (type) 数组时,它会衰减为指向 (type) 的指针。

1 当然 numbers[length] 并不是你数组中的真正元素,它会溢出它。

于 2013-03-01T17:09:27.953 回答
3

在第 28 行,您尝试在数字的索引“长度”处传递整数。你应该只传递数字本身,所以像CountEvenNumbers(numbers, length);

于 2013-03-01T16:50:05.170 回答
1

尝试这个。

#include <stdio.h>
#include <stdlib.h>

int CountEvenNumbers(int numbers[], int length);
int main(void)
{
    int length;
    int X;int Z; int Y; int W;
    X=0;Y=0;Z=0;W=0;
    printf("Enter list length\n");
    scanf("%d",&length);

    int *numbers = (int*) calloc(length, sizeof(int)); //***************


    if (length<=0)
    {printf("sorry too low of a value\n");
    return 0;}
    else
    {
        printf("Now, enter %d integers\n",length);
        for (X=0;X<length;X++)
        {scanf("%d",&Y);//X is position in array, Y is value.
        numbers[X]=Y;
        }
        printf("The list reads in as follows:\n");
        for (W=0;W<length;W++)
        {Z=numbers[W];
        printf("%d ",Z);}
        printf("\n");
    }
    CountEvenNumbers( numbers , length ); //**************
    free (numbers);
    return 0;
}

int CountEvenNumbers(int numbers[], int length)
{
    int odd_count;int even_count;int P;int Q;
    Q=0; odd_count=0;even_count=0;
    for (P=0;P<length;P++)
        if (numbers[Q]==0)
        {even_count++;
    Q++;}
        else if ((numbers[Q]%2)!=0)
        {odd_count++;
    Q++;}
        else
        {even_count++;
        Q++;}
        printf("There are %d even numbers in the series\n",even_count);
        return 0;
}
于 2013-03-01T17:18:41.083 回答
0

阅读 C 教程,真的。array[index]下标/索引数组,因此它产生index数组中的第 th 个元素。如果要传递要对其自身进行操作的数组(嗯,而不是指向其第一个元素的指针),则只需写下其名称:

CountEvenNumbers(numbers, length);
于 2013-03-01T16:49:46.163 回答