2013-03-01 3 views
4

Я не могу найти свою проблему. продолжает давать мне эти ошибки:Передача аргумента делает указатель из целого числа

"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

Престижность включения номеров в ваш код! –

ответ

1

Почитает C учебник, на самом деле. array[index] индексирует/индексирует массив, и таким образом он дает index-й элемент в массиве. Если вы хотите передать массив должен работать на себя (ну, а указатель на его первый элемент), а затем просто написать свое имя:

CountEvenNumbers(numbers, length); 
3

В строке 28, вы пытаетесь передать целое число в индекс «длина» чисел. Вы должны просто передать номера себе, так что-то вроде CountEvenNumbers(numbers, length);

9

Ответ на ваш вопрос, чтобы поменять это:

CountEvenNumbers(numbers[length], length); 

для этого

CountEvenNumbers(numbers, length); 

Однако, если вы по-прежнему с кодированием, в умение, которое может оказаться неоценимым, - это расшифровка сообщений об атаках/сообщениях об ошибках:

c: 2: 5: note: ожидать D 'INT *', но аргумент типа 'Int'»
"C: 28: 1: предупреждение: проходя аргумент 1 из 'CountEvenNumbers' делает указатель из целое без приведения [по умолчанию включено]"

Так что это значит? В нем говорится, что в строке 28 (CountEvenNumbers(numbers[length] , length); ) он ожидал, что вы сделаете бросок аргумента 1, то есть вы передали ему то, чего он не ожидал. Итак, вы знаете, что с первым аргументом что-то не так.

Уловка здесь другая строка: expected 'int *' but argument is of type 'int' Это говорит: «Мне нужен указатель на целое число, но вы дали мне просто целое число». Вот как вы знаете, что вы проходите неправильный тип.

Так что вы должны спрашивать себя, какой тип аргумент 1? Вы знаете, хотите ли вы получить доступ к элементу внутри массива, вам нужно использовать [], (вы делали это на строках 20 и 25 вашего кода), поэтому, передав numbers[length] вашей функции, вы пытаетесь передать ей один элемент вместо полного массива, как он ожидает.

Другая половина этого вопроса - expected 'int *'. Почему ваша функция рассчитывает получить указатель на int? Ну, это потому, что в C, когда вы передаете массив (введите) его decays указателю на (type).

1 чисел конечно [длина] на самом деле не является элементом в ваш массив в любом случае, оно переполняет его.

+0

спасибо !!! Я знал, что это связано с этим массивом. Я не знал, как это исправить. Я попробовал пару разных способов.Только не этот. Благодарю. –

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; 
}