Val av microprocessor, RGB LED styrning
Re: Val av microprocessor, RGB LED styrning
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.
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
Hmm, ok, det hade jag missat helt.
Håller dock med om att din metod nog är snabbast.
Håller dock med om att din metod nog är snabbast.
Re: Val av microprocessor, RGB LED styrning
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å?
man kan ju testa detta:
Kod: Markera allt
for (char i=0; i<(sizeof ord); i++) {
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Testade med:
Och fick samma resultat..
Kod: Markera allt
for (uint8_t i = 0; i < (sizeof(ord)); i++) {
Re: Val av microprocessor, RGB LED styrning
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): utskriften
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);
}
Kod: Markera allt
test is 5 bytes
Word is 4 bytes
Re: Val av microprocessor, RGB LED styrning
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)
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
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)
dragon: testa jesses metod att loopa tills tecken = 0 eller att köra strlen(ord) istället för sizeof(ord)
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Denna?:
Kod:
void print(const uint8_t * string) {
uint8_t tecken;
while(1) {
tecken = pgm_read_byte(string++);
if (tecken == 0) break;
putChar(tecken);
}
}
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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
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
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.
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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..
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
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()
}
}
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Jag kom fram till att din kod borde vara mer komplicerad än vad som krävs.
Borde inte detta fungera:
Dock så fungerar det inte...
Borde inte detta fungera:
Kod: Markera allt
uint8_t antaltecken = 0;
while(1) {
if(ord[antaltecken] == 0) break;
antaltecken++;
}
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Yay!
Jag löste det.
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.
Jag löste det.
Kod: Markera allt
uint8_t antaltecken = 0;
while(1) {
if(pgm_read_byte(&ord[antaltecken]) == 0) {break;}
antaltecken++;
}