Започнах експериментален редактор на код, използвайки ncurses. Използвам двойно свързан списък за съхраняване/разбор/отпечатване на текста. Въпреки че съм далеч в изпълнението, не съм решил съвсем дали използването на двойно свързан списък е най-добрата идея или не (за разлика от използването на масиви).
Имайте предвид, че когато имам предвид масиви, имам предвид масив от знаци на ред - не един линеен масив.
Ето как претеглих плюсовете и минусите:
Двойно свързани списъци:
- По-бързо вмъкване на знаци и редове
- По-бързо сгъване на кода
Масиви:
- Използвайте по-малко памет
- Много по-бърз анализ
- По-бързо печатане Имах ли право да използвам свързани списъци? Или те са по-добър начин да направите това?
Забележка:
Масивите се отпечатват по-бързо, защото трябва да има само едно извикване на printw
, което отпечатва цял ред. За разлика от извикването на printw
за символ.
printw
само веднъж на ред - вместо да го извиквате за всеки символ (в lllist). Освен това масивите също могат да променят размера си и не е необходимо да имат подобни размери. Не съм съвсем сигурен какво имаш предвид с това. - person tay10r   schedule 19.06.2013printw()
веднъж на ред, както при масивите. Освен това драстично ще намалите изискването за съхранение; на 64-битова машина, двойно свързан списък от единични знаци вероятно ще използва 24 байта на знак, което е доста голямо натоварване. - person Jonathan Leffler   schedule 19.06.2013nano
използва). Вероятно ще изтрия този въпрос, защото мисля, че това е моето решение, с което ще работя. Също така, лоша идея ли е да използватеrealloc
при всяко вмъкване/премахване? - person tay10r   schedule 19.06.2013struct Line { struct Line *next; struct Line *prev; char *line; size_t line_len; size_t line_max; };
, катоline_len
записва текущата дължина на реда, аline_max
записва разпределеното пространство. Не бих извикалrealloc()
, когато знак беше изтрит; Вероятно не бих го направил, освен ако няма някакво доста голямо (256 байта?) несъответствие между действителния и максималния размер. [...продължение...] - person Jonathan Leffler   schedule 19.06.2013line_len == line_max
, но внимавайте да не е по-едно) и бих разпределил на стъпки от най-малко 16 знака (тъй като това вероятно е минималното количество, коетоmalloc()
et al действително разпределят така или иначе, плюс когато потребителят вмъква един знак, той често вмъква няколко). Така че, вие искате да избегнете промени за всеки символ в разпределението на паметта (извиквания къмrealloc()
), без да се страхувате да преразпределите, когато е необходимо. - person Jonathan Leffler   schedule 19.06.201316
байта наведнъж - person tay10r   schedule 19.06.2013