| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Tagge 
 
 
 Joined: 23 Aug 2005
 Posts: 93
 
 
 
			      
 
 | 
			
				| Length of a string? |  
				|  Posted: Fri Jan 20, 2006 5:16 am |   |  
				| 
 |  
				| Do someone know why I get a "String Too Long" from this sprintf() as soon as I put another sign in it? I know its rather long but, is there a max length beside the one I put there (128)? beacuse the string aint >128 long! And it doesnt matter if I make room for whatever in the buffer.
 When I made a strlen() at it I got  the length of only 84.
 Beside, thanks for a god forum.
 
  	  | Code: |  	  | int8 my_string[128];
 RESET_BCC;  //bcc=0
 sprintf(my_string,
 "F.F(00)\r\nC.1.0(%s)\r\n1.8.1(%f)\r\n1.8.2(%f)\r\n"
 "32.7(%lu)\r\nC.5.0(00)\r\n%C%C%C%C",
 METER_NO,energy_A,energy_A2,voltage,0x21,0x0d,0x0a,0x03);
 
 putc(0x02);                 //stx, startbit text
 printf("Length is %u\r\n", strlen(my_string));
 printf(putcsum, my_string); //print string
 putc(bcc);                  //as last, print checksum
 
 | 
 |  |  
		|  |  
		| Tagge 
 
 
 Joined: 23 Aug 2005
 Posts: 93
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Fri Jan 20, 2006 6:03 am |   |  
				| 
 |  
				| There was some stuff in the forum about this, but not any straight answers about the length. I use a PIC18F2525. Why I want to make a long string and not make it in parts is that I must calculate the bcc of it.
 /Tagge
 |  |  
		|  |  
		| Humberto 
 
 
 Joined: 08 Sep 2003
 Posts: 1215
 Location: Buenos Aires, La Reina del Plata
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jan 20, 2006 9:18 am |   |  
				| 
 |  
				| The maximum size of string is dependable of the maximum RAM block size of the device being used, so in you case it should be 256.
 
 But in your code:
 
  	  | Code: |  	  | int8 my_string[128];
 RESET_BCC;  //bcc=0
 sprintf(my_string,
 "F.F(00)\r\nC.1.0(%s)\r\n1.8.1(%f)\r\n1.8.2(%f)\r\n"
 "32.7(%lu)\r\nC.5.0(00)\r\n%C%C%C%C",
 METER_NO,energy_A,energy_A2,voltage,0x21,0x0d,0x0a,0x03);
 
 
 | 
 
 You are using the same name to define a data space block and a STREAM name.
 
 int8 my_string[128];
 
 sprintf(my_string, ....
 
 
 The compiler should complain about this.
 
 
 Humberto
 |  |  
		|  |  
		| Ttelmah Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Fri Jan 20, 2006 11:10 am |   |  
				| 
 |  
				| He is using sprintf, and for this the first variable, is a string name. However the sprintf is invalid, because of the split constant format string. This has to be a _single_ string.
 
 Best Wishes
 |  |  
		|  |  
		| Humberto 
 
 
 Joined: 08 Sep 2003
 Posts: 1215
 Location: Buenos Aires, La Reina del Plata
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jan 20, 2006 12:10 pm |   |  
				| 
 |  
				|  	  | Quote: |  	  | He is using sprintf,
 
 | 
 
 Yep, RJ you are right. Had a confusion with fprintf.
 
 Humberto
 |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Sat Jan 21, 2006 12:49 am |   |  
				| 
 |  
				| Hi, what do you mean by the "split constant format string"?  how should the string be written? I also had the string in one line but the same error occurs. The string is working fine like it is but I cant put any more in to it and I would like to have a few more bytes in it. But no more than about max 100 bytes. |  |  
		|  |  
		| Ttelmah Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Sat Jan 21, 2006 3:39 am |   |  
				| 
 |  
				| The format string, must be a single constant string. If you need to go onto multiple lines, use the \ line extender character. 
  	  | Code: |  	  | int8 my_string[128];
 int16 voltage;
 float energy_A2;
 float energy_A;
 char METER_NO[8];
 sprintf(my_string, "F.F(00)\r\nC.1.0(%s)\r\n1.8.1(%f)\r\n1.8.2\
 (%f)\r\n32.7(%lu)\r\nC.5.0(00)\r\n%C%C%C%C",
 METER_NO,energy_A,energy_A2,voltage,0x21,0x0d,0x0a,0x03);
 
 | 
 Compiles without complaint for me.
 Howver I have to query 'why' you are coding as you are?. The 'point' of the code I posted before, is that it calculates the checksum as the data is sent, using the normal printf, and gets rid of the need to have a temporary string to hold the output data, and the large amounts of time involved in accessing such an array. You appear to be using this code, since you are including the 'RESET_BCC' define, yet are still wasting space sticking all the data into an output string.
 
 Best Wishes
 |  |  
		|  |  
		| Tagge 
 
 
 Joined: 23 Aug 2005
 Posts: 93
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Jan 23, 2006 2:33 am |   |  
				| 
 |  
				| I cant compile your string eigther? I get the "string to long" error? This following type works but I cant put anything else in the string?
 
 
  	  | Code: |  	  | printf(putcsum, "F.F(00)\r\nC.1.0(%s)\r\n1.8.1(%f)\r\n1.8.2(%f)\r\n"
 "32.7(%lu)\r\nC.5.0(00)\r\n%C%C%C%C",
 METER_NO,energy_A,energy_A2,voltage,0x21,0x0d,0x0a,0x03);
 
 //but not this, makes also "string too long" and its copied from yours? :
 printf(putcsum, "F.F(00)\r\nC.1.0(%s)\r\n1.8.1(%f)\r\n1.8.2\
 (%f)\r\n32.7(%lu)\r\nC.5.0(00)\r\n%C%C%C%C",
 METER_NO,energy_A,energy_A2,voltage,0x21,0x0d,0x0a,0x03);
 | 
 
 And yes, I used your code, its very good!
 I just tried different ways to get around this problem with the string length.
 Has it anything to do with my compiler version?
 I got the 3.210
 |  |  
		|  |  
		| Humberto 
 
 
 Joined: 08 Sep 2003
 Posts: 1215
 Location: Buenos Aires, La Reina del Plata
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jan 23, 2006 8:21 am |   |  
				| 
 |  
				|  	  | Quote: |  	  | Has it anything to do with my compiler version?
 I got the 3.210
 
 | 
 
 
  	  | Quote: |  	  | 
 3.210  A bug in the printf %f is fixed
 3.212  A %u and %d bug is fixed
 3.215  A problem with %u during printf redirection is fixed
 3.216  A problem with 32 bit constants in a printf with %lx is fixed
 3.223  Formatting inconsistancies with %U and %D are fixed
 3.224  A problem with the %02d format in printf is fixed
 3.225  Some formatting issues with %LD are fixed
 3.231  New printf specifications %g and %w added and %f improved
 3.232  printf %f now puts a leading 0 for numbers less than 1
 3.233  The %f, %w and %g formats have been adjusted to be more consistant
 3.233  %w now accepts signed numbers
 3.234  Still more %f adjustments.  It should now solve everyones problems.
 3.237  Left justification has been added to %f, use %x.yf where x<=y to get left justification
 
 
 | 
 
 
  ......   
 I would test with another version.
 
 
 Humberto
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |