Hello! I am trying to use sprintf, but get no result (C51, version 5.20).
char xdata command [80], i=100; strcpy (command, "Hello!"); // now command contains "Hello!" sprintf (command, "Test %d", i); // command has not changed
Hi, ok, it's working (again). There must have been a problem with my installation of the C51 Compiler. After reinstallation sprintf works fine! Thanks to all of you for your help! Holger
Yeah, Back in the old days,
while (1);
for(;;);
Just a note Jon, while (1); may cause compilers to emit a diagnostic. Using for(;;); will not. I've been caught replacing while's with for's in projects where no warnings were permitted at the highest warning level. A boring point, I admit. Regards. - Mark
char i; : sprintf(command, "%bd", (char)i);
sprintf(command, "%bd", i);
sprintf(command, "%d", (int)i);
Have you ever checked the pre-processor output of C51 ? Make sure that the pre-processor does not replace the text "sprintf" with anything else.
OK, I got it to work just fine. Here's what I did. 1. Create a new project. 2. Select the Intel 8052 from the device database. 3. Add the following file to the project:
#include <stdio.h> #include <string.h> char xdata command [80]; void main (void) { strcpy (command, "Hello"); sprintf (command, "Just a text"); while (1) { } }
The variable i is defined as a char (1 byte). sprintf "%d" expects an integer (2 bytes). Try casting it usually works for me, and use the b to say its a byte. sprintf(command, "%bd", (char)i);
All work OK (compiled and simulated in dScope). But without explicitly typecasting of 'i' you get wrong result
char xdata command [80], i=100; sprintf (command, "Test %d", (int) i); // command has "Test 100" sprintf (command, "Test %d", i); // command has "Test 25600"
"I display the content of my variable before and after the sprintf command." Are you sure that it's the sprintf not working; could it be a problem with your display routine? Have you tried it on the simulator, so that you can watch exactly what's going on? Do you use optimisation? If so, have you tried disabling it?
Jon, What I initialy did is I took a function I wrote using C166 that uses a bunch of sprintf commands, and copied it into my C51 source code. Now, my sprintf commands that work fine with C166 don't work with C51. Is there a major difference? After executing the lines:
char xdata command [80]; strcpy (command, "Hello"); sprintf (command, "Just a text");
Can you write a very small example of sprintf failing? I use sprintf a lot. I mean a whole lot and never have problems. Jon
Sorry but, in this case, if the code works out of the hardware ( simulation only ) I think an Emulator may help you catch what is going on with your hardware.
I am not using a simulator, I test the software directly with our custom hardware (works since a few years, no problem on that side), and show the variable on an attached display. Holger
I would have thought that's an ANSI command and it should work the same way in every C compiler version. This command is ANSI C patern. It's really strange the fact that you can't see it working. What is the simulator that you're attempting to watch it? - Alex
Jon, I display the content of my variable before and after the sprintf command. We have 2 similar devices, one using an 8bit C51 program, the newer one using a 16bit C166 program. C166 works fine, but the same sprintf commands in C51 don't seem to affect the variable that sprintf is supposed to change (I can do a bunch of sprintf commands without changing the initial value of my variable). Holger
View all questions in Keil forum