Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Меню в С++ 3.1  (Прочитано 58504 раз)
0 Пользователей и 1 Гость смотрят эту тему.
elja_1989
Гость
« : 19-02-2008 17:36 » 

Народ, помогите с поиском инфы или с моим просвещением...
Задали курсач(1 курс), суть написать текстовый редактор, с реализацией системной части запаров особо нет, а вот с графикой и созданием меню я просто == 0

Скажите как сделать меню и панель со свитками.. Например File | Edit | BlaBla | BlaBla1 |
В инете на русском не нашёл ничего, может и плохо искал, но старался Ага
« Последнее редактирование: 19-02-2008 17:47 от elja_1989 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 19-02-2008 19:02 » 

elja_1989, На чем хоть пишем? Тема была перенесена с Unix C++. Если действительно в среде Linux. То можно ли использывать стороние библиотеки? Если да, то легче всего взять Qt и его использовать. Описание работы на английском можно найти на сайте разработчиков http://doc.trolltech.com/.
« Последнее редактирование: 19-02-2008 19:10 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sands
Помогающий

ua
Offline Offline

« Ответ #2 : 19-02-2008 20:06 » 

А если под ДОС,тогда прямой вывод в видеопамять очень даже рулит. Мы в свое время полностью скопировали вид редактора Turbo C со всеми его менюхами ))
Записан
elja_1989
Гость
« Ответ #3 : 20-02-2008 13:50 » 

Пишу на Borland C++ & Application Frameworks 3.1 под DOS..
Кста именно что-то похожее на Си с менюшками мне бы и хотелось, т.е. сверху панель с file edit ..., а снизу рабочая область... Писать надо именно в этой среде и под DOS.
« Последнее редактирование: 20-02-2008 13:53 от elja_1989 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 20-02-2008 13:56 » 

Насколько мне не изменяет память, у Борланда всегда в хелпе куча примеров была - практических. В тч и меню для текстового режима.

зы Кстати, оболочка графическая или текстовая?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sands
Помогающий

ua
Offline Offline

« Ответ #5 : 20-02-2008 14:08 » 

elja_1989
Ну тогда все очень просто.
Для етого нужны:
1) Желание поковыряться
2) Знание про работу напрямую с видеобуфером в тестовом режиме(по идее если поискать по форуму, то тема такая уже была)
3) Вспомогательная программа которая выведет по коду ASCII его символьное представление(пригодится когда будеш рамочки рисовать и все такое)
4) Хорошо продуманное взаиможействие с клавиатурой и мышью(если таковая предусматривается)
5) Много считать для того чтобы "подделка" не отличалась от "оригинала" в плане интерфейса ))

Основное тут первые 2 пункта. Как только возникнут вопросы по поводу 2 - пиши, бум разбираться ))

Джон, думаю если аналог Turbo С++ то все-таки текстовая
Записан
elja_1989
Гость
« Ответ #6 : 20-02-2008 16:26 » 

А кстати насчет графического и текстового режимов, что лучше выбирать для текстового редактора, просто я хочу под конец работы попытаться подключить мышь.. Её можно реализовать и там и там?

Ещё просьба, если можете скиньте сюда хоть какой пример кода выезжающего меню, типа жму че нить(например alt+f) и выезжает менюшка-свиток (без анимации конечно Улыбаюсь ), а в ней разные строки типа File Save As.. ну и т.д.
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #7 : 20-02-2008 16:26 » 

вообще там есть в библиотеках  TurboVision =) копируете оттуда функции один в один - и вуаля =)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 20-02-2008 17:24 » 

вообще там есть в библиотеках  TurboVision =) копируете оттуда функции один в один - и вуаля =)
В подавляющем большинстве вузов на 1-м курсе у студентов проблемы с ООП и, соответственно, использованием таких объектных библиотек, "дружелюбность" которых ниже, чем у Delphi. Это в моё время студенты младших курсов TV изучали просто ради интереса, вне программы. Теперь мне такие любознательные студенты попадаются исключительно редко Жаль.

elja_1989, в рамках какого курса выдано задание? Нужно использовать структурное или объектно-ориентированное программирование? Каково знание языка C (или C++)?
« Последнее редактирование: 20-02-2008 17:26 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #9 : 20-02-2008 17:57 » 

Я писал какой курс вначале(1 курс)
В рамках структурного
Borland C++ 3.1 можно юзать..
Учу язык 1 семестр, но успехи неплохие... Учусь быстро, трудолюбив и мне нравится  Улыбаюсь !

Я с графикой некогда не работал, ну не счетая моего хобби - 3dsmax, zbrush, vegas, photoshop и т.д., но к программухе это уж никак в данный момент прицепить нельзя!
В объектном я бы наверное бы не парился над меню(моё предположение), а вот в досовской сишке... Просто понятия не имею, как к этому подойти... Ну вот за сегодня за вчера дорубил как с графикой работать хоть немного, с тексовым режимом хоть чуток разобрался, но не рублю как в разбираться в вещах аля 0xb800. И нехочется просто тупо сдирать откуда-то код, ахочется разобраться, дорубить и уже делать с пониманием.

возникает вся таже просьба про меню...
« Последнее редактирование: 20-02-2008 18:10 от elja_1989 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 20-02-2008 18:07 » 

elja_1989, Ты чуть чуть не правильно понял Улыбаюсь. dimka, имел ввиду, какой именно предмет изучения, заставляет тебя писать такую программу.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
elja_1989
Гость
« Ответ #11 : 20-02-2008 18:12 » 

elja_1989, Ты чуть чуть не правильно понял Улыбаюсь. dimka, имел ввиду, какой именно предмет изучения, заставляет тебя писать такую программу.
В рамках курса ОАиЯП.. Основы алгоритмизации и языки программирования, простыми сломами - программирование Улыбаюсь
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 20-02-2008 19:58 » 

