localtime question

Giorgos Keramidas keramida at ceid.upatras.gr
Tue Aug 10 09:26:20 PDT 2004


On 2004-08-10 16:49, Mipam <mipam at ibb.net> wrote:
> Hi,
>
> I tried to display the time from yesterday by this little program
>
> #include <stdio.h>
> #include <sys/time.h>
>
> time_t tval;
>
> int main()
> {
>     struct timeval tv;
>     struct timeval tv_current;
>
>     if (gettimeofday(&tv_current, NULL) == -1)
>         err(1, "Could not get local time of day");
>
>     tv.tv_sec = tv_current.tv_sec-86400;
>     printf("%s\n", ctime(tv.tv_sec));
> }

Note that it's a good idea to explicitly specify that main() does
nothing to its argument with:

        int
        main(void)
        {
                ...
        }

and that main() has to `return' some value that fits in an `int' as its
definition says it should.

> But at compilation it complains:
>
> tijd.c: In function `main':
> tijd.c:15: warning: passing arg 1 of `ctime' makes pointer from integer without a cast
>
> What am i doing wrong?

You're passing the "value" of tv.tv_sec in a function that expects a
pointer to it.

        % man ctime

             char *
             ctime(const time_t *clock);

The value you passed to ctime() is not an address of a constant time_t
object but the value of the time_t object itself.  The compiler detects
that a conversion from an integral type to a pointer needs to take place
and warns you about it.

This is not a fatal error (c.f. the rationale of the ANSI C99 standard,
which specifies that pointers might be converted to integral values and
back to the same pointer type without losing any information).  However,
it is usually a very common mistake (forgetting to pass a reference to
the object and passing the object itself).  This is why you get warned.

Try calling ctime() with the address of tv.tv_sec:

        printf("%s\n", ctime(&tv.tv_sec));

- Giorgos



More information about the freebsd-questions mailing list