Berkeley CSUA MOTD:Entry 30157
Berkeley CSUA MOTD
 
WIKI | FAQ | Tech FAQ
http://csua.com/feed/
2024/11/23 [General] UID:1000 Activity:popular
11/23   

2004/5/11 [Computer/SW/Languages/C_Cplusplus] UID:30157 Activity:high
5/10    Can I create arbitrary blocks of code in C without control structures?
        I really just want something I can "break" out of.
        GetLock(myLock);
        {
          rc = SomeLibraryCall();
          if (rc < 0) break; // breaks to release lock
          rc = SecondLibraryCall();
          if (rc < 0) break;
          printf("Success\n");
        }
        ReleaseLock(myLock);
        return rc;
        Furthermore, is this advisable, or is there a better way to do it?
        \_ Yes, you can create arbitrary blocks.  No, you can't break out of
           them; "break" is allowed only within loop and switch blocks.  Use a
           goto if you must, or maybe even a do { ... } while(0) if you feel
           strongly against gotos.  In your example though, I'd just use
           if/else. --jameslin
        \_ As jameslin said, but here's the solution:
        int SomeFunction(void)
        {
            ...
            GetLock(myLock);
            int rc = SomeLibraryCall();

            if (rc >= 0)
            {
                rc = SecondLibraryCall();
                if (rc >= 0)
                {
                     printf("Success\n");
                }
            }

            ReleaseLock(myLock);
            return rc;
        }
        \_ Thanks both, but the problem is that it's not just SecondLibraryCall,
           it's NinthLibraryCall and it's getting ugly.  I think I'll use a
           goto ERROR sort of setup in the future.
           \_ How's this:
        int SomeFunction(void)
        {
            ...
            GetLock(myLock);

            while (1)
            {
                int rc = LibraryCall1();
                if (rc < 0) break;
                rc = LibraryCall2();
                if (rc < 0) break;
                ...
                printf("Success\n");
                break;
            }

            ReleaseLock(myLock);
            return rc;
        }
        \_ I'd rather not use a loop, even a fake one, because it implies
           ... well, a loop.  Same with the do / while above.  I guess I'm
           looking for a try { ... } block, but it's gotta be C.
           \_ what's wrong with implying a loop? Use the tools the language
              gives you. If you're so concerned use "for (i=0;i==0;i++)".
           \_ Totally correct.  How's this:
        int SomeFunction(void)
        {
            ...
            GetLock(myLock);

            int rc;
            if (   (rc = LibraryCall1()) >= 0
                && (rc = LibraryCall2()) >= 0
                && (rc = LibraryCall3()) >= 0
                ...
               )
            {
                printf("Success\n");
            }

            ReleaseLock(myLock);
            return rc;
        }
        \_ guys guys guy, you realize that gotos are allowed in C right?
           \_ ob GotoConsideredHarmful
              \_ This is where goto is the best solution.
2024/11/23 [General] UID:1000 Activity:popular
11/23   

You may also be interested in these entries...
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
	...