elja_1989, понятно. (Специальность, случаем, не 230105?)

Цитата: elja_1989
В объектном я бы наверное бы не парился над меню(моё предположение), а вот в досовской сишке...
По секрету скажу, что эта "досовская сишка..." тоже объектно-ориентированная Улыбаюсь Это значит, что под "объектным" ты понимаешь что-то не то.

Задача с меню простая, и читать там особо нечего. Нужно лишь думать "в правильную сторону".

1) В начале важно понимать такую тебе неведомую штуку, как поток управления. Сколько я понимаю, ты планируешь 2 режима работы: основные действия программы; работа с меню. Переключение в режим меню происходит по нажатию кнопки (например, F10), выход из меню по нажатию другой кнопки (например, Esc). При обычном подходе к структурному программированию эти режимы не могут работать одновременно, поскольку меню является вызываемой функцией - пока эта функция не завершит работу, нельзя будет вернуться к исходной функции. Добавление мыши потребует обязательного использования специфической "событийной" архитектуры, которая позволит создать видимость одновременной работы как меню, так и других функций программы. Если интересно, можем её разобрать. Если нет - тогда забудь про мышь. В конце ты её не приделаешь, если не заложишь правильный фундамент с самого начала.

2) Отделить функцию отрисовки текущего состояния меню (какой пункт меню выделен) от функции управления меню (как передвигать выделение между пунктами меню в случае нажатия соответствующих кнопок). Функция управления вызывает функцию отрисовки после изменения состояния меню.

3) Поскольку обе функции требуют информации о пунктах меню, то потребуется разработать структуру данных, которая описывают пункты меню, и может быть передана в каждую из функций..

4) Чтобы модуль обеспечения работы меню был удобно настраиваемым, полезно познакомиться с такой штукой, как указатели на функции, и научиться ими пользоваться.

P.S. Тему в "Начинающим".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #13 : 20-02-2008 20:07 » 

Если мне не изменяет память, то у С++ должны быть функции типа writebyte/readbyte в которых указывается, адрес в/из которого надо звписать/прочитать данные. Подробнее посмотри в справке Borland C++ 3.1
0хb000 ето адрес начала видеопамяти в текстовом режиме. На каждый символ екрана отводится 2 байта данных: байт самго символа и байт атрибутов(таких как цвет символа, цвет фона и мерцание).
Для того чтобы семулировать интерфейс Turbo C++ достаточно выставить первой строке атрибут фона в "белый", а строкам 2-80 поставить атрибут фона "синий". Изменять ети данные придется крайне редко, кроме тех случаев, когда некоторый участок будет перекрываться меню, и подсветки выделения текста (если она будет реализована)
Записан
elja_1989
Гость
« Ответ #14 : 20-02-2008 21:05 » 

Мммм... Ну в общем я более менее начал дорубать, указатели на функции я знаю неплохо... Вроде всё потдается логике.. Теперь возникают новые вопросы:
1) Если переключение в меню организовать через ALT+*! То напримериспользуя  switch, что писать в case? али 'ALT+F' он поймет, что-то подсказывает что нет)
2) Доступ к меню(к активной области скажем File) Осужествляется тупо по координатам? И "выделение на самом деле делается циклом, просто меняя цвет?
3) Как сделать скролирование текста(по нажатию стрелок) и переместить отображение, как бы под панель с File Edit Search

                File  Edit  Search                   (1;80)
                                                     
с координаты(2;161 до 2;238 идёт текст) Как его в рамки загнать?

4) Ещё, как я понял экран имеет всего 1 индекс из значений 25*80?   
5) Как передвигать с помщью индекса курсос мигающий, показывающий, где вводить текст...
« Последнее редактирование: 20-02-2008 21:08 от elja_1989 » Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #15 : 20-02-2008 21:28 » 

1) Нет такое ему будет сделать трудновато, можно отслеживать нажатие на "F" И в етот момент проверять нажата ли клавиша "Alt" - делается ето с помощью считывания статусного байта по адресу 0:0419
2) В случае с использованием мышки правильно, однако не стоит забывать про перемещене по меню с помощью стрелок "вправо" "влево", для етого удобней хранить индекс активного пункта меню(имхо). Опять же если реализовывать возможность перехода между меню когда один из пунктов, то стоит так же знать открыт етот пункт или нет.
3) А каким образом ты собираешся хранить весь набраный текст? И что обозначают индексы 2;161 2;238?
4) В видеопямяти - да, он линейный, но на более высшем уровне он имеет 25 строк по 80 символов, а потому для удобства работы лучше все же использовать координаты X(позиция в строчке 0..79) Y(номер строки 0..24)
5) По моему есть такая функция gotoxy(x,y) которая перемещает курсор в нужную позицию на екране (или за егопределами:-) ). Подробнее смотри Help.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 21-02-2008 12:36 » 

Ну вы, блин, даёте.

Во-первых, адрес B000 для монохромного режима, для цветного B800.

Во-вторых, зачем эти адреса и вручную писать прямой вывод в видеопамять, когда можно использовать имеющиеся в данной среде функции conio.h, где есть позиционирование курсора (gotoxy), управление цветами (textcolor, backgroundcolor), работа с окнами (включая их скроллирование)? Все эти функции как раз обеспечивают прямой вывод в видеопамять (по умолчанию), либо используют BIOS - переключение осуществляется значением специальной глобальной переменной (если память не изменяет, она называется directVideo или как-то так).

В-третьих, зачем статусный байт по адресу 0419 (и чтение 60-го порта)? Скорее, нужно уметь обрабатывать ASCII-коды нажатых клавиш (включая расширенные коды)? Не все сочетания клавишь можно будет охватить, но это и не главное в данной задаче.

В-четвёртых, структура видеопамяти текстового режима представляет собой 2-хбайтовое слово на позицию. 1-й байт описвает ASCII-код отображаемого символа, 2-й байт содержит цветовые атрибуты. Хотя, может и в другом порядке - точно не помню. Цветовые атрибуты описываются как: BGGGHCCC. C - биты цвета символа (8 цветов), H - бит яркости цвета символов (расширение до 16 цветов), G - биты цвета фона (8 цветов), B - (в зависимости от настроек) бит мерцания символов (8 цветов сохраняется) /яркости цвета фона (расширение до 16 цветов).

Цитата: elja_1989
Если переключение в меню организовать через ALT+*! То напримериспользуя  switch, что писать в case? али 'ALT+F' он поймет, что-то подсказывает что нет)
Нет, не поймёт. Нужно обрабатывать расширенный код данного сочетания клавиш. Коды можешь определить методом тыка - написать простую программку, которая читает все введённые символы и выводит на экран их коды (номера в таблице ASCII).

Главное даже не это, главное: где писать этот switch. В каком месте программы.

Цитата: elja_1989
Как его в рамки загнать?
Рамки рисуются символами псевдографики. Смотри кодовую таблицу 866 расширения ASCII.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 22-02-2008 14:00 » 

Я тут буду выкладывать различные решения, но на другом языке, чтобы показать идею, а не написать готовый для курсовика код.

Получение ASCII-кодов нажимаемых клавиш:
Код: (Text) Quick Basic
KeyCode% = 0
' Пока не нажата <Esc>
WHILE KeyCode% <> 27
        KeyCodes$ = INKEY$
       
        IF LEN(KeyCodes$) > 0 THEN
                KeyCode% = ASC(LEFT$(KeyCodes$, 1))
                IF KeyCode% = 0 THEN
                        ' Расширенный ASCII-код клавиши
                        KeyCode% = ASC(MID$(KeyCodes$, 2, 1))
                        PRINT 0, KeyCode%
                ELSE
                        ' Обычный ASCII-код клавиши
                        PRINT KeyCode%
                END IF
        END IF
WEND
END
В частности, столь желаемый <Alt>+<I> таким способом поймать можно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 22-02-2008 16:09 » 

Ну и собственно меню (только вертикальное, но с рамкой) для приложения с полноэкранными (не оконными) функциями может выглядеть примерно так:

Код: (Text) Quick Basic
DECLARE FUNCTION GetKeyCode% ()
DECLARE SUB Menu ()
DECLARE SUB Main ()
DECLARE SUB DrawMain ()
DECLARE SUB NewOperation ()
DECLARE SUB OpenOperation ()
DECLARE SUB SaveOperation ()
DECLARE SUB PrintOperation ()
DECLARE SUB ExitOperation ()
DECLARE SUB Stub (Name$)
DECLARE FUNCTION VerticalMenu% (X%, Y%, ItemNames$())
DECLARE SUB DrawVerticalMenu (StartX%, StartY%, ItemNames$(), CurrentItem%)

OPTION BASE 1
CALL Main
END

FUNCTION GetKeyCode%
        DO
                Keys$ = INKEY$
        LOOP UNTIL LEN(Keys$) <> 0
        KeyCode% = ASC(LEFT$(Keys$, 1))
        IF KeyCode% = 0 THEN
                GetKeyCode% = 255 * ASC(MID$(Keys$, 2, 1))
        ELSE
                GetKeyCode% = KeyCode%
        END IF
END FUNCTION

SUB Main
        DO
                CALL DrawMain
                SELECT CASE GetKeyCode%
                CASE 27
                        EXIT SUB
                CASE 17340
                        CALL Menu
                END SELECT
        LOOP
END SUB

SUB DrawMain
        CLS
        COLOR 7, 0
        LOCATE 12, 38
        PRINT "MAIN"
        LOCATE 25, 1
        PRINT "ESC=Exit  F10=Menu";
END SUB

SUB Menu
        DIM ItemNames$(5)
        ItemNames$(1) = "New"
        ItemNames$(2) = "Open"
        ItemNames$(3) = "Save"
        ItemNames$(4) = "Print"
        ItemNames$(5) = "Exit"
        SELECT CASE VerticalMenu%(10, 5, ItemNames$())
        CASE 1
                CALL NewOperation
        CASE 2
                CALL OpenOperation
        CASE 3
                CALL SaveOperation
        CASE 4
                CALL PrintOperation
        CASE 5
                CALL ExitOperation
        END SELECT
END SUB

FUNCTION VerticalMenu% (X%, Y%, ItemNames$())
        CurrentItem% = LBOUND(ItemNames$)
        DO
                CALL DrawVerticalMenu(X%, Y%, ItemNames$(), CurrentItem%)
                SELECT CASE GetKeyCode%
                CASE 13
                        VerticalMenu% = CurrentItem%
                        EXIT FUNCTION
                CASE 27
                        VerticalMenu% = -1
                        EXIT FUNCTION
                CASE 18360
                        IF CurrentItem% > LBOUND(ItemNames$) THEN
                                CurrentItem% = CurrentItem% - 1
                        END IF
                CASE 20400
                        IF CurrentItem% < UBOUND(ItemNames$) THEN
                                CurrentItem% = CurrentItem% + 1
                        END IF
                END SELECT
        LOOP
END FUNCTION

SUB DrawVerticalMenu (StartX%, StartY%, ItemNames$(), CurrentItem%)
        MaxLengthOfName% = 0
        FOR I% = LBOUND(ItemNames$) TO UBOUND(ItemNames$)
                LengthOfName% = LEN(ItemNames$(I%))
                IF MaxLengthOfName% < LengthOfName% THEN
                        MaxLengthOfName% = LengthOfName%
                END IF
        NEXT I%
        Y% = StartY%
        COLOR 15, 0
        LOCATE Y%, StartX%
        PRINT CHR$(218);
        FOR X% = StartX% + 1 TO StartX% + MaxLengthOfName% + 2
                LOCATE Y%, X%
                PRINT CHR$(196);
        NEXT X%
        LOCATE Y%, StartX% + MaxLengthOfName% + 3
        PRINT CHR$(191);      
        FOR I% = LBOUND(ItemNames$) TO UBOUND(ItemNames$)
                Y% = Y% + 1
                LOCATE Y%, StartX%
                PRINT CHR$(179);
                IF I% = CurrentItem% THEN
                        COLOR 0, 3
                ELSE
                        COLOR 0, 7
                END IF
                LOCATE Y%, StartX% + 1
                PRINT " ";
                LOCATE Y%, StartX% + 2
                PRINT ItemNames$(I%);
                LengthOfName% = LEN(ItemNames$(I%))
                FOR J% = LengthOfName% TO MaxLengthOfName% + 1
                        X% = StartX% + J% + 2
                        LOCATE Y%, X%
                        PRINT " ";
                NEXT J%
                COLOR 15, 0
                LOCATE Y%, StartX% + MaxLengthOfName% + 3
                PRINT CHR$(179);
        NEXT I%
        Y% = Y% + 1
        LOCATE Y%, StartX%
        PRINT CHR$(192);
        FOR X% = StartX% + 1 TO StartX% + MaxLengthOfName% + 2
                LOCATE Y%, X%
                PRINT CHR$(196);
        NEXT X%
        LOCATE Y%, StartX% + MaxLengthOfName% + 3
        PRINT CHR$(217);
        COLOR 7, 0
        LOCATE 25, 1
        PRINT "ESC=Cancel  ENTER=Execute  ARROW UP,ARROW DOWN=Select";
END SUB

SUB ExitOperation
        CALL Stub("EXIT")
END SUB

SUB NewOperation
        CALL Stub("NEW")
END SUB

SUB OpenOperation
        CALL Stub("OPEN")
END SUB

SUB PrintOperation
        CALL Stub("PRINT")
END SUB

SUB SaveOperation
        CALL Stub("SAVE")
END SUB

SUB Stub (Name$)
        COLOR 7, 0
        CLS
        LOCATE 12, 40 - LEN(Name$) / 2
        PRINT Name$;
        LOCATE 25, 1
        PRINT "Press any key";
        DO
        LOOP UNTIL INKEY$ <> ""
END SUB

Тут ещё надо много чего доводить до кондиции, например, обрабатывать нештатные ситуации, когда меню не помещается на экране и т.д.
« Последнее редактирование: 22-02-2008 20:36 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #19 : 22-02-2008 18:15 » 

dimka, Нащет памяти - каюсь не то написал, относительно Альта - согласен, что предложил не самое оптимальное решение( я просто не пробовал через ASCII делать, а когда появилась надобность обрабатывать Альт, то как раз еще свежими были зхнания про нужные адреса в памяти, да и код готовый был, потому его и использовал)

А меню и все остальное рисовал напрямую... К счастью или к сожалению - трудно сказать...
Записан
elja_1989
Гость
« Ответ #20 : 22-02-2008 21:30 » 

Мммм.. С меню вроде уже разберусь, а вот как организовать редактирование и выделение текста.. Каждую строку на которой каретка в данных момент, да или каждую хранить в отдельном буфере для строки?
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #21 : 22-02-2008 22:09 » 

elja_1989,  хм... Вот представь себе что ты работал(а) С Word-ом. Какие там возможности для редактирования текста существуют? Ты сначала опиши чего тебе хочется, и как ты ето видиш, а потом жди помощи и конструктивной критики...
Записан
elja_1989
Гость
« Ответ #22 : 23-02-2008 22:39 » 

Код: (C)
//#include <graphics.h>
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>

void del(char**,int,int,int);

void main()
{clrscr();
 int i,j,k,x=1,y=1;
 char **ms;
 int n=25;
 ms=(char**)calloc(n,sizeof(char*));
 for(i=0;i<n;i++)
 { *(ms+i)=(char*)calloc(80,sizeof(char));
   *(ms+i)="kd adasdddddddddddddddddddd adada a dadadasd kldskl sklslk sdklsdlk ssdfsklsdf";
   puts(*(ms+i));
 }

 gotoxy(1,1);

 while(1)
 {
    switch(getch())
  {
    case 72:
              y--;
              if(y<1) y=1;
              gotoxy(x,y);
              break;

    case 80:
              y++;
              if(y>25) y=1;
              gotoxy(x,y);
              break;

    case 77:
              x++;
              if(x>80) {x=1;y++;}
              gotoxy(x,y);
              break;

    case 75:
              x--;
              if(x<1) {x=80; if(!(y<=1)) y--;}
              gotoxy(x,y);
              break;


    case 8:
               del(ms,x,y,n);
               break;


  }
 }
}


void del(char **ms,int x,int y,int n)
{
 for(i=x-1;i<80;i++)
   *(*(ms+y-1)+i-1)=*(*(ms+y-1)+i);

 clrscr();

 for(i=0;i<n;i++)
   cputs(*(ms+i));

 gotoxy(--x,y);

}

Ну вот что-то тока что набросал тестовое, впадлу уже сегодня править что-то! Что-то тут работает, 1 строка кое как, но не суть.. мне то про подход спросить хотелось, учтите тока что всякие мелочевые ошибки я не отрабатывал(аля сдвиги куда не надо, перенос с другой строки..) Да и не в состояние провить, праздник всё таки был)) Жду критики короче.. правильный подход беру или нет.. Кстати упорно дрочился над выводом новым.. Какова-то не хотел работать принтф, работал тока цпринтф..
« Последнее редактирование: 06-08-2008 16:34 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 24-02-2008 07:24 » 

