Sida 22 av 23
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 16:47:29
av jesse
och det kostar säkert en massa kod...
i min bok "Vägen till C" av U Bilting & J Skansholm står det på sidan 81:
sizeof-operatorn:
Man kan utnyttja sizeof-operatorn på fält. om rad är ett teckenfält ger t.ex. uttrycket sizeof rad antalet bytes, dvs antalet tecken i rad.
annars kan man ju göra som jag gjorde i min funktion: loopa igenom och stoppa vid nollan.
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 16:50:32
av Virror
Hmm, ok, det hade jag missat helt.
Håller dock med om att din metod nog är snabbast.
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 16:52:10
av jesse
det kanske har med prioritetsordningen på operatorerna (fast det tror jag inte är orsaken egentligen)...
man kan ju testa detta:
fast det kan ju ha att göra med att fältet skickas som argument i funktionsanropet. Vad som egentligen skickas är ju bara en pekare till första elementet i fältet - ett integer på 2 bytes.Så det är väl längden av pekaren som avläses av sizeof, inte strängen den pekar på. hur skulle man kunna få den att fatta att det är strängen man vill ha storleken på?
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 16:54:49
av dragon9226
Testade med:
Kod: Markera allt
for (uint8_t i = 0; i < (sizeof(ord)); i++) {
Och fick samma resultat..
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:06:53
av snigelen
Ja, eftersom sizeof(ord) är två, eftersom det är en en pekare (en adress) som är två bytes på avr.
T.ex ger följande på 32 bit Ubuntu (med 4 bytes pekare):
Kod: Markera allt
#include <stdio.h>
void print_size(char word[]) {
printf("Word is %d bytes\n", sizeof(word));
}
int main(void)
{
char test[] = "Test"; // Fyra tecken + avslutande \0 ger 5 totalt
printf("test is %d bytes\n", sizeof(test));
print_size(test);
}
utskriften
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:09:46
av jesse
japp. Du får helt enkelt köra med pekare... som i mitt exempel print() ovan.
eller, det behöver du ju inte heller om du inte vill , men byt if-satsen mot while(1) istället och ha en if-sats längre ner som kollar om tecknet är en nolla. (alla strängar slutar på "nolla" = ascii-kod noll)
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:11:45
av Virror
jesse, det var det jag menade när jag skrev min post.
dragon: testa jesses metod att loopa tills tecken = 0 eller att köra strlen(ord) istället för sizeof(ord)
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:12:32
av dragon9226
Denna?:
Kod:
void print(const uint8_t * string) {
uint8_t tecken;
while(1) {
tecken = pgm_read_byte(string++);
if (tecken == 0) break;
putChar(tecken);
}
}
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:13:30
av dragon9226
Räcker det med att byta sizeof mot strlen?
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:14:43
av jesse
jag tror strlen inte funkar i ditt fall.
jag antar väl att strlen(ord) är en funktion i C som letar efter nollan? I så fall blir det både dubbel kod och dubbelt jobb för processorn att använda den... förresten kommer den inte att funka ändå, eftersom strängen inte ligger i RAM utan i flashminnet - så den kommer att leta på fel ställe och det blir tokfel

Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:19:56
av snigelen
Det finns en strlen_P() för strängar i FLASH,
http://www.nongnu.org/avr-libc/user-manual/index.html. Men i det här fallet är det väl bättre att leta efter nollan själv.
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 17:34:48
av dragon9226
Jag försöker använda Jesses kod, och placera den först i slideLine så att längden kan ges direkt till for-satsen.
Men jag förstår mig inte riktigt på hur den fungerar och vad de olika variablerna är till för..
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 18:08:16
av jesse
Kod: Markera allt
void print(const uint8_t * string) {
// argumentet är en sträng i flash t.ex print(HelloWorld);
// *string är en pekare som pekar på första tecknet i fältet.
uint8_t tecken; // en variabel som kan lagra ett tecken tillfälligt
while(1) { // en loop
tecken = pgm_read_byte(string++); // du läser ett tecken från flash-minnet och pekaren string pekar på nästa tecken med ++ operatorn.
if (tecken == 0) break; // om tecknet är nolla ska loopen avslutas = slut på texten
putChar(tecken); // annars skrivs tecknet ut med funktionen putChar()
}
}
Jag har gjort en egen funktion som heter putChar(); och som kan skriva ut ett tecken till t.ex. en display eller till en PC. I ditt fall får du väl byta ut
putChar(tecken); mot
aslide(tecken);
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 20:14:05
av dragon9226
Jag kom fram till att din kod borde vara mer komplicerad än vad som krävs.
Borde inte detta fungera:
Kod: Markera allt
uint8_t antaltecken = 0;
while(1) {
if(ord[antaltecken] == 0) break;
antaltecken++;
}
Dock så fungerar det inte...
Re: Val av microprocessor, RGB LED styrning
Postat: 3 mars 2011, 20:36:35
av dragon9226
Yay!
Jag löste det.
Kod: Markera allt
uint8_t antaltecken = 0;
while(1) {
if(pgm_read_byte(&ord[antaltecken]) == 0) {break;}
antaltecken++;
}
Det måste vara för att arrayen ord[] som skickas bara är en pekare, och inte arrayen. Vilket gör att man inte kan läsa som vanligt utan måste läsa den från programminnet.