Sida 1 av 2

sprintf kletar ihop alla värden i en enda sträng - Varför?

Postat: 6 februari 2015, 15:32:42
av Al_Bundy
Nu har jag stött på något mystiskt som jag inte kan förklara.

Jag har en kod som ska skicka ut allt på en LCD. Men innan koden skickas ut så måste den får textsträngar "" i form av en pekare.

sprintf(temperature1, "%d", TEMP1);
sprintf(temperature2, "%d", TEMP2);
sprintf(temperature3, "%d", TEMP3);

Vi säger att TEMP1 = 45 och TEMP2 = 50 och TEMP3 = 60
När jag skriver ut temperature1 på min LCD så ser jag 455060 och temperature2 blir 5060 och temperature3 blir 60.

Skulle jag bara köra med sprintf(temperature1, "%d", TEMP1); och skriva ut temperature1 så fungerar det bra. Men just när jag har andra sprintf-funktioner nedan så kletas allt ihop.

Har detta med raminnet att göra på min ATmega?

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 15:35:50
av johano
Hur deklarerar du variablerna temperature1, temperature2 och temperature1?
Tänk på att dessa måste peka på varsin tillräckligt stor buffer innan sprintf(), annars blir det "bort i knas".

/johan

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 15:57:10
av Al_Bundy
Ja! Det var det som var problemet! För liten buffert! Jag som tyckte att jag hade en rätt lämplig buffert.
Hur är det med de där buffert? Visst är det bättre att ha för stor, än precis?

Det fungerar nu! Tack för du påminnde mig om detta! :) :tumupp:

Om jag ska få plats med ett tal som har storleken mellan 10 och 99. Hur stor buffert ska man ha då?

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 16:04:28
av TomasL
Hur är det med de där buffert? Visst är det bättre att ha för stor, än precis?
Nja, bufferten måste minst vara så stor så att variabeln får plats.
Den behöver (och skall egentligen inte vara större).

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 16:06:49
av bit96
Normalt skall du ha plats för 3 tecken om talet ligger mellan 00 och 99.
D.v.s. två siffror och noll-tecknet som markerar 'slut på strängen'.

Noll-tecknet talar om för C var texten slutar, d.v.s. var utskriften stoppar.
Det finns ingen annan information som talar om hur lång en sträng är.

Ev. kan ett tal inledas med ett blanksteg för att få plats med plustecken, minustecken, ett eller flera blanksteg, högerjustering, blanksteg istället för plustecken o.s.v.
Detta går dock att styra genom att sätta olika tecken ihop med %d, t.ex. % d, %5d, %-5d, o.s.v.

Edit: förtydligande om %d

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 16:10:15
av svanted
menar du tal eller siffror(ASCII sträng), du använder ju "sprintf" som skriver strängar,,

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 16:11:21
av TomasL
Jo, men, det beror ju på hur variablerna är deklarerade, och vilka formatsträngar som används.

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 16:40:59
av Al_Bundy
svanted skrev:menar du tal eller siffror(ASCII sträng), du använder ju "sprintf" som skriver strängar,,
I detta fall måste jag konvertera om t.ex. 1 till "1" i from av char-pekare då biblioteket U8GLIB vill ha det så.
TomasL skrev:
Hur är det med de där buffert? Visst är det bättre att ha för stor, än precis?
Nja, bufferten måste minst vara så stor så att variabeln får plats.
Den behöver (och skall egentligen inte vara större).
Okej.
bit96 skrev:Normalt skall du ha plats för 3 tecken om talet ligger mellan 00 och 99.
D.v.s. två siffror och noll-tecknet som markerar 'slut på strängen'.

Noll-tecknet talar om för C var texten slutar, d.v.s. var utskriften stoppar.
Det finns ingen annan information som talar om hur lång en sträng är.

Ev. kan ett tal inledas med ett blanksteg för att få plats med plustecken, minustecken, ett eller flera blanksteg, högerjustering, blanksteg istället för plustecken o.s.v.
Detta går dock att styra genom att sätta olika tecken ihop med %d, t.ex. % d, %5d, %-5d, o.s.v.

Edit: förtydligande om %d
så om jag ska få plats med "talet 34" så måste jag ha 8 + 1 = 9 i buffert då mellanslag tar också upp ett tecken lika väl som \n?

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 17:11:32
av sodjan
Ja. Mellanslag inte bara "tar upp" ett tecken, det *är*
ett tecken precis som alla andra. Ingen som helst skillnad...

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 17:44:45
av Al_Bundy
Okej, tack då vet jag! :)

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 17:47:18
av Mr Andersson
Al_Bundy skrev:så om jag ska få plats med "talet 34" så måste jag ha 8 + 1 = 9 i buffert då mellanslag tar också upp ett tecken lika väl som \n?
Du har ju inget \n i den strängen. Däremot har du ett "osynligt" \0 i slutet, så ja det behövs 9 tecken. Om du också ska ha med \n så blir det 10.

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 17:47:54
av TomasL
Al, om du hade läst i dina "hjälp-filer" hade du förstått hur sprintf fungerar.

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 17:56:11
av tecno
Varför skulle han frångå sina principer att inte läsa på?

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 18:30:13
av opatagio
Använda snprintf istället?

:shock:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Postat: 6 februari 2015, 18:44:09
av svanted
TomasL skrev:Jo, men, det beror ju på hur variablerna är deklarerade, och vilka formatsträngar som används.
ja men det är aldrig ett tal i ordets bemärkelse utan en text eller en sträng...