View previous topic :: View next topic |
Author |
Message |
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
strcpy vs strncpy |
Posted: Wed Feb 08, 2006 11:08 pm |
|
|
The first example doesn't work, the second does. What am I doning wrong?
Code: |
char data_string[40];
char data_input[40];
data_input[0]='A';
data_input[1]='B';
data_input[2]='C';
data_input[C]=0;
strcpy(data_string,data_input);
printf(data_string);
|
But nothing is stored in data_string, but I found a work-around.
Code: |
char data_string[40];
char data_input[40];
data_input[0]='A';
data_input[1]='B';
data_input[2]='C';
data_input[C]=0;
strncpy(data_string,data_input,40);
printf(data_string);
|
This works. What am I doing wrong?
Last edited by Eugeneo on Wed Feb 08, 2006 11:47 pm; edited 1 time in total |
|
|
kel
Joined: 17 Oct 2005 Posts: 68 Location: Brisbane
|
try |
Posted: Wed Feb 08, 2006 11:14 pm |
|
|
try this...
Code: | printf("%s",data_string); |
|
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
|
Posted: Wed Feb 08, 2006 11:31 pm |
|
|
I used the printf to debug the code. There was a problem with my string copy before I inserted the printf. |
|
|
kel
Joined: 17 Oct 2005 Posts: 68 Location: Brisbane
|
Is this part of the string!! |
Posted: Wed Feb 08, 2006 11:38 pm |
|
|
Check this below.You are using the array wrongly i guess!!check this
why do you have C as an index.did you define it some where else?
if not change it to 3 i.e.
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Feb 08, 2006 11:39 pm |
|
|
1. What PIC are you using ?
2. What is your compiler version ? |
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
Re: Is this part of the string!! |
Posted: Wed Feb 08, 2006 11:48 pm |
|
|
kel wrote: | Check this below.You are using the array wrongly i guess!!check this
why do you have C as an index.did you define it some where else?
if not change it to 3 i.e.
|
Sorry.. It was right in the original.
Compiler: 3.227
Chip: 16F877 |
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
|
Posted: Wed Feb 08, 2006 11:53 pm |
|
|
I noticed there was a fix for the 18F, but I guess it was always working for the 16F? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 09, 2006 12:05 am |
|
|
I tested the following program with PCM vs. 3.227 and it displayed this:
ABC
Code: | #include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//=========================
void main()
{
char data_string[40];
char data_input[40];
data_input[0]='A';
data_input[1]='B';
data_input[2]='C';
data_input[3]=0;
strcpy(data_string, data_input);
printf(data_string);
while(1);
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 09, 2006 12:12 am |
|
|
Quote: | There was a problem with my string copy before I inserted the printf. |
I didn't see your statement above, initially.
So I made a new test program in which printf() is commented out and
stepped through it with the simulator. The values are in there.
I saw 0x41, 0x42, 0x43 go into 'c' in the watch window, as I stepped
through the code.
Code: | #include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//=========================
void main()
{
char data_string[40];
char data_input[40];
char c;
data_input[0]='A';
data_input[1]='B';
data_input[2]='C';
data_input[3]=0;
strcpy(data_string, data_input);
//printf(data_string);
c = data_string[0];
c = data_string[1];
c = data_string[2];
c = data_string[3];
while(1);
} |
|
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
|
Posted: Thu Feb 09, 2006 2:26 am |
|
|
I've tested it again, and it doesn't work. This is the code I get
Code: |
008 PSP_DATA
015 CCP_1_LOW
015-016 CCP_1
016 CCP_1_HIGH
01B CCP_2_LOW
01B-01C CCP_2
01C CCP_2_HIGH
020 strtok.save
021-024 _Randseed
025-04C data_string
04D-074 data_input
075 rs232_errors
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
07C main.@SCRATCH
07D @delay_ms1.P1
07D main.@SCRATCH
07E main.@SCRATCH
.................... data_input[0]='A';
*
002F: MOVLW 41
0030: MOVWF 4D
.................... data_input[1]='B';
0031: MOVLW 42
0032: MOVWF 4E
.................... data_input[2]='C';
0033: MOVLW 43
0034: MOVWF 4F
.................... data_input[3]=0;
0035: CLRF 50
....................
.................... strcpy(data_string, data_input);
0036: MOVLW 4D
0037: MOVWF 10
0038: MOVLW 25
0039: MOVWF 7C
003A: MOVF 10,W W=4D
003B: MOVWF 04 FSR=4D
003C: MOVF 00,W
003D: MOVWF 7E 7E ='A'
003E: MOVF 7C,W
003F: MOVWF 04 FSR=25
0040: MOVF 7E,W W='A'
0041: MOVWF 00 REG 25='A'
0042: MOVF 00,F Test reg
0043: BTFSC 03.2 Zero bit
0044: GOTO 048 Zero END
0045: INCF 7C,F
0046: INCF 7D,F Should this not be 10?
0047: GOTO 03A Loop
.................... printf("%s\n\r",data_input);
0048: MOVLW 4D
0049: MOVWF 04
004A: MOVLW 00
004B: IORWF 00,W
004C: BTFSC 03.2
004D: GOTO 054
004E: BTFSS 0C.4
004F: GOTO 04E
0050: MOVF 00,W
0051: MOVWF 19
0052: INCF 04,F
0053: GOTO 04A
0054: MOVLW 0A
0055: BTFSS 0C.4
0056: GOTO 055
0057: MOVWF 19
0058: MOVLW 0D
0059: BTFSS 0C.4
005A: GOTO 059
005B: MOVWF 19
.................... printf("%s\n\r",data_string);
005C: MOVLW 25
005D: MOVWF 04
005E: MOVLW 00
005F: IORWF 00,W
0060: BTFSC 03.2
0061: GOTO 068
0062: BTFSS 0C.4
0063: GOTO 062
0064: MOVF 00,W
0065: MOVWF 19
0066: INCF 04,F
0067: GOTO 05E
0068: MOVLW 0A
0069: BTFSS 0C.4
006A: GOTO 069
006B: MOVWF 19
006C: MOVLW 0D
006D: BTFSS 0C.4
006E: GOTO 06D
006F: MOVWF 19
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 09, 2006 12:16 pm |
|
|
I've installed your version, and I've gone back to vs. 3.188 as well,
and I don't see the bug. The address that you're getting, which is
0x10, is not even listed in your symbol table. Can you confirm that
your version is 3.227 ? The version is given at the top of the .LST file.
Also, can you re-install your compiler ? Something is very wrong,
and I think you should re-install it. |
|
|
|