Обработка расширенных кодов неправильная. В таком виде кнопки движения курсора совпадают с буквами латинского алфавита.

Цитата: elja_1989
Какова-то не хотел работать принтф, работал тока цпринтф..
При подключении conio.h нужно использовать cprintf. Стандартные потоки ввода/вывода заменяются на прямую работу с видеопамятью.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #24 : 24-02-2008 07:33 » 

Ммм.. Так я и подозревал.. А как сделать, через порты(0х417) получается? Или есть ещё АЦКИЙ КОД этих..
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 24-02-2008 09:23 » 

elja_1989, зачем тебе порты? Пример более правильной обработки расширенных кодов см. выше.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #26 : 24-02-2008 11:07 » 

elja_1989, Если тебе на вход будет приходить расширенный код, то он будет состоять как бы из 2 "символов", первый из которых 0, а второй -  какое-то значение.(именно ето написано в том примере кода от dimka) Соответственно для корректрой обработки расширенных кодов надо проверять значение считанного символа на 0.
Записан
elja_1989
Гость
« Ответ #27 : 24-02-2008 12:50 » 

То что у него там мне неочем не говорит, я никогда раньше не программил, я занимался 3д графикой..
Не могли бы вы показать как это сделать..
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 24-02-2008 13:45 » 

Цитата: elja_1989
То что у него там мне неочем не говорит, я никогда раньше не программил, я занимался 3д графикой..
Ну и что? Программист понимает почти любой (за исключением всяких извращений типа BrainFuck) алгоритмический язык программирования - даже незнакомый, так как все они основаны на едином принципе. Посмотри внимательно на код Quick Basic и подумай.

Цитата: elja_1989
Не могли бы вы показать как это сделать..
Там это и показано - там приведён рабочий код. Кроме того, уже на словах даны пояснения основного принципа.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 24-02-2008 14:11 » 

elja_1989, придется учить - готовую программу писать за тебя никто не будет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
elja_1989
Гость
« Ответ #30 : 26-02-2008 17:06 » 

C меню разобрался.. запаров нет) спс! Теперь вопрос другой! Как лучше представить текст вводимый/выводимы на экран? Массив строк? 1 большая строка ? Список?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 26-02-2008 17:44 » 

Большая строка и массив имеют известные недостатки, связанные с операциями вставки/удаления в середине.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #32 : 26-02-2008 18:52 » 

с быстродействием что ли? Вроде в голове продумал и просто,тока медленно..

А если делать через список(никогда не делал ещё, тока начал изучать, то надо на каждый символ что ли отдельную структуру имеющую символ, и адрес следующей что ли, ну ещё и ряд функций для работы с ним? Кстати А в списке чего такого понтового? Только то что адреса перенапрявлять проще?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #33 : 26-02-2008 19:18 » 

Под каждый символ липить структуру, ну Вы братец изврашенец. Символ имеет длину 1 байт, если брать однобайтовую кодировку. Плюс 8 байт на два указателя, Один вверх списка, второй вниз списка. Итого получается 9 байт на 1 символ. Делают как правило блоками. например абзац. Тогда получается как бы меньший объем занимаемой памяти. Второй момент, содержимое блока относительно мало, поэтому им быстрее манипулировать.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 27-02-2008 07:11 » 

Finch, ну почему сразу такой уж извращенец? Улыбаюсь Если мне не изменяет память, небезызвестный товарищ Гамма сотоварищи в своей книжке про образцы проектирования как раз занимался созданием расчудесного текстового редактора с кучей возможностей по безболезненному расширению. И первым делом ввёл древовидную структуру сущностей "глиф", чтобы поддерживать форматирование (включая потенциал его расширения и усложнения) и ряд других любопытных возможностей. Правда, там были зачатки мощного текстового процессора, с набором шрифтов, возможностью вставки картинок, проверки орфографии, ну и так далее. Не сказать, чтобы они скрывали, что это более затратно - но находили такой метод более универсальным, чтобы не пришлось потом перепроектировать в случае, если понадобится, скажем, усложнить форматирование Улыбаюсь

P.S. Разумеется, в обсуждаемой задаче все эти навороты могут быть и не нужны Улыбаюсь Вообще, некоторые считают vi вполне удобным текстовым редактором - в принципе, когда запоминаешь базовые команды, работать с ним и правда не так сложно Улыбаюсь
« Последнее редактирование: 27-02-2008 07:23 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 27-02-2008 11:42 » 

Цитата: Вад
Если мне не изменяет память, небезызвестный товарищ Гамма сотоварищи в своей книжке про образцы проектирования как раз занимался созданием расчудесного текстового редактора с кучей возможностей по безболезненному расширению. И первым делом ввёл древовидную структуру сущностей "глиф", чтобы поддерживать форматирование (включая потенциал его расширения и усложнения) и ряд других любопытных возможностей.
К сожалению, расчудесная банда четырёх с известным текстовым редактором на 1-м курсе слишком сложны и непонятны, а ООП в этой курсовой не применяется Жаль. Так что, увы, студенту эта книжка пока пользы не принесёт, а раз она бесполезна, то остаётся лишь не навредить Улыбаюсь.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #36 : 27-02-2008 11:55 » 

Вад, Насколько я помню, как-то Джон на форуме расказывал байку. Как один чудак выделил под число в пределах от 0 до 1024 ровно 1024 байта. Да расширяемость просто наименоверная. Можно хранить числа  аж до 2^8096-1. Если уж так нужно, то есть паттерн проектирования Приспособленец http://www.citforum.ru/SE/project/pattern/#3.1.8, который эту задачу решает также легко с меньшим расходом ресурсов.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 27-02-2008 12:27 » 

Finch, dimka, согласен Улыбаюсь Но нельзя же полёт мысли человеку ограничивать просто потому, что он затеял что-то сложное Улыбаюсь Просто нужно помочь ему задуматься над тем, адекватны ли те или иные решения сложности предложенной задачи. Отклонение от упомянутого Finch-ем правила ещё не является извращением. В каких-то случаях такое решение будет удобнее. Нужно лишь, чтобы elja_1989 сумел понять, когда такое решение - наилучшее, а когда можно и попроще чего сделать Улыбаюсь
А то напугаете, будет всю жизнь варианты поэкономнее выгадывать, считая более сложное извращением Улыбаюсь
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #38 : 27-02-2008 14:50 » 

Вад, согласен. Но тогда лучше излагать решение своими словами и, главное, в терминах структурного программирования, а не ООП.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #39 : 15-03-2008 22:31 » 

Народ, с меню поконченно, впринципе оочень давно)) всё было намного проще чем системная часть, но вот теперь возникает вопрос насчет памяти..
Как выделить более 64 кб памяти, если конечно стоит это делать, просто ведь так проще))) Если уж никак тогда как правильно алгоритмизировать работу с файлами подкачи(буфер.. короче не знаю как правильно назвать) Стоит ли создавать 2 буфера(верхний и нижний) или можно обойтись 1 фалом таким, и как записывать на тоже место в файл изменённую строчку превышающую по размерам не измененную(fwrite) как перемещатся по строчкам файла не используя fgets(я думаю это не оптимально..наверное). Короче идеи у меня были такие:
1) Хранить данные идущие вверх в верхнем буфере, а идущие вниз в нижнем..
Всё принципе с верхним вышло, а вот с нижним нет)) Там надо подписывать данные в буфер не с конца а с начала, а как это оптимальнее сделать я не догадался..
2) ВЫделить на мое окно в котором 46 строчек, ровно 46 пустых строк.. и при каждом ствиге записывать всё в 1 буфер, а потом читать из него новые переписывая их на эти 46..
3) Забить на мою посимвольную премотку текста и сделать постраничную, это решит пару проблем... Но я очень не хочу..

