0

I'm still new to the forum so I apologize in advance for forum - etiquette issues.

I'm getting an error that makes no sense and I cannot find a reference to anywhere.

The code in question is in c, and was written for the purpose of reading a grid of numbers to find the largest product of four adjacent. It uses a two dimensional array to provide x-y like coordinates.

The error I'm getting is along the lines of ...

...../p11-largest-grid-product.c:30 function definition expected

This is confusing because I do not use any functions (besides the main function of course).

My code is as follows

#include <stdio.h>

int main
{


// decalare and value vars
int a, n, p, g = 0;

// initialize two dimensional array
int str[21][21];
// fill array 'str'
int str[1] = {08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08};
int str[2] = {49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00};
int str[3] = {81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65};
int str[4] = {52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91};
int str[5] = {22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80};
int str[6] = {24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50};
int str[7] = {32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70};
int str[8] = {67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21};
int str[9] = {24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72};
int str[10] = {21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95};
int str[11] = {78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92};
int str[12] = {16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57};
int str[13] = {86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58};
int str[14] = {19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40};
int str[15] = {04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66};
int str[16] = {88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69};
int str[17] = {04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36};
int str[18] = {20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16};
int str[19] = {20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54};
int str[20] = {01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48};

// horizontal
for( n = 1 ; n != 21 ; n++ )
{

    for( a = 3 ; a != 20 ; a++ )
    {

        p = str[n][a] * str[n][a-1] * str[n][a-2] * str[n][a-3];
        if( p > g )
        {

            g = p;

        }

    }

}

// vertical
for( a = 0 ; a != 20 ; a++ )
{

    for( n = 4 ; n != 21 ; n++ )
    {

        p = str[n][a] * str[n-1][a] * str[n-2][a] * str[n-3][a];
        if( p > g )
        {

            g = p;

        }

    }

}

// diagonal not /
for( n = 1 ; n != 18 ; n++ )
{

    for( a = 0 ; a != 17 ; a++ )
    {

        p = str[n][a] * str[n+1][a+1] * str[n+2][a+2] * str[n+][a+3];
        if( p > g )
        {

            g = p;

        }

    }

}

// diagonal /
for( n = 1 ; n != 18 ; n++ )
{

    for( a = 3 ; a != 20 ; a++ )
    {

        p = str[n][a] * str[n+1][a-1] * str[n+2][a-2] * str[n+3][a-3];
        if( p > g )
        {

            g = p;

        }

    }

}


getchar();
return 0;
}

Any explanation as to why these things worked/did not work and anything that can lead to a better understanding of these ideas will be appreciated. Links to helpful stuff are as well. I have tried to find a solution on my own (I'm self taught as I'm in high school) but with no luck.

Any tips for a good windows debugger for c are also appreciated.

doctorlove
  • 18,872
  • 2
  • 46
  • 62
Charles
  • 99
  • 2
  • 11
  • the open bracket on my main function, right below the int main – Charles Aug 14 '13 at 08:58
  • Ah - see improved answer – doctorlove Aug 14 '13 at 09:01
  • 1
    @Charles you have already defined a two dimensional integer array(str) which can hold the grid. Den y are u again defining it with int str[1]. Its not recommended. To access the defined array just use its name alone. str[1] to work on first row of that array – Amarnath Krishnan Aug 14 '13 at 09:30
  • @AmarnathKrishnan, the first row of the array would be `str[0]` and not `str[1]`. Also, your comments would sound more professional if you used proper English rather than text shorthand like "den" and "y". – verbose Aug 14 '13 at 09:56
  • @verbose only by default str[0] will point to first row. But in this case he is taking str[1] as first index. He is not referring to 0 as a start index and he refers to 1 as a start index. So in this case i meant str[1] will point to first row as per his code. – Amarnath Krishnan Aug 14 '13 at 09:58
  • True, but I wonder if this is deliberate or not. There are just 20 items, so it smells like a misunderstanding – doctorlove Aug 14 '13 at 10:00

3 Answers3

3

