| 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.
 |  | 
	
		|  | 
	
		|  |