Gå til innhold

Forslag til "buffer"-struktur til en text editor


Anbefalte innlegg

Hei.

 

Driver å leker meg litt med tanken å lage en text editor basert på curses/ncurses-biblioteket. Kanskje ingen orginal idé, men jeg synes det er morsomt å ha små sideprosjekter i tillegg til alle obliger som må gjøres på skolen. Å bruke curses er jo ikke akkurat noe "hokus pokus", men å finne den riktige datastrukteren som holder teksten i minnet synes jeg er litt mer spennende å tenke over.

 

Det første jeg egentlig tenkte på var å bruke dobbeltlenkede lister som inneholder bokstaver, og én dobbeltlenket liste som representerer linjene. Altså ut fra en linjenode er det en liste med bokstaver. Fordelen med denne strukturen (tenkte jeg) er at man slipper mye(?) overhead når man skriver inn nye bokstaver (f.eks. midt i en setning), og at det ikke er noen begrensing på hvor lang en linje kan være. Ulempen med strukturen er at det er vanskeligere å manipulere strengene, og hver bokstav/node tar mye plass.

 

En annen fremgangsmåte jeg har tenkt på er å la hver linje være en char-array av en fast størrelse (f.eks. 256-512 bytes). Fordelen her er enkel kordinasjon i forhold til cursoren på skjermen, mulighet til å bruke funksjoner fra standardbiblioteket (string.h), og muligens i de fleste tilfeller tar bufferet mindre plass avhengig av implementasjonen. Ulempene er som sagt mye unødvendig flyttinger internt i arrayene, og fast lengde på linjene.

 

Da har jeg "gulpet" opp mine tanker rundt problemstillingen og håper at andre kan komme med innspill på hva de mener. F.eks. hvis noen vet hvordan andre editorer behandler dette syns jeg også det er spennende å høre om.

Lenke til kommentar
Videoannonse
Annonse

Hei og velkommen til forumet.

 

Bruker du C eller C++?

Hvis du bruker C++ hvorfor vil du ikke bruke std::string?

 

Ellers så virker tanken om å representere linjen med en dobbeltlenkede lister som veldig overkill, jeg ser ikke helt fordelen med dette i det lange løp. Jeg tror nok char arrayen virker som den beste løsningen.

Lenke til kommentar

Ja, det var akkurat det jeg tenkte, altså at lenkede lister blir litt i overkant. Så vil nok gå for en array løsning, men tenker fortsatt på dette med mye flytting av verdier internt i arrayene.

 

Når det gjelder programmeringsspråk så er det C det går i, så har ikke så mye ferdiglagde "duppedingser" jeg kan bruke (så vidt jeg vet ihvertfall).

 

Kom gjerne med flere innspill :)

Lenke til kommentar

Jeg synes det virker ganske logisk å tenke på all teksten på skjermen som én enkelt bytestream, siden det er jo det en tekstfil faktisk er.

 

\n i strengen er jo et signal om at det oppstår en ny linje, så du kunne kanskje ha brukt en rå streng der teksten ligger, med hjelpefunksjoner som lar deg enkelt holde rede på hvor e.g.

linje 5, tegn 10 befinner seg i bytestreamen. Forøvrig et ganske interessant prosjekt :) Du bør for all del bruke dynamisk allokert minne.

 

Hvis det er av noen betydning nevner GNU coding standards at man aldri bør sette slike statiske, og kunstige begrensinger på datastrukturer, med mindre det er umulig at størrelsen kan overskride den størrelsen. Tror de fleste programmerere vil være enig med det rådet. :)

 

For å unngå at du må flytte rundt på masse data i bytestreamen når du skal legge til tegn midt i, kan det kanskje være en idé å ha en kopi av tekstfila i minnet slik at du kan skrive rått over teksten i hovedstrengen, for deretter å kopiere over all teksten på en gang ved et senere tidspunkt. Sparer litt overhead der i hvertfall, men kan kanskje være litt klumsete å implementere godt, og idéen er kanskje heller ikke så god :D

Lenke til kommentar

Interessante innspill TheMaister! Når det gjelder dette med å putte tekst mellom annen tekst syns jeg det høres veldig fornuftig ut å legge den nye teksten i et midlertidig buffer, for så å kopiere dette på plassen sin når man f.eks. endrer posisjon på cursoren. Tror faktisk jeg diskuterte dette med en venn tidligere i dag, men vi kom ikke fram til noe veldig konkret siden det bare var en tanke som fløy forbi i farta :roll:

 

Når det gjelder streams må jeg nok sette meg ned å lese litt, så kan ikke uttale meg der. Har ikke kjempe lang erfaring med C (inf1060 fra UiO, og har for tiden inf3190), så driver egentlig med dette prosjektet for å trene meg selv. Men det at minnestrukturen er begrenset av en størrelse er selfølgelig ingen god praksis, så er enig der. Kunne forsåvidt implementert en array-list elns... eller kanskje ikke :p

Lenke til kommentar

Jeg tror jeg ville satsa på en dobbelt-lenka liste og en memory pool. Særlig en memory pool vil sikkert være både morsomt og lærerikt hvis du ikke kjenner til det eller har implementert det før. Tror også det skal være en relativt bra løsning med tanke på minnebruk og hastighet uten at jeg har tenkt veldig nøye gjennom problemstillingen din. Forøvrig enig med TheMaister i at linjeskift bare er et tegn på lik linje med alle andre.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...