The function definition expected error is probably caused by missing parentheses between main and the opening brace. Try this: int main () {.

Besides this, though, there are odd things happening in your code:

  1. It initializes a 21 x 21 array of ints, but you call call it str as though you intend it to be an array of strings.
  2. Arrays can only be initialized at declaration time. Once you've declared it, you cannot re-declare int str[1] and try to initialize values.
  3. Arrays are zero-indexed; the first row of str[21][21] would be str[0], not str[1]. I'm not sure why you're leaving the top row out of your (attempted) initialization.

So even if you do rectify the function definition expected error by supplying the parentheses, the code is still broken in other ways.

verbose
  • 7,827
  • 1
  • 25
  • 40
  • Declaration is when you tell the compiler something it needs to know to understand subsequent code. Definition is when your code actually creates something. Frequently we do both together, but in C they are not the same thing. – andy256 Aug 14 '13 at 10:13
  • Right; in this situation they are being done at the same time, and generally with variables we tend to use the phrasing "declare and initialize" rather than "define and initialize" (or at least, I've come across the former phrasing more often), so I went with "declare." If you think it's misleading, I'm happy to edit and say "define" instead. – verbose Aug 14 '13 at 10:18
  • Thanks for all the help! In retrospect I was exhausted when trying to do this and now I feel ridiculous for forgetting () on my main function... Originally I was planning to do it differently and so it was easier to call the whole array str than to change all of the string names. And I simply forgot to start at zero with the strings. In general I was being sloppy. But thank you! – Charles Aug 14 '13 at 17:15
  • No worries; I'm impressed that a high school student should be trying this out on his own. See @doctorlove's answer, which deserves an upvote for first pointing out the missing `()`, and for explaining that leading zeroes will cause `int`s to be treated as octal numbers. – verbose Aug 14 '13 at 17:18
  • And since I never actually call str[0] does it matter that it isn't defined? – Charles Aug 14 '13 at 17:55
  • It's defined--memory has been allocated for it. It just has garbage values that you're not accessing. But what's the point? If you need only 20 arrays, it wastes memory to allocate 21. Assigning one over the number you actually need makes sense in some circs., e.g. if you have an array of pointers and set the last pointer to NULL as a sentinel. But in this case, str[0] is taking up memory for no good reason. Make your data structures only as big as they need to be. – verbose Aug 14 '13 at 18:07
  • Right. I was still thinking of char strings in arrays where you need the extra space. – Charles Aug 14 '13 at 22:19
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/35480/discussion-between-verbose-and-charles) – verbose Aug 14 '13 at 22:19
2

I would hazard a guess that

p = str[n][a] * str[n+1][a+1] * str[n+2][a+2] * str[n+][a+3];
                                                    ^^^

is the problem. You probably intended to add something to n.


EDIT

With the extra information in the comment, line 30 says

int main {

A function takes (possibly no) parameters, so try this

int main () {

While you are there watch out for a leading 0 meaning octal, making 08 and 09 make no sense.

doctorlove
  • 18,872
  • 2
  • 46
  • 62
  • Just to clarify, @Charles: you added the parentheses between `main` and the opening brace, and you're still getting the `function definition expected` error? That's very odd. – verbose Aug 14 '13 at 09:26
  • @verbose The "good catch" comment came before the "With the extra.." part - I'll make that clearer. Tumbleweed since – doctorlove Aug 14 '13 at 09:30
  • @doctorlove thanks for the clarification. Now I'm sad the OP hasn't accepted your answer, so I'll upvote as a consolation prize. – verbose Aug 14 '13 at 09:34
  • @verbose Try your own answer with your comment about str in - that's important too, then I can return the favour – doctorlove Aug 14 '13 at 09:40
  • Thanks for the octagonal number heads up. Can someone explain why that is? I thought only characters were encoded? – Charles Aug 14 '13 at 17:16
  • @Charles *octal* means in base 8. http://en.wikipedia.org/wiki/Octal and http://stackoverflow.com/questions/44569/octal-number-literals-when-why-ever – doctorlove Aug 15 '13 at 08:16
1

You are not properly defining main, you have:

int main
{
    ...

But, you need:

int main()
{
    ...

in order for the compiler to know you are creating a function.

phyrrus9
  • 1,441
  • 11
  • 26