Can someone tell me why this won't compile?(to do with strings, arrays, pointers)

Started by
15 comments, last by tiresandplanes 11 years, 2 months ago

For some reason this won't compile. This isn't the first time that something hasn't worked from this book so I suspect it's a tiny typo that is messing up the whole thing. Can someone explain to me why this doesn't compile? I'm just starting to deal with strings so I don't know how to call a function from within a string.


#include <stdio.h>

main ()

{ int str_number;

for (str_number = 0; str_number < 13; str_number++)
   {
   printf ("%s", menutext(str_number));
   }
}

/*********************************************************/

char *menutext(n)
int n;

{
  static char *t[] =
   {
   "  -------------------------------------- \n",
   " |            ++ MENU ++                |\n",
   " |           ~~~~~~~~~~~~               |\n",
   " |     (1) Edit Defaults                |\n",
   " |     (2) Print Charge Sheet           |\n",
   " |     (3) Print Log Sheet              |\n",
   " |     (4) Bill Calculator              |\n",
   " |     (q) Quit                         |\n",
   " |                                      |\n",
   " |                                      |\n",
   " |     Please Enter Choice              |\n",
   " |                                      |\n",
   "  -------------------------------------- \n"
   };
return (t[n]);
}



I get an error on line 15: char *menutext(n)

C:\Documents and Settings\Gary II\Desktop\cprog.c|15|error: conflicting types for 'menutext'|

Advertisement
The book must be really old.

It is using a K&R dialect of C that is long dead.

It likely won't compile on any compiler written to the standards of the last 13 years.

You can't have parentheses in a variable name... char *menutext(n) is meaningless in standard C. If you want an array of character arrays, you need char* menutext[n] with the appropriate initialization code. Also, you forgot a semicolon. Also, menutext is declared after it is used, so it won't work. Also, everything after main isn't in a function, so you can't return from it.

Looks like old C code.

EDIT: I thought the menutext was a global variable - turns out its actually a function, look at Hodgman's post below for the translation.

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

As above, that code does not resemble modern C. I guess it translates like:
#include <stdio.h>

char *menutext(int n)
{
  static char *t[] =
   {
   "  -------------------------------------- \n",
   " |            ++ MENU ++                |\n",
   " |           ~~~~~~~~~~~~               |\n",
   " |     (1) Edit Defaults                |\n",
   " |     (2) Print Charge Sheet           |\n",
   " |     (3) Print Log Sheet              |\n",
   " |     (4) Bill Calculator              |\n",
   " |     (q) Quit                         |\n",
   " |                                      |\n",
   " |                                      |\n",
   " |     Please Enter Choice              |\n",
   " |                                      |\n",
   "  -------------------------------------- \n"
   };
  return (t[n]);
}

int main()
{
  for (int str_number = 0; str_number < 13; str_number++)
  {
    printf ("%s", menutext(str_number));
  }
}

Well crap, could someone recommend a website with a c reference that is up to date? I have been using K & R (lol). What is a good website to be learning from? Also, could anyone recommend some up-to-date books on c that are really good?

C Unleashed by Heathfield is pretty good, although it isn't really an introductory book. There are probably newer books, but for several years that was one of the best covering the c99 standard.

Ahh ok thank you very much :D

The problem, by the way, is that menutext needs to be declared before it is used. This can be done by copying the first line of the function (up to the ;), above main, or by moving the whole function. Otherwise the default return type is int, which does not match the definition.

The K&R style parameter definition on menutext is valid C90 code, but I'm not sure if they removed it in later standards. It's not modern practice regardless. Similarly, it's good practice to write "int main()", even though int is assumed.

Thanks I plan on learning from a more modern book/ online reference from now on. I'll use "int main()" now also.

The K&R style parameter definition on menutext is valid C90 code, but I'm not sure if they removed it in later standards. It's not modern practice regardless. Similarly, it's good practice to write "int main()", even though int is assumed.

Both were removed in the C99 standard.

This topic is closed to new replies.

Advertisement