I declared different parameters, variables and pointers and I put into in two blocks. I declare and defined function for calculating, saving and checking chksum for both block. I realised that the compiler give error message when I try to pass through the pointer's address to a function. I tried to use an another pointer to point to the pointer's address but the compiler didn't support it. Has anybody a good idea to solve my problem. thank in advace leslie #include <reg51.h> #define record 7 #define byte unsigned char #define word unsigned int #define dword unsigned long int //declare funtions void save_block(byte xdata *start_addr,word xdata *chksum); word calc_block(byte xdata *start_addr,word xdata *chksum); bit chk_block(byte xdata *start_addr,word xdata *chksum); //declare variables xdata byte par_buff1[14]; xdata word chksum1; // xdata byte dummy1; // xdata byte xdata *rec_buf_start; xdata byte xdata *rec_buf_end; xdata byte xdata *wr_ptr; xdata byte xdata *rd_ptr; xdata word chksum2; // xdata word xdata **valami; main() { //valami=&rec_buf_start; if(chk_block&rec_buf_start,&chksum2)) { // do something } if (chk_block(&par_buff1[0],&chksum1)) { //do something } else { //do something } for(;;) { //do something } } // // functions definition // bit chk_block(byte xdata *start_addr,word xdata *chksum) { if(*chksum!=calc_block(start_addr,chksum)) { return 1; //setb c } else { return 0; } } word calc_block(byte xdata *start_addr,word xdata *chksum) { xdata word blsumma; while(start_addr!=(byte *)chksum) { blsumma+=(byte)*start_addr++; } return blsumma; } void save_block(byte xdata *start_addr,word xdata *chksum) { *chksum=calc_block(start_addr,chksum); }
You are not guaranteed to have these variables in order in memory (ANSI C). You can force this be selecting "Keep variables in order" I think but this is a weak thing to do. It's too fragile and will break easily. Put your pointers into a struct like this:
typedef unsigned char U8; typedef unsigned short U16; typedef struct { // All pointers to XDATA only. U8 * xdata rec_buf_start; U8 * xdata rec_buf_end; U8 * xdata rd_ptr; U8 * xdata wr_ptr; } Pointer; int main(void) { // Put struct into XDATA too. Pointer xdata ptrs; U16 idata chksum; chksum = calcChecksum(&ptrs); return 0; }