Re: problem with compiling BrDb.cxx

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Mon Mar 19 2001 - 05:12:55 EST

  • Next message: Michael Murray: "Re: ZDC Vertex"

    Hi Steve, 
    
    On Sun, 18 Mar 2001 20:47:45 -0600
    "Stephen J. Sanders" <ssanders@ukans.edu> wrote
    concerning ": problem with compiling BrDb.cxx":
    > Hi,  I recently checked out  the complete brat to work on the revised
    > mult code.  However, when compiling BrDb.cxx the make  stopped with:
    > 
    > cc1plus: warnings being treated as errors
    > BrDb.cxx: In method `Bool_t BrDb::ReadBratDbRc(const char *, const char
    > *, char
    > *&, char *&)':
    > BrDb.cxx:249: warning: comparison is always false due to limited range
    > of data t
    > ype
    > make[1]: *** [../obj/linux/BrDb.o] Error 1
    > make[1]: Leaving directory `/home/sanders/Brahms/brat/db/src'
    > 
    > The problem statement is:
    > 
    >     if (c == EOF) break;
    
    The problem is, for some reason, datatype 'char' is unsigned on your
    platform/compiler/C library, and 'EOF' is an 'int' with the value
    -1. So 'c', being and char (unsigend), can never ever by -1, and so
    the comparison above will always be false (like the error message 
    says).  
    
    Here's what the GCC manual (EGCS 1.1.2) has to say on the signedness
    of 'char' 
    
         Ideally, a portable program should always use `signed char' or
         `unsigned char' when it depends on the signedness of an object.
         ...
    
         The type `char' is always a distinct type from each of `signed
         char' or `unsigned char', even though its behavior is always just
         like one of those two.
    
    
    > I was able to fix the problem by explicitly casting EOF with
    > 
    >     if(c==(char) EOF) break;
    
    The explicit cast is not a good idea here, since the condition will
    anyway allways be false, which ofcourse defies the purpose of the
    test. 
    
    I signed the datatype of 'c' to be 'signed char' and it worked
    fine. I've commited the change to CVS. Please try it out and let me
    know of there's a problem. 
    
    How are you doing on ROOT 3.00/06?
    
    Thanks Steve for brining this up. I knew that 'char' could be signed
    or unsigned depending on the architecture, but I wasn't aware that it
    could be a problem in this kind of code. Good stable and portable code
    is a very good thing, so if anyone knows of anything similar
    other places in the code, please correct it. 
    
    > The rest of the build went OK.
    > I don't want to commit this change to the cvs without having a better
    > idea  of possilbe consequences.
    > Christian, is the casting OK?  I'm running a LinuxPPC system on a mac
    > with the 2.4.2 kernel. and
    > version 2.95.3 of g++.
    
    Fancy stuff uh. Latest kernel, odd GCC, on a RISC processor. Do you
    have a dual boot system (i.e., Linux + MacOS), and if so have you
    tried to build ROOT/BRAT on MacOS? That'd be interresting, especially
    if it't the new version (read: Unix-clone) of MacOS. 
    
    Yours, 
    
    Christian  -----------------------------------------------------------
    Holm Christensen                             Phone:  (+45) 35 35 96 91 
      Sankt Hansgade 23, 1. th.                  Office: (+45) 353  25 305 
      DK-2200 Copenhagen N                       Web:    www.nbi.dk/~cholm    
      Denmark                                    Email:       cholm@nbi.dk
    



    This archive was generated by hypermail 2b29 : Mon Mar 19 2001 - 05:13:45 EST