c question: *printf'ing arrays
Alfred Perlstein
alfred at freebsd.org
Tue Jun 30 22:54:57 UTC 2009
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"
--
- Alfred Perlstein
VMOA #5191, 03 vmax, 92 gs500, ch250 - FreeBSD
More information about the freebsd-hackers
mailing list