c question: *printf'ing arrays

Alexander Best alexbestms at math.uni-muenster.de
Tue Jun 30 22:06:08 UTC 2009


thanks for all the help. i decided to take the pill and coded all the fprintfs
by hand. here's the result. usually i'd stick to a higher level languag, but i
need C's inline assembly support:

    struct Header
    {
        u_int8_t rom_entry[4];
        u_int8_t nintendo_logo[156];
        u_char game_title[12];
        u_char game_code[4];
        u_char maker_code[2];
        u_int8_t fixed_val;
        u_int8_t unit_code;
        u_int8_t device_type;
        u_int8_t reserved_area1[7];
        u_int8_t software_version;
        u_int8_t complement_check;
        u_int8_t reserved_area2;
        u_int8_t ram_entry[4];
        u_int8_t boot_mode;
        u_int8_t slave_id;
        u_int8_t unused_area[26];
        u_int8_t joybus_entry[4];
    };

    struct Header * hdr = rom;
    int i;

    fprintf(stderr, "ROM Entry: 0x");
    for (i=0; i < 4; i++) fprintf(stderr, "%x", hdr->rom_entry[i]);
    fprintf(stderr, "\nNintendo Logo: 0x");
    for (i=0; i < sizeof(hdr->nintendo_logo); i++) fprintf(stderr, "%x",
    hdr->nintendo_logo[i]);
    fprintf(stderr, "\nGame Title: %s",  hdr->game_title);
    fprintf(stderr, "\nGame Code: %s",  hdr->game_code);
    fprintf(stderr, "\nMaker Code: %s",  hdr->maker_code);
    fprintf(stderr, "\nFixed Value: 0x");
    fprintf(stderr, "%x", hdr->fixed_val);
    fprintf(stderr, "\nUnit Code: 0x");
    fprintf(stderr, "%x", hdr->unit_code);
    fprintf(stderr, "\nDevice Type: 0x");
    fprintf(stderr, "%x", hdr->device_type);
    fprintf(stderr, "\nReserved Area: 0x");
    for (i=0; i < sizeof(hdr->reserved_area1); i++) fprintf(stderr, "%x",
    hdr->reserved_area1[i]);
    fprintf(stderr, "\nSoftware Version: 0x");
    fprintf(stderr, "%x", hdr->software_version);
    fprintf(stderr, "\nComplement Check: 0x");
    fprintf(stderr, "%x", hdr->complement_check);
    fprintf(stderr, "\nReserved Area: 0x");
    fprintf(stderr, "%x", hdr->reserved_area2);
    fprintf(stderr, "\nRAM Entry Point: 0x");
    for (i=0; i < sizeof(hdr->ram_entry); i++) fprintf(stderr, "%x",
    hdr->ram_entry[i]);
    fprintf(stderr, "\nBoot Mode: 0x");
    fprintf(stderr, "%x", hdr->boot_mode);
    fprintf(stderr, "\nSlave ID: 0x");
    fprintf(stderr, "%x", hdr->slave_id);
    fprintf(stderr, "\nUnused Area: 0x");
    for (i=0; i < sizeof(hdr->unused_area); i++) fprintf(stderr, "%x",
    hdr->unused_area[i]);
    fprintf(stderr, "\nJoybus Entry Point: 0x");
    for (i=0; i < sizeof(hdr->joybus_entry); i++) fprintf(stderr, "%x",
    hdr->joybus_entry[i]);

cheers.

Rick C. Petty schrieb am 2009-06-30:
> On Tue, Jun 30, 2009 at 08:21:03PM +0200, Alexander Best wrote:
> > thanks. now the output gets redirected using >. i'm quite new to
> > programming
> > under unix. sorry for the inconvenience.

> No problem; we all had to learn sometime.  But what I suggested
> should
> work for every platform that adheres to POSIX.  If you were using
> fprintf/fwrite, then it would work on anything that's standard C.  As
> for
> redirection, windows command line allows the same type of
> redirection.

> > so i guess there is no really easy way to output an inhomogeneous
> > struct to
> > stdout without using a loop to output each array contained in the
> > struct.

> That's not something C would ever provide easily.  You may want to
> use a
> different high-level language.  However, I often use macros for
> printing
> pieces of structures, for example I used this to print out sizes of
> kernel
> structures:

> #define SIZE(astruct, member) \
>         printf("%d\t\t.%s\n", sizeof(astruct.member), #member)

> #include <sys/ktrace.h>
> ...
>         struct ktr_header header;
>         struct ktr_genio genio;

>         printf("%d\tktr_header:\n", sizeof(header));
>         SIZE(header, ktr_len);
>         SIZE(header, ktr_type);
>         SIZE(header, ktr_pid);
>         SIZE(header, ktr_comm);
>         SIZE(header, ktr_time);
>         SIZE(header, ktr_time.tv_sec);
>         SIZE(header, ktr_time.tv_sec);
>         SIZE(header, ktr_tid);

>         printf("\n%d\tktr_genio:\n", sizeof(genio));
>         SIZE(genio, ktr_fd);
>         SIZE(genio, ktr_rw);

> In your case, you could make a macro for each type.  Without an
> example of
> how you want the output to look, it's hard for us to show you code
> that
> will produce such output.

> -- Rick C. Petty


More information about the freebsd-hackers mailing list