OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 23 Апрель, 2024 11:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 11:59 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Если в Delphi некоторая функция принимает один аргумент типа PChar и возвращает такого же типа, то как определить тип PChar для КП?

function foo (arg: PChar): PChar;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 12:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Роман, а давайте Вы будете каждый раз чётко пояснять, что Вам надо:

1) В программе на КП сделать аналог

или

2) Определить ТАКОЙ тип (для взаимодействий с Дельфой и т.п.)

(По поводу (2) лучше, видимо, в Системные вопросы)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 12:06 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Продолжаю работать над модулем интерфейса библиотеки Cairo.
Поэтому, необходим тип для работы с такого типа строками.

Я и так достаточно чётко определил. Не знаю по каким критериям решать в какой форум писать. Чем этот раздел плох для такого вопроса?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 12:10 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Тем, что средства сопряжения с другими языками, SYSTEM... и проч. не являются частью Компонентного Паскаля, а только аппендиксом.

За темой по библиотеке, извините, не слежу, не помню..

Если нужно описать точно PChar, то это POINTER TO ARRAY [untagged] OF SHORTCHAR.
Если я не ошибаюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 12:26 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
POINTER TO ARRAY [untagged] OF SHORTCHAR будет достаточно.

MODULE ...

IMPORT SYSTEM;

TYPE
T: POINTER TO ARRAY [untagged] OF SHORTCHAR;

PROCEDURE foo (arg: T): T;

Хотя, в принципе, можно PChar и из модуля Windows притянуть (см. определения функций winapi, использующих pchar), тогда можно и без SYSTEM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 12:42 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
А как присваивать строку? С := не позволяет, если так описать тип.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 12:45 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Роман М. писал(а):
А как присваивать строку? С := не позволяет, если так описать тип.
dst$ := src$; ? dst^$ := src^$; ? мозгой поехать можно! "у нас - всё под контролем!" :)
Или - всё таки - ЫНЫЕУЬ - будем привлекать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 14:04 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Добавив [untagged], компилятор "проглотил" строку в присваивании.
Однако, насколько я понимаю, обероновские строки остаются несовместимыми с сишными, поэтому последние необходимо конвертировать в родной формат.

Обратить внимание на копирование строки Ver в Ver2.
Код:
MODULE TestCairoVer;

IMPORT
   Api := CairoApi, L := StdLog;

PROCEDURE Do*;
(* CrTSString* =  POINTER TO ARRAY [untagged] OF SHORTCHAR;
   PROCEDURE [ccall] cairo_version_string* (): CrTSString;
 *)
VAR Ver: Api.CrTSString; Ver2: ARRAY 200 OF CHAR;
BEGIN
   Ver := Api.cairo_version_string();
   Ver2 := Ver$;
   L.String (Ver2); L.Ln
END Do;

END TestCairoVer.

Неужели и вправду, конечный вариант? :shock:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 14:55 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
"Обероновские строки" совместимы с сишными. Начиная с адреса первого символа лежат символы до нулевого.

Несовместимы массивы, как места хранения этих строк. Почему и untagged.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:18 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Илья Ермаков писал(а):
Начиная с адреса первого символа лежат символы до нулевого.
Ничё не понял.
Может - с начального( нулевого ) до терминального?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:33 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Созерцатель писал(а):
Может - с начального( нулевого ) до терминального?
Всё правильно. Первый символ находится на нулевой позиции.

А тут непонятно. Запускаю демку:
Код:
MODULE TestCairoTextDemo;

IMPORT Api := CairoApi, L := StdLog;

PROCEDURE RunDemo*;
VAR
    surface: Api.Pcairo_surface_t;
    cr: Api.Pcairo_t;
   status: Api.cairo_status_t;
BEGIN
    surface := Api.cairo_image_surface_create(Api.CAIRO_FORMAT_ARGB32, 390, 60);
    cr := Api.cairo_create(surface);

    Api.cairo_set_source_rgb(cr, 0, 0, 0);
    Api.cairo_select_font_face(cr, 'Sans', Api.CAIRO_FONT_SLANT_NORMAL,
      Api.CAIRO_FONT_WEIGHT_NORMAL);
    Api.cairo_set_font_size(cr, 40.0);

    Api.cairo_move_to(cr, 10.0, 50.0);
    Api.cairo_show_text(cr, "Cairo text demo.");

    status := Api.cairo_surface_write_to_png(surface, 'image.png');
   L.Int(status); L.Ln;

    Api.cairo_destroy(cr);
    Api.cairo_surface_destroy(surface)
