Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!linus!security!genrad!grkermit!masscomp!clyde!burl!hou3c!hocda!houxm!hogpc!houxt!pegasus!lzpfd!bpl From: bpl@lzpfd.UUCP Newsgroups: net.lang.c Subject: Casting Pointers Message-ID: <354@houxt.UUCP> Date: Wed, 25-Jan-84 12:33:49 EST Article-I.D.: houxt.354 Posted: Wed Jan 25 12:33:49 1984 Date-Received: Fri, 27-Jan-84 10:05:48 EST Lines: 47 Recently I came across a problem in C which I wonder if somebody out there in netland can help me with. I was trying to copy a string on a 68000 in C, and to make it fast I was trying (where possible) to do the transfers a longword at a time. No Problem, I said to myself, its easy: just cast the two pointers to be long pointers. So I came up with: *(long *)to++ = *(long *)from++; Then I went to look at page 49 of the White Book, and realized that the ++ and casts assosciate from right to left, which means it would only increment the pointers by one for each time through. Well, still no problem, I thought: that's what brackets are for. So I changed the line to: *((long *)to)++ = *((long *)from++; I decided to test it on the VAX first, rather than download it to the 68000. So I tried to compile it with the 5.0 C compiler. "illegal lhs of assignment", it said. So I tried it on the 68000 cross compiler, also based on PCC. This time it compiled prefectly, and ran no problem. The cause of the difference is the treatment of casting: the 5.0 VAX C compiler assumes that the result of casting a pointer of one type to a pointer of another type is not an lvalue, even though the original pointer was an lvalue. The 68000 cross-compiler assumes that the result is still an lvalue. I have read the White Book, and it leaves me as confused as ever. Can anybody out there tell me which Compiler is correct, or is it an ambiguity which leaves you to the tender mercies of you local PCC hacker. To avoid flames: yes, I know what I am doing is non- portable. I am not trying to write portable code. I am trying to write a fast copy for a 68000. I have checked that the pointers are really word-aligned. Brendan Lynch (pegasus!lzpfd!bpl)