Вывод текста в консоль Linux
Модератор: Модераторы
Вывод текста в консоль Linux
Возникла проблемка в .so на Linux-е. После инициализации crt, гробится консольный вывод (т.е. например хостаппликация, текст нормально уже не может вывести, строчки не начинаются с начала строки). Никто не сталкивался? как лечить?
- Deepthroat
- постоялец
- Сообщения: 144
- Зарегистрирован: 06.09.2007 00:21:34
- Откуда: Outer Heaven
- Контактная информация:
- Deepthroat
- постоялец
- Сообщения: 144
- Зарегистрирован: 06.09.2007 00:21:34
- Откуда: Outer Heaven
- Контактная информация:
alik1 писал(а): строчки не начинаются с начала строки
Перед первым выводом текста использовать Writeln('');
alik1 писал(а):а чем пользоваться? нашел nCrt, но он не компилируется ...
Что значит он не компилируется, он в стандартном комплекте fpc идет, заходим в fpc_source/packages/extra/ncurses, и там смотрим.
Все демо имеющиеся там у меня собирались, и прекрасно работали, ни каких различий с сишными, есть демо из родного ncurses переписаное на fpc.
Читаем в юните ocrt.pp - "Purpose - crt unit replacement plus OOP windows using ncurses", по моему то что нужно.
Там же демо для него - ocrt_demo.pp.
К сожалению поддержка ncurses не полная, в частности нет form, а главное ни каких упоминаний о юникоде. В СИ ncurses для использования юникоде линкуется с ncursesw, вместо ncurses, в фпс такой возможности как я понял не предусмотрено, когда я попробовал самостоятельно задать, фпс прилинковал их обе - тупизм полный.
Ну у меня тоже проблема с консолью. При выводе русских букв (UTF-8) консоль сокращается в два раза от этого смещаются все выводы через gotoXY. Например вывод предложения из 45 букв в консоль размером 100х35 приводит к переносу на новую строку.
Нашел выход пока такой:
Может у кого-нибудь есть другие соображения?
Нашел выход пока такой:
Код: Выделить всё
function writestr(const s:string):integer;
var i:integer;
begin
for i:=1 to length(s) do write(s[i]);
writestr:=i;
end;
Может у кого-нибудь есть другие соображения?
- Alexander
- энтузиаст
- Сообщения: 875
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
Код: Выделить всё
begin
WriteLn('Слово !');
end.Работает без проблем, а в чём проблема то я не понял, как
воспроизвести ?
Может у тебя консоль не UTF8, а ты на неё в утф8 выводишь ?
Ну правильно - так оно по-любому нормально. Показываю программу:
и вот что она выводит:
Получается что под русские буквы выделяется по 2 позиции текста!
Как с этим бороться?
Код: Выделить всё
program textdemo;
uses crt;
function writestr(const s:string):integer;
var i:integer;
begin
for i:=1 to length(s) do write(s[i]);
writestr:=i;
end;
const s:string='Это слишком длинная сторка для того чтобы уместиться в консольном окне любого размера!';
var i:integer;
begin
writeln('Стандартный вывод:');
writeln(s);
writeln('Мой вывод');
i:=writestr(s+#10#13);
writeln('Размер строки: ',i);
readln;
end.
и вот что она выводит:
Код: Выделить всё
Стандартный вывод:
Это слишком длинная сторка для того чтобы уместиться в консольном о
кне любого размера!
Мой вывод
Это слишком длинная сторка для того чтобы уместиться в консольном окне любого размера!
Размер строки: 161
Получается что под русские буквы выделяется по 2 позиции текста!
Как с этим бороться?
- Alexander
- энтузиаст
- Сообщения: 875
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
Да, есть такое дело, похоже на баг ФПК (CRT ни при чём).
При твоём коде всё как у тебя, а при модификации так (исходник в UTF8):
При твоём коде всё как у тебя, а при модификации так (исходник в UTF8):
Код: Выделить всё
program t;
function writestr(const s:utf8string):integer;
var i:integer;
begin
for i:=1 to length(s) do write(s[i]);
writestr:=i;
end;
const s:utf8string='Это слишком длинная сторка для того чтобы уместиться в консольном окне любого размера!';
var i:integer;
begin
writeln('Стандартный вывод:');
writeln(s);
writeln('Мой вывод');
i:=writestr(s+#10#13);
writeln('Размер строки: ',i);
readln;
end.Код: Выделить всё
fpc -FcUTF8 t.pasКод: Выделить всё
./tКод: Выделить всё
??????????? ?????:
??? ??????? ??????? ?????? ??? ???? ????? ?????????? ? ?????????? ???? ?????? ???????!
??? ?????
??? ??????? ??????? ?????? ??? ???? ????? ?????????? ? ?????????? ???? ?????? ???????!
?????? ??????: 88
Последний раз редактировалось Alexander 16.01.2008 14:43:33, всего редактировалось 1 раз.