Что вы мне посоветуете..
« Последнее редактирование: 15-03-2008 22:57 от elja_1989 » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 16-03-2008 13:44 » 

Цитата: elja_1989
Как выделить более 64 кб памяти
Проще всего в куче. Можно и для статического размещения, но нужно будет сменить модель памяти со small на что-нибудь более основательное и использовать far-указатели.

Но под DOS я бы не советовал полагаться на память. Всегда можно получить такой файл, который в память не влезет.

Можно работать со временным файлом и держать окно текста в 32 Кб с возможностью расширения до 64 Кб. Окно - часть файла, находящаяся в памяти, в которой находится курсор (точка ввода/редактирования).

Как только юзер ввёл много текста, окно сбрасывается на диск в таком порядке: создаётся новый временный файл, часть старого временного файла до начала окна копируется в новый, затем вставляется окно, затем оставшаяся часть старого временного файла. После чего старый временный файл удаляется, окно очищается и в него загружается порция данных в 32 Кб вокруг курсора. Ну, обработать случаи начала и конца файла. То же самое, если пользователь удалил много текста или переместил курсор намного вперёд или назад. В случае "листания" файла новые временные файлы создавать, естественно, не нужно - просто обновлять окно, двигаясь по файлу вниз или вверх.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #41 : 17-03-2008 14:31 » 

А если я ограничусь 300-ми байтами на 1 строчку? То как сделать оптимальнее?

моя структурка выглядит примерно так(если конечно это что-то решает), огранизация - очередь.
struct TeXt
{ char txt[300];
  struct TeXt *next;
  struct TeXt *prev;
}
 
Записан
elja_1989
Гость
« Ответ #42 : 17-03-2008 19:14 » 

Во сделал тока что.. при каждом сдвиге всё делается как написал Дмитрий.. Запись изменений, перепись в темповик и вновь четение из него на строку ниже/выше.. Но при больших файлах начинает тормозить, потому что переписывать надо слишком много.. Как сделать оптимальнее этот вариант? Использовать вместо 1 окна.. как бы в 2 раза большее.. и делать опирации переписии-четения в 2 раза реже? Или вообще сделать n-окон на сколько памяти хватит? как оптимальнее?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #43 : 17-03-2008 19:37 » 

Именно потому я и говорил про окно в 32-64 Кб, что при таком окне дисковые операции достаточно редки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #44 : 23-03-2008 18:05 » 

Народ помогите я в тупике... Не могу дописать уже 4 день 1 мелочь... Где ошибка? Что не так делаю?
Объясню принцип.. Когда переменная для скролирования становится крастно 46(полное окно), то текст должен переписаться в темповик, а потом счетаться из него в соответствие с тем куда движется текст.. Вниз всё ок, а вверх не могу дописать.. Не понимаю какие цифры нужны для этих смещений...

Вот код этого момента
Код:
if(c=='u')
 while(++t!=yy+win/2)
  {if(t<(yy-(win*3)/2))    fgets(byf,str_size,tmp);
   else if(t>(yy-(win*3)/2)) { fgets(byf,str_size,tmp);
     strcpy(p1->txt,byf);
     p1=p1->next; }
  }
else if(c=='d')
 while(++t!=(yy+win))
  {if(t<yy)  fgets(byf,str_size,tmp);
   else if(t>yy)     {  fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next; }
 }


fclose(tmp);

t=0;
if(c=='d')
 p3=*text;
else if(c=='u')
 { p3=*text;
  while(++t!=(win/2))
   p3=p3->next;
 }

Вот тестовая версия части проги..
В качестве проверки юзал файлик с цифрами от 1 до 999

