Konvertera int till string

Avdelningen för programmering, nätverk samt alternativa OS.
Post Reply
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Konvertera int till string

Post by tkh »

Jag kommer att få ett tal som en int, och behöver konvertera detta till en sträng för att spara undan det. Jag kan inte använda några specialkommandon som finns i C++, för detta är ICC AVR, eller vad det heter. Ett C-språk som används mot AVR mikrokontroller.

Den funktion jag har skrivit ser ut såhär:

Code: Select all

write_ints(int siffra)
{
    char tecken;
	
	if ((siffra/1000) >= 1)
	    lcd_write_byte((siffra / 1000) + 48);
	else
		lcd_write_byte(' ');

	siffra = (siffra - (siffra / 1000) * 1000);
	
	if((siffra/100) >= 1)
		lcd_write_byte((siffra / 100) + 48);
	else
		lcd_write_byte(' ');		
	siffra = (siffra - (siffra / 100) * 100);
	
	if((siffra/10) >= 1)
		lcd_write_byte((siffra / 10) + 48);
	else
		lcd_write_byte(' ');
		
	siffra = (siffra - (siffra / 10) * 10); 		

	lcd_write_byte(siffra + 48);
}
Den fungerar bara så att den skriver ut det tal som kommer in. Jag utnyttjar det fula i heltalen för att beta av talet del för del. Jag skriver ut dem på så sätt att jag skickar siffran plus 48, ascii-talet för den siffra jag vill åt. På så sätt kan jag skriva ut den rakt av utan att det blir problem i datatyperna. Antar att jag på exakt samma sätt kan spara undan talen i en sträng.

Just nu fungerar den inte perfekt, för nollor blir mellanslag istället. Det kanske jag helt enkelt bara löser genom att skriva en nolla istället för ett mellanslag. Men jag hade inte planerat att göra så, helst löser jag det med ännu en liten koll.

Ett riktigt problem som jag har är att den är otroligt platsineffektiv. Bara denna lilla funktion tar upp ca: 3% av kapselns minne. Jag har skrivit en fullständig lcd-drivrutin och en hel del mer på bara 9%. Kan man på något annat sätt skriva rutinen på ett mer effektivt sätt?
"Just because you are unique does not mean you are useful."
User avatar
straver
Posts: 485
Joined: 2002-03-09 13:51:28
Location: Malmö
Contact:

Post by straver »

Vet inte om det här är till någon hjälp eftersom den använder sig av pow från math.h. Men den klarar i alla fall av nollor.

Code: Select all

int aktTal = 100;
int sif = 3;
int i, del1, del2;
char tecken[10];
	
for (i = 1; i < sif+1; i++) {
	del1 = (aktTal / (pow (10, (sif - i)) ));
	del2 = (aktTal / (pow (10, (sif - i+1)) ));
	del2 = del2 * 10;

	tecken[i-1] = (del1 - del2) + 48;
}

tecken[i] = '\0';

printf ("talet som sträng blir: %s\n", tecken);
YourDick

Post by YourDick »

Jag är ingen. Jag är längtan
än till mörker, än till ljus.
Jag var ingen, blott en längtan
att bedöva idioternas brus.
Last edited by YourDick on 2003-10-15 1:10:07, edited 1 time in total.
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Post by tkh »

Straver wrote:Vet inte om det här är till någon hjälp eftersom den använder sig av pow från math.h. Men den klarar i alla fall av nollor.
math.h finns visserligen, och pow fanns däri, men det stod bara massa definitioner där... bland annat detta:
math.h wrote:double pow(double x, double y); /* x ** y */
Vet inte vad jag ska få ut av det.

Bobby: vill du vara snäll och förklara koden du skrev? Alltså hur ConvertToString är tänkt att fungera...?

Jag är alltså ingen programmerare, därav denna relativt lätta fråga :)
"Just because you are unique does not mean you are useful."
User avatar
IcePic
Hedersbit
Posts: 6061
Joined: 2002-03-08 16:09:38

Post by IcePic »

tkh wrote:Vet inte vad jag ska få ut av det.

Bobby: vill du vara snäll och förklara koden du skrev? Alltså hur ConvertToString är tänkt att fungera...?

