Вывод текста в консоль Linux

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Вывод текста в консоль Linux

Сообщение alik1 » 27.09.2007 15:18:44

Возникла проблемка в .so на Linux-е. После инициализации crt, гробится консольный вывод (т.е. например хостаппликация, текст нормально уже не может вывести, строчки не начинаются с начала строки). Никто не сталкивался? как лечить?
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Deepthroat » 28.09.2007 00:52:50

По-моему, там в документации написано, что такое возможно и обычно бывает. Выход - не использовать crt, а поискать ему замену.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Сообщение alik1 » 28.09.2007 13:46:54

а чем пользоватся? нашел nCrt, но он не компилируется ...
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Deepthroat » 28.09.2007 20:18:26

Лично я для Delphi и FPC для винды свое писал. Но там все на WinApi, так что никакой кроссплатформенности.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Re: Вывод текста в консоль Linux

Сообщение Сквозняк » 01.10.2007 11:18:23

alik1 писал(а): строчки не начинаются с начала строки

Перед первым выводом текста использовать Writeln('');
Сквозняк
энтузиаст
 
Сообщения: 1126
Зарегистрирован: 29.06.2006 22:08:32

Сообщение trifon » 05.10.2007 22:43:15

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, в фпс такой возможности как я понял не предусмотрено, когда я попробовал самостоятельно задать, фпс прилинковал их обе - тупизм полный.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение HomeCraft » 14.01.2008 21:27:32

Ну у меня тоже проблема с консолью. При выводе русских букв (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;

Может у кого-нибудь есть другие соображения?
HomeCraft
новенький
 
Сообщения: 25
Зарегистрирован: 14.01.2008 20:42:46
Откуда: Магнитогорск

Сообщение Alexander » 14.01.2008 23:52:45

Код: Выделить всё
begin
WriteLn('Слово !');
end.


Работает без проблем, а в чём проблема то я не понял, как
воспроизвести ?

Может у тебя консоль не UTF8, а ты на неё в утф8 выводишь ?
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение HomeCraft » 15.01.2008 19:12:18

Ну правильно - так оно по-любому нормально. Показываю программу:
Код: Выделить всё
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 позиции текста!
Как с этим бороться?
HomeCraft
новенький
 
Сообщения: 25
Зарегистрирован: 14.01.2008 20:42:46
Откуда: Магнитогорск

Сообщение Alexander » 16.01.2008 15:28:40

Да, есть такое дело, похоже на баг ФПК (CRT ни при чём).

При твоём коде всё как у тебя, а при модификации так (исходник в 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 15:43:33, всего редактировалось 1 раз.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Alexander » 16.01.2008 15:38:40

Хотя нет, CRT меняет картину. При uses crt, происходит неправильный
перенос, а без - нет. Но размер строки всё равно неправильный.

(хотя при ключе -FcUTF8, uses crt не влияет никак)
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение HomeCraft » 18.01.2008 20:43:24

Так надо сообщить куда надо :arrow:!
HomeCraft
новенький
 
Сообщения: 25
Зарегистрирован: 14.01.2008 20:42:46
Откуда: Магнитогорск


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 3

Рейтинг@Mail.ru