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. Неужели и вправду, конечный вариант? ![]() |
Автор: | Илья Ермаков [ Понедельник, 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 В случае, когда в программе на FP получаю переменную err, строка err.mes не отображается, потому что первые 3 символа забиты нулями, а начиная с 4-го начинается строка.ErrType* = RECORD error-: BOOLEAN; mes-: ARRAY 127 OF SHORTCHAR; location-: INTEGER END; Str = ARRAY 8 OF SHORTCHAR; VAR err*: ErrType; str: Str; В случае чтения 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/ |