Xref: news2.mv.net comp.os.msdos.djgpp:6952 From: Erik Max Francis Newsgroups: comp.os.msdos.djgpp Subject: Re: warning problem Date: Wed, 07 Aug 1996 21:36:04 -0700 Organization: Alcyone Systems Lines: 52 Message-ID: <32096EB4.34EF4032@alcyone.com> References: <4u9cju$p5p AT news DOT ysu DOT edu> NNTP-Posting-Host: annex-p134.meer.net Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp randall williams wrote: > while(x[b]!=10&&x[b]!=13&&x[b]!=EOF&&b<128) > warning: comparison is always 1 due to limited range of data type > > The above is the line causing the warning and I have an if() that > causes a similar warning. Maybe I'm just missing something in my logic > though I don't understand it. the variables are char x[], and int b. The problem is that you've misreported the types of the variables in question :-). What's happening here is that your variable x is actually of type unsigned char x[]. The comparison to the EOF macro is what's causing the warning. According to the ANSI C standard, section 7.9.1: EOF which expands to a negative integral constant expression that is returned by several functions to indicate _end-of-file_, that is, no more input from a stream. . . . Since x[] is of type unsigned char[], any comparison to a negative integral constant will itself be constant. In this case your comparison is x[b] != EOF, where x[b] is of type unsigned char. Since EOF is negative, this comparison will always be true ("comparison is always 1 due to limited range of data type"). An unsigned char can hold an ASCII character, but it can't hold the value of EOF. This means that that portion of your comparison will always return 1 (true), and, as it's part of a repeated && expression, will add nothing to the comparison; the expression behaves exactly as if you didn't include the comparison at all. I don't know exactly what context in which you're making this comparison (since you only posted the while statement that was causing the warning), but it looks to me as if you're reading a sequence of 128 characters into a buffer and then iterating through the array to check for CR, LF, and EOF. This is the wrong context in which to check for EOF; EOF indicates an end-of-stream condition and is not itself a character that will be read. You should be checking the function which is reading in the buffer (or line, if that's all you're doing) for success or failure at that point, not checking the characters of the array that is read after success or failure. If you need more help, post a more complete sample of what you're trying to do. -- Erik Max Francis, &tSftDotIotE http://www.alcyone.com/max/ max AT alcyone DOT com San Jose, California ICBM 37 20 07 N 121 53 38 W R^4: the 4th R is respect War's a game which were their subjects wise/Kings would not play at. -- Cowper