END RunDemo;

END TestCairoTextDemo.

В созданном изображении выводится только первая буква "С" ?!

Лписание тиров в модуле интерфейса Cairo:
Код:
TYPE
   CrTString* =  POINTER TO ARRAY [untagged] OF CHAR;
   CrTSString* =  POINTER TO ARRAY [untagged] OF SHORTCHAR;

(*cairo_show_text (cairo_t *cr, const char *utf8);*)
PROCEDURE [ccall] cairo_show_text* (cr: Pcairo_t; utf8: CrTString);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:38 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
CrTString* = POINTER TO ARRAY [untagged] OF CHAR;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
UTF8 кодирует латинские буквы одним байтом (а, например, русские двумя байтами).

ARRAY OF CHAR -- это строка двухбайтовых букв, это не UTF8.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:45 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Теперь я понял. utf8 должен задаваться как CrTSString. Тогда я плохо понимал что такое UTF-8. Я думал, что символ - это двойной байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:46 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Сергей Губанов писал(а):
UTF8 кодирует латинские буквы одним байтом (а, например, русские двумя байтами).
ARRAY OF CHAR -- это строка двухбайтовых букв, это не UTF8.

То есть у вас символ занимает два байта и второй байт == 0. А процедура (которая имеет дело с однобайтовыми символами) воспринимает это как терминальный символ строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:48 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Роман М. писал(а):
Я думал, что символ - это двойной байт.
Не "двойной байт", а - "более, чем один байт". И - не известно, может статься, что в последнем байте символа будет 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
>> Теперь я понял. utf8 должен задаваться как CrTSString.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 15:53 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Сергей Губанов писал(а):
Не совсем. UTF8-строка должна задаваться как массив байтов так как размер символа в ней имеет переменную длину. В тех местах где нужны латинские буквы, в массиве должно быть выделено по одному байту, а в тех местах где другие буквы (например, русские), там в этом массиве должно быть отведено по два байта на букву.

Не пугайте человека. Просто отошлите его ск способу "растягивания" 16 разрядного символа Unicode по нескольким байтам utf8 - сразу станет понятна дисциплина получения нужного количества байт для кодирования исмвола в utf8. У меня просто таких ссылок под рукой нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Понедельник, 25 Январь, 2010 18:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Стандарт читать УТФ8... Он очень небольшой и ясный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тип PChar, строки, строки
СообщениеДобавлено: Воскресенье, 11 Апрель, 2010 14:21 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Для меня открылся один интересный момент при сборке библиотеки из модулей.

В моём случае из модуля на КП экспортируются разные переменные, среди них есть переменная типа ЗАПИСЬ с полем mes строкового типа, рассчитанная на чтение в FreePascal.
Код:
   TYPE
      ErrType* = RECORD
         error-: BOOLEAN;
         mes-: ARRAY 127 OF SHORTCHAR;
         location-: INTEGER
      END;
      Str = ARRAY 8 OF SHORTCHAR;
   VAR
      err*: ErrType;
      str: Str;
В случае, когда в программе на FP получаю переменную err, строка err.mes не отображается, потому что первые 3 символа забиты нулями, а начиная с 4-го начинается строка.
В случае чтения str строка имеет предполагаемое содержание, как и было задано в модуле на КП, и полностью отображается! Почему так?

Код:
MODULE TestExport;

IMPORT SYSTEM (*, Kernel *);

   TYPE
      TA = RECORD
         d,
         d2: REAL;
      END;

      TString = ARRAY [untagged] OF CHAR;
      Name = ARRAY 40 OF SHORTCHAR;
      
      ErrType* = RECORD
         error-: BOOLEAN;
         mes-: ARRAY 127 OF SHORTCHAR;
         location-: INTEGER
      END;
      Str = ARRAY 8 OF SHORTCHAR;
      
   VAR
      Int-: INTEGER;
      A-: POINTER TO TA;
      name*: Name;
      err*: ErrType;
      str: Str;
   
   PROCEDURE GetLinkerError* (OUT error: ErrType);
   BEGIN
      error := err
   END GetLinkerError;
   
   PROCEDURE GetStr* (OUT s: Str);
   BEGIN
      s := str
   END GetStr;

   PROCEDURE Do*;
   BEGIN
      (*NEW(A);
      A.d := 321.345;
      A.d2 := A.d*2.0;*)
      Int := 3*1024;
      err.error := TRUE; err.location := -100; err.mes := "!debug:";
      str := "!debug:";
   END Do;

END TestExport.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB