Sida 1 av 2

Sträng i C

Postat: 30 augusti 2012, 14:56:10
av SeniorLemuren
Om jag vill skriva ut något på en display så finns rutinen:

Kod: Markera allt

lcd_puts("TEXT SOM SKRIVS");


rutinen ser ut så här

Kod: Markera allt

void
lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s)
		lcd_write(*s++);
}
void
lcd_write(unsigned char c)
{
	if (c == 'Å') c = 0x00; // Å
	if (c == 'Ä') c = 0x01; // Ä
	if (c == 'Ö') c = 0x02; // Ö
	if (c == 'å') c = 0x03; // å
	if (c == 'ä') c = 0xe1; // ä
	if (c == 'ö') c = 0xef; // ö
	__delay_us(40);
	LCD_DATA = ( ( c >> 4 ) & 0x0F );
	LCD_STROBE();
	LCD_DATA = ( c & 0x0F );
	LCD_STROBE();
}

Om jag däremot vill lägga in "TEXT SOM SKRIVS" i sVariabel och använda rutinen :
lcd_puts(sVariabel);

Så skriver jag i pascal

Kod: Markera allt

sVarabel="TEXT SOM SKRIVS"
cd_puts(sVariabel);
Hur definierar jag sVariabel= "TEXT SOM SKRIVS" för att det skall funka i C?

Re: Sträng i C

Postat: 30 augusti 2012, 15:00:39
av Klas-Kenny
Precis så som du skrev, fast med ett semikolon på slutet av raden också. :)

Givetvis måste du dock definiera variabeln först också.

Re: Sträng i C

Postat: 30 augusti 2012, 15:08:24
av sodjan
C definierar strängar som "pekare till en rad med bytes som slutar med null (h'00')", ungefär.

När du skriver : lcd_puts("TEXT SOM SKRIVS"); så tar kompilatorn hand om att
lagra texten och skapa en (intern) pekare till texten. Det är alltså *pekaren*
(d.v.s en adress, i princip) som skickas till lcd_puts, inte texten som sådan.

I Pascal kallas detta för "pass-by-reference (VAR)".

Se även t.ex :
http://en.wikipedia.org/wiki/Comparison_of_Pascal_and_C
http://en.wikipedia.org/wiki/Comparison ... _C#Strings
http://en.wikipedia.org/wiki/Comparison ... procedures
ifall du kan Pascal sedan tidigare.

Om du vill skapa en egen variabel så ska den vara av typen "pointer to char".
Något i stil med :

Kod: Markera allt

const char *p;                ; p är en "pointer to char"
p = "the rain in Spain";      ; p "pekar på" texten
lcd_puts(p);                  ; p skickas som parameter till lcd_puts().

Re: Sträng i C

Postat: 30 augusti 2012, 15:10:00
av sodjan
> Givetvis måste du dock definiera variabeln först också.

Jaha !?
Och det var ju hur man gör exakt *det* som efterfrågades...

Re: Sträng i C

Postat: 30 augusti 2012, 15:27:04
av SeniorLemuren
Äntligen :)

Re: Sträng i C

Postat: 30 augusti 2012, 15:44:42
av Odur
char sVarabel[]="TEXT SOM SKRIVS";

Re: Sträng i C

Postat: 30 augusti 2012, 15:48:54
av sodjan
Är det (bara) ett annat sätt att skriva det?
Eller var det/mitt första exemplet fel och detta rätt?
Varför inte helt enkelt kommentera inlägget med ett
par ord så att man vet varför det gjordes?

Re: Sträng i C

Postat: 30 augusti 2012, 15:54:05
av Odur
Förlåt, jag sitter på bussen på mobilen.
Båda är OK .

"ditt" sätt skapar en pekare till ett minnesområde där texten lagras. "Mitt" sätt skapar en array av chars som innehåller exakt den mängd tecken som avses plus null-terminering.

En smaksak helt enkelt vilket man vill använda.

Re: Sträng i C

Postat: 30 augusti 2012, 15:57:19
av TomasL
Nä det är väl bara två olika sätt att skriva det, egentligen.

Re: Sträng i C

Postat: 30 augusti 2012, 15:57:36
av sodjan
Jaha... :-)

OK, då är jag med, jag tänkte att det var så.
Lemuren får välja det som passar... :-)

Re: Sträng i C

Postat: 30 augusti 2012, 16:06:18
av AndLi
Det finns väll en ganska stor skillnad, sodjan har med const i sin version. Vilket betyder att det hela blir en konstant (eller egentligen är det ju pekaren som blir konstant, innehållet den pekar på kan ju ändra sig, men i detta fall är även det definierat som en konstant...)

Ska strängen modifieras och ett varvtal tex skrivas in i den funkar Odurs version, där kan man modifiera enstaka tecken med sVarabel[10] = '3'; för att ändra 11 byten till en 3a..

Re: Sträng i C

Postat: 30 augusti 2012, 16:10:37
av sodjan
> sodjan har med const i sin version.

Har med och har med... :-)
Det "råkade" vara med i min cut-n-paste... :-)
Det fanns ingen större tanke bakom det.
Men "const" eller inte har ju inte direkt med "strängar" att göra
som sådana, det är i princip samma betydelse oavsett datatyp.

Re: Sträng i C

Postat: 30 augusti 2012, 16:11:16
av Icecap
Om det är en fast text bör man deklarera den som const:

const char sVarabel[]="TEXT SOM SKRIVS";

EDIT: Hå hå, ja ja... andra var snabbare.

Re: Sträng i C

Postat: 30 augusti 2012, 16:54:08
av 4kTRB
Läste först rubriken som "Sträng iC" :)

Re: Sträng i C

Postat: 30 augusti 2012, 17:28:32
av SeniorLemuren
Odur skrev:char sVarabel[]="TEXT SOM SKRIVS";
Ok jag testade detta först (trodde jag) av allt innan jag frågade, eftersom det var nästan Pascal. Då funkade det inte. Nu funkar det, så förmodligen var jag trött och felstaven hade slunkit in.
Hur som helst så tackar jag för den bra förklaringen jag fick om pekare. Något som jag inte hade brytt mig om att fatta tidigare. :)