Hello, In trying to compile the C code with the C51 compiler [Keil µvision2], I received error c213 "left side of asn-op not an lvalue" - " the address of a changeable object is required at the right side of the assignment operator". But i don't know where is/are problems... Code: #include <Chipcon\srf04\regssrf04.h> #include <Chipcon\srf04\halsrf04.h> #include <Chipcon\srf04\ebsrf04.h> #include <ctype.h> #define TX_entree 0x80 //P0.4 #define RI0 0x98 BYTE idata txBuffer[8]; BYTE idata buffer[8]; int i = 0; int taille_tab; void main () { #ifdef STAND_ALONE CLOCK_INIT(); IO_PORT_INIT(); #endif ebLcdInit(); ebLcdUpdate("Emission test v0.1", NULL); halWait(3000); ebLcdUpdate("Initialisation", NULL); halWait(2000); halUartSetup(UART_BAUDRATE_115200, DEFAULT_MODE); SPI_INIT(SCLK_6_MHZ); POWER_UP_RESET_CCxxx0(); FIRST ERROR UART_RX_ENABLE(); ebLcdUpdate("Reception et stockage des données en cours", NULL); halWait(3000); if(RI0 == 1){ //stockage des données taille_tab = sizeof(buffer); for (i = 1; i < taille_tab; i++) { UART_WAIT_AND_RECEIVE(buffer[i]); SECOND ERROR IF I COMMENT THE FIRST } } ebLcdUpdate("Emission des données en cours", NULL); halWait(2000); SPI_ENABLE(); halRfSendPacket(buffer, sizeof(buffer)); ebLcdUpdate("Fin", NULL); halWait(2000); } Any help or comments appreciated. I'm workin' on the CC2500DK, it's an tranceiver HF and many fonctions has already created by the constructor. Thanks John
do { .... } while (0) That's a new one. Just curious, what is the purpose of such a construct? Erik
It's a horrible macro dodge: http://www.eskimo.com/~scs/C-faq/q10.4.html
It's a horrible macro dodge: You got that right "The usual goal is to write a macro that can be invoked as if it were a statement consisting of a single function call" Got it, it must be an entry from the "if C is readable, it is not real C" club. Hiding the fact that something is a macro by making it look as a subroutine will make debugging pure joy. Erik
Erik, I actually think this sort of thing is justifiable if you comment it up properly. For instance, it can achieve the equivalent of C++'s "inline" functions in C. If you have a "function" to call a bunch of places that's very simple, then just injecting the 9 or 10 actual instructions everywhere gets a bit ugly. Also, if the timing is of some importance, they may be used at places where you don't want the overhead of a function call.