Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Beginning C programmer - irritating error using for loop over array entries

Tags:

arrays

c

I've attempted to write a program that will take an array of numbers, and produce a new array containing the squares of the entries of the first array. Here is the function which is supposed to do this;

void square_entires(numbers, squares){

    for (int i=0; i<5; ++i) {
        squares[i]=numbers[i]*numbers[i];
    }

}

Now I get 3 errors on the squares[i]... line saying

"Subscripted value is neither array nor pointer".   

Why on earth would I want i to be an array or a pointer!? Shouldn't it simply be an index for the loop to make sense? I've seen other examples of functions which loop over array elements this way and they work fine.. just my function doesn't work properly! Can somebody please explain why this is? thanks it advance.

like image 381
FireGarden Avatar asked Nov 20 '25 16:11

FireGarden


2 Answers

Your functions declaration is wrong. You must have to specify the types of the arguments in a function. It should be

void square_entires(int numbers[], int squares[]) 
{   

Without specifying type of parameters, it will be considered int by default which is allowed in C89.

n1570: 6.5.2.2 Function calls

Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter.


Now I get 3 errors on the squares[i]... line saying "Subscripted value is neither array nor pointer". Why on earth would I want i to be an array or a pointer!? Shouldn't it simply be an index for the loop to make sense?

Clearly this warning is about the variables squares and numbers which should be declared either an array or pointer. Only then subscripted value is used.

like image 164
haccks Avatar answered Nov 23 '25 06:11

haccks


Given A[B], the "subscripted value" is A. B is the subscript.

And, what others said about the missing type specifiers and declarator bits.

When you write:

int foo(a, b)
/* <- nothing here */
{
}

you're writing an old-style function. It's how C was written before some improvements took place in the 1980's which became standardized as ANSI C. The types for a and b are declared between the function declarator and body. If they are not declared, evidently they default to int. There are two ways out. The much preferred one is to use the modern style:

int square_entries(int *numbers, int *squares) // or some other type: double?
{
}

The obsolete style, not recommended, would have looked like:

int square_entries(numbers, squares)
int *numbers;
int *squares;
{  
}
like image 44
Kaz Avatar answered Nov 23 '25 05:11

Kaz



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!