Jump to content

  • Log In with Google      Sign In   
  • Create Account

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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
16 replies to this topic

#1 tiresandplanes   Members   -  Reputation: 133

Like
0Likes
Like

Posted 13 February 2013 - 08:19 PM

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'|

 



Sponsor:

#2 frob   Moderators   -  Reputation: 21307

Like
1Likes
Like

Posted 13 February 2013 - 08:39 PM

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.
Check out my personal indie blog at bryanwagstaff.com.

#3 Bacterius   Crossbones+   -  Reputation: 8876

Like
0Likes
Like

Posted 13 February 2013 - 08:40 PM

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.


Edited by Bacterius, 13 February 2013 - 08:46 PM.

The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#4 Hodgman   Moderators   -  Reputation: 30385

Like
3Likes
Like

Posted 13 February 2013 - 08:42 PM

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


#5 tiresandplanes   Members   -  Reputation: 133

Like
0Likes
Like

Posted 13 February 2013 - 08:42 PM

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?



#6 frob   Moderators   -  Reputation: 21307

Like
1Likes
Like

Posted 13 February 2013 - 08:47 PM

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.
Check out my personal indie blog at bryanwagstaff.com.

#7 tiresandplanes   Members   -  Reputation: 133

Like
0Likes
Like

Posted 13 February 2013 - 09:07 PM

Ahh ok thank you very much :D



#8 King Mir   Members   -  Reputation: 2000

Like
1Likes
Like

Posted 13 February 2013 - 09:33 PM

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.



#9 tiresandplanes   Members   -  Reputation: 133

Like
0Likes
Like

Posted 13 February 2013 - 09:43 PM

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



#10 frob   Moderators   -  Reputation: 21307

Like
3Likes
Like

Posted 13 February 2013 - 11:20 PM

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.


Check out my personal indie blog at bryanwagstaff.com.

#11 shay.yizhak   Members   -  Reputation: 195

Like
0Likes
Like

Posted 14 February 2013 - 02:27 AM

If you're starting fresh - why start with c? I'd recommend you jump straight to c++ or c#.

And no - you don't need to know c to learn c++.



#12 Subtle_Wonders   Members   -  Reputation: 225

Like
-3Likes
Like

Posted 14 February 2013 - 02:48 AM

Withdrawn due to errors on my part.


Edited by Subtle_Wonders, 14 February 2013 - 10:40 AM.


#13 King Mir   Members   -  Reputation: 2000

Like
0Likes
Like

Posted 14 February 2013 - 03:23 AM

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'|

char *menutext(n)   um... where's your ;

I'm sure other people have their points too, but that was the first thing that cought my eye, and the compiler did say... that line was causing you the problem.

As already mentioned, his code is a valid C90 function definition written in K&R style. It's not a variable.



#14 Subtle_Wonders   Members   -  Reputation: 225

Like
-1Likes
Like

Posted 14 February 2013 - 03:51 AM

Withdrawn due to errors in my part.


Edited by Subtle_Wonders, 14 February 2013 - 10:41 AM.


#15 King Mir   Members   -  Reputation: 2000

Like
2Likes
Like

Posted 14 February 2013 - 04:16 AM

His compiler reads it just fine. The error says "conflicting types for 'menutext'". It's complaining that menutext was implicitly declared to return int, but is defined to return char *.

 

I'm not saying that anyone should use K&R style C, but that's not the cause of the problem here.



#16 Subtle_Wonders   Members   -  Reputation: 225

Like
0Likes
Like

Posted 14 February 2013 - 04:28 AM

His compiler reads it just fine. The error says "conflicting types for 'menutext'". It's complaining that menutext was implicitly declared to return int, but is defined to return char *.

 

I'm not saying that anyone should use K&R style C, but that's not the cause of the problem here.

 

This I can accept.  Thank you sir.  As stated before, you are a well inteligent human being and I'm glad I learned something from you. smile.png



#17 tiresandplanes   Members   -  Reputation: 133

Like
0Likes
Like

Posted 15 February 2013 - 05:15 PM

Also anyone that reads this and needs a good c reference online that free and up-to-date I've found http://publications.gbdirect.co.uk/c_book/ to be a great help.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS