C-kods problem
Påpeka gärna vad du menar så ska jag försöka fixa det!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".
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
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.
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.
Vet du hur en 'switch()' fungerar ens??
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
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:
}
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)
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.
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.