[comp.lang.c] Help: VAX C problem

kkrueger@zeus.unomaha.edu (Kurt Krueger) (03/30/91)

Originally, I posted this on com.os.vms, but I haven't had any responses yet,
and I thought the gurus on this newsgroup could be of help.

I have been working on a simple C program to supplement a DCL program.  It is
passed two parameters: a filename and the length of the file in bytes.  It
outputs the length of time the file will take to transfer at 2400bps.  I would
have written the whole thing in DCL except that DCL can't do floating point
operations.  I wrote and compiled my program on my Amiga, and it runs fine;
however, I can't get it to run on our VAX.  I know next to nothing about C
programming on the VAX (the truth is, I know little about C, as well), and I
would be happy if someone could point out my folly.  The program is as follows:

extern int atoi();
float size, time;
int block, mins, secs;
 
main (argc, argv)
 
int argc;
char *argv[];
 
{
  int result, value();
  printf ("%s", argv[1]);
  block = value(argv[2]);
  size = block / 2;
  time = size / 0.2227;
  mins = time / 60;
  secs = time - (mins * 60);
  printf ("\t\t%d\t%d\n", mins, secs);
}
 
int value(number1)
char *number1;
{
  int convblock = atoi(number1);
}

   (I realize that a one-line function is strange, but this is only part of
what the whole program will be.)  I compiled the program on the VAX and then
linked it with the sharable vaxcrtl library as specified in the last Info-VAX.
Here is the correct output of the program as compiled on my Amiga:

RAM DISK:> test filename 55                                                   
filename                2       1                                             
RAM DISK:> test filename 45                           
filename                1       38

"Test" is the name of the program, the first parameter is "filename" and the
second is "55", which refers to the block size.  The program prints out that
the file will take 2 mins., 1 sec. to transfer (I haven't refined the xfer
times yet).  Here is the output from the VAX:

$ test filename 55
filename                30124390        24
$ test filename 45
filename                30124390        24

Obviously, something is wrong (well, this is almost plausible at 300 baud).  Is
it something to do with the floating point libraries?  I am only a computer
user by hobby, so forgive me because I know this entire post is mighty elemen-
tary to a real programmer.

Also, how do I set the tabs on the VAX?  I would like to have the first tab at
30 or 40.

Thanks in advance,

--
Sign below.  Type hard, you are making thousands of copies.
-----------------------------------------------------------------------------
Kurt Krueger | BITNET:   kkrueger@unoma1           |        //\
MBA student  | Internet: kkrueger@zeus.unomaha.edu |      \X/--\ M I G A
-----------------------------------------------------------------------------

kkrueger@zeus.unomaha.edu (Kurt Krueger) (03/30/91)

In article <1991Mar30.161854.27378@cbnewsk.att.com>, linwood@cbnewsk.att.com (linwood.d.johnson) writes:

> Wouldn't you want this function to return something since you are
> using the return value.
> 
> I think something like: return( convblock);
> 
> will do the trick.

It will, indeed.  My mail box has been flooded with responses to this question,
and a lot of people were very kind in providing me with answers and a number of
additional tips that will prove very valuable in the future.  Thanks to the
multitude.

Kurt Krueger
MBA student looking for work in a recession
kkrueger@zeus.unomaha.edu

linwood@cbnewsk.att.com (linwood.d.johnson) (03/31/91)

In article <11697.27f376d8@zeus.unomaha.edu> kkrueger@zeus.unomaha.edu (Kurt Krueger) writes:
>I wrote and compiled my program on my Amiga, and it runs fine;
>however, I can't get it to run on our VAX.  I know next to nothing about C
>programming on the VAX (the truth is, I know little about C, as well), and I
>would be happy if someone could point out my folly.  The program is as follows:
>
>extern int atoi();
>float size, time;
>int block, mins, secs;
> 
>main (argc, argv)
> 
>int argc;
>char *argv[];
> 
>{
>  int result, value();
>  printf ("%s", argv[1]);
>  block = value(argv[2]);
>  size = block / 2;
>  time = size / 0.2227;
>  mins = time / 60;
>  secs = time - (mins * 60);
>  printf ("\t\t%d\t%d\n", mins, secs);
>}
> 
>int value(number1)
>char *number1;
>{
>  int convblock = atoi(number1);
******
Wouldn't you want this function to return something since you are
using the return value.

I think something like: return( convblock);

will do the trick.

>}

-- 
| Linwood D. Johnson       |  linwood@ihlpf.att.com                 |
| AT&T Bell Labs, 1000 E. Warrenville Rd., Naperville, IL 60566     |
| Disclaimer: Opinions expressed here are mine and mine only.       |
|             Besides, who else would want them?                    |

browns@iccgcc.decnet.ab.com (Stan Brown) (04/02/91)

[attribution suppressed so as not to embarrass anyone]
> I think something like: return( convblock);
> will do the trick.

I bet if you stopped 100 C programmers, more than 50 of 'em would tell
you that parentheses are part of the return statement, just like if,
while, do, and for.  They're not.

I don't want to start another religious war (the one on EQU or == is
enough excitement for me), but since the ( ) don't add anything to a
return statement I'd suggest leaving them out. 

My opinions are mine:  I don't speak for any other person or company. 
                   email (until 91/4/30): browns@iccgcc.decnet.ab.com 
Stan Brown, Oak Road Systems, Cleveland, Ohio, USA    +1 216 371 0043

henry@zoo.toronto.edu (Henry Spencer) (04/02/91)

In article <4072.27f7215c@iccgcc.decnet.ab.com> browns@iccgcc.decnet.ab.com (Stan Brown) writes:
>I bet if you stopped 100 C programmers, more than 50 of 'em would tell
>you that parentheses are part of the return statement, just like if,
>while, do, and for.  They're not.

They used to be, actually, and many of the role models :-) for C programmers
have habits dating back to the time when they were.
-- 
"The stories one hears about putting up | Henry Spencer @ U of Toronto Zoology
SunOS 4.1.1 are all true."  -D. Harrison|  henry@zoo.toronto.edu  utzoo!henry

darcy@druid.uucp (D'Arcy J.M. Cain) (04/02/91)

In article <4072.27f7215c@iccgcc.decnet.ab.com> Stan Brown writes:
>I bet if you stopped 100 C programmers, more than 50 of 'em would tell
>you that parentheses are part of the return statement, just like if,
>while, do, and for.  They're not.

You must be moving in the wrong circles.  Ask around here and I bet hardly
anyone thinks that parentheses are required in the return statement.  However
parentheses are always allowed around *ANY* expression so what's the big deal
if someone wants to put them there?  I bet you also have a problem with:
    if ((a == 1) || (a == 5)) ...

>I don't want to start another religious war (the one on EQU or == is
>enough excitement for me), but since the ( ) don't add anything to a
>return statement I'd suggest leaving them out. 

And I suggest using as many as make you comfortable.  I don't want to
shock anyone but I have been known to do the following and I am totally
unrepentant:
   return(5 + (a * k));

Whitespace doesn't add anything to the program either.  Should we leave
that out as well?

-- 
D'Arcy J.M. Cain (darcy@druid)     |
D'Arcy Cain Consulting             |   There's no government
Toronto, Ontario, Canada           |   like no government!
+1 416 424 2871                    |