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); }
thanks for Your answer I understand your explanation, but I would like to a calculate pointers controlsum not that place where pointers point to. I can do it if I declare a new dummy byte(U8) variable before the line where my first pointer placed.
//declare xdata byte dummy; xdata byte xdata *rec_buf_start; xdata byte xdata *rec_buf_end; xdata byte xdata *rd_ptr; xdata byte xdata *wr_ptr; xdata word chksum1;
main() { *chksum1=calc_chk(&dummy, &chksum1); }
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; }
So, you want to treat the pointers as just ordinary numbers, and calculate a checksum on those numbers? Can't you just use a cast?
Yes I'd like to do that, but I don't know how do I do it. I program always in assembly and nowadays i'd like to apply C language in my job. It's not to easy change my assembly oriented attitud. So I should greatly appreciate if You show it the good solution. thank in advance Leslie
unsigned char *Ptr; unsigned long PtrVal; Ptr = &something; PtrVal = (unsigned long)Ptr;