Код:
#include <dos.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>

#define str_size 300
#define win 92
/////////////////////////////////STRUCT////////////////////////
struct Text
{char txt[str_size];
 struct Text *next;
 struct Text *prev;
};
//////////////////////////////////////INSERT////////////////////////////////
void insert( Text **golova, char *ms, Text **hvost)
{Text *n;
 if(!(n=(Text*)calloc(1,sizeof(Text))))
    return;
 else strcpy(n->txt,ms);
 if(!*golova)
  *golova=*hvost=n;
 else
{ n->prev=*hvost;
  (*hvost)->next=n;
  *hvost=n; }
}
//////////////////////////////////////OPEN////////////////////////
void open(Text **start)
{
FILE *txt,*rec;
rec=fopen("temp.tmp","w");
Text *hvost=NULL;
char ms[str_size+1];
int i=0;
if( (txt=fopen("123.txt","r"))==NULL)
     { printf("ЌҐў®§¬®¦­® ®вЄалвм д ©«!!!");
       delay(1500);
       exit(1);
     }
    else
    {    while(1)
   {if(!feof(txt))
     {fgets(ms,str_size,txt);
   if(!feof(txt))  fputs(ms,rec);
      if(i++<=win) insert(start,ms,&hvost);
     }
    else if(feof(txt)&&i<win)
     {fputs("",rec);
      if(i++<=win) insert(start,"",&hvost);
     }
    else break;
   }fclose(txt);
    fclose(rec);

    }

}


///////////////////////////PROTOTIPS/////////////////////
int print(Text **,int,int,char);
void to_menu(void);
void refresh(void);

//void add(TXT *text,int x,int y);
//void to_text(void);
//void open
//void save
//void copy
//void paste
//void cut




//////////////////////////////////////////MAIN//////////////
void main()
{
 textmode(64);
 Text *text=NULL,*hvost;
 int x=1,y=1,i; //Є®®а¤Ё­ вл ¤«п ЇҐаҐ¬ҐйҐ­Ёп Ї® ®Є­г । ЄвЁа®ў ­Ёп
 int handle=0;


remove("recopy.tmp");
remove("temp.tmp");
if (_dos_creatnew("temp.tmp", _A_HIDDEN, &handle) != 0)
  {
    perror("Unable to create");
 exit(1);
  }
if (_dos_creatnew("recopy.tmp", _A_HIDDEN, &handle) != 0)
  {
    perror("Unable to create");
 exit(1);
  }
_dos_close(handle);





open(&text);
textbackground(BLUE);
clrscr();



//ᮧ¤ ­ЁҐ ўЁ¤ 
window(1,1,80,1);
textbackground(LIGHTGRAY);
for(i=0;i<80;i++) cputs(" ");
textcolor(BLACK);
cputs(" File  Edit  Search  About ");
window(1,1,80,50);
gotoxy(1,2);
textcolor(YELLOW);
textbackground(BLUE);
 cputs("ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                             є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"є                                                                              є"
"ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");
 cprintf(" F10 - enter menu                                               Esc - exit menu");

 window(3,3,78,47);
 print(&text,1,1,'0');
 gotoxy(1,1);


//®Є­® ᮧ¤ ­­®

char sim;  //ўў®¤Ё¬л© бЁ¬ў®«

int ps_x=1,ps_y=1; //ЇбҐў¤® y Ё е
long int scr_x=1,scr_y=1;
//y=44;
while(1)

{
 switch(sim=getch())
  {
    case 0: switch(sim=getch())
     {
       case 68:
to_menu();
break;

       case 72: if(ps_y==1)
{ ps_y=1;
   y--;
   if(y<=0) y=1;

   if(scr_y>1)
    {scr_y--;
     if(scr_y<=0) scr_y=1;
     print(&text,scr_x,scr_y,'u');
    }
  }
else {ps_y--;
      y--;
     }
gotoxy(ps_x,ps_y);
break;

       case 80: if(ps_y==46)
{ ps_y=46;
   y++;
   if(ps_y==46&&y!=46)
    {scr_y++;
     print(&text,scr_x,scr_y,'d');
    }
}
else
{ps_y++;
y++;
}
       gotoxy(ps_x,ps_y);
break;


       case 77: if(ps_x==76)
{ ps_x=76;
   x++;
   if(ps_x==76&&x!=76)
    {scr_x++;
    print(&text,scr_x,scr_y,'0');
    }
}
else
{ps_x++;
x++;
}
       gotoxy(ps_x,ps_y);
break;

       case 75: if(ps_x==1)
{ ps_x=1;
   x--;
   if(x<=0) x=1;

   if(scr_x>1)
    {scr_x--;
     if(scr_x<=0) scr_x=1;
    print(&text,scr_x,scr_y,'0');
    }
  }
else {ps_x--;
      x--;
     }
gotoxy(ps_x,ps_y);
break;


     }

    default: break;//add(text,x,y);

  }

}






getch();
}


void to_menu(void)
{

int i,j,k;
window(1,1,80,50);

_setcursortype(_NOCURSOR);

char *ms[4]={" File "," Edit "," Search "," About "};

gotoxy(1,1);
textcolor(BLACK);
textbackground(GREEN);
cprintf(" File ");

i=0;


while(1)
{
 switch(getch())
  {
    case 77 : if(i==3) i=3;
     else {
   i++;
   textbackground(LIGHTGRAY);
   textcolor(BLACK);
   gotoxy(1,1);
   cputs(" File  Edit  Search  About ");

   textcolor(BLACK);
   textbackground(GREEN);
   if(i==0) gotoxy(1,1);
   if(i==1) gotoxy(7,1);
   if(i==2) gotoxy(13,1);
   if(i==3) gotoxy(21,1);

   cputs(*(ms+i));
  }


     break;

   case 75 : if(i==0) i=0;
     else {
   i--;
   textbackground(LIGHTGRAY);
   textcolor(BLACK);
   gotoxy(1,1);
   cputs(" File  Edit  Search  About ");

   textcolor(BLACK);
   textbackground(GREEN);
   if(i==0) gotoxy(1,1);
   if(i==1) gotoxy(7,1);
   if(i==2) gotoxy(13,1);
   if(i==3) gotoxy(21,1);

   cputs(*(ms+i));
  }


     break;
  }
 }
}


