C-kods problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, men.. Vad menar du?
Ska jag skriva små snuttar med PROGMEM anvädning som ni testar?
Eller vad är detr du menar?

Jo, det är inte en fast 7x5 matris utan variable bredd.

//Emil
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Nej, jag menade att du ska skriva lite mindre kod som bara testar att läsningen från Flash-minnet fungerar. Sen när du känner dig säker på det kan du fortsätta och lägga in det i ditt riktiga program. Det var bara ett tips för att öka din förståelse för vad du håller på med. :)
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Aha, nu är vi på samma sida. :)

//Emil
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Icecap skrev:På mig verkar det som att du vill göra den mest ineffektiva och långsamma kod som möjligt men det kanske är för att"Jag förstår inte heller riktigt din kod".
Påpeka gärna vad du menar så ska jag försöka fixa det!
För jag är inte 100% när det kommer till programmering och då blir det inte den mest perfekta koden på engång och dåfår ni gärna säga till så jag kan effektivisera min kod.

//Emil
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du kopierar i ett kör, du gör en massa switch() och när allt detta är klart gör du själva jobbet.

Effektivt i hastighet:
1: Indexera.
2: Läs mängden av data
3: Skriv in dessa data till skärmen.

Varför kopiera så mycket?
Varför en massa switch()?

Visst, tabellen kommer att fylla lite men det du kan spara i tabell kommer du att kasta bort ett antal gånger om med alla memcpy(), switch() osv.

Hade du kört med fast storlek på tecknen hade du sparat 256 bytes bara på tabellen.

Det sätt jag anger är kanske inte det snabbaste men bra nära, det är enkelt och överskådligt, enkelt att ändra men det kräver att man skriva HELA jävla tabellen in innan man börjar.

Själv kopierade jag tomma rader i ett helvetes kör och sedan fyllde jag i de olika bitpatterns allt eftersom.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Har fixat det.
Har nu så switchen bara ger ett värder som är teckenets platts i minnet.

//Emil
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Vet du hur en 'switch()' fungerar ens??

Kod: Markera allt

switch(Någonting)
  {
  case 0:
  break;
  case 1:
  break;
  case 2:
  break;
  case 3:
  break;
  case 4:
  break;
  default:
  }

motsvaras i effekt av:
if(Någonting == 0)
  { // case 0:
  }
else if(Någonting == 1)
  { // case 1:
  }
else if(Någonting == 2)
  { // case 2:
  }
else if(Någonting == 3)
  { // case 3:
  }
else if(Någonting == 4)
  { // case 4:
  }
else
  { // default:
  }
Så ska du case'a till t.ex. 245 blir det en jävla massa 'if(xx == yy)' som ska genomlöpas.

Jag tror att du sparar programminne vid att ha tabellen som jag beskrev den, ska det vara riktigt snålt ska du hålla alla tecken till en 5*7-matris (vilket samtidig gör det enkelt att rada upp text), varje switch-case kostar ju en laddning av en pekare vilket i sin tur ger minst 5 bytes EXTRA per tecken, data-innehållet i teckentabellen ska ju LIKAVÄL anges.

Ditt case'ande gör alltså att programmet kör än långsammare och fyller än mer än det borde göra. Vill du snåla på platsen kan du beskära bottnen och toppen av tabellen och ta med det i indexeringen.

Kod: Markera allt

if((ch >= LOWEST_CHAR) && (ch <= HIGHEST_CHAR)) .... (indexera i tabellen med 'ch - LOWEST_CHAR')
else ..... (peka på tom plats)
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Jag vet inte om du såg det men det vart en switch därför att tecknena INTE ligger på rad i ASCII tabellen.
Jag har bara de tecken jag behöver och då vart det tuvärr så att det vart en switch.

Och, ja jag vet hur en switch fungerar och jag vet hur if-then-else fungerar.

//Emil
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du behöver alltså teckenkoder från 32 (0x20) till 127 (0x7f) eller liknande.

Gör då en tabell över dessa koder, med fast längd behöver du bara 5 bytes per tecken, med variabel kan du faktisk nöja dig med 5 bytes per tecken också om du använder MSB'n som stoppkod.

Sedan gör du en
if((ch >= ' ') && (ch <= sizeof(Tabell / 5)) p = Tabell[0][ch - ' '];
else p = Inget_Tecken;

Klart.

Edit: Glömde en sak: fattas det ett par tecken "i mitten" av tabellen är det bara att fylla "finns ej" i dom, de extra utrymme sparar du in på kod och effektivitet.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, nu ser ja hur du tänker!
Ska skriva om koden så. Tackar! :D

//Emil
Skriv svar