|
|
View previous topic :: View next topic |
Author |
Message |
Ruby
Joined: 04 Jul 2014 Posts: 44
|
An atol problem |
Posted: Fri Jul 04, 2014 11:25 am |
|
|
Hi guys. I have an atol problem. I am using pic16f877a. I am sending data via pc.
Code: |
Unsigned long x;
Char data [20]={};
For (I=0, I <20, I++) Data [I]=getc ();
X=atol (data [0]);
|
Lets say if data [0] is 9 I get on lcd 11.
Why it can be? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19541
|
|
Posted: Fri Jul 04, 2014 11:46 am |
|
|
Lots of potential things:
9 is not an ASCII number.
0x39 is the digit '9'.
However then remember that the string needs to be _terminated_ (`\0' character). Otherwise ATOL will keep walking through memory until it finds a terminator. You need to add a terminator after your last character. This is why a 10 character 'string' needs 11 characters of storage.
It is probably finding some much larger number like 3456780011, and only returning the '11' since it then overflows....
Syntax is also wrong.
You want &data[0], or just data passed to the function.
Then how is a 'long' (max 65536) going to hold a 20 digit number?.... |
|
|
Ruby
Joined: 04 Jul 2014 Posts: 44
|
|
Posted: Sat Jul 05, 2014 12:30 am |
|
|
Thanks for reply. The program is like this:
Code: | .....
char data[20]={}; // ==> Global
unsigned long x=0; // ==> Global
......
for (i=0;i<25;i++)
{
data[i]=getc();
}
printf(LCD_PUTC,"\fD0=%c D1=%c D2=%c \nD3=%c D4=%c ",data[0],data[1],data[2],data[3],data[4]); //==> Correct
delay_ms (1000);
x=atol('9');
printf(LCD_PUTC,"\fx=%lu ",x); //==> I am getting 11
delay_ms (1000);
x=atol(data[1]);
printf(LCD_PUTC,"\fD0=%lu ",x); //==> I am getting 2011 doesn't matter what is data[1]
delay_ms (1000);
x=atol(data[2])*100+10*atol(data[3])+atol(data[4]);
printf(LCD_PUTC,"\fD0=%lu ",x);
delay_ms (1000);
|
data[20] will be convert to 7 different int
As x=atol(data[0]) , y=atol(data[2])*100+10*atol(data[3])+atol(data[4]);
etc...... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19541
|
|
Posted: Sat Jul 05, 2014 12:56 am |
|
|
Key point is understanding what a 'string' is.
In C, a 'string', is an array of text characters _terminated with a '\0' character.
The termination is critical.
Second is understanding the difference between a value, and it's _address_.
atol, expects to receive a pointer to an array of characters (it's address in memory). You are calling it with the value 0x39, which it then treats as such a pointer. So it goes walking off through memory, starting at address 0x39, and returns what it finds. Could be anything.....
Code: |
char temp_buff[10];
int8 val=123;
int16 x;
sprintf(temp_buff,"%d",val);
//At this point 'temp_buff' contains 0x31 0x32 0x33, 0
//Note the '0' - sprintf, automatically terminates
x=atol(temp_buff); //The name of an array, _is_ it's address
//x is now 123
//Or
x=atol(&temp_buff[1]);
//x is now 23 (because the scan started at the second character)
temp_buff[0]='9';
temp_buff[1]='\0';
//At this point 'temp_buff' contains 0x39, 0, 0x33, 0
x=atol(temp_buff);
//x is now 9
|
This is really basic C. Some basic reading is needed about C strings, and C pointers. |
|
|
Ruby
Joined: 04 Jul 2014 Posts: 44
|
|
Posted: Sun Jul 06, 2014 3:00 pm |
|
|
Thank you. Now is working... |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|