Jag är alltså ingen programmerare, därav denna relativt lätta fråga :)
Den reskurserar och delar med tio för varje gång, tills det inte längre finns
något kvar efter divisionen. (Och printar ut siffran för varje varv givetvis)
Oh give me a clone, my very own clone,
with the Y chromosome changed to X!
And since she's my own, of my own flesh and bone,
she'll be thinking of nothing but sex!
User avatar
Illuwatar
Hedersbit
Posts: 2116
Joined: 2002-02-21 11:14:49
Location: Haninge
Contact:

Post by Illuwatar »

Klarar c-kompilatorn in-line assembler? I så fall skulle jag göra subrutinen i ren assembler för att få ner storleken. Jag kan tyvärr inte ge ett praktiskt exempel eftersom jag aldrig har kodat AVR-assembler, men tankesättet borde vara den samma.
Born to mod..
Inget är omöjligt, det omöjliga tar bara lite längre tid.
Quad Core - som fyrhjulsdrift för datorer: Du kommer alltid vidare även när det tar emot...
User avatar
IcePic
Hedersbit
Posts: 6061
Joined: 2002-03-08 16:09:38

Post by IcePic »

Illuwatar wrote:Klarar c-kompilatorn in-line assembler? I så fall skulle jag göra subrutinen i ren assembler för att få ner storleken. Jag kan tyvärr inte ge ett praktiskt exempel eftersom jag aldrig har kodat AVR-assembler, men tankesättet borde vara den samma.
Moderna kompilatorer är så bra att
det knappt lönar sig. Det är i extrema fall man kan vinna lite på det, men om
str2int är ett problem så tror jag inte riktigt inline-asm är på rätt nivå riktigt.
(Utan att vara elak)
Dessutom blir inline-asm ett hinder om "han som fattade det" blir överkörd av
en buss och man ska in med en ersättare.
Oh give me a clone, my very own clone,
with the Y chromosome changed to X!
And since she's my own, of my own flesh and bone,
she'll be thinking of nothing but sex!
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Post by tkh »

IcePic wrote:Den reskurserar och delar med tio för varje gång, tills det inte längre finns
något kvar efter divisionen. (Och printar ut siffran för varje varv givetvis)
Mm, kom på det idag när jag testkörde. Och den fungerade väldigt bra, man får tacka för det. Har bara två kommentarer till detta.
1. Den fick inte ut något mellanslag i början av talet (om det är mindre än 1000 t.ex., då blir det snett på displayen. Men det är nog inte så svårt att fixa.
2. Den är lika platsineffektiv som min kodsnutt. Kanske får man acceptera att den här typen av matematiska beräkningar tar plats?

edit:
Testade att på både min och Bobbys kodsnutt lägga till en koll på hur stort talet är, om man ska skriva ut ett mellanslag eller bara en nolla. Min kod med "nollkoll" blev ytterligare 2 procentenheter större. Bobbys variant med en nollkoll blev inte större. Så den tror jag att jag behåller.
Såhär gjorde jag nollkollen:

Code: Select all

void write_ints_pre(int n)
{
 	 if(n < 1000)
	 	  lcd_write_byte(' ');
	 if(n < 100)
	 	  lcd_write_byte(' ');
	 if(n < 10)
	      lcd_write_byte(' ');
	 write_ints(n);
}
Funkar fint. Men 3% är ingen liten funktion kan jag säga... :)
Last edited by tkh on 2003-10-14 10:13:55, edited 1 time in total.
"Just because you are unique does not mean you are useful."
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Post by tkh »

Illuwatar wrote:Klarar c-kompilatorn in-line assembler? I så fall skulle jag göra subrutinen i ren assembler för att få ner storleken. Jag kan tyvärr inte ge ett praktiskt exempel eftersom jag aldrig har kodat AVR-assembler, men tankesättet borde vara den samma.
ICC ska klara assembler, problemet är bara att det var 1½ år sedan jag skrev AVR-assembler. Det skulle ta lite för mycket tid att friska upp minnet för att det ska vara värt det. Frågan är ju också om resultatet skulle bli bättre.

Att skriva i asm blir i princip alltid effektivare än om man kodar i C, MEN, då krävs det att man skriver en optimerad kod, vilket inte alls är säkert att man gör.
"Just because you are unique does not mean you are useful."
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Post by tkh »