int print(Text **text,int x,int yy,char c)
{window(1,1,80,50);
 gotoxy(1,2);
 textcolor(YELLOW);
 textbackground(BLUE);
 cprintf("ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "є                                                                              є"
 "ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");


 window(3,3,78,50);
 gotoxy(1,1);
 cprintf("%d", yy);
static int flg=0;

textcolor(WHITE);
textbackground(BLUE);
int t=0;
Text *p1=*text,*p2;
static Text *p3=*text;

if(c=='0')
 { p1=p3;
  t=0;
  while(p1->next&&(t++)!=46)
  {gotoxy(1,t);
   cprintf("%.76s",p1->txt+x-1);
   p1=p1->next;
  } return 0;
 }


FILE *tmp,*rec;
if(yy%(win/2+1)==0)
{char *byf;
byf=(char*)calloc(str_size+1,sizeof(char));

if(flg==0) { tmp=fopen("temp.tmp","r+");       //error places not view
     rec=fopen("recopy.tmp","w");
     flg=1;
   }
else       { rec=fopen("temp.tmp","w");       //error places not view
     tmp=fopen("recopy.tmp","r+");
     flg=0;
    }

t=0;

while(++t<(yy+win/2)) //+-1   perepis verha i okna i smeshenie po tmp k nizy
 {
 if(t<(yy-(win/2)-1))  { fgets(byf,str_size,tmp);
       fputs(byf,rec); }
 if(t>(yy-(win/2)-1)) { fputs(p1->txt,rec);
       p1=p1->next;
       fgets(byf,str_size,tmp); }
 }
t=0;
while(!feof(tmp))                    //Perepis konca
 {   fgets(byf,str_size,tmp);
   if(!feof(tmp))
     fputs(byf,rec);
 }
fclose(tmp);
fclose(rec);

if(flg==0)  tmp=fopen("recopy.tmp","r");
else        tmp=fopen("temp.tmp","r");
p1=*text;
if(c=='u')
 while(++t!=yy+win/2)
  {if(t<(yy-(win*3)/2))    fgets(byf,str_size,tmp);
   else if(t>(yy-(win*3)/2)) { fgets(byf,str_size,tmp);
     strcpy(p1->txt,byf);
     p1=p1->next; }
  }
else if(c=='d')
 while(++t!=(yy+win))
  {if(t<yy)  fgets(byf,str_size,tmp);
   else if(t>yy)     {  fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next; }
 }


fclose(tmp);

t=0;
if(c=='d')
 p3=*text;
else if(c=='u')
 { p3=*text;
  while(++t!=(win/2))
   p3=p3->next;
 }

}

if(p3->next&&c=='d')
 {p3=p3->next;
  p1=p3;}
else if(p3->prev&&c=='u')
 {p3=p3->prev;
  p1=p3;}
t=0;
while(p1->next&&(t++)!=46)
 {gotoxy(1,t);
  cprintf("%.76s",p1->txt+x-1);
  p1=p1->next;
 }
return 0;
}

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #45 : 23-03-2008 18:55 » 

1) для начала: когда копируешь в пост, делай так: включи русскую раскладку, затем скопируй в буфер текст программы, только потом вставь в пост. Так русские буквы не испортятся

2)
момент
Код:
 cputs("ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»"
"є                                                                              є"
"є                                                                              є"
....
....
"є                                                                              є"
"ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");


очень сильно пугает... Ну, я не имею в виду испорченные буквы, а сам подход. Я бы написал что то вроде
Код:
const char pch1="ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»\r\n";
const char pch2="є                                                                              є\r\n";
int i;

cputs(pch1);
for(i=0;i<46;i++)cputs(pch2);
cputs(pch1);

3) форматирование

даже фрагмент в первом блоке кода в твоём посте - нечитабельный...
а вот в таком виде, я уверен, даже радует глаз
Код:
if(c=='u')
{
while(++t!=yy+win/2)
{
if(t<(yy-(win*3)/2))
{
fgets(byf,str_size,tmp);
}
else if(t>(yy-(win*3)/2))
{
fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next;
}
}
}
else
if(c=='d')
{
while(++t!=(yy+win))
{
if(t<yy)
{
fgets(byf,str_size,tmp);
}
else if(t>yy)
{
fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next;
}
}
}


fclose(tmp);

t=0;
if(c=='d')
{
p3=*text;
}
else
if(c=='u')
{
p3=*text;
while(++t!=(win/2))
{
p3=p3->next;
}
}

----------------
вот, как бы к чему я всё это ? А никто не будет разбираться в чужом коде, когда это сделать так сложно, а на дворе - уже почти на работу надо идти, а потом - понедельник Улыбаюсь
Записан

elja_1989
Гость
« Ответ #46 : 23-03-2008 19:52 » 

А что разве быстрее будет делать циклом?

Ну ребят я просто уже в тупике, прошу помогите!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 24-03-2008 03:55 » 

elja_1989, в цикле, конечно, будет не быстрее, но ты этого никогда в таких масштабах не заметишь ) Зато удобно. Я бы ещё и длину строки в цикл загнал, но это уже как хочешь
-----------
насчёт помочь - я уже написал, что надо для этого сделать - люди ведь на работе сидят, им некогда в каше разбираться , серьёзно
Записан

Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines