Berkeley CSUA MOTD:Entry 17948
Berkeley CSUA MOTD
 
WIKI | FAQ | Tech FAQ
http://csua.com/feed/
2025/07/12 [General] UID:1000 Activity:popular
7/12    

2000/4/7 [Computer/SW/Languages/Misc, Computer/SW/Languages/C_Cplusplus] UID:17948 Activity:high
4/6     In C, how do I get the offset of a field in a struct?  E.g.
                typedef struct {
                        char MS_foo;
                        int MS_bar;
                } MyStruct;
        I want to use the offset of MS_bar (which is 1) in compile-time.
                \_ It most likely isn't 1 on any modern architecture.
                   The compiler will pad it so the int starts on a 32-bit
                   boundary on almost all 32-bit machines.
        \_ ((MyStruct*)0)->MS_bar
           \_ don't you mean (int)(&((MyStruct*)0)->MS_bar) ? -ali
              \_ This works.  Thanks!
        \_ MyStruct crap;
           bar_offset = &(crap.MS_bar) - &crap;
        \_ You don't wanna go there.  This is machine specific stuff.  If you
           want to write portable code, there are lots of other ways to do
           what you want.
           \_ no, the ways outlined above are not machine dependent. what
              are you talking about? maybe there's some fine print in the
              standard that says the above won't work, but really, it works
              doing this is using C++ and using member objects.
              and you shouldn't be pedantic about it. another good way of
              doing this is using C++ and using member objects. -ali
              \_ Dude.  You don't know what you are talking about.  The
                 way in which variable sized members of a struct are
                 positioned within the struct are, and should be,
                 implementation specific according to the standard.  Shut
                 up and go away.  You know nothing.  Don't give advice here.
                 You are a fool.  Sign your name.
                 \_ ok, you go and underline for me in the above specified
                    code the machine specific stuff that is susceptible to
                    padding differences and data type size and reordering.
                    \_ Sure.  The above data structure has a character
                       (generally 8 bits), followed by an int (generally
                       16 or 32 bits).  Depending on how the memory on the
                       target computer is arranged, the offset of the second
                       member (the integer) could be 8, 16, 32, or maybe even
                       some wierd non-power-of-2 number.  You have said this
                       yourself, the implementation is free to pad (I am not
                       sure it is allowed to reorder though).
                    ok? -ali. And sign your name yourself.
           \_ Example?
              \_ What are you trying to do, exactly?
                 \_ I want to print out all the fields in a variable of
                    a certain big struct, so I think I should make a table
                    of field informations, like this:
                        typedef struct {
                            char *FE_string;
                            int FE_offset;
                            int FE_type;
                        } FieldEntry;

                        FieldEntry fieldTable[] = {
                            {"MS_foo", <offset of MS_foo>, TYPE_CHAR},
                            {"MS_bar", <offset of MS_bar>, TYPE_INT},
                            ......
                        };
                    Then I use printf() to print the fields according to the
                    types.
                    \_ Why do you need field offsets in the first place?
                       \_ Then I can just traverse the table to print
                          out all the fields passing the appropriate format
                          strings to printf() according to the field type,
                          rather than writing 100 printf()'s for 100 fields.
                          \_ Use a macro, then cut and paste from the struct
                             definition.
                             \_ But I think using a table reduces code size
                                a bit.
2025/07/12 [General] UID:1000 Activity:popular
7/12    

You may also be interested in these entries...
2010/12/11-2011/2/19 [Computer/SW/Languages/Perl] UID:53984 Activity:nil
12/11   Anyone have experience with Perl PDF::API2 or PDF::API3?  Can you
        point me to a good tutorial for creating a simple document (a small
        table of 2-3 rows and a single image)?
	...
2010/7/21-8/9 [Computer/SW/OS/FreeBSD] UID:53890 Activity:nil
7/21    Can I just use ifconfig to expand my netmask on a FreeBSD box?
        Are there any gotchas here? Linux forces me to restart my network
        to expand my netmask.
        \_ yes... and no, you don't have to restart your network on linux either
           \_ Rebooting is the Ubootntoo way!
              \_ Oooboot'n'tootin!
	...
2014/1/14-2/5 [Computer/SW/Languages/C_Cplusplus] UID:54763 Activity:nil
1/14    Why is NULL defined to be "0" in C++ instead of "((void *) 0)" like in
        C?  I have some overloaded functtions where one takes an integer
        parameter and the other a pointer parameter.  When I call it with
        "NULL", the compiler matches it with the integer version instead of
        the pointer version which is a problem.  Other funny effect is that
        sizeof(NULL) is different from sizeof(myPtr).  Thanks.
	...
2013/4/9-5/18 [Computer/SW/Languages/C_Cplusplus, Computer/SW/Apps, Computer/SW/Languages/Perl] UID:54650 Activity:nil
4/04    Is there a good way to diff 2 files that consist of columns of
        floating point numbers, such that it only tells me if there's a
        difference if the numbers on a given line differ by at least a given
        ratio?  Say, 1%?
        \_ Use Excel.
           1. Open foo.txt in Excel.  It should convert all numbers to cells in
	...
2013/4/29-5/18 [Computer/SW/Languages/C_Cplusplus, Computer/SW/Compilers] UID:54665 Activity:nil
4/29    Why were C and Java designed to require "break;" statements for a
        "case" section to terminate rather than falling-through to the next
        section?  99% of the time poeple want a "case" section to terminate.
        In fact some compilers issue warning if there is no "break;" statement
        in a "case" section.  Why not just design the languages to have
        termination as the default behavior, and provide a "fallthru;"
	...
2012/7/19-11/7 [Computer/SW/Languages/C_Cplusplus] UID:54439 Activity:nil
7/19    In C or C++, how do I write the code of a function with variable
        number of parameters in order to pass the variable parameters to
        another function that also has variable number of parameters?  Thanks.
        \_ The usual way (works on gcc 3.0+, Visual Studio 2005+):
               #define foo(fmt, ...) printf(fmt, ##__VA_ARGS__)
           The cool new way (works on gcc 4.3+):
	...
2011/3/7-4/20 [Computer/SW/Languages/C_Cplusplus] UID:54056 Activity:nil
3/7     I have a C question.  I have the following source code in two identical
        files t.c and t.cpp:
                #include <stdlib.h>
                int main(int argc, char *argv[]) {
                  const char * const * p1;
                  const char * * p2;
	...
2011/2/5-19 [Computer/SW/Languages/C_Cplusplus] UID:54027 Activity:nil
2/4     random C programming/linker fu question.  If I have
        int main() { printf("%s is at this adddr %p\n", "strlen", strlen); }
        and soda's /proc/sys/kernel/randomize_va_space is 2 (eg; on)
        why is strlen (or any other libc fn) at the same address every time?
        \_ I don't pretend to actually know the right answer to this, but
           could it have something to do with shared libraries?
	...
2010/2/12-3/9 [Computer/SW/Languages/C_Cplusplus] UID:53708 Activity:nil
2/12    I need a way to make a really big C++ executable (~200MBs) that does
        nothing.  No static initialization either.  Any ideas?
        \_ static link in lots of libraries?
        \_ #define a   i=0; i=0; i=0; i=0; i=0; i=0; i=0; i=0; i=0; i=0;
           #define b   a a a a a a a a a a
           #define c   b b b b b b b b b b
	...
2009/9/28-10/8 [Computer/SW/Languages/C_Cplusplus] UID:53409 Activity:nil
9/28    http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
        Java is #1!!! Followed by C, PHP, C++, Visual Basic, Perl,
        C#, Python, Javascript, then finally Ruby. The good news is
        Pascal is going waaaay back up!
        \_ C is still more popular than C++?  I feel much better about myself
           now.
	...
2009/8/7-14 [Computer/SW/Languages/C_Cplusplus, Computer/SW/Languages/Java] UID:53252 Activity:high
8/6     In C one can do "typedef int my_index_t;".  What's the equivalent in
        C#?  Thanks.
        \_ C#? Are you serious? Is this what the class of 2009 learn?
           \_ No.  I have to learn .NET code at work.  I am Class of '93.
           \_ python is what 2009 learns, see the motd thread about recent
              cal courses and languages
	...
2009/7/21-24 [Computer/SW/Languages/Java] UID:53168 Activity:moderate
7/20    For those who care btw, it looks like eclipse is now A Standard Tool
        at UCB ugrad cs, probably replaced emacs.  Furthermore, people get
        angry at seeing Makefiles, (since eclispe takes care of that).  I
        guess it's just a sign of the times.
        \_ The more people at my work use eclipse the less the code is
           managable in emacs.  I'm not sure which application's fault
	...