tkh wrote:Men 3% är ingen liten funktion kan jag säga... :)
Tre inlägg i rad, men när jag hela tiden sitter och programmerar så händer det ju saker hela tiden.

Vad jag vill tillägga just nu är att jag har fått veta anledningen till att funktionen blir så stor; division. Så om jag vill få ned storleken på funktionen så måste jag bygga om den till en som bara jobbar med addition och subtraktion. Typ räkna ned tusental,hundratal,tiotal... spara undan för varje steg. Blir några fler rader kod, men den kan kanske både kan gå snabbare och ta mindre utrymme då.
"Just because you are unique does not mean you are useful."
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Post by tkh »

Ett fjärde inlägg, nu får det räcka... detta är nog det sista. Ville bara säga att jag har lämnat Bobbys variant för en egen. Anledningen är att addition/subtraktion är de snabbaste räknesätten, och jag håller mig till dem.

Den kod som Bobby gav mig fungerade kanon, och det var få rader kod. Men den kunde jag skriva ut 40.000 tecken (räknar från 0 till 9999, varje gång skrivs alla fyra tecken ut) till displayen på ca: 9 sekunder. Vilket är väldigt snabbt, vår examinator blev faktiskt imponerad. Med min nya kod sparade jag en procentenhet i utrymme, samt att jag nu kan skriva mina 40.000 tecken på strax över 4 sekunder. Koden blev ful och tråkig, men den är effektiv iaf :)

Code: Select all

void write_ints(int n)
{
 	 int n2 = n;
 	 int tutal,hutal,tital;
	 tutal = hutal = tital = 0;
	 
	 while(n > 999)
	 {
	  	n = n - 1000;
		tutal++;
	 }

	 while(n > 99)
	 {
	  	n = n - 100;
		hutal++;	 
	 }
	 
	 while(n > 9)
	 {
	  	n = n - 10;
		tital++;	 
	 }
	 
	 if (tutal > 0)
	 	lcd_write_byte(tutal + 48);
	 else
	 	lcd_write_byte(' ');
		
	 if (hutal > 0)
	 	lcd_write_byte(hutal + 48);
	 else if (n2 > 99)
		lcd_write_byte('0');
	 else 
	 	lcd_write_byte(' ');
		
	 if (tital > 0)
	 	lcd_write_byte(tital + 48);
	 else if (n2 > 9)
	 	lcd_write_byte('0');
	 else
   	 	lcd_write_byte(' ');
		
	 lcd_write_byte(n + 48);
}
edit: ändrade bara en liten liten bugg gällande nollor i mitten av talet ;)
"Just because you are unique does not mean you are useful."
YourDick

Post by YourDick »

Jag är ingen. Jag är längtan
än till mörker, än till ljus.
Jag var ingen, blott en längtan
att bedöva idioternas brus.
Last edited by YourDick on 2003-10-15 1:09:52, edited 1 time in total.
User avatar
fisk
Posts: 7485
Joined: 2003-03-18 21:09:30
Location: Örebro / Sverige
Contact:

Post by fisk »

Imponerande Bobby!
Du kan din sak.
Aotearoa - tino rangatiratanga
User avatar
Ancalagon
Posts: 550
Joined: 2002-03-08 14:16:41
Location: Stockholm

Post by Ancalagon »

YourDick wrote:Jag är ingen. Jag är längtan
än till mörker, än till ljus.
Jag var ingen, blott en längtan
att bedöva idioternas brus.
hmm, är ovanstående ett resultat av ett spam-filter eller ? ::)
Xhargh
Posts: 1177
Joined: 2002-10-21 15:05:32
Contact:

Post by Xhargh »

YourDick wrote:Jag är ingen. Jag är längtan
än till mörker, än till ljus.
Jag var ingen, blott en längtan
att bedöva idioternas brus.
Vart tog den vackra koden vägen?
Windows 98 på 4.38 MB, Nano98
User avatar
tkh
Hedersbit
Posts: 3901
Joined: 2002-03-08 0:41:22
Location: Landskrona (Umeå)
Contact:

Post by tkh »

Xhargh wrote:Vart tog den vackra koden vägen?
Bobby ändrade själv sina inlägg..
"Just because you are unique does not mean you are useful."
Post Reply