c question: *printf'ing arrays

Alexander Best alexbestms at math.uni-muenster.de
Wed Jul 1 00:01:57 UTC 2009


wow. thanks. that's looking really nice. i'll change my sources tomorrow after
a good dose of sleep. ;)

alex

Alfred Perlstein schrieb am 2009-07-01:
> Hey Alex,

> People frown on macros, but this could be a good one:

> #define SPRINT(f, fmt) \
>         do {\
>                 for (_i = 0; _i < sizeof(f)/sizeof(f[0]); i++) \
>                         printf(fmt, f[i]); \
>         }while(0)

> :D

> This should allow you to point to any _array_ and print each
> element of it using format "fmt".

> Example:
> SPRINT(Header->game_title, "%c");



> -Alfred


> * Alexander Best <alexbestms at math.uni-muenster.de> [090630 15:06]
>   wrote:
> > 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
> > _______________________________________________
> > freebsd-hackers at freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> > To unsubscribe, send any mail to
> > "freebsd-hackers-unsubscribe at freebsd.org"



More information about the freebsd-hackers mailing list