OberonCore
https://forum.oberoncore.ru/

Тип PChar, строки, строки
https://forum.oberoncore.ru/viewtopic.php?f=2&t=2269
Страница 1 из 2

Автор:  Роман М. [ Понедельник, 25 Январь, 2010 11:59 ]
Заголовок сообщения:  Тип PChar, строки, строки

Если в Delphi некоторая функция принимает один аргумент типа PChar и возвращает такого же типа, то как определить тип PChar для КП?

function foo (arg: PChar): PChar;

Автор:  Илья Ермаков [ Понедельник, 25 Январь, 2010 12:00 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Роман, а давайте Вы будете каждый раз чётко пояснять, что Вам надо:

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

или

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

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

Автор:  Роман М. [ Понедельник, 25 Январь, 2010 12:06 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Продолжаю работать над модулем интерфейса библиотеки Cairo.
Поэтому, необходим тип для работы с такого типа строками.

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

Автор:  Илья Ермаков [ Понедельник, 25 Январь, 2010 12:10 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Тем, что средства сопряжения с другими языками, SYSTEM... и проч. не являются частью Компонентного Паскаля, а только аппендиксом.

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

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

Автор:  Димыч [ Понедельник, 25 Январь, 2010 12:26 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

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.

Автор:  Роман М. [ Понедельник, 25 Январь, 2010 12:42 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

А как присваивать строку? С := не позволяет, если так описать тип.

Автор:  Созерцатель [ Понедельник, 25 Январь, 2010 12:45 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

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

Автор:  Роман М. [ Понедельник, 25 Январь, 2010 14:04 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Добавив [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:

Автор:  Илья Ермаков [ Понедельник, 25 Январь, 2010 14:55 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

"Обероновские строки" совместимы с сишными. Начиная с адреса первого символа лежат символы до нулевого.

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

Автор:  Созерцатель [ Понедельник, 25 Январь, 2010 15:18 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Илья Ермаков писал(а):
Начиная с адреса первого символа лежат символы до нулевого.
Ничё не понял.
Может - с начального( нулевого ) до терминального?

Автор:  Роман М. [ Понедельник, 25 Январь, 2010 15:33 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Созерцатель писал(а):
Может - с начального( нулевого ) до терминального?
Всё правильно. Первый символ находится на нулевой позиции.

А тут непонятно. Запускаю демку:
Код:
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);

Автор:  Созерцатель [ Понедельник, 25 Январь, 2010 15:38 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

CrTString* = POINTER TO ARRAY [untagged] OF CHAR;

Автор:  Сергей Губанов [ Понедельник, 25 Январь, 2010 15:43 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

UTF8 кодирует латинские буквы одним байтом (а, например, русские двумя байтами).

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

Автор:  Роман М. [ Понедельник, 25 Январь, 2010 15:45 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Теперь я понял. utf8 должен задаваться как CrTSString. Тогда я плохо понимал что такое UTF-8. Я думал, что символ - это двойной байт.

Автор:  Созерцатель [ Понедельник, 25 Январь, 2010 15:46 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Сергей Губанов писал(а):
UTF8 кодирует латинские буквы одним байтом (а, например, русские двумя байтами).
ARRAY OF CHAR -- это строка двухбайтовых букв, это не UTF8.

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

Автор:  Созерцатель [ Понедельник, 25 Январь, 2010 15:48 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Роман М. писал(а):
Я думал, что символ - это двойной байт.
Не "двойной байт", а - "более, чем один байт". И - не известно, может статься, что в последнем байте символа будет 0.

Автор:  Сергей Губанов [ Понедельник, 25 Январь, 2010 15:49 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

>> Теперь я понял. utf8 должен задаваться как CrTSString.

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

Автор:  Созерцатель [ Понедельник, 25 Январь, 2010 15:53 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

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

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

Автор:  Илья Ермаков [ Понедельник, 25 Январь, 2010 18:05 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Стандарт читать УТФ8... Он очень небольшой и ясный.

Автор:  Роман М. [ Воскресенье, 11 Апрель, 2010 14:21 ]
Заголовок сообщения:  Re: Тип PChar, строки, строки

Для меня открылся один интересный момент при сборке библиотеки из модулей.

В моём случае из модуля на КП экспортируются разные переменные, среди них есть переменная типа ЗАПИСЬ с полем 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.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/