Sträng i C

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
SeniorLemuren
Inlägg: 8410
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Sträng i C

Inlägg 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?
Användarvisningsbild
Klas-Kenny
Inlägg: 11832
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Sträng i C

Inlägg 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å.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sträng i C

Inlägg 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().
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sträng i C

Inlägg 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...
Användarvisningsbild
SeniorLemuren
Inlägg: 8410
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Sträng i C

Inlägg av SeniorLemuren »

Äntligen :)
Användarvisningsbild
Odur
Inlägg: 267
Blev medlem: 11 september 2005, 14:36:49
Ort: Borås

Re: Sträng i C

Inlägg av Odur »

char sVarabel[]="TEXT SOM SKRIVS";
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sträng i C

Inlägg 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?
Användarvisningsbild
Odur
Inlägg: 267
Blev medlem: 11 september 2005, 14:36:49
Ort: Borås

Re: Sträng i C

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46936
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Sträng i C

Inlägg av TomasL »

Nä det är väl bara två olika sätt att skriva det, egentligen.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sträng i C

Inlägg av sodjan »

Jaha... :-)

OK, då är jag med, jag tänkte att det var så.
Lemuren får välja det som passar... :-)
Användarvisningsbild
AndLi
Inlägg: 18255
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Sträng i C

Inlägg 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..
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sträng i C

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26635
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Sträng i C

Inlägg 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.
Användarvisningsbild
4kTRB
Inlägg: 20687
Blev medlem: 16 augusti 2009, 19:04:48

Re: Sträng i C

Inlägg av 4kTRB »

Läste först rubriken som "Sträng iC" :)
Användarvisningsbild
SeniorLemuren
Inlägg: 8410
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Sträng i C

Inlägg 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. :)
Skriv svar